Skip to content

Commit

Permalink
Merge pull request #929 from betagouv/feat/addressbook-api
Browse files Browse the repository at this point in the history
[feat] Addressbook API and more
  • Loading branch information
glibersat authored Feb 10, 2025
2 parents fc87756 + e1dc3b4 commit 8c92ded
Show file tree
Hide file tree
Showing 41 changed files with 1,776 additions and 894 deletions.
21 changes: 19 additions & 2 deletions conftest.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# global personal configuration of pytest
import pytest
from django.contrib.auth.models import Group, User
from django.contrib.sites.models import Site
from django.contrib.sites.shortcuts import get_current_site
from django.core.management import call_command
from model_bakery import baker
Expand All @@ -15,9 +17,24 @@ def setup_db(django_db_setup, django_db_blocker):
call_command("update_permissions")


@pytest.fixture
@pytest.fixture(scope="function")
def api_client():
return APIClient
return APIClient()


@pytest.fixture
def current_site():
return Site.objects.filter(domain="example.com").first()


@pytest.fixture
def staff_user():
site = Site.objects.filter(domain="example.com").first()
staff = baker.make(User)
staff.profile.sites.add(site)
gstaff = Group.objects.get(name="example_com_staff")
staff.groups.add(gstaff)
return staff


# -- Project Fixtures
Expand Down
25 changes: 22 additions & 3 deletions recoco/apps/addressbook/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,35 @@
from . import models


@admin.register(models.OrganizationGroup)
class OrganizationGroupAdmin(admin.ModelAdmin):
search_fields = ["name"]
list_display = ["name"]
ordering = ["name"]


@admin.register(models.Organization)
class OrganizationAdmin(admin.ModelAdmin):
search_fields = ["name"]
search_fields = ["name" "group__name"]
list_display = ["name"]
ordering = ["name"]
list_filter = ["sites", "group"]
list_select_related = ("group",)


@admin.register(models.Contact)
class ContactAdmin(VersionAdmin):
search_fields = ["first_name", "last_name", "organization__name"]
list_display = ["last_name", "first_name", "email", "phone_no", "organization"]
search_fields = [
"first_name",
"last_name",
"organization__name",
]
list_display = [
"last_name",
"first_name",
"email",
"phone_no",
"organization",
]
ordering = ["last_name", "first_name"]
list_select_related = ("organization",)
17 changes: 17 additions & 0 deletions recoco/apps/addressbook/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,21 @@ def ready(self):
Organization,
fields=("name", "departments__name", "departments__code"),
)

Contact = self.get_model("Contact")
watson.register(
Contact,
fields=(
"last_name",
"first_name",
"division",
"organization__name",
"organization__group__name",
"organization__departments__name",
"organization__departments__code",
"organization__departments__region__name",
"organization__departments__region__code",
),
)

registry.register(Organization)
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Generated by Django 4.2.17 on 2025-01-14 15:38

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
("addressbook", "0009_alter_organization_departments"),
]

operations = [
migrations.CreateModel(
name="OrganizationGroup",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("name", models.CharField(max_length=90, verbose_name="Nom")),
],
options={
"verbose_name": "Groupement d'organisations",
"verbose_name_plural": "Groupements d'organisations",
},
),
migrations.AddField(
model_name="organization",
name="group",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="organizations",
to="addressbook.organizationgroup",
),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# Generated by Django 4.2.17 on 2025-01-28 12:50

from django.db import migrations
import django.utils.timezone
import model_utils.fields


class Migration(migrations.Migration):

dependencies = [
("addressbook", "0010_organizationgroup_organization_group"),
]

operations = [
migrations.AddField(
model_name="contact",
name="created",
field=model_utils.fields.AutoCreatedField(
default=django.utils.timezone.now,
editable=False,
verbose_name="created",
),
),
migrations.AddField(
model_name="contact",
name="modified",
field=model_utils.fields.AutoLastModifiedField(
default=django.utils.timezone.now,
editable=False,
verbose_name="modified",
),
),
migrations.AddField(
model_name="organization",
name="created",
field=model_utils.fields.AutoCreatedField(
default=django.utils.timezone.now,
editable=False,
verbose_name="created",
),
),
migrations.AddField(
model_name="organization",
name="modified",
field=model_utils.fields.AutoLastModifiedField(
default=django.utils.timezone.now,
editable=False,
verbose_name="modified",
),
),
migrations.AddField(
model_name="organizationgroup",
name="created",
field=model_utils.fields.AutoCreatedField(
default=django.utils.timezone.now,
editable=False,
verbose_name="created",
),
),
migrations.AddField(
model_name="organizationgroup",
name="modified",
field=model_utils.fields.AutoLastModifiedField(
default=django.utils.timezone.now,
editable=False,
verbose_name="modified",
),
),
]
33 changes: 26 additions & 7 deletions recoco/apps/addressbook/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
from django.db.models.functions import Lower
from django.db.models.signals import post_migrate
from django.dispatch import receiver
from model_utils.models import TimeStampedModel

from recoco.apps.geomatics import models as geomatics_models

Expand All @@ -37,6 +38,17 @@ def create_site_permissions(sender, **kwargs):
)


class OrganizationGroup(TimeStampedModel):
name = models.CharField(max_length=90, verbose_name="Nom")

class Meta:
verbose_name = "Groupement d'organisations"
verbose_name_plural = "Groupements d'organisations"

def __str__(self):
return self.name


class OrganizationManager(models.Manager):
def get_queryset(self):
return super().get_queryset().order_by(Lower("name"))
Expand All @@ -46,7 +58,7 @@ class OrganizationOnSiteManager(CurrentSiteManager, OrganizationManager):
pass


class Organization(models.Model):
class Organization(TimeStampedModel):
objects = OrganizationManager()
on_site = OrganizationOnSiteManager()

Expand All @@ -60,6 +72,14 @@ class Organization(models.Model):
verbose_name="Départements concernés",
)

group = models.ForeignKey(
OrganizationGroup,
on_delete=models.CASCADE,
related_name="organizations",
blank=True,
null=True,
)

def __str__(self): # pragma: nocover
return "{0}".format(self.name)

Expand All @@ -84,7 +104,7 @@ class ContactOnSiteManager(CurrentSiteManager, ContactManager):
@reversion.register(
fields=("first_name", "last_name", "phone_no", "mobile_no", "email", "division")
)
class Contact(models.Model):
class Contact(TimeStampedModel):
objects = ContactManager()
on_site = ContactOnSiteManager()

Expand All @@ -94,11 +114,6 @@ class Contact(models.Model):
last_name = models.CharField(
max_length=50, blank=True, verbose_name="Nom de famille"
)

@property
def full_name(self):
return "{0} {1}".format(self.first_name, self.last_name)

phone_no = models.CharField(blank=True, max_length=20, verbose_name="Téléphone")
mobile_no = models.CharField(blank=True, max_length=20, verbose_name="GSM")
email = models.EmailField(blank=True, verbose_name="Courriel")
Expand All @@ -107,6 +122,10 @@ def full_name(self):
Organization, related_name="contacts", on_delete=models.CASCADE
)

@property
def full_name(self):
return "{0} {1}".format(self.first_name, self.last_name)

def __str__(self): # pragma: nocover
return "{0} {1}".format(self.last_name, self.first_name)

Expand Down
Loading

0 comments on commit 8c92ded

Please sign in to comment.