Merge branch 'forum'
authorAleksander Łukasz <aleksander.lukasz@nowoczesnapolska.org.pl>
Tue, 8 Oct 2013 09:48:42 +0000 (11:48 +0200)
committerAleksander Łukasz <aleksander.lukasz@nowoczesnapolska.org.pl>
Tue, 8 Oct 2013 09:48:42 +0000 (11:48 +0200)
16 files changed:
contact/admin.py
contact/forms.py
contact/models.py
contact/templates/contact/mail_managers_body.txt
contact/templatetags/__init__.py [new file with mode: 0755]
contact/templatetags/contact_tags.py [new file with mode: 0755]
contact/views.py
edumed/contact_forms.py
edumed/settings.d/50-static.py
edumed/static/js/formset.js [new file with mode: 0755]
edumed/templates/base.html
edumed/templates/contact/wtem/form.html [new file with mode: 0755]
edumed/templates/contact/wtem/mail_body.txt [new file with mode: 0755]
edumed/templates/contact/wtem/mail_subject.txt [new file with mode: 0755]
edumed/templates/contact/wtem/thanks.html [new file with mode: 0755]
requirements.txt

index ee1623d..33b1963 100644 (file)
@@ -29,7 +29,7 @@ class ContactAdmin(admin.ModelAdmin):
         except BaseException, e:
             return ''
         else:
-            return obj.body.get(field_name, '')
+            return Contact.pretty_print(obj.body.get(field_name, ''), for_html=True)
 
     def __getattr__(self, name):
         if name.startswith('admin_list_'):
@@ -75,7 +75,7 @@ class ContactAdmin(admin.ModelAdmin):
 
                 # Create field getters for fields and attachments.
                 for k, v in instance.body.items():
-                    f = (lambda v: lambda self: v)(v)
+                    f = (lambda v: lambda self: v)(Contact.pretty_print(v, for_html=True))
                     f.short_description = orig_fields[k].label if k in orig_fields else _(k)
                     setattr(self, "body__%s" % k, f)
 
index 0279e12..e369e95 100644 (file)
@@ -33,12 +33,22 @@ class ContactForm(forms.Form):
     required_css_class = 'required'
     contact = forms.CharField(max_length=128)
 
-    def save(self, request):
+    def save(self, request, formsets=None):
         from .models import Attachment, Contact
         body = {}
         for name, value in self.cleaned_data.items():
             if not isinstance(value, UploadedFile) and name != 'contact':
