Contact forms update.
authorRadek Czajka <rczajka@rczajka.pl>
Mon, 16 Sep 2019 13:00:42 +0000 (15:00 +0200)
committerRadek Czajka <rczajka@rczajka.pl>
Mon, 16 Sep 2019 13:00:42 +0000 (15:00 +0200)
13 files changed:
requirements/requirements.txt
src/contact/admin.py
src/contact/fields.py
src/contact/forms.py
src/contact/models.py
src/contact/views.py
src/wolnelektury/contact_forms.py
src/wolnelektury/settings/apps.py
src/wolnelektury/settings/contrib.py
src/wolnelektury/templates/forms/form_detail.html [new file with mode: 0644]
src/wolnelektury/templates/forms/form_sent.html [new file with mode: 0644]
src/wolnelektury/templates/forms/includes/built_form.html [new file with mode: 0644]
src/wolnelektury/urls.py

index ce0b5e9..3af1448 100644 (file)
@@ -1,7 +1,7 @@
 -i https://py.mdrn.pl/simple/
 
 # django
-Django==2.2.4
+Django==2.2.5
 fnpdjango==0.4
 
 #django-pipeline==1.6.13
@@ -22,6 +22,10 @@ djangorestframework-xml
 django-admin-ordering==0.10.0
 django-machina==1.0.2
 
+# A version compatible with Django 2.2, with long help text and editable max_length.
+-e git+https://github.com/rczajka/django-forms-builder@1e57b980ef5778895512218fbea015ed428dc89a#egg=django-forms-builder
+
+
 oauthlib>=3.0.1,<3.1
 
 # contact
index cf8d06c..98413f3 100644 (file)
@@ -56,7 +56,7 @@ class ContactAdmin(admin.ModelAdmin, metaclass=ContactAdminMeta):
             else:
                 # Create readonly fields from the body JSON.
                 attachments = list(instance.attachment_set.all())
-                body_keys = body.keys() + [a.tag for a in attachments]
+                body_keys = list(body.keys()) + [a.tag for a in attachments]
 
                 # Find the original form.
                 try:
index 578776a..ce85c22 100644 (file)
@@ -2,6 +2,8 @@
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
 from django import forms
+from django.utils.html import conditional_escape
+from django.utils.safestring import mark_safe
 from .widgets import HeaderWidget
 
 
@@ -9,4 +11,11 @@ class HeaderField(forms.CharField):
     def __init__(self, required=False, widget=None, *args, **kwargs):
         if widget is None:
             widget = HeaderWidget
-        super(HeaderField, self).__init__(required=required, widget=widget, *args, **kwargs)
+        super(HeaderField, self).__init__(required=False, widget=widget, *args, **kwargs)
+        self.label = mark_safe('<b>' + conditional_escape(self.label) + '</b>')
+
+
+class SeparatorField(HeaderField):
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        self.label = ''
index ecdc47d..8fe0070 100644 (file)
@@ -76,15 +76,14 @@ class ContactForm(forms.Form, metaclass=ContactFormMeta):
             'site_domain': getattr(self, 'site_domain', site.domain),
             'contact': contact,
         }
-        context = RequestContext(request)
         mail_managers_subject = render_to_string([
                 'contact/%s/mail_managers_subject.txt' % self.form_tag,
                 'contact/mail_managers_subject.txt', 
-            ], dictionary, context).strip()
+            ], dictionary, request).strip()
         mail_managers_body = render_to_string([
                 'contact/%s/mail_managers_body.txt' % self.form_tag,
                 'contact/mail_managers_body.txt', 
-            ], dictionary, context)
+            ], dictionary, request)
         mail_managers(mail_managers_subject, mail_managers_body, fail_silently=True)
 
         try:
