From e98693b21403d32f0e2d91a379f964ab8ef4f6f7 Mon Sep 17 00:00:00 2001
From: Yohann D'ANELLO <yohann.danello@gmail.com>
Date: Tue, 31 Mar 2020 16:22:11 +0200
Subject: [PATCH] Memberships are optional for clubs

---
 apps/member/fixtures/initial.json     |  2 ++
 apps/member/models.py                 | 21 +++++++++++++++++++++
 apps/permission/fixtures/initial.json |  2 +-
 templates/member/club_form.html       | 20 ++++++++++++++++++++
 templates/member/club_info.html       | 21 ++++++++++-----------
 5 files changed, 54 insertions(+), 12 deletions(-)

diff --git a/apps/member/fixtures/initial.json b/apps/member/fixtures/initial.json
index bba1e7ac..649cbbc1 100644
--- a/apps/member/fixtures/initial.json
+++ b/apps/member/fixtures/initial.json
@@ -5,6 +5,7 @@
         "fields": {
             "name": "BDE",
             "email": "tresorerie.bde@example.com",
+            "require_memberships":  true,
             "membership_fee": 500,
             "membership_duration": "396 00:00:00",
             "membership_start": "213 00:00:00",
@@ -17,6 +18,7 @@
         "fields": {
             "name": "Kfet",
             "email": "tresorerie.bde@example.com",
+            "require_memberships":  true,
             "membership_fee": 3500,
             "membership_duration": "396 00:00:00",
             "membership_start": "213 00:00:00",
diff --git a/apps/member/models.py b/apps/member/models.py
index d0051e59..377cc010 100644
--- a/apps/member/models.py
+++ b/apps/member/models.py
@@ -77,22 +77,34 @@ class Club(models.Model):
     )
 
     # Memberships
+
+    # When set to False, the membership system won't be used.
+    # Useful to create notes for activities or departments.
+    require_memberships = models.BooleanField(
+        default=True,
+        verbose_name=_("require memberships"),
+    )
+
     membership_fee = models.PositiveIntegerField(
+        default=0,
         verbose_name=_('membership fee'),
     )
     membership_duration = models.DurationField(
+        blank=True,
         null=True,
         verbose_name=_('membership duration'),
         help_text=_('The longest time a membership can last '
                     '(NULL = infinite).'),
     )
     membership_start = models.DurationField(
+        blank=True,
         null=True,
         verbose_name=_('membership start'),
         help_text=_('How long after January 1st the members can renew '
                     'their membership.'),
     )
     membership_end = models.DurationField(
+        blank=True,
         null=True,
         verbose_name=_('membership end'),
         help_text=_('How long the membership can last after January 1st '
@@ -100,6 +112,15 @@ class Club(models.Model):
                     'membership.'),
     )
 
+    def save(self, force_insert=False, force_update=False, using=None,
+             update_fields=None):
+        if not self.require_memberships:
+            self.membership_fee = 0
+            self.membership_duration = None
+            self.membership_start = None
+            self.membership_end = None
+        super().save(force_insert, force_update, update_fields)
+
     class Meta:
         verbose_name = _("club")
         verbose_name_plural = _("clubs")
diff --git a/apps/permission/fixtures/initial.json b/apps/permission/fixtures/initial.json
index 04920cfb..5bf0d77d 100644
--- a/apps/permission/fixtures/initial.json
+++ b/apps/permission/fixtures/initial.json
@@ -842,7 +842,7 @@
         35,
         36,
         39,
-        40,
+        40
       ]
     }
   },
diff --git a/templates/member/club_form.html b/templates/member/club_form.html
index 99c254e3..7abe9db9 100644
--- a/templates/member/club_form.html
+++ b/templates/member/club_form.html
@@ -9,3 +9,23 @@
 <button class="btn btn-primary" type="submit">{% trans "Submit" %}</button>
 </form>
 {% endblock %}
+
+{% block extrajavascript %}
+    <script>
+        require_memberships_obj = $("#id_require_memberships");
+
+        if (!require_memberships_obj.is(":checked")) {
+            $("#div_id_membership_fee").toggle();
+            $("#div_id_membership_duration").toggle();
+            $("#div_id_membership_start").toggle();
+            $("#div_id_membership_end").toggle();
+        }
+
+        require_memberships_obj.change(function () {
+            $("#div_id_membership_fee").toggle();
+            $("#div_id_membership_duration").toggle();
+            $("#div_id_membership_start").toggle();
+            $("#div_id_membership_end").toggle();
+        });
+    </script>
+{% endblock %}
diff --git a/templates/member/club_info.html b/templates/member/club_info.html
index 907914be..039583c5 100644
--- a/templates/member/club_info.html
+++ b/templates/member/club_info.html
@@ -18,26 +18,25 @@
                 <dd class="col-xl-6"> {{ club.parent_club.name}}</dd>
             {% endif %}
 
-            <dt class="col-xl-6">{% trans 'membership start'|capfirst %}</dt>
-            <dd class="col-xl-6">{{ club.membership_start }}</dd>
+            {% if club.require_memberships %}
+                <dt class="col-xl-6">{% trans 'membership start'|capfirst %}</dt>
+                <dd class="col-xl-6">{{ club.membership_start }}</dd>
 
-            <dt class="col-xl-6">{% trans 'membership end'|capfirst %}</dt>
-            <dd class="col-xl-6">{{ club.membership_end }}</dd>
+                <dt class="col-xl-6">{% trans 'membership end'|capfirst %}</dt>
+                <dd class="col-xl-6">{{ club.membership_end }}</dd>
 
-            <dt class="col-xl-6">{% trans 'membership duration'|capfirst %}</dt>
-            <dd class="col-xl-6">{{ club.membership_duration }}</dd>
+                <dt class="col-xl-6">{% trans 'membership duration'|capfirst %}</dt>
+                <dd class="col-xl-6">{{ club.membership_duration }}</dd>
 
-            <dt class="col-xl-6">{% trans 'membership fee'|capfirst %}</dt>
-            <dd class="col-xl-6">{{ club.membership_fee|pretty_money }}</dd>
+                <dt class="col-xl-6">{% trans 'membership fee'|capfirst %}</dt>
+                <dd class="col-xl-6">{{ club.membership_fee|pretty_money }}</dd>
+            {% endif %}
             
             <dt class="col-xl-6"><a href="{% url 'member:club_alias' club.pk %}">{% trans 'aliases'|capfirst %}</a></dt>
             <dd class="col-xl-6 text-truncate">{{ object.note.alias_set.all|join:", " }}</dd>
 
             <dt class="col-xl-3">{% trans 'email'|capfirst %}</dt>
             <dd class="col-xl-9"><a href="mailto:{{ club.email }}">{{ club.email }}</a></dd>
-
-            <dt class="col-xl-6"><a href="{% url 'member:club_linked_note_list' pk=club.pk %}">{% trans 'linked notes'|capfirst %}</a></dt>
-            <dd class="col-xl-6 text-truncate">{{ club.linked_notes.all|join:", " }}</dd>
         </dl>
     </div>
     <div class="card-footer text-center">
-- 
GitLab