From eb6c62736d57d9efb8ba9fc35b16d26b9e88cb03 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Fri, 28 Aug 2015 12:11:41 +0200 Subject: Archaeological files: add departments to preventive forms - Wizards manage several many to many in one form --- .../templates/ishtar/sheet_file.html | 3 +- archaeological_files_pdl/forms.py | 11 ++++--- archaeological_files_pdl/models.py | 2 -- .../ishtar/wizard/wizard_preventiveplanning.html | 7 ++++ ishtar_common/wizards.py | 37 ++++++++++++++-------- 5 files changed, 38 insertions(+), 22 deletions(-) diff --git a/archaeological_files/templates/ishtar/sheet_file.html b/archaeological_files/templates/ishtar/sheet_file.html index 2d7b6262d..fc5ddbe70 100644 --- a/archaeological_files/templates/ishtar/sheet_file.html +++ b/archaeological_files/templates/ishtar/sheet_file.html @@ -57,7 +57,8 @@ {% if item.comment %}

{{ item.comment }}

{%endif%}

{% trans "Localisation"%}

-

{{ item.towns.all|join:", " }}

+{% if item.towns.count %}

{{ item.towns.all|join:", " }}

{% endif %} +{% if item.departments.count %}

{{ item.departments.all|join:", " }}

{% endif %} {% if item.address %}

{{ item.address }}

{% if item.address_complement %}

{{ item.address_complement }}