@@ -95,19 +94,19 @@ class ContactForm(forms.Form, metaclass=ContactFormMeta):
             mail_subject = render_to_string([
                     'contact/%s/mail_subject.txt' % self.form_tag,
                     'contact/mail_subject.txt', 
-                ], dictionary, context).strip()
+                ], dictionary, request).strip()
             if self.result_page:
                 mail_body = render_to_string(
                     'contact/%s/results_email.txt' % contact.form_tag,
                     {
                         'contact': contact,
                         'results': self.results(contact),
-                    }, context)
+                    }, request)
             else:
                 mail_body = render_to_string([
                         'contact/%s/mail_body.txt' % self.form_tag,
                         'contact/mail_body.txt',
-                    ], dictionary, context)
+                    ], dictionary, request)
             send_mail(mail_subject, mail_body, 'no-reply@%s' % site.domain, [contact.contact], fail_silently=True)
 
         return contact
index 929106e..e365990 100644 (file)
@@ -23,7 +23,7 @@ class Contact(models.Model):
         if type(value) in (tuple, list, dict):
             value = yaml.safe_dump(value, allow_unicode=True, default_flow_style=False)
             if for_html:
-                value = smart_text(value).replace(" ", unichr(160))
+                value = smart_text(value).replace(" ", chr(160))
         return value
 
     class Meta:
index 6f62052..5f22f79 100644 (file)
@@ -43,7 +43,7 @@ def form(request, form_tag, force_enabled=False):
         formsets = {
             prefix: formset_class(request.POST, request.FILES, prefix=prefix)
             for prefix, formset_class in formset_classes.items()}
-        if form.is_valid() and all(formset.is_valid() for formset in formsets.itervalues()):
+        if form.is_valid() and all(formset.is_valid() for formset in formsets.values()):
             contact = form.save(request, formsets.values())
             if form.result_page:
                 return redirect('contact_results', contact.id, contact.digest())
index 9eb87ff..89baea9 100644 (file)
@@ -70,7 +70,7 @@ class KonkursForm(ContactForm):
 
 
 class CoJaCzytamForm(ContactForm):
-    form_tag = 'cojaczytam'
+    form_tag = 'cojaczytam2019'
     form_title = "#cojaczytam?"
     admin_list = ['opiekun_nazwisko', 'contact', 'nazwa_kampanii']
     # ends_on = (2018, 11, 16)
@@ -80,17 +80,22 @@ class CoJaCzytamForm(ContactForm):
     opiekun_nazwisko = forms.CharField(label='Imię i nazwisko Opiekuna/ki', max_length=128)
     contact = forms.EmailField(label='Adres e-mail Opiekuna/ki', max_length=128)
     opiekun_tel = forms.CharField(label='Numer telefonu Opiekuna/ki', max_length=32)
-    nazwa_dkk = forms.CharField(label='Nazwa szkoły/biblioteki publicznej', max_length=128)
-    adres_dkk = forms.CharField(label='Adres szkoły/biblioteki publicznej', max_length=128)
 
+    hadres = HeaderField(label=mark_safe('<b>Placówka</b>'))
+    nazwa_dkk = forms.CharField(label='Nazwa placówki', max_length=128)
+    adres1_dkk = forms.CharField(label='Ulica i numer', max_length=128)
+    adres2_dkk = forms.CharField(label='Miejscowość', max_length=128)
+    adres3_dkk = forms.CharField(label='Kod pocztowy', max_length=128)
+
+    hkampania = HeaderField(label=mark_safe('<b>Kampania</b>'))
     nazwa_kampanii = forms.CharField(label='Nazwa kampanii', max_length=255)
 
     wiek = forms.ChoiceField(label='Grupa wiekowa', choices=(
-        ('9-14', 'uczniowie kl. IV-VIII szkół podstawowych w wieku 9-14 lat,'),
-        ('15-19', 'uczniowie gimnazjum oraz wszystkich typów szkół ponadpodstawowych w wieku 15-19.'),
+        ('9-14', 'uczestnicy w wieku 9-14 lat,'),
+        ('15-19', 'uczestnicy w wieku 15-19.'),
     ), widget=forms.RadioSelect)
 
