Skip to content
Snippets Groups Projects
Commit 234c1d18 authored by Jonas Braathen's avatar Jonas Braathen
Browse files

Merge branch 'GREG-26-model-changes' into 'master'

Greg 26 model changes

See merge request !35
parents 6c7e678f aea35b58
No related branches found
No related tags found
1 merge request!35Greg 26 model changes
Pipeline #91591 passed
Showing
with 254 additions and 247 deletions
...@@ -3,11 +3,11 @@ from reversion.admin import VersionAdmin ...@@ -3,11 +3,11 @@ from reversion.admin import VersionAdmin
from greg.models import ( from greg.models import (
Person, Person,
PersonRole,
Role, Role,
RoleType,
PersonIdentity, PersonIdentity,
ConsentType,
Consent, Consent,
PersonConsent,
OrganizationalUnit, OrganizationalUnit,
Sponsor, Sponsor,
SponsorOrganizationalUnit, SponsorOrganizationalUnit,
...@@ -17,7 +17,7 @@ admin.site.site_header = "Guest Registration Admin" ...@@ -17,7 +17,7 @@ admin.site.site_header = "Guest Registration Admin"
class RoleInline(admin.TabularInline): class RoleInline(admin.TabularInline):
model = PersonRole model = Role
extra = 1 extra = 1
...@@ -27,7 +27,7 @@ class PersonIdentityInline(admin.TabularInline): ...@@ -27,7 +27,7 @@ class PersonIdentityInline(admin.TabularInline):
class ConsentInline(admin.TabularInline): class ConsentInline(admin.TabularInline):
model = PersonConsent model = Consent
extra = 1 extra = 1
...@@ -47,18 +47,18 @@ class PersonAdmin(VersionAdmin): ...@@ -47,18 +47,18 @@ class PersonAdmin(VersionAdmin):
role_count.short_description = "# roles" # type: ignore role_count.short_description = "# roles" # type: ignore
class PersonRoleAdmin(VersionAdmin): class RoleAdmin(VersionAdmin):
list_display = ("id", "person", "role") list_display = ("id", "person", "type")
search_fields = ( search_fields = (
"person__id", "person__id",
"role__id", "type__id",
) )
raw_id_fields = ("person", "role") raw_id_fields = ("person", "type")
readonly_fields = ("id", "created", "updated") readonly_fields = ("id", "created", "updated")
class RoleAdmin(VersionAdmin): class RoleTypeAdmin(VersionAdmin):
list_display = ("id", "type", "name_nb", "name_en") list_display = ("id", "identifier", "name_nb", "name_en")
readonly_fields = ("id", "created", "updated") readonly_fields = ("id", "created", "updated")
...@@ -68,19 +68,19 @@ class PersonIdentityAdmin(VersionAdmin): ...@@ -68,19 +68,19 @@ class PersonIdentityAdmin(VersionAdmin):
readonly_fields = ("id", "created", "updated") readonly_fields = ("id", "created", "updated")
class ConsentAdmin(admin.ModelAdmin): class ConsentAdmin(VersionAdmin):
list_display = ("id", "consent_name_en", "valid_from", "user_allowed_to_change") list_display = ("id", "person", "get_consent_type_name")
readonly_fields = ("id", "created", "updated") readonly_fields = ("id", "created", "updated")
def get_consent_type_name(self, obj):
return obj.type.name_en
class PersonConsentAdmin(VersionAdmin): get_consent_type_name.short_description = "Consent name" # type: ignore
list_display = ("id", "person", "get_consent_name_en")
readonly_fields = ("id", "created", "updated")
def get_consent_name_en(self, obj):
return obj.consent.consent_name_en
get_consent_name_en.short_description = "Consent name" # type: ignore class ConsentTypeAdmin(admin.ModelAdmin):
list_display = ("id", "name_en", "valid_from", "user_allowed_to_change")
readonly_fields = ("id", "created", "updated")
class OrganizationalUnitAdmin(VersionAdmin): class OrganizationalUnitAdmin(VersionAdmin):
...@@ -104,11 +104,11 @@ class SponsorOrganizationalUnitAdmin(VersionAdmin): ...@@ -104,11 +104,11 @@ class SponsorOrganizationalUnitAdmin(VersionAdmin):
admin.site.register(Person, PersonAdmin) admin.site.register(Person, PersonAdmin)
admin.site.register(PersonRole, PersonRoleAdmin)
admin.site.register(Role, RoleAdmin) admin.site.register(Role, RoleAdmin)
admin.site.register(RoleType, RoleTypeAdmin)
admin.site.register(PersonIdentity, PersonIdentityAdmin) admin.site.register(PersonIdentity, PersonIdentityAdmin)
admin.site.register(Consent, ConsentAdmin) admin.site.register(Consent, ConsentAdmin)
admin.site.register(PersonConsent, PersonConsentAdmin) admin.site.register(ConsentType, ConsentTypeAdmin)
admin.site.register(OrganizationalUnit, OrganizationalUnitAdmin) admin.site.register(OrganizationalUnit, OrganizationalUnitAdmin)
admin.site.register(Sponsor, SponsorAdmin) admin.site.register(Sponsor, SponsorAdmin)
admin.site.register(SponsorOrganizationalUnit, SponsorOrganizationalUnitAdmin) admin.site.register(SponsorOrganizationalUnit, SponsorOrganizationalUnitAdmin)
...@@ -6,16 +6,16 @@ from django_filters.rest_framework import ( ...@@ -6,16 +6,16 @@ from django_filters.rest_framework import (
from greg.models import ( from greg.models import (
Person, Person,
PersonRole, Role,
PersonIdentity, PersonIdentity,
) )
class PersonRoleFilter(FilterSet): class RoleFilter(FilterSet):
type = BaseInFilter(field_name="role__type", lookup_expr="in") type = BaseInFilter(field_name="role__type", lookup_expr="in")
class Meta: class Meta:
model = PersonRole model = Role
fields = ["type"] fields = ["type"]
......
from .notification import NotificationSerializer from .notification import NotificationSerializer
from .person import PersonSerializer from .person import PersonSerializer
from .role import RoleSerializer from .role_type import RoleTypeSerializer
def get_serializer(instance): def get_serializer(instance):
return { return {
"notification": NotificationSerializer, "notification": NotificationSerializer,
"person": PersonSerializer, "person": PersonSerializer,
"role": RoleSerializer, "role": RoleTypeSerializer,
}.get(instance._meta.verbose_name) }.get(instance._meta.verbose_name)
from rest_framework.serializers import ModelSerializer from rest_framework.serializers import ModelSerializer
from greg.models import Role from greg.models import ConsentType
class RoleSerializer(ModelSerializer): class ConsentTypeSerializer(ModelSerializer):
class Meta: class Meta:
model = Role model = ConsentType
fields = "__all__" fields = "__all__"
from rest_framework import serializers from rest_framework import serializers
from greg.models import Person, PersonRole, Role, PersonIdentity, PersonConsent, Consent from greg.models import Person, Role, RoleType, PersonIdentity, Consent, ConsentType
class PersonRoleSerializer(serializers.ModelSerializer): class RoleSerializer(serializers.ModelSerializer):
role = serializers.SlugRelatedField(queryset=Role.objects.all(), slug_field="type") type = serializers.SlugRelatedField(
queryset=RoleType.objects.all(), slug_field="identifier"
)
class Meta: class Meta:
model = PersonRole model = Role
fields = [ fields = [
"id", "id",
"start_date", "start_date",
...@@ -16,7 +18,7 @@ class PersonRoleSerializer(serializers.ModelSerializer): ...@@ -16,7 +18,7 @@ class PersonRoleSerializer(serializers.ModelSerializer):
"unit", "unit",
"created", "created",
"updated", "updated",
"role", "type",
] ]
...@@ -41,28 +43,28 @@ class PersonIdentitySerializer(serializers.ModelSerializer): ...@@ -41,28 +43,28 @@ class PersonIdentitySerializer(serializers.ModelSerializer):
) )
class ConsentSerializerBrief(serializers.ModelSerializer): class ConsentTypeSerializerBrief(serializers.ModelSerializer):
class Meta: class Meta:
model = Consent model = ConsentType
fields = [ fields = [
"type", "identifier",
"valid_from", "valid_from",
"user_allowed_to_change", "user_allowed_to_change",
] ]
class PersonConsentSerializerBrief(serializers.ModelSerializer): class ConsentSerializerBrief(serializers.ModelSerializer):
consent = ConsentSerializerBrief(read_only=True) type = ConsentTypeSerializerBrief(read_only=True)
class Meta: class Meta:
model = PersonConsent model = Consent
fields = ["consent", "consent_given_at"] fields = ["type", "consent_given_at"]
class PersonSerializer(serializers.ModelSerializer): class PersonSerializer(serializers.ModelSerializer):
identities = PersonIdentitySerializer(many=True, read_only=True) identities = PersonIdentitySerializer(many=True, read_only=True)
person_roles = PersonRoleSerializer(many=True, read_only=True) roles = RoleSerializer(many=True, read_only=True)
person_consent = PersonConsentSerializerBrief(many=True, read_only=True) consents = ConsentSerializerBrief(many=True, read_only=True)
class Meta: class Meta:
model = Person model = Person
...@@ -79,6 +81,6 @@ class PersonSerializer(serializers.ModelSerializer): ...@@ -79,6 +81,6 @@ class PersonSerializer(serializers.ModelSerializer):
"registration_completed_date", "registration_completed_date",
"token", "token",
"identities", "identities",
"person_roles", "roles",
"person_consent", "consents",
] ]
from rest_framework.serializers import ModelSerializer from rest_framework.serializers import ModelSerializer
from greg.models import Consent from greg.models import RoleType
class ConsentSerializer(ModelSerializer): class RoleTypeSerializer(ModelSerializer):
class Meta: class Meta:
model = Consent model = RoleType
fields = "__all__" fields = "__all__"
...@@ -3,20 +3,20 @@ from django.urls import ( ...@@ -3,20 +3,20 @@ from django.urls import (
) )
from rest_framework.routers import DefaultRouter from rest_framework.routers import DefaultRouter
from greg.api.views.consent import ConsentViewSet from greg.api.views.consent_type import ConsentTypeViewSet
from greg.api.views.organizational_unit import OrganizationalUnitViewSet from greg.api.views.organizational_unit import OrganizationalUnitViewSet
from greg.api.views.person import ( from greg.api.views.person import (
PersonRoleViewSet, RoleViewSet,
PersonViewSet, PersonViewSet,
PersonIdentityViewSet, PersonIdentityViewSet,
) )
from greg.api.views.role import RoleViewSet from greg.api.views.role_type import RoleTypeViewSet
from greg.api.views.sponsor import SponsorViewSet, SponsorGuestsViewSet from greg.api.views.sponsor import SponsorViewSet, SponsorGuestsViewSet
router = DefaultRouter() router = DefaultRouter()
router.register(r"persons", PersonViewSet, basename="person") router.register(r"persons", PersonViewSet, basename="person")
router.register(r"roles", RoleViewSet, basename="role") router.register(r"roletypes", RoleTypeViewSet, basename="roletype")
router.register(r"consents", ConsentViewSet, basename="consent") router.register(r"consenttypes", ConsentTypeViewSet, basename="consenttype")
router.register(r"sponsors", SponsorViewSet, basename="sponsor") router.register(r"sponsors", SponsorViewSet, basename="sponsor")
router.register(r"orgunit", OrganizationalUnitViewSet, basename="orgunit") router.register(r"orgunit", OrganizationalUnitViewSet, basename="orgunit")
...@@ -26,12 +26,12 @@ urlpatterns = router.urls ...@@ -26,12 +26,12 @@ urlpatterns = router.urls
urlpatterns += [ urlpatterns += [
re_path( re_path(
r"^persons/(?P<person_id>[0-9]+)/roles/$", r"^persons/(?P<person_id>[0-9]+)/roles/$",
PersonRoleViewSet.as_view({"get": "list", "post": "create"}), RoleViewSet.as_view({"get": "list", "post": "create"}),
name="person_role-list", name="person_role-list",
), ),
re_path( re_path(
r"^persons/(?P<person_id>[0-9]+)/roles/(?P<id>[0-9]+)/$", r"^persons/(?P<person_id>[0-9]+)/roles/(?P<id>[0-9]+)/$",
PersonRoleViewSet.as_view( RoleViewSet.as_view(
{"get": "retrieve", "patch": "partial_update", "delete": "destroy"} {"get": "retrieve", "patch": "partial_update", "delete": "destroy"}
), ),
name="person_role-detail", name="person_role-detail",
......
from rest_framework import viewsets from rest_framework import viewsets
from greg.api.pagination import PrimaryKeyCursorPagination from greg.api.pagination import PrimaryKeyCursorPagination
from greg.api.serializers.consent import ConsentSerializer from greg.api.serializers.consent_type import ConsentTypeSerializer
from greg.models import Consent from greg.models import ConsentType
class ConsentViewSet(viewsets.ModelViewSet): class ConsentTypeViewSet(viewsets.ModelViewSet):
"""Consent API""" """Consent API"""
queryset = Consent.objects.all().order_by("id") queryset = ConsentType.objects.all().order_by("id")
serializer_class = ConsentSerializer serializer_class = ConsentTypeSerializer
pagination_class = PrimaryKeyCursorPagination pagination_class = PrimaryKeyCursorPagination
lookup_field = "id" lookup_field = "id"
...@@ -4,14 +4,14 @@ from drf_spectacular.utils import extend_schema, OpenApiParameter ...@@ -4,14 +4,14 @@ from drf_spectacular.utils import extend_schema, OpenApiParameter
from rest_framework import viewsets, status from rest_framework import viewsets, status
from rest_framework.response import Response from rest_framework.response import Response
from greg.api.filters import PersonFilter, PersonRoleFilter, PersonIdentityFilter from greg.api.filters import PersonFilter, RoleFilter, PersonIdentityFilter
from greg.api.pagination import PrimaryKeyCursorPagination from greg.api.pagination import PrimaryKeyCursorPagination
from greg.api.serializers.person import ( from greg.api.serializers.person import (
PersonSerializer, PersonSerializer,
PersonRoleSerializer, RoleSerializer,
PersonIdentitySerializer, PersonIdentitySerializer,
) )
from greg.models import Person, PersonRole, PersonIdentity from greg.models import Person, Role, PersonIdentity
class PersonViewSet(viewsets.ModelViewSet): class PersonViewSet(viewsets.ModelViewSet):
...@@ -39,14 +39,14 @@ class PersonViewSet(viewsets.ModelViewSet): ...@@ -39,14 +39,14 @@ class PersonViewSet(viewsets.ModelViewSet):
return super().list(request, *args, **kwargs) return super().list(request, *args, **kwargs)
class PersonRoleViewSet(viewsets.ModelViewSet): class RoleViewSet(viewsets.ModelViewSet):
"""Person role API""" """Person role API"""
queryset = PersonRole.objects.all().order_by("id") queryset = Role.objects.all().order_by("id")
serializer_class = PersonRoleSerializer serializer_class = RoleSerializer
pagination_class = PrimaryKeyCursorPagination pagination_class = PrimaryKeyCursorPagination
filter_backends = (filters.DjangoFilterBackend,) filter_backends = (filters.DjangoFilterBackend,)
filterset_class = PersonRoleFilter filterset_class = RoleFilter
lookup_field = "id" lookup_field = "id"
def get_queryset(self): def get_queryset(self):
......
from rest_framework import viewsets from rest_framework import viewsets
from greg.api.pagination import PrimaryKeyCursorPagination from greg.api.pagination import PrimaryKeyCursorPagination
from greg.api.serializers.role import RoleSerializer from greg.api.serializers.role_type import RoleTypeSerializer
from greg.models import Role from greg.models import RoleType
class RoleViewSet(viewsets.ModelViewSet): class RoleTypeViewSet(viewsets.ModelViewSet):
"""Role API""" """Role type API"""
queryset = Role.objects.all().order_by("id") queryset = RoleType.objects.all().order_by("id")
serializer_class = RoleSerializer serializer_class = RoleTypeSerializer
pagination_class = PrimaryKeyCursorPagination pagination_class = PrimaryKeyCursorPagination
lookup_field = "id" lookup_field = "id"
...@@ -39,5 +39,5 @@ class SponsorGuestsViewSet(mixins.ListModelMixin, GenericViewSet): ...@@ -39,5 +39,5 @@ class SponsorGuestsViewSet(mixins.ListModelMixin, GenericViewSet):
if not self.kwargs: if not self.kwargs:
return qs.none() return qs.none()
sponsor_id = self.kwargs["sponsor_id"] sponsor_id = self.kwargs["sponsor_id"]
qs = qs.filter(person_roles__registered_by=sponsor_id).order_by("id") qs = qs.filter(roles__registered_by=sponsor_id).order_by("id")
return qs return qs
# Generated by Django 3.2.5 on 2021-08-23 08:53 # Generated by Django 3.2.5 on 2021-08-31 10:57
import datetime import datetime
import dirtyfields.dirtyfields import dirtyfields.dirtyfields
...@@ -15,18 +15,18 @@ class Migration(migrations.Migration): ...@@ -15,18 +15,18 @@ class Migration(migrations.Migration):
operations = [ operations = [
migrations.CreateModel( migrations.CreateModel(
name='Consent', name='ConsentType',
fields=[ fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created', models.DateTimeField(auto_now_add=True)), ('created', models.DateTimeField(auto_now_add=True)),
('updated', models.DateTimeField(auto_now=True)), ('updated', models.DateTimeField(auto_now=True)),
('type', models.SlugField(max_length=64, unique=True)), ('identifier', models.SlugField(max_length=64, unique=True)),
('consent_name_en', models.CharField(max_length=256)), ('name_en', models.CharField(max_length=256)),
('consent_name_nb', models.CharField(max_length=256)), ('name_nb', models.CharField(max_length=256)),
('consent_description_en', models.TextField()), ('description_en', models.TextField()),
('consent_description_nb', models.TextField()), ('description_nb', models.TextField()),
('consent_link_en', models.URLField(null=True)), ('link_en', models.URLField(null=True)),
('consent_link_nb', models.URLField(null=True)), ('link_nb', models.URLField(null=True)),
('valid_from', models.DateField(default=datetime.date.today)), ('valid_from', models.DateField(default=datetime.date.today)),
('user_allowed_to_change', models.BooleanField()), ('user_allowed_to_change', models.BooleanField()),
], ],
...@@ -87,12 +87,12 @@ class Migration(migrations.Migration): ...@@ -87,12 +87,12 @@ class Migration(migrations.Migration):
bases=(dirtyfields.dirtyfields.DirtyFieldsMixin, models.Model), bases=(dirtyfields.dirtyfields.DirtyFieldsMixin, models.Model),
), ),
migrations.CreateModel( migrations.CreateModel(
name='Role', name='RoleType',
fields=[ fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created', models.DateTimeField(auto_now_add=True)), ('created', models.DateTimeField(auto_now_add=True)),
('updated', models.DateTimeField(auto_now=True)), ('updated', models.DateTimeField(auto_now=True)),
('type', models.SlugField(max_length=64, unique=True)), ('identifier', models.SlugField(max_length=64, unique=True)),
('name_nb', models.CharField(max_length=256)), ('name_nb', models.CharField(max_length=256)),
('name_en', models.CharField(max_length=256)), ('name_en', models.CharField(max_length=256)),
('description_nb', models.TextField()), ('description_nb', models.TextField()),
...@@ -142,7 +142,7 @@ class Migration(migrations.Migration): ...@@ -142,7 +142,7 @@ class Migration(migrations.Migration):
field=models.ManyToManyField(related_name='sponsor_unit', through='greg.SponsorOrganizationalUnit', to='greg.OrganizationalUnit'), field=models.ManyToManyField(related_name='sponsor_unit', through='greg.SponsorOrganizationalUnit', to='greg.OrganizationalUnit'),
), ),
migrations.CreateModel( migrations.CreateModel(
name='PersonRole', name='Role',
fields=[ fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created', models.DateTimeField(auto_now_add=True)), ('created', models.DateTimeField(auto_now_add=True)),
...@@ -152,9 +152,9 @@ class Migration(migrations.Migration): ...@@ -152,9 +152,9 @@ class Migration(migrations.Migration):
('contact_person_unit', models.TextField(blank=True)), ('contact_person_unit', models.TextField(blank=True)),
('comments', models.TextField(blank=True)), ('comments', models.TextField(blank=True)),
('available_in_search', models.BooleanField(default=False)), ('available_in_search', models.BooleanField(default=False)),
('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='person_roles', to='greg.person')), ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='roles', to='greg.person')),
('registered_by', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='sponsor_role', to='greg.sponsor')), ('registered_by', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='sponsor_role', to='greg.sponsor')),
('role', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='person_roles', to='greg.role')), ('type', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='persons', to='greg.roletype')),
('unit', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='unit_person_role', to='greg.organizationalunit')), ('unit', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='unit_person_role', to='greg.organizationalunit')),
], ],
bases=(dirtyfields.dirtyfields.DirtyFieldsMixin, models.Model), bases=(dirtyfields.dirtyfields.DirtyFieldsMixin, models.Model),
...@@ -174,32 +174,22 @@ class Migration(migrations.Migration): ...@@ -174,32 +174,22 @@ class Migration(migrations.Migration):
('verified_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='sponsor', to='greg.sponsor')), ('verified_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='sponsor', to='greg.sponsor')),
], ],
options={ options={
'abstract': False, 'verbose_name_plural': 'person identities',
}, },
bases=(dirtyfields.dirtyfields.DirtyFieldsMixin, models.Model), bases=(dirtyfields.dirtyfields.DirtyFieldsMixin, models.Model),
), ),
migrations.CreateModel( migrations.CreateModel(
name='PersonConsent', name='Consent',
fields=[ fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created', models.DateTimeField(auto_now_add=True)), ('created', models.DateTimeField(auto_now_add=True)),
('updated', models.DateTimeField(auto_now=True)), ('updated', models.DateTimeField(auto_now=True)),
('consent_given_at', models.DateField(null=True)), ('consent_given_at', models.DateField(null=True)),
('consent', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='link_person_consent', to='greg.consent')), ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='consents', to='greg.person')),
('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='link_person_consent', to='greg.person')), ('type', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='persons', to='greg.consenttype')),
], ],
bases=(dirtyfields.dirtyfields.DirtyFieldsMixin, models.Model), bases=(dirtyfields.dirtyfields.DirtyFieldsMixin, models.Model),
), ),
migrations.AddField(
model_name='person',
name='consents',
field=models.ManyToManyField(related_name='consent', through='greg.PersonConsent', to='greg.Consent'),
),
migrations.AddField(
model_name='person',
name='roles',
field=models.ManyToManyField(related_name='persons', through='greg.PersonRole', to='greg.Role'),
),
migrations.AddConstraint( migrations.AddConstraint(
model_name='sponsororganizationalunit', model_name='sponsororganizationalunit',
constraint=models.UniqueConstraint(fields=('sponsor', 'organizational_unit'), name='sponsor_organizational_unit_unique'), constraint=models.UniqueConstraint(fields=('sponsor', 'organizational_unit'), name='sponsor_organizational_unit_unique'),
...@@ -209,15 +199,15 @@ class Migration(migrations.Migration): ...@@ -209,15 +199,15 @@ class Migration(migrations.Migration):
constraint=models.UniqueConstraint(fields=('feide_id',), name='unique_feide_id'), constraint=models.UniqueConstraint(fields=('feide_id',), name='unique_feide_id'),
), ),
migrations.AddConstraint( migrations.AddConstraint(
model_name='personrole', model_name='role',
constraint=models.UniqueConstraint(fields=('person_id', 'role_id', 'unit_id', 'start_date', 'end_date'), name='person_role_unique'), constraint=models.UniqueConstraint(fields=('person_id', 'type_id', 'unit_id', 'start_date', 'end_date'), name='person_role_type_unique'),
),
migrations.AddConstraint(
model_name='personconsent',
constraint=models.UniqueConstraint(fields=('person', 'consent'), name='person_consent_unique'),
), ),
migrations.AddConstraint( migrations.AddConstraint(
model_name='organizationalunit', model_name='organizationalunit',
constraint=models.UniqueConstraint(fields=('orgreg_id',), name='unique_orgreg_id'), constraint=models.UniqueConstraint(fields=('orgreg_id',), name='unique_orgreg_id'),
), ),
migrations.AddConstraint(
model_name='consent',
constraint=models.UniqueConstraint(fields=('person', 'type'), name='person_consent_type_unique'),
),
] ]
# Generated by Django 3.2.5 on 2021-08-27 14:37
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('greg', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='personconsent',
name='consent',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='person_consent', to='greg.consent'),
),
migrations.AlterField(
model_name='personconsent',
name='person',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='person_consent', to='greg.person'),
),
]
...@@ -44,10 +44,6 @@ class Person(BaseModel): ...@@ -44,10 +44,6 @@ class Person(BaseModel):
mobile_phone_verified_date = models.DateField(null=True) mobile_phone_verified_date = models.DateField(null=True)
registration_completed_date = models.DateField(null=True) registration_completed_date = models.DateField(null=True)
token = models.CharField(max_length=32, blank=True) token = models.CharField(max_length=32, blank=True)
roles = models.ManyToManyField("Role", through="PersonRole", related_name="persons")
consents = models.ManyToManyField(
"Consent", through="PersonConsent", related_name="consent"
)
def __str__(self): def __str__(self):
return "{} {} ({})".format(self.first_name, self.last_name, self.pk) return "{} {} ({})".format(self.first_name, self.last_name, self.pk)
...@@ -120,10 +116,10 @@ class Person(BaseModel): ...@@ -120,10 +116,10 @@ class Person(BaseModel):
) )
class Role(BaseModel): class RoleType(BaseModel):
"""A role variant.""" """A role variant."""
type = models.SlugField(max_length=64, unique=True) identifier = models.SlugField(max_length=64, unique=True)
name_nb = models.CharField(max_length=256) name_nb = models.CharField(max_length=256)
name_en = models.CharField(max_length=256) name_en = models.CharField(max_length=256)
description_nb = models.TextField() description_nb = models.TextField()
...@@ -131,26 +127,24 @@ class Role(BaseModel): ...@@ -131,26 +127,24 @@ class Role(BaseModel):
default_duration_days = models.IntegerField(null=True) default_duration_days = models.IntegerField(null=True)
def __str__(self): def __str__(self):
return str(self.name_nb or self.name_en) return "{} ({})".format(str(self.name_en or self.name_nb), self.identifier)
def __repr__(self): def __repr__(self):
return "{}(id={!r}, type={!r}, name_nb={!r}, name_en={!r})".format( return "{}(pk={!r}, identifier={!r}, name_nb={!r}, name_en={!r})".format(
self.__class__.__name__, self.__class__.__name__,
self.pk, self.pk,
self.type, self.identifier,
self.name_nb, self.name_nb,
self.name_en, self.name_en,
) )
class PersonRole(BaseModel): class Role(BaseModel):
"""The relationship between a person and a role.""" """The relationship between a person and a role."""
person = models.ForeignKey( person = models.ForeignKey("Person", on_delete=models.CASCADE, related_name="roles")
"Person", on_delete=models.CASCADE, related_name="person_roles" type = models.ForeignKey(
) "RoleType", on_delete=models.PROTECT, related_name="persons"
role = models.ForeignKey(
"Role", on_delete=models.PROTECT, related_name="person_roles"
) )
unit = models.ForeignKey( unit = models.ForeignKey(
"OrganizationalUnit", on_delete=models.PROTECT, related_name="unit_person_role" "OrganizationalUnit", on_delete=models.PROTECT, related_name="unit_person_role"
...@@ -169,14 +163,14 @@ class PersonRole(BaseModel): ...@@ -169,14 +163,14 @@ class PersonRole(BaseModel):
class Meta: class Meta:
constraints = [ constraints = [
models.UniqueConstraint( models.UniqueConstraint(
fields=["person_id", "role_id", "unit_id", "start_date", "end_date"], fields=["person_id", "type_id", "unit_id", "start_date", "end_date"],
name="person_role_unique", name="person_role_type_unique",
) )
] ]
def __repr__(self): def __repr__(self):
return "{}(id={!r}, person={!r}, role={!r})".format( return "{}(id={!r}, person={!r}, type={!r})".format(
self.__class__.__name__, self.pk, self.person, self.role self.__class__.__name__, self.pk, self.person, self.type
) )
...@@ -240,43 +234,49 @@ class PersonIdentity(BaseModel): ...@@ -240,43 +234,49 @@ class PersonIdentity(BaseModel):
self.verified_when, self.verified_when,
) )
class Meta:
verbose_name_plural = "person identities"
class Consent(BaseModel):
class ConsentType(BaseModel):
""" """
Describes some consent, like acknowledging the IT department guidelines, a guest can give. Describes some consent, like acknowledging the IT department guidelines, a guest can give.
""" """
type = models.SlugField(max_length=64, unique=True) identifier = models.SlugField(max_length=64, unique=True)
consent_name_en = models.CharField(max_length=256) name_en = models.CharField(max_length=256)
consent_name_nb = models.CharField(max_length=256) name_nb = models.CharField(max_length=256)
consent_description_en = models.TextField() description_en = models.TextField()
consent_description_nb = models.TextField() description_nb = models.TextField()
consent_link_en = models.URLField(null=True) link_en = models.URLField(null=True)
consent_link_nb = models.URLField(null=True) link_nb = models.URLField(null=True)
valid_from = models.DateField(default=date.today) valid_from = models.DateField(default=date.today)
user_allowed_to_change = models.BooleanField() user_allowed_to_change = models.BooleanField()
def __str__(self):
return "{} ({})".format(str(self.name_en or self.name_nb), self.identifier)
def __repr__(self): def __repr__(self):
return "{}(id={!r}, type={!r}, consent_name_en={!r}, valid_from={!r}, user_allowed_to_change={!r})".format( return "{}(id={!r}, identifier={!r}, name_en={!r}, valid_from={!r}, user_allowed_to_change={!r})".format(
self.__class__.__name__, self.__class__.__name__,
self.pk, self.pk,
self.type, self.identifier,
self.consent_name_en, self.name_en,
self.valid_from, self.valid_from,
self.user_allowed_to_change, self.user_allowed_to_change,
) )
class PersonConsent(BaseModel): class Consent(BaseModel):
""" """
Links a person and a consent he has given. Links a person and a consent he has given.
""" """
person = models.ForeignKey( person = models.ForeignKey(
"Person", on_delete=models.CASCADE, related_name="person_consent" "Person", on_delete=models.CASCADE, related_name="consents"
) )
consent = models.ForeignKey( type = models.ForeignKey(
"Consent", on_delete=models.PROTECT, related_name="person_consent" "ConsentType", on_delete=models.PROTECT, related_name="persons"
) )
# If the date is blank it means the person has not given consent yet # If the date is blank it means the person has not given consent yet
consent_given_at = models.DateField(null=True) consent_given_at = models.DateField(null=True)
...@@ -284,16 +284,16 @@ class PersonConsent(BaseModel): ...@@ -284,16 +284,16 @@ class PersonConsent(BaseModel):
class Meta: class Meta:
constraints = [ constraints = [
models.UniqueConstraint( models.UniqueConstraint(
fields=["person", "consent"], name="person_consent_unique" fields=["person", "type"], name="person_consent_type_unique"
) )
] ]
def __repr__(self): def __repr__(self):
return "{}(id={!r}, person={!r}, consent={!r}, consent_given_at={!r})".format( return "{}(id={!r}, person={!r}, type={!r}, consent_given_at={!r})".format(
self.__class__.__name__, self.__class__.__name__,
self.pk, self.pk,
self.person, self.person,
self.consent, self.type,
self.consent_given_at, self.consent_given_at,
) )
...@@ -313,6 +313,9 @@ class OrganizationalUnit(BaseModel): ...@@ -313,6 +313,9 @@ class OrganizationalUnit(BaseModel):
self.__class__.__name__, self.pk, self.orgreg_id, self.name_en, self.parent self.__class__.__name__, self.pk, self.orgreg_id, self.name_en, self.parent
) )
def __str__(self):
return "{} ({})".format(str(self.name_en or self.name_nb), self.orgreg_id)
class Meta: class Meta:
constraints = [ constraints = [
models.UniqueConstraint(name="unique_orgreg_id", fields=["orgreg_id"]) models.UniqueConstraint(name="unique_orgreg_id", fields=["orgreg_id"])
...@@ -334,6 +337,9 @@ class Sponsor(BaseModel): ...@@ -334,6 +337,9 @@ class Sponsor(BaseModel):
related_name="sponsor_unit", related_name="sponsor_unit",
) )
def __str__(self):
return "{} ({} {})".format(self.feide_id, self.first_name, self.last_name)
def __repr__(self): def __repr__(self):
return "{}(id={!r}, feide_id={!r}, first_name={!r}, last_name={!r})".format( return "{}(id={!r}, feide_id={!r}, first_name={!r}, last_name={!r})".format(
self.__class__.__name__, self.__class__.__name__,
......
...@@ -5,7 +5,7 @@ from typing import Optional ...@@ -5,7 +5,7 @@ from typing import Optional
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from django.utils import timezone from django.utils import timezone
from greg.models import PersonRole, Notification, ScheduleTask from greg.models import Role, Notification, ScheduleTask
class BaseSchedule(ABC): class BaseSchedule(ABC):
...@@ -77,12 +77,12 @@ class ExpiringRolesNotification(BaseSchedule): ...@@ -77,12 +77,12 @@ class ExpiringRolesNotification(BaseSchedule):
self.__get_roles_about_to_expire(check_date) self.__get_roles_about_to_expire(check_date)
def __get_roles_about_to_expire(self, end_date: date): def __get_roles_about_to_expire(self, end_date: date):
roles_about_to_expire = PersonRole.objects.filter(end_date=end_date) roles_about_to_expire = Role.objects.filter(end_date=end_date)
for person_role in roles_about_to_expire: for role in roles_about_to_expire:
meta = {"person_id": person_role.person.id, "role_id": person_role.role.id} meta = {"person_id": role.person.id, "type_id": role.type.id}
self._store_notification( self._store_notification(
identifier=person_role.id, identifier=role.id,
object_type="PersonRole", object_type="PersonRole",
operation="expire_reminder", operation="expire_reminder",
**meta **meta
......
...@@ -7,22 +7,22 @@ from django.dispatch import receiver ...@@ -7,22 +7,22 @@ from django.dispatch import receiver
from greg.models import ( from greg.models import (
Person, Person,
PersonRole,
Role, Role,
RoleType,
Notification, Notification,
PersonIdentity, PersonIdentity,
PersonConsent,
Consent, Consent,
ConsentType,
) )
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
SUPPORTED_MODELS = ( SUPPORTED_MODELS = (
Person, Person,
PersonRole,
Role, Role,
RoleType,
PersonIdentity, PersonIdentity,
PersonConsent, Consent,
) )
...@@ -123,20 +123,20 @@ def m2m_changed_notification_callback( ...@@ -123,20 +123,20 @@ def m2m_changed_notification_callback(
): ):
if action not in ("post_add", "post_remove"): if action not in ("post_add", "post_remove"):
return return
if sender not in (PersonConsent, PersonRole, PersonIdentity): if sender not in (Consent, Role, PersonIdentity):
return return
operation = "add" if action == "post_add" else "delete" operation = "add" if action == "post_add" else "delete"
instance_type = type(instance) instance_type = type(instance)
if sender is PersonConsent: if sender is Consent:
person_consents = [] person_consents = []
if instance_type is Person and model is Consent: if instance_type is Person and model is ConsentType:
person_consents = PersonConsent.objects.filter( person_consents = Consent.objects.filter(
person_id=instance.id, consent_id__in=pk_set person_id=instance.id, consent_id__in=pk_set
) )
elif instance_type is Consent and model is Person: elif instance_type is ConsentType and model is Person:
person_consents = PersonConsent.objects.filter( person_consents = Consent.objects.filter(
consent_id=instance.id, person_id__in=pk_set consent_id=instance.id, person_id__in=pk_set
) )
...@@ -144,26 +144,22 @@ def m2m_changed_notification_callback( ...@@ -144,26 +144,22 @@ def m2m_changed_notification_callback(
meta = _create_metadata(pc) meta = _create_metadata(pc)
_store_notification( _store_notification(
identifier=pc.id, identifier=pc.id,
object_type=PersonConsent._meta.object_name, object_type=Consent._meta.object_name,
operation=operation, operation=operation,
**meta **meta
) )
elif sender is PersonRole: elif sender is Role:
person_roles = [] roles = []
if instance_type is Person and model is Role: if instance_type is Person and model is RoleType:
person_roles = PersonRole.objects.filter( roles = Role.objects.filter(person_id=instance.id, role_id__in=pk_set)
person_id=instance.id, role_id__in=pk_set elif instance_type is RoleType and model is Person:
) roles = Role.objects.filter(role_id=instance.id, person_id__in=pk_set)
elif instance_type is Role and model is Person:
person_roles = PersonRole.objects.filter( for pr in roles:
role_id=instance.id, person_id__in=pk_set
)
for pr in person_roles:
meta = _create_metadata(pr) meta = _create_metadata(pr)
_store_notification( _store_notification(
identifier=pr.id, identifier=pr.id,
object_type=PersonRole._meta.object_name, object_type=Role._meta.object_name,
operation=operation, operation=operation,
**meta **meta
) )
...@@ -172,14 +168,14 @@ def m2m_changed_notification_callback( ...@@ -172,14 +168,14 @@ def m2m_changed_notification_callback(
def _create_metadata(instance) -> Dict: def _create_metadata(instance) -> Dict:
meta = {} meta = {}
if isinstance(instance, PersonRole): if isinstance(instance, Role):
meta["person_id"] = instance.person.id meta["person_id"] = instance.person.id
meta["role_id"] = instance.role.id meta["type_id"] = instance.type.id
if isinstance(instance, PersonIdentity): if isinstance(instance, PersonIdentity):
meta["person_id"] = instance.person.id meta["person_id"] = instance.person.id
meta["identity_id"] = instance.id meta["identity_id"] = instance.id
if isinstance(instance, PersonConsent): if isinstance(instance, Consent):
meta["person_id"] = instance.person.id meta["person_id"] = instance.person.id
meta["consent_id"] = instance.consent.id meta["consent_id"] = instance.type.id
return meta return meta
import pytest
from rest_framework import status
from rest_framework.reverse import reverse
from greg.models import Consent
@pytest.fixture
def consent_foo() -> Consent:
return Consent.objects.create(
type="test_consent",
consent_name_en="Test1",
consent_name_nb="Test2",
consent_description_en="Test description",
consent_description_nb="Test beskrivelse",
consent_link_en="https://example.org",
consent_link_nb="https://example.org",
valid_from="2018-01-20",
user_allowed_to_change=True,
)
@pytest.mark.django_db
def test_get_consent(client, consent_foo):
resp = client.get(reverse("v1:consent-detail", kwargs={"id": consent_foo.id}))
assert resp.status_code == status.HTTP_200_OK
data = resp.json()
assert data.get("id") == consent_foo.id
assert data.get("type") == consent_foo.type
assert data.get("consent_name_en") == consent_foo.consent_name_en
import pytest
from rest_framework import status
from rest_framework.reverse import reverse
from greg.models import ConsentType
@pytest.fixture
def consent_type_foo() -> ConsentType:
return ConsentType.objects.create(
identifier="test_consent",
name_en="Test1",
name_nb="Test2",
description_en="Test description",
description_nb="Test beskrivelse",
link_en="https://example.org",
link_nb="https://example.org",
valid_from="2018-01-20",
user_allowed_to_change=True,
)
@pytest.mark.django_db
def test_get_consent_type(client, consent_type_foo: ConsentType):
resp = client.get(
reverse("v1:consenttype-detail", kwargs={"id": consent_type_foo.id})
)
assert resp.status_code == status.HTTP_200_OK
data = resp.json()
assert data.get("id") == consent_type_foo.id
assert data.get("identifier") == consent_type_foo.identifier
assert data.get("name_en") == consent_type_foo.name_en
...@@ -10,18 +10,18 @@ from django.core.exceptions import ValidationError ...@@ -10,18 +10,18 @@ from django.core.exceptions import ValidationError
from greg.models import ( from greg.models import (
PersonIdentity, PersonIdentity,
Sponsor, Sponsor,
Role, RoleType,
OrganizationalUnit, OrganizationalUnit,
Consent, ConsentType,
Person, Person,
PersonRole, Role,
) )
@pytest.fixture @pytest.fixture
def role_visiting_professor() -> Role: def role_type_visiting_professor() -> RoleType:
return Role.objects.create( return RoleType.objects.create(
type="visiting_professor", identifier="visiting_professor",
name_nb="Gjesteprofessor", name_nb="Gjesteprofessor",
name_en="Visiting professor", name_en="Visiting professor",
description_nb="Gjesteprofessor", description_nb="Gjesteprofessor",
...@@ -44,10 +44,10 @@ def sponsor_bar() -> Sponsor: ...@@ -44,10 +44,10 @@ def sponsor_bar() -> Sponsor:
@pytest.fixture @pytest.fixture
def role_data_guest( def role_data_guest(
role_test_guest: Role, sponsor_bar: Sponsor, unit_foo: OrganizationalUnit role_type_test_guest: RoleType, sponsor_bar: Sponsor, unit_foo: OrganizationalUnit
) -> Dict: ) -> Dict:
return { return {
"role": "Test Guest", "type": "Test Guest",
"start_date": "2021-06-10", "start_date": "2021-06-10",
"end_date": "2021-08-10", "end_date": "2021-08-10",
"registered_by": sponsor_bar.id, "registered_by": sponsor_bar.id,
...@@ -56,15 +56,15 @@ def role_data_guest( ...@@ -56,15 +56,15 @@ def role_data_guest(
@pytest.fixture @pytest.fixture
def consent_foo() -> Consent: def consent_foo() -> ConsentType:
return Consent.objects.create( return ConsentType.objects.create(
type="test_consent", identifier="test_consent",
consent_name_en="Test1", name_en="Test1",
consent_name_nb="Test2", name_nb="Test2",
consent_description_en="Test description", description_en="Test description",
consent_description_nb="Test beskrivelse", description_nb="Test beskrivelse",
consent_link_en="https://example.org", link_en="https://example.org",
consent_link_nb="https://example.org", link_nb="https://example.org",
valid_from="2018-01-20", valid_from="2018-01-20",
user_allowed_to_change=True, user_allowed_to_change=True,
) )
...@@ -114,7 +114,7 @@ def test_persons_verified_filter_exclude( ...@@ -114,7 +114,7 @@ def test_persons_verified_filter_exclude(
@pytest.mark.django_db @pytest.mark.django_db
def test_add_role( def test_add_role(
client, person_foo, role_visiting_professor, sponsor_guy, unit_human_resources client, person_foo, role_type_visiting_professor, sponsor_guy, unit_human_resources
): ):
url = reverse("v1:person_role-list", kwargs={"person_id": person_foo.id}) url = reverse("v1:person_role-list", kwargs={"person_id": person_foo.id})
roles_for_person = client.get(url).json()["results"] roles_for_person = client.get(url).json()["results"]
...@@ -123,7 +123,7 @@ def test_add_role( ...@@ -123,7 +123,7 @@ def test_add_role(
assert len(roles_for_person) == 0 assert len(roles_for_person) == 0
role_data = { role_data = {
"role": "visiting_professor", "type": "visiting_professor",
"start_date": "2021-06-10", "start_date": "2021-06-10",
"end_date": "2021-08-10", "end_date": "2021-08-10",
"registered_by": "1", "registered_by": "1",
...@@ -398,16 +398,14 @@ def test_remove_person( ...@@ -398,16 +398,14 @@ def test_remove_person(
@pytest.mark.django_db @pytest.mark.django_db
def test_add_duplicate_role_fails( def test_add_duplicate_role_fails(client, person_foo: Person, person_foo_role: Role):
client, person_foo: Person, person_foo_role: PersonRole
):
url = reverse("v1:person_role-list", kwargs={"person_id": person_foo.id}) url = reverse("v1:person_role-list", kwargs={"person_id": person_foo.id})
roles_for_person = client.get(url).json()["results"] roles_for_person = client.get(url).json()["results"]
assert len(roles_for_person) == 1 assert len(roles_for_person) == 1
role_data = { role_data = {
"role": person_foo_role.role_id, "type": person_foo_role.type_id,
"start_date": person_foo_role.start_date, "start_date": person_foo_role.start_date,
"end_date": person_foo_role.end_date, "end_date": person_foo_role.end_date,
"registered_by": person_foo_role.registered_by, "registered_by": person_foo_role.registered_by,
......
...@@ -11,8 +11,8 @@ from greg.models import ( ...@@ -11,8 +11,8 @@ from greg.models import (
Sponsor, Sponsor,
PersonIdentity, PersonIdentity,
Role, Role,
RoleType,
OrganizationalUnit, OrganizationalUnit,
PersonRole,
) )
# faker spams the logs with localisation warnings # faker spams the logs with localisation warnings
...@@ -82,8 +82,8 @@ def person_foo_not_verified(person_foo) -> PersonIdentity: ...@@ -82,8 +82,8 @@ def person_foo_not_verified(person_foo) -> PersonIdentity:
@pytest.fixture() @pytest.fixture()
def role_test_guest() -> Role: def role_type_test_guest() -> RoleType:
return Role.objects.create(type="Test Guest") return RoleType.objects.create(identifier="Test Guest")
@pytest.fixture @pytest.fixture
...@@ -94,13 +94,13 @@ def unit_foo() -> OrganizationalUnit: ...@@ -94,13 +94,13 @@ def unit_foo() -> OrganizationalUnit:
@pytest.fixture @pytest.fixture
def person_foo_role( def person_foo_role(
person_foo: Person, person_foo: Person,
role_test_guest: Role, role_type_test_guest: RoleType,
sponsor_guy: Sponsor, sponsor_guy: Sponsor,
unit_foo: OrganizationalUnit, unit_foo: OrganizationalUnit,
) -> PersonRole: ) -> Role:
return PersonRole.objects.create( return Role.objects.create(
person=person_foo, person=person_foo,
role=role_test_guest, type=role_type_test_guest,
start_date="2021-08-02", start_date="2021-08-02",
end_date="2021-08-06", end_date="2021-08-06",
registered_by=sponsor_guy, registered_by=sponsor_guy,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment