diff --git a/projects/apps.py b/projects/apps.py index e2ae2a40114e4a9486e34f0b7ba4d004754ef77e..54bd9da39b4ad413b29206ce721a36e4cf2b462b 100644 --- a/projects/apps.py +++ b/projects/apps.py @@ -4,3 +4,6 @@ from django.apps import AppConfig class ProjectsConfig(AppConfig): name = 'projects' verbose_name = 'Projets' + + def ready(self): + from . import signals diff --git a/projects/models.py b/projects/models.py index a29e38be85b4af202ecdc4a1fa71cd130ddf3ab1..38b02fd813eb89bb2b5c43a7f897afbc4b4214e1 100644 --- a/projects/models.py +++ b/projects/models.py @@ -182,7 +182,7 @@ class Participation(models.Model): entry = models.OneToOneField( 'dynamicforms.FormEntry', - on_delete=models.CASCADE, + on_delete=models.SET_NULL, null=True, related_name='project_participation', verbose_name='entrée', diff --git a/projects/serializers.py b/projects/serializers.py index 6f7033d73dd2cae83667df89f726628e8021b2ef..637eb1dee20afa1a4c00aabaf18b09e656537d19 100644 --- a/projects/serializers.py +++ b/projects/serializers.py @@ -55,7 +55,7 @@ class EditionListSerializer(serializers.HyperlinkedModelSerializer): """List serializer for Edition objects.""" description = MarkdownField() - project = serializers.PrimaryKeyRelatedField(read_only=True) + project = serializers.StringRelatedField(read_only=True) organizers = serializers.SerializerMethodField() participations = serializers.SerializerMethodField() edition_form = EditionFormSerializer() @@ -112,6 +112,8 @@ class ParticipationSerializer(serializers.ModelSerializer): with transaction.atomic(): entry_data = validated_data['entry'] entry = FormEntrySerializer().create(entry_data) + for answer in entry.answers.all(): + print(answer) participation = Participation.objects.create( user=validated_data['user'], diff --git a/projects/signals.py b/projects/signals.py new file mode 100644 index 0000000000000000000000000000000000000000..4b75cea9a475f587c0874e5a2b8582cb55b24124 --- /dev/null +++ b/projects/signals.py @@ -0,0 +1,20 @@ +"""Projects app signals.""" + +import logging +from django.db.models.signals import pre_delete +from django.dispatch import receiver + +from .models import Participation + + +logger = logging.getLogger('web.projects.signals') + + +@receiver(pre_delete, sender=Participation) +def delete_associated_form_entry(sender, instance: Participation, + *args, **kwargs): + """Delete the form entry associated to a participation being deleted.""" + entry = instance.entry + if entry: + entry.delete() + logger.info('entry %s deleted', entry.id) diff --git a/projects/views.py b/projects/views.py index 6d9548be770e8084f49749c82a82c2c07fb3d2ca..716f394dd07160a58ff02993c93d53a489a21077 100644 --- a/projects/views.py +++ b/projects/views.py @@ -103,7 +103,7 @@ class EditionViewSet(viewsets.ReadOnlyModelViewSet): "url": "http://localhost:8000/api/editions/1/", "name": "", "year": 2018, - "project": 1, + "project": "Oser la Prépa", "description": "", "organizers": 0, "participations": 2, @@ -245,7 +245,7 @@ class EditionViewSet(viewsets.ReadOnlyModelViewSet): "url": "http://localhost:8000/api/editions/1/", "name": "", "year": 2018, - "project": 1, + "project": "Oser la Prépa", "description": "", "organizers": 0, "participations": 3, @@ -321,7 +321,7 @@ class ParticipationViewSet(mixins.CreateModelMixin, } """ - queryset = Participation.objects.all() + queryset = Participation.objects.prefetch_related('edition').all() serializer_class = ParticipationSerializer permission_classes = (permissions.IsAuthenticated,) filter_backends = (DjangoFilterBackend,)