-    uczestnik1_header = HeaderField(label='Dane\xa0Uczestników (3 do 5)')
+    uczestnik1_header = HeaderField(label=mark_safe('<b>Dane\xa0Uczestników (3\xa0do\xa05)</b>'))
     uczestnik1_imie = forms.CharField(label='Imię', max_length=128)
     uczestnik1_nazwisko = forms.CharField(label='Nazwisko', max_length=128)
     uczestnik1_email = forms.EmailField(label='Adres e-mail', max_length=128)
@@ -111,33 +116,32 @@ class CoJaCzytamForm(ContactForm):
     uczestnik5_nazwisko = forms.CharField(label='Nazwisko', max_length=128, required=False)
     uczestnik5_email = forms.EmailField(label='Adres e-mail', max_length=128, required=False)
 
-    ankieta_header = HeaderField(label='')
-    opis_kampanii = forms.CharField(
-        label='Krótki opis realizacji oraz przebiegu kampanii', max_length=255, widget=forms.Textarea)
-    co_sie_udalo = forms.CharField(label='Co udało Wam się zrealizować?', max_length=1024, widget=forms.Textarea)
-    co_sie_nie_udalo = forms.CharField(
-        label='Czy jest coś, co chcieliście zrealizować, a się nie udało? Jeśli tak, to dlaczego?', max_length=1024,
+    ankieta_header = HeaderField(label=mark_safe('<b>Efekty</b>'))
+    opis_kampanii = forms.CharField(help_text='maks. 250 znaków',
+        label='Krótki opis realizacji oraz przebiegu kampanii', max_length=250, widget=forms.Textarea)
+    co_sie_udalo = forms.CharField(help_text='maks. 1000 znaków',label='Co udało Wam się zrealizować?', max_length=1000, widget=forms.Textarea)
+    co_sie_nie_udalo = forms.CharField(help_text='maks. 1000 znaków',
+        label='Czy jest coś, co chcieliście zrealizować, a się nie udało? Jeśli tak, to dlaczego?', max_length=1000,
         widget=forms.Textarea)
-    wnioski = forms.CharField(
-        label='Jakie wnioski na przyszłość wyciągnęliście z tego, czego się nie udało zrealizować?', max_length=1024,
+    wnioski = forms.CharField(help_text='maks. 1000 znaków',
+        label='Jakie wnioski na przyszłość wyciągnęliście z tego, czego się nie udało zrealizować?', max_length=1000,
         widget=forms.Textarea)
-    zasieg = forms.CharField(
+    zasieg = forms.CharField(help_text='maks. 1000 znaków',
         label='Do ilu odbiorców udało Wam się dotrzeć z Waszą kompanią? Podaj liczbę, może być szacunkowa.',
-        max_length=1024, widget=forms.Textarea)
-    grupy_odbiorcow = forms.CharField(
+        max_length=1000, widget=forms.Textarea)
+    grupy_odbiorcow = forms.CharField(help_text='maks. 1000 znaków',
         label='Do jakich grup odbiorców dotarliście (np. uczniowie, nauczyciele, rodzice, seniorzy, inni)?',
-        max_length=1024, widget=forms.Textarea)
+        max_length=1000, widget=forms.Textarea)
     plik = forms.FileField(
         label='Plik .zip ze stworzonymi materiałami (np. zdjęcia, dokumenty tekstowe)')
-    materialy = forms.CharField(
-        label='Adresy stworzonych materiałów online (jeśli dotyczy)', max_length=1024, widget=forms.Textarea,
-        required=False)
+    materialy = forms.CharField(help_text='maks. 1000 znaków',
+        label='Adresy stworzonych materiałów online', max_length=1000, widget=forms.Textarea)
 
-    agree_header = HeaderField(label='Oświadczenia')
+    agree_header = HeaderField(label=mark_safe('<b>Oświadczenia</b>'))
     agree_terms = forms.BooleanField(
         label='Regulamin',
         help_text=mark_safe_lazy(
-            'Znam i akceptuję <a href="/media/chunks/attachment/Regulamin_konkursu_cojaczytam_edycja_2018.pdf">'
+            'Znam i akceptuję <a href="/media/chunks/attachment/Regulamin_konkursu_cojaczytam_edycja_2019.pdf">'
             'Regulamin Konkursu</a>.'),
     )
     agree_data = forms.BooleanField(
index 7797d3a..fa2f82f 100644 (file)
@@ -32,6 +32,7 @@ INSTALLED_APPS_OUR = [
     'isbn',
     'paypal',
     'push',
+    'club.apps.ClubConfig',
 ]
 
 INSTALLED_APPS_CONTRIB = [
@@ -58,7 +59,7 @@ INSTALLED_APPS_CONTRIB = [
     'getpaid',
     'getpaid.backends.payu',
     'django_extensions',
-    'club.apps.ClubConfig',
+    'forms_builder.forms',
 
     'debug_toolbar',
 
index 66c8762..ce08821 100644 (file)
@@ -51,3 +51,14 @@ HAYSTACK_CONNECTIONS = {
         'ENGINE': 'haystack.backends.simple_backend.SimpleEngine',
     },
 }
+
+
+FORMS_BUILDER_USE_SITES = False
+FORMS_BUILDER_EDITABLE_FIELD_MAX_LENGTH = True
+FORMS_BUILDER_EDITABLE_SLUGS = True
+FORMS_BUILDER_EXTRA_FIELDS = [
+        (100, 'contact.fields.HeaderField', 'Header'),
+        (101, 'contact.fields.SeparatorField', 'Separator'),
+]
+FORMS_BUILDER_HELPTEXT_MAX_LENGTH = 2048
+FORMS_BUILDER_REQUIRED_CSS_CLASS = 'required'
diff --git a/src/wolnelektury/templates/forms/form_detail.html b/src/wolnelektury/templates/forms/form_detail.html
new file mode 100644 (file)
index 0000000..519681b
--- /dev/null
@@ -0,0 +1,8 @@
+{% extends form.base_template|default:"base/base.html" %}
+{% load forms_builder_tags %}
+
+{% block title %}{{ form.title }}{% endblock %}
+
+{% block body %}
+   {% render_built_form form %}
+{% endblock %}
diff --git a/src/wolnelektury/templates/forms/form_sent.html b/src/wolnelektury/templates/forms/form_sent.html
new file mode 100644 (file)
index 0000000..dbed3ce
--- /dev/null
@@ -0,0 +1,9 @@
+{% extends form.base_template|default:"base/base.html" %}
+{% load forms_builder_tags %}
+
+{% block title %}{{ form.title }}{% endblock %}
+
+{% block body %}
+   <h1>{{ form.title }}</h1>
+   <p>{{ form.response }}</p>
+{% endblock %}
diff --git a/src/wolnelektury/templates/forms/includes/built_form.html b/src/wolnelektury/templates/forms/includes/built_form.html
new file mode 100644 (file)
index 0000000..4a8807f
--- /dev/null
@@ -0,0 +1,18 @@
+{% load honeypot %}
+
+<h1>{{ form.title }}</h1>
+
+    <div class="form-info">
+       {{ form.intro|safe }}
+    </div>
+
+    {{ form_for_form.media }}
+    <form method="POST" action="{{ form.get_absolute_url }}" {% if form_for_form.is_multipart %}enctype="multipart/form-data"{% endif %} class="submit-form">
+    {% csrf_token %}
+    {% render_honeypot_field %}
+    <table>
+        {{ form_for_form.as_table }}
+        <tr><td></td><td><button>{{ form.button_text }}</button></td></tr>
+    </table>
+    </form>
+
index 97443fa..bb2c54e 100644 (file)
@@ -42,6 +42,7 @@ urlpatterns += [
     url(r'^ankieta/', include('polls.urls')),
     url(r'^biblioteki/', include('libraries.urls')),
     url(r'^newsletter/', include('newsletter.urls')),
+    url(r'^formularz-new/', include('forms_builder.forms.urls')),
     url(r'^formularz/', include('contact.urls')),
     url(r'^isbn/', include('isbn.urls')),