From e180d205ba5f2a449c4dd50a5a82e65f94e45a0c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Bedna=C5=99=C3=ADk?= <jan.bednarik@gmail.com>
Date: Fri, 15 Jan 2021 22:54:24 +0100
Subject: [PATCH] donate: Customizable amounts for home page and projects

---
 donate/migrations/0013_auto_20210115_2248.py  | 61 ++++++++++++++++
 donate/models.py                              | 72 +++++++++++++------
 donate/templates/donate/donate_home_page.html | 17 +----
 .../templates/donate/donate_project_page.html | 17 +----
 .../templates/donate/donate_region_page.html  | 17 +----
 .../donate/form_amounts_snippet.html          | 16 +++++
 6 files changed, 132 insertions(+), 68 deletions(-)
 create mode 100644 donate/migrations/0013_auto_20210115_2248.py
 create mode 100644 donate/templates/donate/form_amounts_snippet.html

diff --git a/donate/migrations/0013_auto_20210115_2248.py b/donate/migrations/0013_auto_20210115_2248.py
new file mode 100644
index 00000000..6c8ffe23
--- /dev/null
+++ b/donate/migrations/0013_auto_20210115_2248.py
@@ -0,0 +1,61 @@
+# Generated by Django 3.1.3 on 2021-01-15 21:48
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("donate", "0012_auto_20200915_0114"),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name="donatehomepage",
+            name="form_amount_1",
+            field=models.IntegerField(default=100, verbose_name="pevná částka 1"),
+        ),
+        migrations.AddField(
+            model_name="donatehomepage",
+            name="form_amount_2",
+            field=models.IntegerField(default=200, verbose_name="pevná částka 2"),
+        ),
+        migrations.AddField(
+            model_name="donatehomepage",
+            name="form_amount_3",
+            field=models.IntegerField(default=500, verbose_name="pevná částka 3"),
+        ),
+        migrations.AddField(
+            model_name="donatehomepage",
+            name="form_preselected",
+            field=models.IntegerField(
+                choices=[(1, "první"), (2, "druhá"), (3, "třetí")],
+                default=1,
+                verbose_name="výchozí částka",
+            ),
+        ),
+        migrations.AddField(
+            model_name="donateregionpage",
+            name="form_amount_1",
+            field=models.IntegerField(default=100, verbose_name="pevná částka 1"),
+        ),
+        migrations.AddField(
+            model_name="donateregionpage",
+            name="form_amount_2",
+            field=models.IntegerField(default=200, verbose_name="pevná částka 2"),
+        ),
+        migrations.AddField(
+            model_name="donateregionpage",
+            name="form_amount_3",
+            field=models.IntegerField(default=500, verbose_name="pevná částka 3"),
+        ),
+        migrations.AddField(
+            model_name="donateregionpage",
+            name="form_preselected",
+            field=models.IntegerField(
+                choices=[(1, "první"), (2, "druhá"), (3, "třetí")],
+                default=1,
+                verbose_name="výchozí částka",
+            ),
+        ),
+    ]
diff --git a/donate/models.py b/donate/models.py
index e2aafa03..cf025d2e 100644
--- a/donate/models.py
+++ b/donate/models.py
@@ -65,6 +65,29 @@ class DonateFormMixin(models.Model):
         return bool(self.portal_project_id)
 
 
+class DonateFormAmountsMixin(models.Model):
+    """Amounts setup for donate forms."""
+
+    FIRST = 1
+    SECOND = 2
+    THIRD = 3
+    FORM_CHOICES = [
+        (FIRST, "prvnĂ­"),
+        (SECOND, "druhá"),
+        (THIRD, "třetí"),
+    ]
+
+    form_amount_1 = models.IntegerField("pevná částka 1", default=100)
+    form_amount_2 = models.IntegerField("pevná částka 2", default=200)
+    form_amount_3 = models.IntegerField("pevná částka 3", default=500)
+    form_preselected = models.IntegerField(
+        "výchozí částka", default=FIRST, choices=FORM_CHOICES
+    )
+
+    class Meta:
+        abstract = True
+
+
 def get_url(page, dest_page_type):
     try:
         return page.get_children().type(dest_page_type).live().first().get_url()
@@ -72,7 +95,7 @@ def get_url(page, dest_page_type):
         return "#"
 
 
-class DonateHomePage(DonateFormMixin, Page, MetadataPageMixin):
+class DonateHomePage(DonateFormMixin, DonateFormAmountsMixin, Page, MetadataPageMixin):
     ### FIELDS
 
     # lead section
@@ -155,7 +178,16 @@ class DonateHomePage(DonateFormMixin, Page, MetadataPageMixin):
             "sociální sítě",
         ),
         FieldPanel("matomo_id"),
-        FieldPanel("portal_project_id"),
+        MultiFieldPanel(
+            [
+                FieldPanel("portal_project_id"),
+                FieldPanel("form_amount_1"),
+                FieldPanel("form_amount_2"),
+                FieldPanel("form_amount_3"),
+                FieldPanel("form_preselected"),
+            ],
+            "nastavenĂ­ darĹŻ",
+        ),
     ]
 
     ### RELATIONS
