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_'):
# 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)
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'],
# -*- 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 _
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')
-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 }}:
--- /dev/null
+from django.template import Library
+from contact.models import Contact
+
+register = Library()
+
+@register.filter
+def pretty_print(value):
+ return Contact.pretty_print(value)
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}
)
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
+ )
+
'catalogue/js/lesson.js',
'sponsors/js/sponsors.js',
'curriculum/curriculum.js',
-
+ 'js/formset.js',
'pybb/js/pybbjs.js',
),
'output_filename': 'compressed/base.js',
--- /dev/null
+(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);
<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>
--- /dev/null
+{% 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 %}
--- /dev/null
+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
--- /dev/null
+Dziękujemy za rejestrację w Wielkim Turnieju Edukacji Medialnej.
--- /dev/null
+{% 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 %}
django-libravatar
sorl-thumbnail>=11,<12
+pyyaml