Skip to content
Snippets Groups Projects
Commit 0b7ac616 authored by Henrich Neumann's avatar Henrich Neumann
Browse files

Add date validation for roles in the backend

Add comments field for roles
Removed contact_person_unit from read_only_fields for roles
parent ecb4fc16
No related branches found
No related tags found
1 merge request!353Create endpoint for inviting a guest
Pipeline #162403 passed
......@@ -14,7 +14,6 @@ disable=
missing-class-docstring,
missing-function-docstring,
missing-module-docstring,
no-self-use,
redefined-outer-name,
too-few-public-methods,
too-many-ancestors,
......
......@@ -3,6 +3,7 @@ from rest_framework.fields import IntegerField
from greg.api.serializers.organizational_unit import OrganizationalUnitSerializer
from greg.models import Role, RoleType
from greg.utils import role_invitation_date_validator
class RoleSerializer(serializers.ModelSerializer):
......@@ -31,7 +32,6 @@ class RoleSerializer(serializers.ModelSerializer):
"available_in_search",
"contact_person_unit",
]
read_only_fields = ["contact_person_unit"]
class RoleWriteSerializer(RoleSerializer):
......@@ -43,10 +43,38 @@ class RoleWriteSerializer(RoleSerializer):
orgunit = IntegerField(source="orgunit_id") # type: ignore
class Meta:
model = Role
fields = [
"id",
"start_date",
"end_date",
"sponsor",
"orgunit",
"created",
"updated",
"type",
"comments",
"available_in_search",
"contact_person_unit",
]
class RoleInvitationSerializer(RoleWriteSerializer):
"""Serializer used when creating an invitation"""
def validate(self, attrs):
"""Validate dates"""
start_date = attrs.get("start_date")
end_date = attrs.get("end_date")
max_days = attrs["type"].max_days
role_invitation_date_validator(
start_date=start_date, end_date=end_date, max_days=max_days
)
return attrs
class Meta:
model = Role
fields = [
......@@ -55,6 +83,6 @@ class RoleInvitationSerializer(RoleWriteSerializer):
"end_date",
"orgunit",
"type",
"comments",
"contact_person_unit",
]
read_only_fields = ["contact_person_unit"]
import re
import typing
from datetime import date, datetime, timedelta
from rest_framework import serializers
from django.db import transaction
from django.conf import settings
from django.utils import timezone
......@@ -170,3 +171,21 @@ def queue_mail_to_invitee(person: Person, sponsor: Sponsor):
):
invitemailer = InviteGuest()
invitemailer.queue_mail(invitationlink)
def role_invitation_date_validator(
start_date: typing.Optional[datetime], end_date: datetime, max_days: int
):
"""Validates dates for a role. max_days comes from a roleType."""
# Ensure end date is after start date if start date is given
if start_date and end_date < start_date:
raise serializers.ValidationError("End date cannot be before start date.")
# Ensure end date is not further into the future than the role type allows
today = date.today()
max_date = today + timedelta(days=max_days)
if max_date < end_date:
raise serializers.ValidationError(
f"New end date too far into the future for this type. Must be before {max_date.strftime('%Y-%m-%d')}."
)
import datetime
from rest_framework import serializers
from rest_framework.fields import SerializerMethodField
from rest_framework.exceptions import ValidationError
from rest_framework.validators import UniqueTogetherValidator
from greg.models import Role
from greg.utils import role_invitation_date_validator
class RoleSerializerUi(serializers.ModelSerializer):
......@@ -40,29 +40,20 @@ class RoleSerializerUi(serializers.ModelSerializer):
def validate(self, attrs):
"""Validate things that need access to multiple fields"""
# Ensure end date is not further into the future than the role type allows
today = datetime.date.today()
if self.instance:
max_days = today + datetime.timedelta(days=self.instance.type.max_days)
else:
max_days = today + datetime.timedelta(days=attrs["type"].max_days)
if attrs["end_date"] > max_days:
raise serializers.ValidationError(
f"New end date too far into the future for this type. Must be before {max_days.strftime('%Y-%m-%d')}."
)
# Ensure end date is after start date if start date is set
# Validate dates
start_date = attrs.get("start_date")
end_date = attrs.get("end_date")
if self.instance:
start_date = attrs.get("start_date") or self.instance.start_date
end_date = attrs.get("end_date") or self.instance.end_date
if start_date and end_date < start_date:
raise serializers.ValidationError(
"End date cannot be before start date."
)
start_date = start_date or self.instance.start_date
end_date = end_date or self.instance.end_date
max_days = self.instance.type.max_days
else:
if attrs.get("start_date") and attrs["end_date"] < attrs["start_date"]:
raise serializers.ValidationError(
"End date cannot be before start date."
)
max_days = attrs["type"].max_days
role_invitation_date_validator(
start_date=start_date, end_date=end_date, max_days=max_days
)
# A sponsor can not modify roles connected to units they do not have access to
allowed_units = self.context["sponsor"].get_allowed_units()
if self.instance and self.instance.orgunit not in allowed_units:
......
This diff is collapsed.
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