@@ -247,7 +279,9 @@ class DonateRegionIndexPage(Page, SubpageMixin, MetadataPageMixin):
         return context
 
 
-class DonateRegionPage(DonateFormMixin, Page, SubpageMixin, MetadataPageMixin):
+class DonateRegionPage(
+    DonateFormMixin, DonateFormAmountsMixin, Page, SubpageMixin, MetadataPageMixin
+):
     ### FIELDS
 
     main_title = models.CharField("hlavní nadpis na stránce", max_length=250)
@@ -279,7 +313,18 @@ class DonateRegionPage(DonateFormMixin, Page, SubpageMixin, MetadataPageMixin):
         ),
     ]
 
-    settings_panels = [FieldPanel("portal_project_id")]
+    settings_panels = [
+        MultiFieldPanel(
+            [
+                FieldPanel("portal_project_id"),
+                FieldPanel("form_amount_1"),
+                FieldPanel("form_amount_2"),
+                FieldPanel("form_amount_3"),
+                FieldPanel("form_preselected"),
+            ],
+            "nastavenĂ­ darĹŻ",
+        ),
+    ]
 
     ### RELATIONS
 
@@ -351,16 +396,9 @@ class DonateProjectIndexPage(Page, SubpageMixin, MetadataPageMixin):
         return context
 
 
-class DonateProjectPage(DonateFormMixin, Page, SubpageMixin, MetadataPageMixin):
-    FIRST = 1
-    SECOND = 2
-    THIRD = 3
-    FORM_CHOICES = [
-        (FIRST, "prvnĂ­"),
-        (SECOND, "druhá"),
-        (THIRD, "třetí"),
-    ]
-
+class DonateProjectPage(
+    DonateFormMixin, DonateFormAmountsMixin, Page, SubpageMixin, MetadataPageMixin
+):
     ### FIELDS
 
     date = models.DateField("běží od")
@@ -384,12 +422,6 @@ class DonateProjectPage(DonateFormMixin, Page, SubpageMixin, MetadataPageMixin):
     )
     expected_amount = models.IntegerField("očekávaná částka", blank=True, null=True)
     donated_amount = models.IntegerField("vybraná částka", blank=True, null=True)
-    form_amount_1 = models.IntegerField("pevná částka 1", default=100)
-    form_amount_2 = models.IntegerField("pevná částka 2", default=200)
-    form_amount_3 = models.IntegerField("pevná částka 3", default=500)
-    form_preselected = models.IntegerField(
-        "výchozí částka", default=FIRST, choices=FORM_CHOICES
-    )
     # we will use photo as search image
     search_image = None
 
diff --git a/donate/templates/donate/donate_home_page.html b/donate/templates/donate/donate_home_page.html
index ed690217..a27f8e40 100644
--- a/donate/templates/donate/donate_home_page.html
+++ b/donate/templates/donate/donate_home_page.html
@@ -69,22 +69,7 @@
             <div class="form-group row mb-4 align-items-center">
               <legend class="col-form-label col-md-4 col-form-label-lg">Částka</legend>
               <div class="col-md-8">
-                  <div class="custom-control custom-radio custom-control-inline">
-                    <input type="radio" id="amount1" name="amount" value="200" class="custom-control-input">
-                    <label class="custom-control-label col-form-label-lg" for="amount1">200 KÄŤ</label>
-                  </div>
-                  <div class="custom-control custom-radio custom-control-inline">
-                    <input type="radio" id="amount2" name="amount" value="500" class="custom-control-input" checked required>
-                    <label class="custom-control-label col-form-label-lg" for="amount2">500 KÄŤ</label>
-                  </div>
-                  <div class="custom-control custom-radio custom-control-inline">
-                    <input type="radio" id="amount3" name="amount" value="1000" class="custom-control-input">
-                    <label class="custom-control-label col-form-label-lg" for="amount3">1000 KÄŤ</label>
-                  </div>
-                  <div class="custom-control custom-radio custom-control-inline">
-                    <input type="radio" id="amount4" name="amount" value="-1" class="custom-control-input">
-                    <label class="custom-control-label col-form-label-lg" for="amount4">Jiná částka</label>
-                  </div>
+                {% include "donate/form_amounts_snippet.html" %}
               </div>
             </div>
             <div class="form-group row mb-4 align-items-center" id="js-custom-amount-input" style="display: none;">
diff --git a/donate/templates/donate/donate_project_page.html b/donate/templates/donate/donate_project_page.html
index 34e90352..3b44ee88 100644
--- a/donate/templates/donate/donate_project_page.html
+++ b/donate/templates/donate/donate_project_page.html
@@ -99,22 +99,7 @@
                   <div class="form-group row mb-4 align-items-center">
                       <legend class="col-form-label col-md-12 col-form-label-lg">Částka</legend>
                       <div class="col-md-12">
