From af1f7a46e8776b4874a40742a15fb05d26608a5a Mon Sep 17 00:00:00 2001
From: florimondmanca <florimond.manca@gmail.com>
Date: Sat, 23 Jun 2018 18:43:41 +0100
Subject: [PATCH] delete form entry when deleting a project participation

---
 projects/apps.py        |  3 +++
 projects/models.py      |  2 +-
 projects/serializers.py |  4 +++-
 projects/signals.py     | 20 ++++++++++++++++++++
 projects/views.py       |  6 +++---
 5 files changed, 30 insertions(+), 5 deletions(-)
 create mode 100644 projects/signals.py

diff --git a/projects/apps.py b/projects/apps.py
index e2ae2a4..54bd9da 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 a29e38b..38b02fd 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 6f7033d..637eb1d 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 0000000..4b75cea
--- /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 6d9548b..716f394 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,)
-- 
GitLab