{%endif%} diff --git a/archaeological_files_pdl/forms.py b/archaeological_files_pdl/forms.py index a0c5037e7..3b5ed4601 100644 --- a/archaeological_files_pdl/forms.py +++ b/archaeological_files_pdl/forms.py @@ -24,7 +24,7 @@ from django.core import validators from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ -from ishtar_common.models import Person, PersonType, Town, valid_id +from ishtar_common.models import Person, PersonType, Town, Department, valid_id from archaeological_files import models from ishtar_common.forms import get_now, reverse_lazy @@ -74,12 +74,14 @@ class FileFormPreventiveType(forms.Form): class FileFormPlanning(forms.Form): form_label = _(u"Planning") - base_model = 'town' - associated_models = {'town': Town} + base_models = ['town', 'department'] + associated_models = {'town': Town, 'department': Department} name = forms.CharField(label=_(u"Planning name"), required=False, max_length=100) town = widgets.MultipleAutocompleteField( model=Town, label=_("Towns"), required=False) + department = widgets.MultipleAutocompleteField( + model=Department, label=_("Departments"), required=False) locality = forms.CharField(label=_(u"Locality"), max_length=100, required=False) address = forms.CharField( @@ -266,7 +268,6 @@ class FileFormPlanningService(forms.Form): def is_valid(self, *args, **kwargs): c = super(FileFormPlanningService, self).is_valid(*args, **kwargs) - print(self.cleaned_data) return c @@ -283,7 +284,7 @@ class FileFormInstruction(forms.Form): limit={ 'person_types': [ PersonType.objects.get(txt_idx='sra_agent').pk] - }, + }, associated_model=Person, new=True), validators=[valid_id(Person)]) related_file = forms.IntegerField( diff --git a/archaeological_files_pdl/models.py b/archaeological_files_pdl/models.py index 71a836239..6b2021999 100644 --- a/archaeological_files_pdl/models.py +++ b/archaeological_files_pdl/models.py @@ -1,3 +1 @@ -from django.db import models - # Create your models here. diff --git a/archaeological_files_pdl/templates/ishtar/wizard/wizard_preventiveplanning.html b/archaeological_files_pdl/templates/ishtar/wizard/wizard_preventiveplanning.html index 6bd5598b6..1be5b1b36 100644 --- a/archaeological_files_pdl/templates/ishtar/wizard/wizard_preventiveplanning.html +++ b/archaeological_files_pdl/templates/ishtar/wizard/wizard_preventiveplanning.html @@ -31,6 +31,13 @@ {{wizard.form.town|safe}} + + + + + {{wizard.form.department|safe}} + + diff --git a/ishtar_common/wizards.py b/ishtar_common/wizards.py index 7da654b80..cc371b5e2 100644 --- a/ishtar_common/wizards.py +++ b/ishtar_common/wizards.py @@ -284,6 +284,8 @@ class Wizard(NamedUrlWizardView): frm = form.forms[0] if hasattr(frm, 'base_model') and frm.base_model: whole_associated_models.append(frm.base_model) + elif hasattr(frm, 'base_models') and frm.base_models: + whole_associated_models += frm.base_models else: whole_associated_models += associated_models.keys() fields = frm.fields.copy() @@ -291,8 +293,9 @@ class Wizard(NamedUrlWizardView): fields.pop('DELETE') multi = len(fields) > 1 if multi: - assert hasattr(frm, 'base_model'), \ - u"Must define a base_model for " + \ + assert hasattr(frm, 'base_model') or \ + hasattr(frm, 'base_models'), \ + u"Must define a base_model(s) for " + \ unicode(frm.__class__) for frm in form.forms: if not frm.is_valid(): @@ -314,7 +317,11 @@ class Wizard(NamedUrlWizardView): else: m2m.append((key, value)) if multi and vals: - m2m.append((frm.base_model, vals)) + if hasattr(frm, 'base_models'): + for m in frm.base_models: + m2m.append((frm.base_model, m)) + else: + m2m.append((frm.base_model, vals)) elif type(form.cleaned_data) == dict: for key in form.cleaned_data: if key.startswith('hidden_'): @@ -336,15 +343,17 @@ class Wizard(NamedUrlWizardView): value = model.objects.get(pk=value) else: value = None - if hasattr(form, 'base_model') and form.base_model and \ - form.base_model == key: - whole_associated_models.append(form.base_model) + if (hasattr(form, 'base_model') and form.base_model and + form.base_model == key) or ( + hasattr(form, 'base_models') and + key in form.base_models): + whole_associated_models.append(key) if value: vals = value if type(vals) not in (list, tuple): vals = [vals] for val in vals: - m2m.append((form.base_model, val)) + m2m.append((key, val)) else: dct[key] = value return self.save_model(dct, m2m, whole_associated_models, form_list, @@ -445,27 +454,27 @@ class Wizard(NamedUrlWizardView): obj.save() m2m_items = {} for model in whole_associated_models: - getattr(obj, model+'s').clear() + getattr(obj, model + 's').clear() for key, value in m2m: if key not in m2m_items: if type(key) == dict: vals = [] - for item in getattr(obj, key+'s').all(): + for item in getattr(obj, key + 's').all(): v = {} for k in value.keys(): v[k] = getattr(item, k) vals.append(v) m2m_items[key] = vals else: - m2m_items[key] = getattr(obj, key+'s').all() + m2m_items[key] = getattr(obj, key + 's').all() if value not in m2m_items[key]: if type(value) == dict: - model = getattr(obj, key+'s').model + model = getattr(obj, key + 's').model if issubclass(model, models.BaseHistorizedItem): value['history_modifier'] = self.request.user value = model.objects.create(**value) value.save() - getattr(obj, key+'s').add(value) + getattr(obj, key + 's').add(value) # necessary to manage interaction between models like # material_index management for baseitems obj.save() @@ -979,7 +988,7 @@ class AccountWizard(Wizard): continue for key in form.cleaned_data: if key == 'hidden_password' and form.cleaned_data[key]: - datas[-1][1].append((_("New password"), "*"*8)) + datas[-1][1].append((_("New password"), "*" * 8)) return datas def done(self, form_list, **kwargs): @@ -1032,7 +1041,7 @@ class AccountWizard(Wizard): 'password': dct['password'], 'app_name': app_name, 'site': site and site.domain or "" - }) + }) t = loader.get_template('account_activation_email.txt') msg = t.render(context) subject = _(u"[%(app_name)s] Account creation/modification") % { -- cgit v1.2.3