-                          <div class="custom-control custom-radio custom-control-inline">
-                            <input type="radio" id="amount1" name="amount" value="{{ page.form_amount_1 }}" class="custom-control-input"{% if page.form_preselected == page.FIRST %} checked{% endif %}>
-                            <label class="custom-control-label col-form-label-lg" for="amount1">{{ page.form_amount_1 }} KÄŤ</label>
-                          </div>
-                          <div class="custom-control custom-radio custom-control-inline">
-                            <input type="radio" id="amount2" name="amount" value="{{ page.form_amount_2 }}" class="custom-control-input"{% if page.form_preselected == page.SECOND %} checked{% endif %}>
-                            <label class="custom-control-label col-form-label-lg" for="amount2">{{ page.form_amount_2 }} KÄŤ</label>
-                          </div>
-                          <div class="custom-control custom-radio custom-control-inline">
-                            <input type="radio" id="amount3" name="amount" value="{{ page.form_amount_3 }}" class="custom-control-input"{% if page.form_preselected == page.THIRD %} checked{% endif %}>
-                            <label class="custom-control-label col-form-label-lg" for="amount3">{{ page.form_amount_3 }} KÄŤ</label>
-                          </div>
-                          <div class="custom-control custom-radio custom-control-inline">
-                            <input type="radio" id="amount4" name="amount" value="-1" class="custom-control-input">
-                            <label class="custom-control-label col-form-label-lg" for="amount4">Jiná částka</label>
-                          </div>
+                        {% include "donate/form_amounts_snippet.html" %}
                       </div>
                   </div>
                   <div class="form-group row mb-2 align-items-center" id="js-custom-amount-input" style="display: none;">
diff --git a/donate/templates/donate/donate_region_page.html b/donate/templates/donate/donate_region_page.html
index 6b82b5a8..9549d5c1 100644
--- a/donate/templates/donate/donate_region_page.html
+++ b/donate/templates/donate/donate_region_page.html
@@ -56,22 +56,7 @@
                 <div class="form-group row mb-4 align-items-center">
                   <legend class="col-form-label col-md-12 col-form-label-lg">Částka</legend>
                   <div class="col-md-12">
-                    <div class="custom-control custom-radio custom-control-inline">
-                      <input type="radio" id="amount1" name="amount" value="200" class="custom-control-input">
-                      <label class="custom-control-label col-form-label-lg" for="amount1">200 KÄŤ</label>
-                    </div>
-                    <div class="custom-control custom-radio custom-control-inline">
-                      <input type="radio" id="amount2" name="amount" value="500" class="custom-control-input" checked>
-                      <label class="custom-control-label col-form-label-lg" for="amount2">500 KÄŤ</label>
-                    </div>
-                    <div class="custom-control custom-radio custom-control-inline">
-                      <input type="radio" id="amount3" name="amount" value="1000" class="custom-control-input">
-                      <label class="custom-control-label col-form-label-lg" for="amount3">1000 KÄŤ</label>
-                    </div>
-                    <div class="custom-control custom-radio custom-control-inline">
-                      <input type="radio" id="amount4" name="amount" value="-1" class="custom-control-input">
-                      <label class="custom-control-label col-form-label-lg" for="amount4">Jiná částka</label>
-                    </div>
+                    {% include "donate/form_amounts_snippet.html" %}
                   </div>
                 </div>
                 <div class="form-group row mb-2 align-items-center" id="js-custom-amount-input" style="display: none;">
diff --git a/donate/templates/donate/form_amounts_snippet.html b/donate/templates/donate/form_amounts_snippet.html
new file mode 100644
index 00000000..c6f0c43b
--- /dev/null
+++ b/donate/templates/donate/form_amounts_snippet.html
@@ -0,0 +1,16 @@
+<div class="custom-control custom-radio custom-control-inline">
+  <input type="radio" id="amount1" name="amount" value="{{ page.form_amount_1 }}" class="custom-control-input"{% if page.form_preselected == page.FIRST %} checked{% endif %}>
+  <label class="custom-control-label col-form-label-lg" for="amount1">{{ page.form_amount_1 }} KÄŤ</label>
+</div>
+<div class="custom-control custom-radio custom-control-inline">
+  <input type="radio" id="amount2" name="amount" value="{{ page.form_amount_2 }}" class="custom-control-input"{% if page.form_preselected == page.SECOND %} checked{% endif %}>
+  <label class="custom-control-label col-form-label-lg" for="amount2">{{ page.form_amount_2 }} KÄŤ</label>
+</div>
+<div class="custom-control custom-radio custom-control-inline">
+  <input type="radio" id="amount3" name="amount" value="{{ page.form_amount_3 }}" class="custom-control-input"{% if page.form_preselected == page.THIRD %} checked{% endif %}>
+  <label class="custom-control-label col-form-label-lg" for="amount3">{{ page.form_amount_3 }} KÄŤ</label>
+</div>
+<div class="custom-control custom-radio custom-control-inline">
+  <input type="radio" id="amount4" name="amount" value="-1" class="custom-control-input">
+  <label class="custom-control-label col-form-label-lg" for="amount4">Jiná částka</label>
+</div>
-- 
GitLab