From 9db571994ff96a1b2612410ca0a9513f1eb9a1ce Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Bedna=C5=99=C3=ADk?= <jan.bednarik@gmail.com>
Date: Mon, 29 Mar 2021 15:42:13 +0200
Subject: [PATCH] uniweb: Captcha in forms

---
 .isort.cfg                                    | 2 +-
 majak/settings/base.py                        | 8 ++++++++
 majak/urls.py                                 | 2 ++
 requirements/base.in                          | 1 +
 requirements/base.txt                         | 8 +++++---
 uniweb/models.py                              | 7 ++++++-
 uniweb/templates/uniweb/uniweb_form_page.html | 9 +++++++--
 7 files changed, 30 insertions(+), 7 deletions(-)

diff --git a/.isort.cfg b/.isort.cfg
index 6376f49d..24b9a93d 100644
--- a/.isort.cfg
+++ b/.isort.cfg
@@ -4,4 +4,4 @@ line_length = 88
 multi_line_output = 3
 default_section = "THIRDPARTY"
 include_trailing_comma = true
-known_third_party = arrow,django,environ,faker,ics,markdown,modelcluster,pirates,pytest,pytz,requests,sentry_sdk,snapshottest,taggit,wagtail,wagtailmetadata
+known_third_party = arrow,captcha,django,environ,faker,ics,markdown,modelcluster,pirates,pytest,pytz,requests,sentry_sdk,snapshottest,taggit,wagtail,wagtailmetadata
diff --git a/majak/settings/base.py b/majak/settings/base.py
index 00ec6c44..262f55fa 100644
--- a/majak/settings/base.py
+++ b/majak/settings/base.py
@@ -52,6 +52,7 @@ INSTALLED_APPS = [
     "regulace_konopi",
     "green_deal",
     "widget_tweaks",
+    "captcha",
     "wagtail.contrib.forms",
     "wagtail.contrib.redirects",
     "wagtail.contrib.modeladmin",
@@ -232,6 +233,13 @@ MAJAK_ENV = env.str("MAJAK_ENV", default="prod")
 
 SETTINGS_EXPORT = ["MAJAK_ENV"]
 
+CAPTCHA_BACKGROUND_COLOR = "#fafafa"
+CAPTCHA_FOREGROUND_COLOR = "#303132"
+CAPTCHA_LETTER_ROTATION = (-20, 20)
+CAPTCHA_FONT_SIZE = 30
+CAPTCHA_IMAGE_SIZE = (120, 47)
+
+
 # CUSTOM APPS SETTINGS
 # ------------------------------------------------------------------------------
 DONATE_PORTAL_REDIRECT_URL = env.str("DONATE_PORTAL_REDIRECT_URL", default="")
diff --git a/majak/urls.py b/majak/urls.py
index b2aa7c7c..44cf8412 100644
--- a/majak/urls.py
+++ b/majak/urls.py
@@ -1,3 +1,4 @@
+import captcha.urls
 from django.conf import settings
 from django.conf.urls import include, url
 from django.contrib import admin
@@ -13,6 +14,7 @@ urlpatterns = [
     url(r"^admin/", include(wagtailadmin_urls)),
     url(r"^documents/", include(wagtaildocs_urls)),
     url(r"^search/$", search_views.search, name="search"),
+    url(r"^captcha/", include(captcha.urls)),
 ] + pirates_urlpatterns
 
 
diff --git a/requirements/base.in b/requirements/base.in
index 2c9d1c31..76b21d69 100644
--- a/requirements/base.in
+++ b/requirements/base.in
@@ -5,6 +5,7 @@ django-extensions
 django-redis
 django-settings-export
 django-widget-tweaks
+django-simple-captcha
 psycopg2-binary
 pirates<=0.6
 whitenoise
diff --git a/requirements/base.txt b/requirements/base.txt
index 8a1aec03..06638dde 100644
--- a/requirements/base.txt
+++ b/requirements/base.txt
@@ -16,12 +16,14 @@ django-environ==0.4.5     # via -r base.in
 django-extensions==3.1.1  # via -r base.in
 django-filter==2.4.0      # via wagtail
 django-modelcluster==5.1  # via wagtail
+django-ranged-response==0.2.0  # via django-simple-captcha
 django-redis==4.12.1      # via -r base.in
 django-settings-export==1.2.1  # via -r base.in
+django-simple-captcha==0.5.14  # via -r base.in
 django-taggit==1.3.0      # via wagtail
 django-treebeard==4.5.1   # via wagtail
 django-widget-tweaks==1.4.8  # via -r base.in
-django==3.1.7             # via django-filter, django-redis, django-settings-export, django-taggit, django-treebeard, djangorestframework, mozilla-django-oidc, wagtail
+django==3.1.7             # via django-filter, django-ranged-response, django-redis, django-settings-export, django-simple-captcha, django-taggit, django-treebeard, djangorestframework, mozilla-django-oidc, wagtail
 djangorestframework==3.12.4  # via wagtail
 draftjs-exporter==2.1.7   # via wagtail
 et-xmlfile==1.0.1         # via openpyxl
@@ -35,7 +37,7 @@ mozilla-django-oidc==1.2.4  # via pirates
 numpy==1.20.2             # via opencv-python
 opencv-python==4.5.1.48   # via -r base.in
 openpyxl==3.0.7           # via tablib
-pillow==8.1.2             # via wagtail
+pillow==8.1.2             # via django-simple-captcha, wagtail
 pirates==0.5.0            # via -r base.in
 psycopg2-binary==2.8.6    # via -r base.in
 pycparser==2.20           # via cffi
@@ -45,7 +47,7 @@ pytz==2021.1              # via django, django-modelcluster, l18n
 redis==3.5.3              # via django-redis
 requests==2.25.1          # via -r base.in, mozilla-django-oidc, wagtail
 sentry-sdk==1.0.0         # via -r base.in
-six==1.15.0               # via html5lib, ics, l18n, mozilla-django-oidc, pyopenssl, python-dateutil
+six==1.15.0               # via django-simple-captcha, html5lib, ics, l18n, mozilla-django-oidc, pyopenssl, python-dateutil
 soupsieve==2.2.1          # via beautifulsoup4
 sqlparse==0.4.1           # via django
 tablib[xls,xlsx]==3.0.0   # via wagtail
diff --git a/uniweb/models.py b/uniweb/models.py
index b1370705..c3cd4f88 100644
--- a/uniweb/models.py
+++ b/uniweb/models.py
@@ -1,3 +1,4 @@
+from captcha.fields import CaptchaField
 from django import forms
 from django.core.paginator import Paginator
 from django.db import models
@@ -489,7 +490,6 @@ class UniwebFormPage(AbstractForm, SubpageMixin, MetadataPageMixin):
     ### PANELS
 
     content_panels = AbstractForm.content_panels + [
-        FormSubmissionsPanel(),
         StreamFieldPanel("content_before"),
         InlinePanel("form_fields", label="formulář"),
         StreamFieldPanel("content_after"),
@@ -534,3 +534,8 @@ class UniwebFormPage(AbstractForm, SubpageMixin, MetadataPageMixin):
 
     class Meta:
         verbose_name = "Formulářová stránka"
+
+    def get_form_class(self):
+        form = super().get_form_class()
+        form.base_fields["captcha"] = CaptchaField(label="opište písmena z obrázku")
+        return form
diff --git a/uniweb/templates/uniweb/uniweb_form_page.html b/uniweb/templates/uniweb/uniweb_form_page.html
index a1b8c094..84878524 100644
--- a/uniweb/templates/uniweb/uniweb_form_page.html
+++ b/uniweb/templates/uniweb/uniweb_form_page.html
@@ -58,8 +58,13 @@
                   <label class="form-field__label" for="{{ field.id_for_label }}">{{ field.label }}</label>
                 </div>
               </div>
+            {% elif field.widget_type == "captchatext" %}
+              <label class="form-field__label" for="{{ field.id_for_label }}">{{ field.label }}</label>
+              <div class="form-field__wrapper form-field__wrapper--shadowed w-1/2">
+                {{ field|add_class:"text-input form-field__control" }}
+              </div>
             {% else %}
-              <label class="form-field__label" for="{{ field.id_for_label }}">{{ field.label }} ({{ field.widget_type }})</label>
+              <label class="form-field__label" for="{{ field.id_for_label }}">{{ field.label }}</label>
               <div class="form-field__wrapper form-field__wrapper--shadowed">
                 {{ field|add_class:"text-input form-field__control" }}
               </div>
@@ -77,7 +82,7 @@
         {% endfor %}
       </div>
 
-      <button class="btn text-lg mt-6 mb-4 btn--black-100">
+      <button class="btn text-lg mt-6 mb-4 btn--black-100 btn--hoveractive">
         <div class="btn__body ">odeslat</div>
       </button>
     </form>
-- 
GitLab