-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #5 from maykinmedia/feature/create-list-endpoint
Add endpoint for list creation
- Loading branch information
Showing
10 changed files
with
586 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
10 changes: 10 additions & 0 deletions
10
backend/src/openarchiefbeheer/destruction/api/permissions.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
from django.utils.translation import gettext_lazy as _ | ||
|
||
from rest_framework import permissions | ||
|
||
|
||
class CanStartDestructionPermission(permissions.BasePermission): | ||
message = _("You are not allowed to create a destruction list.") | ||
|
||
def has_permission(self, request, view): | ||
return request.user.role.can_start_destruction |
80 changes: 80 additions & 0 deletions
80
backend/src/openarchiefbeheer/destruction/api/serializers.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
from django.db.models import Q | ||
from django.utils.translation import gettext_lazy as _ | ||
|
||
from rest_framework import serializers | ||
from rest_framework.exceptions import ValidationError | ||
|
||
from openarchiefbeheer.accounts.api.serializers import UserSerializer | ||
|
||
from ..constants import ListItemStatus | ||
from ..models import DestructionList, DestructionListAssignee, DestructionListItem | ||
|
||
|
||
class DestructionListAssigneeSerializer(serializers.ModelSerializer): | ||
class Meta: | ||
model = DestructionListAssignee | ||
fields = ("user", "order") | ||
|
||
|
||
class DestructionListItemSerializer(serializers.ModelSerializer): | ||
class Meta: | ||
model = DestructionListItem | ||
fields = ( | ||
"zaak", | ||
"extra_zaak_data", | ||
) | ||
|
||
def validate(self, attrs: dict) -> dict: | ||
if DestructionListItem.objects.filter( | ||
Q(~Q(status=ListItemStatus.removed), zaak=attrs["zaak"]) | ||
).exists(): | ||
raise ValidationError( | ||
{ | ||
"zaak": _( | ||
"This case was already included in another destruction list and was not exempt during the review process." | ||
) | ||
} | ||
) | ||
|
||
return attrs | ||
|
||
|
||
class DestructionListSerializer(serializers.ModelSerializer): | ||
assignees = DestructionListAssigneeSerializer(many=True) | ||
items = DestructionListItemSerializer(many=True) | ||
author = UserSerializer(read_only=True) | ||
|
||
class Meta: | ||
model = DestructionList | ||
fields = ( | ||
"name", | ||
"author", | ||
"contains_sensitive_info", | ||
"assignees", | ||
"items", | ||
) | ||
|
||
def create(self, validated_data: dict) -> DestructionList: | ||
assignees_data = validated_data.pop("assignees") | ||
items_data = validated_data.pop("items") | ||
|
||
validated_data["author"] = self.context["request"].user | ||
destruction_list = DestructionList.objects.create(**validated_data) | ||
|
||
DestructionListItem.objects.bulk_create( | ||
[ | ||
DestructionListItem(**{**item, "destruction_list": destruction_list}) | ||
for item in items_data | ||
] | ||
) | ||
assignees = DestructionListAssignee.objects.bulk_create( | ||
[ | ||
DestructionListAssignee( | ||
**{**assignee, "destruction_list": destruction_list} | ||
) | ||
for assignee in assignees_data | ||
] | ||
) | ||
|
||
destruction_list.assign(assignees[0]) | ||
return destruction_list |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
from django.db import transaction | ||
|
||
from rest_framework import mixins, viewsets | ||
from rest_framework.permissions import IsAuthenticated | ||
|
||
from ..models import DestructionList | ||
from .permissions import CanStartDestructionPermission | ||
from .serializers import DestructionListSerializer | ||
|
||
|
||
class DestructionListViewSet(mixins.CreateModelMixin, viewsets.GenericViewSet): | ||
serializer_class = DestructionListSerializer | ||
queryset = DestructionList.objects.all() | ||
|
||
def get_permissions(self): | ||
if self.action == "create": | ||
permission_classes = [IsAuthenticated & CanStartDestructionPermission] | ||
else: | ||
permission_classes = [IsAuthenticated] | ||
return [permission() for permission in permission_classes] | ||
|
||
@transaction.atomic | ||
def create(self, request, *args, **kwargs): | ||
# TODO log creation | ||
return super().create(request, *args, **kwargs) |
67 changes: 67 additions & 0 deletions
67
backend/src/openarchiefbeheer/destruction/migrations/0002_destructionlistassignee.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
# Generated by Django 4.2.11 on 2024-05-01 14:25 | ||
|
||
from django.conf import settings | ||
from django.db import migrations, models | ||
import django.db.models.deletion | ||
|
||
|
||
class Migration(migrations.Migration): | ||
|
||
dependencies = [ | ||
migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||
("destruction", "0001_initial"), | ||
] | ||
|
||
operations = [ | ||
migrations.CreateModel( | ||
name="DestructionListAssignee", | ||
fields=[ | ||
( | ||
"id", | ||
models.AutoField( | ||
auto_created=True, | ||
primary_key=True, | ||
serialize=False, | ||
verbose_name="ID", | ||
), | ||
), | ||
( | ||
"order", | ||
models.PositiveIntegerField( | ||
db_index=True, editable=False, verbose_name="order" | ||
), | ||
), | ||
( | ||
"assigned_on", | ||
models.DateTimeField( | ||
blank=True, null=True, verbose_name="assigned on" | ||
), | ||
), | ||
( | ||
"destruction_list", | ||
models.ForeignKey( | ||
on_delete=django.db.models.deletion.CASCADE, | ||
related_name="assignees", | ||
to="destruction.destructionlist", | ||
verbose_name="destruction list", | ||
), | ||
), | ||
( | ||
"user", | ||
models.ForeignKey( | ||
help_text="The user assigned to the destruction list.", | ||
on_delete=django.db.models.deletion.PROTECT, | ||
to=settings.AUTH_USER_MODEL, | ||
verbose_name="user", | ||
), | ||
), | ||
], | ||
options={ | ||
"verbose_name": "destruction list assignee", | ||
"verbose_name_plural": "destruction list assignees", | ||
"ordering": ("order",), | ||
"abstract": False, | ||
"unique_together": {("destruction_list", "user")}, | ||
}, | ||
), | ||
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.