diff options
author | Étienne Loks <etienne.loks@peacefrogs.net> | 2011-02-11 01:03:00 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2011-02-11 01:03:00 +0100 |
commit | cfb18b8ba86967121d4ec552b410f346441ae8d6 (patch) | |
tree | af9ff9bcf86038fdb7d434341c57d3f6b2a887d1 | |
parent | 05644cc3f86c2635374a6b6e442084f8254f3a8f (diff) | |
download | Ishtar-cfb18b8ba86967121d4ec552b410f346441ae8d6.tar.bz2 Ishtar-cfb18b8ba86967121d4ec552b410f346441ae8d6.zip |
Operation are linked to periods (closes #155)
-rw-r--r-- | ishtar/furnitures/forms.py | 58 | ||||
-rw-r--r-- | ishtar/furnitures/models.py | 27 |
2 files changed, 67 insertions, 18 deletions
diff --git a/ishtar/furnitures/forms.py b/ishtar/furnitures/forms.py index b21f801a6..e99d4f077 100644 --- a/ishtar/furnitures/forms.py +++ b/ishtar/furnitures/forms.py @@ -47,6 +47,24 @@ from ishtar import settings reverse_lazy = lazy(reverse, unicode) +def clean_duplicated(formset, key_names): + """Checks for duplicated.""" + if any(formset.errors): + return + items = [] + for i in range(0, formset.total_form_count()): + form = formset.forms[i] + if not form.is_valid(): + continue + item = [key_name in form.cleaned_data and form.cleaned_data[key_name] + for key_name in key_names] + if not [v for v in item if v]: + continue + if item in items: + raise forms.ValidationError, \ + _("There are identical items.") + items.append(item) + class FinalForm(forms.Form): final = True form_label = _("Confirm") @@ -1360,24 +1378,26 @@ class RemainForm(forms.Form): class RemainFormSet(FormSet): def clean(self): """Checks that no remain types are duplicated.""" - if any(self.errors): - return - remains = [] - for i in range(0, self.total_form_count()): - form = self.forms[i] - if not form.is_valid(): - continue - if 'remain_type' not in form.cleaned_data: - continue - remain = form.cleaned_data['remain_type'] - if remain in remains: - raise forms.ValidationError, \ - _("There are identical remain types.") - remains.append(remain) + return clean_duplicated(self, ['remain_type']) -RemainFormSet = formset_factory(RemainForm, can_delete=True, +RemainFormset = formset_factory(RemainForm, can_delete=True, formset=RemainFormSet) -RemainFormSet.form_label = _("Remain types") +RemainFormset.form_label = _("Remain types") + +class PeriodForm(forms.Form): + form_label = _("Periods") + associated_models = {'period':models.Period} + period = forms.ChoiceField(label=_("Period"), required=False, + choices=models.Period.get_types()) + +class PeriodFormSet(FormSet): + def clean(self): + """Checks that no period are duplicated.""" + return clean_duplicated(self, ['period']) + +PeriodFormset = formset_factory(PeriodForm, can_delete=True, + formset=PeriodFormSet) +PeriodFormset.form_label = _("Periods") operation_creation_wizard = OperationWizard([ ('general-operation_creation', OperationFormGeneral), @@ -1386,7 +1406,8 @@ operation_creation_wizard = OperationWizard([ ('preventivediag-operation_creation', OperationFormPreventiveDiag), ('towns-operation_creation', SelectedTownFormSet), ('parcels-operation_creation', SelectedParcelFormSet), - ('remains-operation_creation', RemainFormSet), + ('remains-operation_creation', RemainFormset), + ('periods-operation_creation', PeriodFormset), ('final-operation_creation', FinalForm)], condition_list={ 'preventive-operation_creation':is_preventive('general-operation_creation', @@ -1404,7 +1425,8 @@ operation_modification_wizard = OperationWizard([ ('preventivediag-operation_modification', OperationFormPreventiveDiag), ('towns-operation_modification', SelectedTownFormSet), ('parcels-operation_modification', SelectedParcelFormSet), - ('remains-operation_modification', RemainFormSet), + ('remains-operation_modification', RemainFormset), + ('periods-operation_modification', PeriodFormset), ('final-operation_modification', FinalForm)], condition_list={ 'preventive-operation_modification':is_preventive( diff --git a/ishtar/furnitures/models.py b/ishtar/furnitures/models.py index 0ce4ef057..3112d00f6 100644 --- a/ishtar/furnitures/models.py +++ b/ishtar/furnitures/models.py @@ -373,6 +373,7 @@ class Operation(BaseHistorizedItem, OwnPerms): remains = models.ManyToManyField("RemainType", verbose_name=_(u'Remains')) towns = models.ManyToManyField("Town", verbose_name=_(u"Towns")) cost = models.IntegerField(_(u"Cost"), blank=True, null=True) + periods = models.ManyToManyField('Period', verbose_name=_(u"Periods")) if settings.COUNTRY == 'fr': code_patriarche = models.IntegerField(u"Code PATRIARCHE", null=True, blank=True) @@ -450,6 +451,32 @@ class Period(GeneralType) : def __unicode__(self): return self.label + @classmethod + def get_types(cls, dct={}): + dct['available'] = True + yield ('', '--') + items = cls.objects.filter(**dct).all() + if not items: + return + items = sorted(items, key=lambda x: x.parent) + idx, childs = 0, {None:[]} + while idx < len(items) and not items[idx].parent: + childs[items[idx]] = [] + idx += 1 + while idx < len(items): + if items[idx].parent in childs: + childs[items[idx].parent].append(items[idx]) + else: + childs[None].append(items[idx]) + idx += 1 + for parent in sorted(childs.keys(), + key=lambda x:hasattr(x, 'order') and x.order): + if parent: + yield (parent.id, _(parent.label)) + prefix = parent and "-- " or "" + for child in sorted(childs[parent], key=lambda x:x.order): + yield (child.id, _(prefix + child.label)) + class DatingType(GeneralType): class Meta: verbose_name = _(u"Dating type") |