diff options
| author | Étienne Loks <etienne.loks@peacefrogs.net> | 2011-01-06 18:11:41 +0100 |
|---|---|---|
| committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2011-01-06 18:11:41 +0100 |
| commit | 000359b99c3a39be870fe744df295e3e39db9d7f (patch) | |
| tree | d728d9b3b4aba2b25ca6e13697802492d16f535e | |
| parent | adbfac4fe875b013c2613dddadd0c1c59e0cc660 (diff) | |
| download | Ishtar-000359b99c3a39be870fe744df295e3e39db9d7f.tar.bz2 Ishtar-000359b99c3a39be870fe744df295e3e39db9d7f.zip | |
Prevent duplicate towns (refs #14)
| -rw-r--r-- | ishtar/furnitures/forms.py | 22 | ||||
| -rw-r--r-- | ishtar/templates/default_wizard.html | 3 | ||||
| -rw-r--r-- | static/media/style.css | 28 |
3 files changed, 38 insertions, 15 deletions
diff --git a/ishtar/furnitures/forms.py b/ishtar/furnitures/forms.py index e771fe595..12c9ae9c0 100644 --- a/ishtar/furnitures/forms.py +++ b/ishtar/furnitures/forms.py @@ -26,7 +26,7 @@ from django.core.urlresolvers import reverse from django.utils.translation import ugettext_lazy as _ from django.template import Context, RequestContext from django.shortcuts import render_to_response -from django.forms.formsets import formset_factory +from django.forms.formsets import formset_factory, BaseFormSet from django import forms from formwizard.forms import NamedUrlSessionFormWizard @@ -43,6 +43,9 @@ class FinalForm(forms.Form): final = True form_label = _("Confirm") +class FormSet(BaseFormSet): + pass + class Wizard(NamedUrlSessionFormWizard): def get_template(self, request, storage): templates = ['default_wizard.html'] @@ -230,7 +233,22 @@ class TownForm(forms.Form): 'autocomplete-town', associated_model=models.Town), validators=[models.Town.valid_id], required=False) -TownFormSet = formset_factory(TownForm, can_delete=True) +class TownFormSet(FormSet): + def clean(self): + """Checks that no towns are duplicated.""" + if any(self.errors): + return + towns = [] + for i in range(0, self.total_form_count()): + form = self.forms[i] + if 'town' not in form.cleaned_data: + continue + town = form.cleaned_data['town'] + if town in towns: + raise forms.ValidationError, _("There are identical towns.") + towns.append(town) + +TownFormSet = formset_factory(TownForm, can_delete=True, formset=TownFormSet) TownFormSet.form_label = _("Towns") class FileForm3(forms.Form): diff --git a/ishtar/templates/default_wizard.html b/ishtar/templates/default_wizard.html index 59389719e..83f02539b 100644 --- a/ishtar/templates/default_wizard.html +++ b/ishtar/templates/default_wizard.html @@ -12,11 +12,12 @@ <div class='form'> {% if form.forms %} <table class='formset'> + {%if form.non_form_errors%}<tr class='error'><th colspan='2'>{{form.non_form_errors}}</th></tr>{%endif%} {{ form.management_form }} {% for formsetform in form.forms %} {{ formsetform.as_table }} {% endfor %} - <tr><td rowspan="2"><button name="formset_modify" value="{{form_step}}">{% trans "Modify" %}</button></td></tr></li> + <tr class='modify'><td colspan="2"><button name="formset_modify" value="{{form_step}}">{% trans "Modify" %}</button></td></tr></li> </table> {% else %} <table> diff --git a/static/media/style.css b/static/media/style.css index 2d58631dc..8fc5c8001 100644 --- a/static/media/style.css +++ b/static/media/style.css @@ -13,18 +13,6 @@ a { color:#D14; } -ul#form_path button { - text-decoration:none; - color:#D14; - border:none; - background-color:white; - font-size: 11pt; - cursor:pointer; - padding:0; - margin:0; - font-family:Arial, Helvetica, sans-serif; -} - caption { color:#922; font-weight:bold; @@ -120,6 +108,18 @@ ul#form_path li.current a{ color:#922; } +ul#form_path button { + text-decoration:none; + color:#D14; + border:none; + background-color:white; + font-size: 11pt; + cursor:pointer; + padding:0; + margin:0; + font-family:Arial, Helvetica, sans-serif; +} + div.form { margin-left:auto; margin-right:auto; @@ -142,6 +142,10 @@ div.form table th{ text-align:left; } +div.form .errorlist{ + color:#922; +} + .info{ margin-left:auto; margin-right:auto; |