-                    body[name] = value
+                body[name] = value
+
+        for formset in formsets or []:
+            for f in formset.forms:
+                sub_body = {}
+                for name, value in f.cleaned_data.items():
+                    if not isinstance(value, UploadedFile):
+                        sub_body[name] = value
+                if sub_body:
+                    body.setdefault(f.form_tag, []).append(sub_body)
+                
         contact = Contact.objects.create(body=body,
                     ip=request.META['REMOTE_ADDR'],
                     contact=self.cleaned_data['contact'],
index 21d8405..6b33d29 100644 (file)
@@ -1,4 +1,5 @@
 # -*- coding: utf-8 -*-
+import yaml
 from django.core.files.storage import FileSystemStorage
 from django.db import models
 from django.utils.translation import ugettext_lazy as _
@@ -13,6 +14,16 @@ class Contact(models.Model):
     form_tag = models.CharField(_('form'), max_length=32, db_index=True)
     body = JSONField(_('body'))
 
+    @staticmethod
+    def pretty_print(value, for_html=False):
+        if type(value) in (tuple, list, dict):
+            value = yaml.safe_dump(value, 
+                allow_unicode=True,
+                default_flow_style=False)
+            if for_html:
+                value = value.replace(" ", unichr(160))
+        return value
+
     class Meta:
         ordering = ('-created_at',)
         verbose_name = _('submitted form')
index f9f3995..5088b1b 100644 (file)
@@ -1,10 +1,10 @@
-Wypełniono formularz {{ form_tag }} na stronie {{ site_name }}.
+{% load pretty_print from contact_tags %}Wypełniono formularz {{ form_tag }} na stronie {{ site_name }}.
 
 http://{{ site_domain }}{% url 'admin:contact_contact_change' contact.pk %}
 
 {% for k, v in contact.body.items %}
 {{ k }}:
-{{ v }}
+{{ v|pretty_print }}
 {% endfor %}
 {% for attachment in contact.attachment_set.all %}
 {{ attachment.tag }}:
diff --git a/contact/templatetags/__init__.py b/contact/templatetags/__init__.py
new file mode 100755 (executable)
index 0000000..e69de29
diff --git a/contact/templatetags/contact_tags.py b/contact/templatetags/contact_tags.py
new file mode 100755 (executable)
index 0000000..e84064a
--- /dev/null
@@ -0,0 +1,8 @@
+from django.template import Library
+from contact.models import Contact
+
+register = Library()
+
+@register.filter
+def pretty_print(value):
+    return Contact.pretty_print(value)
index d18598c..26ccf60 100644 (file)
@@ -14,14 +14,24 @@ def form(request, form_tag):
         raise Http404
     if request.method == 'POST':
         form = form_class(request.POST, request.FILES)
-        if form.is_valid():
-            form.save(request)
+        formsets = []
+        valid = form.is_valid()
+        for formset in getattr(form, 'form_formsets', ()):
+            fset = formset(request.POST, request.FILES)
+            if not fset.is_valid():
+                valid = False
+            formsets.append(fset)
+        if valid:
+            form.save(request, formsets)
             return redirect('contact_thanks', form_tag)
     else:
         form = form_class(initial=request.GET)
+        formsets = []
+        for formset in getattr(form, 'form_formsets', ()):
+            formsets.append(formset())
     return render(request,
                 ['contact/%s/form.html' % form_tag, 'contact/form.html'],
-                {'form': form}
+                {'form': form, 'formsets': formsets}
             )
 
 
index 89e5121..3ffdded 100644 (file)
@@ -81,3 +81,49 @@ class UdzialForm(ContactForm):
     contact = forms.EmailField(label=u'Adres e-mail', max_length=128)
     telefon = forms.CharField(label=u'Telefon', max_length=32)
     uczestnicy = forms.IntegerField(label=u'Przewidywana liczba uczestników zajęć')
+
+
+class WTEMStudentForm(forms.Form):
+    first_name = forms.CharField(label=u'Imię', max_length=128)
+    last_name = forms.CharField(label=u'Nazwisko', max_length=128)
+    email = forms.EmailField(label=u'Adres e-mail', max_length=128)
+    form_tag = "student"
+
+class NoEmptyFormsAllowedBaseFormSet(forms.formsets.BaseFormSet):
+    """
+    Won't allow formset_factory to be submitted with no forms
+    """
+    def clean(self):
+        for form in self.forms:
+            if form.cleaned_data:
+                return
+        raise forms.ValidationError(u"Proszę podać dane przynajmniej jednego ucznia.")
+
+class WTEMForm(ContactForm):
+    form_tag = "wtem"
+    form_title = u"WTEM - rejestracja uczestników"
+    submit_label = u"Wyślij zgłoszenie"
+    form_formsets = (forms.formsets.formset_factory(WTEMStudentForm, formset=NoEmptyFormsAllowedBaseFormSet),)
+
+    contact = forms.EmailField(label=u'Adres e-mail opiekuna/opiekunki', max_length=128)
+    imie = forms.CharField(label=u'Imię', max_length=128)
+    nazwisko = forms.CharField(label=u'Nazwisko', max_length=128)
+    function = forms.CharField(label=u'Pełniona funkcja', max_length=255)
+    institution = forms.CharField(label=u'Nazwa instytucji', max_length=255)
+    institution_address = forms.CharField(label=u'Adres instytucji', widget=forms.Textarea, max_length=1000)
+    institution_email = forms.EmailField(label=u'Adres e-mail instytucji', max_length=128)
+    institution_phone = forms.CharField(label=u'Telefon do instytucji', max_length=32)
+    institution_www = forms.URLField(label=u'Strona WWW instytucji', max_length=255, required=False)
+
+    zgoda_regulamin = forms.BooleanField(
+        label=u'Znam i akceptuję regulamin Wielkiego Turnieju Edukacji Medialnej.',
+        help_text=u'Zobacz <a href="/media/chunks/attachment/WTEM_regulamin_1.pdf">regulamin Wielkiego Turnieju Edukacji Medialnej</a>.'
+    )
+    potw_uczniowie = forms.BooleanField(
+        label=u'Potwierdzam, że zgłoszeni Uczestnicy/Uczestniczki w chwili rejestracji są uczniami/uczennicami szkoły ponadgimnazjalnej.',
+    )
+    zgoda_informacje = forms.BooleanField(
+        label=u'Wyrażam zgodę na otrzymywanie informacji od Fundacji Nowoczesna Polska związanych z edukacją medialną.',
+        required=False
+    )
+
index 780ce01..4d75c9a 100644 (file)
@@ -42,7 +42,7 @@ PIPELINE_JS = {
             'catalogue/js/lesson.js',
             'sponsors/js/sponsors.js',
             'curriculum/curriculum.js',
-
+            'js/formset.js',
             'pybb/js/pybbjs.js',
         ),
         'output_filename': 'compressed/base.js',
diff --git a/edumed/static/js/formset.js b/edumed/static/js/formset.js
new file mode 100755 (executable)
index 0000000..7a4657f
--- /dev/null
@@ -0,0 +1,30 @@
+(function($) {
+    $(function() {
+
+
+function cloneMore(selector, type) {
+    var newElement = $(selector).clone(true);
+    var total = $('#id_' + type + '-TOTAL_FORMS').val();
+    newElement.find(':input').each(function() {
+        var name = $(this).attr('name').replace('__prefix__', total);
+        var id = 'id_' + name;
+        $(this).attr({'name': name, 'id': id});
+    });
+    newElement.find('label').each(function() {
+        var newFor = $(this).attr('for').replace('__prefix__', total);
+        $(this).attr('for', newFor);
+    });
+    newElement.attr({'style': '', 'id': ''});
+    total++;
+    $('#id_' + type + '-TOTAL_FORMS').val(total);
+    $(selector).before(newElement);
+}
+
+
+
+            $('.add_more').click(function() {
+                cloneMore($(this).data('selector'), $(this).data('prefix'));
+            });
+
+    });
+})(jQuery);
index 5486d6d..1c8f434 100644 (file)
@@ -45,7 +45,7 @@
                 <li><a class="menu-lekcje" href="{% url "catalogue_lessons" %}">Lekcje</a></li>
                 <li><a class="menu-kompetencje" href="{% url "curriculum" %}">Kompetencje</a></li>
                 <li><a class="menu-wspolpraca" href="{% url "info" "wspolpraca/" %}">Współpraca</a></li>
-                <li><a class="menu-szkolenia" href="{% url "info" "konkurs/" %}">Konkurs</a></li>
+                <li><a class="menu-szkolenia" href="{% url "info" "turniej/" %}">Turniej</a></li>
                 <li><a class="menu-wesprzyj" href="{% url "info" "wesprzyj/" %}">Wesprzyj nas</a></li>
                 <li><a class="menu-o-nas" href="{% url "info" "o-nas/" %}">O nas</a></li>
                 <li><a class="menu-kontakt" href="{% url "info" "kontakt/" %}">Kontakt</a></li>
diff --git a/edumed/templates/contact/wtem/form.html b/edumed/templates/contact/wtem/form.html
new file mode 100755 (executable)
index 0000000..ca3b930
--- /dev/null
@@ -0,0 +1,66 @@
+{% extends "base.html" %}
+{% load chunks %}
+
+{% block title %}{{ form.form_title }}{% endblock %}
+
+{% block body %}
+
+
+
+
+
+
+    <h1>{% block contact_form_title %}{{ form.form_title }}{% endblock %}</h1>
+
+    <div class="form-info">
+    {% block contact_form_description %}
+        {% chunk "contact_form__"|add:form.form_tag %}
+    {% endblock %}
+    </div>
+
+    <form method="POST" action="." enctype="multipart/form-data" class="submit-form">
+    {% csrf_token %}
+    <h3>Dane Opiekuna/Opiekunki i instytucji zgłaszającej Uczestnika:</h3>
+    <table>
+        {{ form.as_table }}
+    </table>
+
+    {% for formset in formsets %}
+
+        {{ formset.management_form }}
+
+        <ul class="errorlist">
+        {% for err in formset.non_form_errors %}
+            <li>{{ err }}</li>
+        {% endfor %}
+        </ul>
+
+        {% for form in formset.forms %}
+            <h3>Dane Uczestnika/Uczestniczki:</h3>
+
+            <table>
+                {{ form.as_table }}
+            </table>
+        {% endfor %}
+
+        <div id="formstub-{{ formset.prefix }}" style="display:none">
+            <h3>Dane Uczestnika/Uczestniczki:</h3>
+            <table>
+                {{ formset.empty_form.as_table }}
+            </table>
+        </div>
+
+        <input type="button" value="+ Dodaj kolejną osobę" class="add_more" data-selector="#formstub-{{formset.prefix}}" data-prefix="{{formset.prefix}}">
+        <script>
+
+        </script>
+
+    {% endfor %}
+
+    <p>
+    <button style="font-size:1.5em;">{% block contact_form_submit %}{{ form.submit_label }}{% endblock %}</button>
+    </p>
+    </form>
+
+
+{% endblock %}
diff --git a/edumed/templates/contact/wtem/mail_body.txt b/edumed/templates/contact/wtem/mail_body.txt
new file mode 100755 (executable)
index 0000000..0c20f5f
--- /dev/null
@@ -0,0 +1,18 @@
+Dziękujemy za rejestrację w Wielkim Turnieju Edukacji Medialnej.
+Do udziału zostały zgłoszone następujące osoby:
+{% for student in contact.body.student %}
+* {{ student.first_name }} {{ student.last_name }}{% endfor %}
+
+Pierwszy etap Turnieju odbędzie się 21 listopada 2013 r. o godz. 15.30.
+Po zakończeniu rejestracji (4 listopada) każdy Uczestnik otrzyma maila
+z indywidualną instrukcją dotyczącą udziału w I etapie Turnieju.
+
+Wszystkie ogłoszenia związane z Turniejem będą publikowane na stronie
+http://edukacjamedialna.edu.pl/WTEM. W razie pytań lub wątpliwości
+możesz kontaktować się z nami pisząc na adres
+edukacjamedialna@nowoczesnapolska.org.pl.
+
+Z pozdrowieniami
+
+Zespół Edukacji Medialnej
+Fundacja Nowoczesna Polska
diff --git a/edumed/templates/contact/wtem/mail_subject.txt b/edumed/templates/contact/wtem/mail_subject.txt
new file mode 100755 (executable)
index 0000000..15f682a
--- /dev/null
@@ -0,0 +1 @@
+Dziękujemy za rejestrację w Wielkim Turnieju Edukacji Medialnej.
diff --git a/edumed/templates/contact/wtem/thanks.html b/edumed/templates/contact/wtem/thanks.html
new file mode 100755 (executable)
index 0000000..9ad56ff
--- /dev/null
@@ -0,0 +1,14 @@
+{% extends "contact/thanks.html" %}
+
+{% block contact_form_description %}
+<p>Dziękujemy za rejestrację w Wielkim Turnieju Edukacji Medialnej.</p>
+
+<p>Na adres adres e-mail Opiekuna została wysłana wiadomość potwierdzająca
+rejestrację.</p>
+
+<p>Pierwszy etap Turnieju odbędzie się 21 listopada 2013 r. o godz. 15.30.<br>
+Serdecznie zapraszamy do udziału.</p>
+
+<p>Zespół Edukacji Medialnej<br>
+Fundacja Nowoczesna Polska</p>
+{% endblock %}
index c96b02c..49b1e28 100644 (file)
@@ -33,4 +33,5 @@ pybbm>=0.14,<0.15
 django-libravatar
 
 sorl-thumbnail>=11,<12
+pyyaml