diff options
author | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-10-20 21:52:43 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-10-20 21:52:43 +0200 |
commit | 8d594a01220d5cbbe9d6e856d1aef04bbb8daf3e (patch) | |
tree | 1f1887c1153c40cd4323c482856e5f281ec1dc97 /archaeological_files | |
parent | 980bf7d6c548f09636b94fd53e575ab8c2e10d2e (diff) | |
download | Ishtar-8d594a01220d5cbbe9d6e856d1aef04bbb8daf3e.tar.bz2 Ishtar-8d594a01220d5cbbe9d6e856d1aef04bbb8daf3e.zip |
Djangoization - Major refactoring (step 6)
Work on wizard, views and forms to dispatch logic in a more
relevant way.
Diffstat (limited to 'archaeological_files')
-rw-r--r-- | archaeological_files/forms.py | 250 | ||||
-rw-r--r-- | archaeological_files/urls.py | 38 | ||||
-rw-r--r-- | archaeological_files/views.py | 79 | ||||
-rw-r--r-- | archaeological_files/wizards.py | 155 |
4 files changed, 282 insertions, 240 deletions
diff --git a/archaeological_files/forms.py b/archaeological_files/forms.py index 368c57843..564d0c6fc 100644 --- a/archaeological_files/forms.py +++ b/archaeological_files/forms.py @@ -31,104 +31,17 @@ from django.shortcuts import render_to_response from django.template import RequestContext from django.utils.translation import ugettext_lazy as _ -from ishtar_common.models import Town +from ishtar_common.models import Person, PersonType, Town, Organization, \ + OrganizationType, valid_id, is_unique +from archaeological_operations.models import ActType, AdministrativeAct import models -from ishtar_common.views import Wizard -from ishtar_common.forms import FinalForm, FormSet, ClosingWizard, \ - ClosingDateFormSelection, SearchWizard, formset_factory, get_now, \ - reverse_lazy -from ishtar_common.forms_common import TownFormset, ParcelFormSet, \ - get_town_field, get_person_field -from archaeological_operations.forms import OperationAdministrativeActWizard, \ - AdministrativeActOpeForm, AdministrativeActOpeFormSelection, \ - AdministrativeActDeletionWizard, FinalAdministrativeActDeleteForm, \ - is_preventive +from ishtar_common.forms import FinalForm, FormSet, ClosingDateFormSelection, \ + formset_factory, get_now, reverse_lazy +from ishtar_common.forms_common import get_town_field, get_person_field +from archaeological_operations.forms import AdministrativeActOpeForm, \ + AdministrativeActOpeFormSelection, FinalAdministrativeActDeleteForm from ishtar_common import widgets -class FileWizard(Wizard): - model = models.File - object_parcel_type = 'associated_file' - - def get_form(self, request, storage, step=None, data=None, files=None): - """ - Manage towns - """ - if data: - data = data.copy() - else: - data = {} - # manage the dynamic choice of towns - if not step: - step = self.determine_step(request, storage) - form = self.get_form_list(request, storage)[step] - town_form_key = 'towns-' + self.url_name - if step.startswith('parcels-') and hasattr(form, 'management_form') \ - and self.session_has_key(request, storage, town_form_key): - towns = [] - qdict = request.session[storage.prefix]['step_data'][town_form_key] - for k in qdict.keys(): - if k.endswith("town") and qdict[k]: - try: - town = Town.objects.get(pk=int(qdict[k])) - towns.append((town.pk, unicode(town))) - except (ObjectDoesNotExist, ValueError): - pass - data['TOWNS'] = sorted(towns, key=lambda x:x[1]) - form = super(FileWizard, self).get_form(request, storage, step, data, - files) - return form - - def get_extra_model(self, dct, request, storage, form_list): - dct = super(FileWizard, self).get_extra_model(dct, request, storage, - form_list) - if not dct['numeric_reference']: - current_ref = models.File.objects.filter(year=dct['year'] - ).aggregate(Max('numeric_reference'))["numeric_reference__max"] - dct['numeric_reference'] = current_ref and current_ref + 1 or 1 - return dct - - def done(self, request, storage, form_list, **kwargs): - ''' - Save parcels - ''' - r = super(FileWizard, self).done(request, storage, form_list, - return_object=True, **kwargs) - if type(r) not in (list, tuple) or len(r) != 2: - return r - obj, res = r - obj.parcels.clear() - for form in form_list: - if not hasattr(form, 'prefix') \ - or not form.prefix.startswith('parcels-') \ - or not hasattr(form, 'forms'): - continue - for frm in form.forms: - if not frm.is_valid(): - continue - dct = frm.cleaned_data.copy() - if 'parcel' in dct: - try: - parcel = models.Parcel.objects.get(pk=dct['parcel']) - setattr(parcel, self.object_parcel_type, obj) - parcel.save() - except (ValueError, ObjectDoesNotExist): - continue - continue - try: - dct['town'] = models.Town.objects.get(pk=int(dct['town'])) - except (ValueError, ObjectDoesNotExist): - continue - dct['associated_file'], dct['operation'] = None, None - dct[self.object_parcel_type] = obj - if 'DELETE' in dct: - dct.pop('DELETE') - parcel = models.Parcel.objects.filter(**dct).count() - if not parcel: - dct['history_modifier'] = request.user - parcel = models.Parcel(**dct) - parcel.save() - return res - class FileSelect(forms.Form): towns = get_town_field() in_charge = get_person_field(label=_(u"Person in charge"), @@ -150,7 +63,7 @@ class FileFormSelection(forms.Form): pk = forms.IntegerField(label="", required=False, widget=widgets.JQueryJqGrid(reverse_lazy('get-file'), FileSelect(), models.File, source_full=reverse_lazy('get-file-full')), - validators=[models.valid_id(models.File)]) + validators=[valid_id(models.File)]) def clean(self): cleaned_data = self.cleaned_data @@ -160,14 +73,14 @@ class FileFormSelection(forms.Form): class FileFormGeneral(forms.Form): form_label = _("General") - associated_models = {'in_charge':models.Person, + associated_models = {'in_charge':Person, 'related_file':models.File, 'file_type':models.FileType} in_charge = forms.IntegerField(label=_("Person in charge"), widget=widgets.JQueryAutoComplete(reverse_lazy('autocomplete-person', - args=[models.PersonType.objects.get(txt_idx='sra_agent').pk]), - associated_model=models.Person, new=True), - validators=[models.valid_id(models.Person)]) + args=[PersonType.objects.get(txt_idx='sra_agent').pk]), + associated_model=Person, new=True), + validators=[valid_id(Person)]) year = forms.IntegerField(label=_("Year"), initial=lambda:datetime.datetime.now().year, validators=[validators.MinValueValidator(1900), @@ -176,7 +89,7 @@ class FileFormGeneral(forms.Form): widget=forms.HiddenInput, required=False) internal_reference = forms.CharField(label=_(u"Internal reference"), max_length=60, - validators=[models.is_unique(models.File, 'internal_reference')]) + validators=[is_unique(models.File, 'internal_reference')]) creation_date = forms.DateField(label=_(u"Creation date"), initial=get_now, widget=widgets.JQueryDate) file_type = forms.ChoiceField(label=_("File type"), @@ -184,7 +97,7 @@ class FileFormGeneral(forms.Form): related_file = forms.IntegerField(label=_("Related file"), required=False, widget=widgets.JQueryAutoComplete(reverse_lazy('autocomplete-file'), associated_model=models.File), - validators=[models.valid_id(models.File)]) + validators=[valid_id(models.File)]) comment = forms.CharField(label=_(u"Comment"), widget=forms.Textarea, required=False) @@ -198,7 +111,7 @@ class FileFormGeneralRO(FileFormGeneral): class FileFormAddress(forms.Form): form_label = _(u"Address") - associated_models = {'town':models.Town} + associated_models = {'town':Town} total_surface = forms.IntegerField(required=False, widget=widgets.AreaWidget, label=_(u"Total surface (m²)"), @@ -212,23 +125,23 @@ class FileFormAddress(forms.Form): class FileFormPreventive(forms.Form): form_label = _(u"Preventive informations") - associated_models = {'general_contractor':models.Person, + associated_models = {'general_contractor':Person, 'saisine_type':models.SaisineType, 'permit_type':models.PermitType, - 'town_planning_service':models.Organization} + 'town_planning_service':Organization} general_contractor = forms.IntegerField(label=_(u"General contractor"), widget=widgets.JQueryAutoComplete( reverse_lazy('autocomplete-person', - args=[models.PersonType.objects.get(txt_idx='general_contractor').pk]), - associated_model=models.Person, new=True), - validators=[models.valid_id(models.Person)]) + args=[PersonType.objects.get(txt_idx='general_contractor').pk]), + associated_model=Person, new=True), + validators=[valid_id(Person)]) town_planning_service = forms.IntegerField(required=False, label=_(u"Town planning service"), widget=widgets.JQueryAutoComplete( reverse_lazy('autocomplete-organization', - args=[models.OrganizationType.objects.get(txt_idx='planning_service').pk]), - associated_model=models.Organization, new=True), - validators=[models.valid_id(models.Organization)]) + args=[OrganizationType.objects.get(txt_idx='planning_service').pk]), + associated_model=Organization, new=True), + validators=[valid_id(Organization)]) permit_type = forms.ChoiceField(label=_(u"Permit type"), required=False, choices=models.PermitType.get_types()) permit_reference = forms.CharField(label=_(u"Permit reference"), @@ -247,143 +160,40 @@ class FileFormPreventive(forms.Form): self.fields['saisine_type'].choices = models.SaisineType.get_types() self.fields['saisine_type'].help_text = models.SaisineType.get_help() -file_search_wizard = SearchWizard([('general-file_search', FileFormSelection)], - url_name='file_search',) - -file_creation_wizard = FileWizard([ - ('general-file_creation', FileFormGeneral), - ('address-file_creation', FileFormAddress), - ('towns-file_creation', TownFormset), - ('parcels-file_creation', ParcelFormSet), - ('preventive-file_creation', FileFormPreventive), - ('final-file_creation', FinalForm)], - condition_list={ -'preventive-file_creation':is_preventive('general-file_creation', - models.FileType, type_key='file_type') - }, - url_name='file_creation',) - -class FileModificationWizard(FileWizard): - modification = True - -file_modification_wizard = FileModificationWizard([ - ('selec-file_modification', FileFormSelection), - ('general-file_modification', FileFormGeneralRO), - ('adress-file_modification', FileFormAddress), - ('towns-file_modification', TownFormset), - ('parcels-file_modification', ParcelFormSet), - ('preventive-file_modification', FileFormPreventive), - ('final-file_modification', FinalForm)], - condition_list={ -'preventive-file_modification':is_preventive('general-file_modification', - models.FileType, type_key='file_type') - }, - url_name='file_modification',) - -class FileClosingWizard(ClosingWizard): - model = models.File - fields = ['year', 'numeric_reference', 'internal_reference', - 'file_type', 'in_charge', 'general_contractor', 'creation_date', - 'reception_date', 'total_surface', 'total_developed_surface', - 'address', 'address_complement', 'postal_code', 'comment'] - if settings.COUNTRY == 'fr': - fields += ['saisine_type', 'reference_number'] - fields += ['towns'] class FinalFileClosingForm(FinalForm): confirm_msg = " " confirm_end_msg = _(u"Would you like to close this archaeological file?") -file_closing_wizard = FileClosingWizard([ - ('selec-file_closing', FileFormSelection), - ('date-file_closing', ClosingDateFormSelection), - ('final-file_closing', FinalFileClosingForm)], - url_name='file_closing',) - -class FileDeletionWizard(FileClosingWizard): - def get_formated_datas(self, forms): - datas = super(FileDeletionWizard, self).get_formated_datas(forms) - datas.append((_("Associated operations"), [])) - for operation in models.Operation.objects.filter( - associated_file=self.current_obj).all(): - if operation.end_date: - datas[-1][1].append(('', unicode(operation))) - return datas - - def done(self, request, storage, form_list, **kwargs): - obj = self.get_current_object(request, storage) - for operation in models.Operation.objects.filter( - associated_file=obj).all(): - operation.delete() - obj.delete() - return render_to_response('wizard_done.html', {}, - context_instance=RequestContext(request)) - class FinalFileDeleteForm(FinalForm): confirm_msg = " " confirm_end_msg = _(u"Would you like to delete this archaelogical file ?") -file_deletion_wizard = FileDeletionWizard([ - ('selec-file_deletion', FileFormSelection), - ('final-file_deletion', FinalFileDeleteForm)], - url_name='file_deletion',) - -class FileAdministrativeActWizard(OperationAdministrativeActWizard): - model = models.File - -class FileEditAdministrativeActWizard(FileAdministrativeActWizard): - model = models.AdministrativeAct - edit = True - def get_associated_item(self, request, storage, dct): - return self.get_current_object(request, storage).associated_file - class AdministrativeActFileSelect(forms.Form): associated_file__towns = get_town_field() act_type = forms.ChoiceField(label=_("Act type"), choices=[]) def __init__(self, *args, **kwargs): super(AdministrativeActFileSelect, self).__init__(*args, **kwargs) - self.fields['act_type'].choices = models.ActType.get_types( + self.fields['act_type'].choices = ActType.get_types( dct={'intented_to':'F'}) - self.fields['act_type'].help_text = models.ActType.get_help( + self.fields['act_type'].help_text = ActType.get_help( dct={'intented_to':'F'}) class AdministrativeActFileFormSelection(AdministrativeActOpeFormSelection): pk = forms.IntegerField(label="", required=False, widget=widgets.JQueryJqGrid(reverse_lazy('get-administrativeactfile'), - AdministrativeActFileSelect(), models.AdministrativeAct, + AdministrativeActFileSelect(), AdministrativeAct, table_cols='TABLE_COLS_FILE'), - validators=[models.valid_id(models.AdministrativeAct)]) + validators=[valid_id(AdministrativeAct)]) class AdministrativeActFileForm(AdministrativeActOpeForm): act_type = forms.ChoiceField(label=_(u"Act type"), choices=[]) def __init__(self, *args, **kwargs): super(AdministrativeActFileForm, self).__init__(*args, **kwargs) - self.fields['act_type'].choices = models.ActType.get_types( + self.fields['act_type'].choices = ActType.get_types( dct={'intented_to':'F'}) - self.fields['act_type'].help_text = models.ActType.get_help( + self.fields['act_type'].help_text = ActType.get_help( dct={'intented_to':'F'}) - -file_administrativeactfile_wizard = FileAdministrativeActWizard([ - ('selec-file_administrativeactfile', FileFormSelection), - ('administrativeact-file_administrativeactfile', AdministrativeActFileForm), - ('final-file_administrativeactfile', FinalForm)], - url_name='file_administrativeactfile',) - -file_administrativeactfile_modification_wizard = FileEditAdministrativeActWizard([ - ('selec-file_administrativeactfile_modification', - AdministrativeActFileFormSelection), - ('administrativeact-file_administrativeactfile_modification', - AdministrativeActFileForm), - ('final-file_administrativeactfile_modification', FinalForm)], - url_name='file_administrativeactfile_modification',) - -file_administrativeactfile_deletion_wizard = AdministrativeActDeletionWizard([ - ('selec-file_administrativeactfile_deletion', - AdministrativeActFileFormSelection), - ('final-file_administrativeactfile_deletion', - FinalAdministrativeActDeleteForm)], - url_name='file_administrativeactfile_deletion',) - diff --git a/archaeological_files/urls.py b/archaeological_files/urls.py index e32ab8294..a64a8b2b1 100644 --- a/archaeological_files/urls.py +++ b/archaeological_files/urls.py @@ -19,29 +19,28 @@ from django.conf.urls.defaults import * -""" -import forms +import views -# forms +# forms: urlpatterns = patterns('', - url(r'file_search/(?P<step>.+)$', - forms.file_search_wizard, name='file_search'), - url(r'file_creation/(?P<step>.+)$', - forms.file_creation_wizard, name='file_creation'), - url(r'file_modification/(?P<step>.+)$', - forms.file_modification_wizard, name='file_modification'), - url(r'file_closing/(?P<step>.+)$', - forms.file_closing_wizard, name='file_closing'), - url(r'file_deletion/(?P<step>.+)$', - forms.file_deletion_wizard, name='file_deletion'), - url(r'file_administrativeactfile/(?P<step>.+)$', - forms.file_administrativeactfile_wizard, + url(r'file_search/(?P<step>.+)?$', + views.file_search_wizard, name='file_search'), + url(r'file_creation/(?P<step>.+)?$', + views.file_creation_wizard, name='file_creation'), + url(r'file_modification/(?P<step>.+)?$', + views.file_modification_wizard, name='file_modification'), + url(r'file_closing/(?P<step>.+)?$', + views.file_closing_wizard, name='file_closing'), + url(r'file_deletion/(?P<step>.+)?$', + views.file_deletion_wizard, name='file_deletion'), + url(r'file_administrativeactfile/(?P<step>.+)?$', + views.file_administrativeactfile_wizard, name='file_administrativeactfile'), - url(r'file_administrativeactfile_modification/(?P<step>.+)$', - forms.file_administrativeactfile_modification_wizard, + url(r'file_administrativeactfile_modification/(?P<step>.+)?$', + views.file_administrativeactfile_modification_wizard, name='file_administrativeactfile_modification'), - url(r'file_administrativeactfile_deletion/(?P<step>.+)$', - forms.file_administrativeactfile_deletion_wizard, + url(r'file_administrativeactfile_deletion/(?P<step>.+)?$', + views.file_administrativeactfile_deletion_wizard, name='file_administrativeactfile_deletion'), ) @@ -61,4 +60,3 @@ urlpatterns += patterns('archaeological_files.views', url(r'revert-file/(?P<pk>.+)/(?P<date>.+)$', 'revert_file', name='revert-file'), ) -""" diff --git a/archaeological_files/views.py b/archaeological_files/views.py index 02332b629..0f71b24d8 100644 --- a/archaeological_files/views.py +++ b/archaeological_files/views.py @@ -24,7 +24,14 @@ from django.http import HttpResponse from django.shortcuts import render_to_response from ishtar_common.views import get_item, show_item, revert_item +from archaeological_operations.models import AdministrativeAct import models +from ishtar_common.wizards import SearchWizard +from archaeological_operations.wizards import is_preventive +from wizards import * +from ishtar_common.forms_common import TownFormset +from archaeological_operations.forms import ParcelFormSet +from forms import * def autocomplete_file(request): person_types = request.user.ishtaruser.person.person_type @@ -56,6 +63,12 @@ get_file = get_item(models.File, 'get_file', 'file') show_file = show_item(models.File, 'file') revert_file = revert_item(models.File) +get_administrativeactfile = get_item(AdministrativeAct, + 'get_administrativeactfile', 'administrativeactfile', + extra_request_keys={'associated_file__towns':'associated_file__towns__pk', + 'operation__towns':'operation__towns__pk', + 'act_type__intented_to':'act_type__intented_to'}) + def dashboard_file(request, dct, obj_id=None, *args, **kwargs): """ Main dashboard @@ -64,3 +77,69 @@ def dashboard_file(request, dct, obj_id=None, *args, **kwargs): return render_to_response('dashboard_file.html', dct, context_instance=RequestContext(request)) +file_search_wizard = SearchWizard.as_view( + [('general-file_search', FileFormSelection)], + url_name='file_search',) +file_creation_wizard = FileWizard.as_view([ + ('general-file_creation', FileFormGeneral), + ('address-file_creation', FileFormAddress), + ('towns-file_creation', TownFormset), + ('parcels-file_creation', ParcelFormSet), + ('preventive-file_creation', FileFormPreventive), + ('final-file_creation', FinalForm)], + condition_dict={'preventive-file_creation':is_preventive( + 'general-file_creation', + models.FileType, type_key='file_type') + }, + url_name='file_creation',) + +file_modification_wizard = FileModificationWizard.as_view([ + ('selec-file_modification', FileFormSelection), + ('general-file_modification', FileFormGeneralRO), + ('adress-file_modification', FileFormAddress), + ('towns-file_modification', TownFormset), + ('parcels-file_modification', ParcelFormSet), + ('preventive-file_modification', FileFormPreventive), + ('final-file_modification', FinalForm)], + condition_dict={'preventive-file_modification':is_preventive( + 'general-file_modification', + models.FileType, type_key='file_type') + }, + url_name='file_modification',) + +file_closing_wizard = FileClosingWizard.as_view([ + ('selec-file_closing', FileFormSelection), + ('date-file_closing', ClosingDateFormSelection), + ('final-file_closing', FinalFileClosingForm)], + url_name='file_closing',) + + +file_deletion_wizard = FileDeletionWizard.as_view([ + ('selec-file_deletion', FileFormSelection), + ('final-file_deletion', FinalFileDeleteForm)], + url_name='file_deletion',) + +file_administrativeactfile_wizard = FileAdministrativeActWizard.as_view([ + ('selec-file_administrativeactfile', FileFormSelection), + ('administrativeact-file_administrativeactfile', + AdministrativeActFileForm), + ('final-file_administrativeactfile', FinalForm)], + url_name='file_administrativeactfile',) + +file_administrativeactfile_modification_wizard = \ + FileEditAdministrativeActWizard.as_view([ + ('selec-file_administrativeactfile_modification', + AdministrativeActFileFormSelection), + ('administrativeact-file_administrativeactfile_modification', + AdministrativeActFileForm), + ('final-file_administrativeactfile_modification', FinalForm)], + url_name='file_administrativeactfile_modification',) + +file_administrativeactfile_deletion_wizard = \ + AdministrativeActDeletionWizard.as_view([ + ('selec-file_administrativeactfile_deletion', + AdministrativeActFileFormSelection), + ('final-file_administrativeactfile_deletion', + FinalAdministrativeActDeleteForm)], + url_name='file_administrativeactfile_deletion',) + diff --git a/archaeological_files/wizards.py b/archaeological_files/wizards.py new file mode 100644 index 000000000..b161deae0 --- /dev/null +++ b/archaeological_files/wizards.py @@ -0,0 +1,155 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (C) 2012 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# See the file COPYING for details. + +from django.conf import settings +from django.core.exceptions import ObjectDoesNotExist +from django.shortcuts import render_to_response +from django.template import RequestContext +from django.utils.translation import ugettext_lazy as _ + +from ishtar_common.wizards import Wizard, ClosingWizard +from archaeological_operations.wizards import OperationAdministrativeActWizard,\ + AdministrativeActDeletionWizard +from archaeological_operations.models import AdministrativeAct +import models + +class FileWizard(Wizard): + model = models.File + object_parcel_type = 'associated_file' + + def get_form(self, request, storage, step=None, data=None, files=None): + """ + Manage towns + """ + if data: + data = data.copy() + else: + data = {} + # manage the dynamic choice of towns + if not step: + step = self.determine_step(request, storage) + form = self.get_form_list(request, storage)[step] + town_form_key = 'towns-' + self.url_name + if step.startswith('parcels-') and hasattr(form, 'management_form') \ + and self.session_has_key(request, storage, town_form_key): + towns = [] + qdict = request.session[storage.prefix]['step_data'][town_form_key] + for k in qdict.keys(): + if k.endswith("town") and qdict[k]: + try: + town = Town.objects.get(pk=int(qdict[k])) + towns.append((town.pk, unicode(town))) + except (ObjectDoesNotExist, ValueError): + pass + data['TOWNS'] = sorted(towns, key=lambda x:x[1]) + form = super(FileWizard, self).get_form(request, storage, step, data, + files) + return form + + def get_extra_model(self, dct, request, storage, form_list): + dct = super(FileWizard, self).get_extra_model(dct, request, storage, + form_list) + if not dct['numeric_reference']: + current_ref = models.File.objects.filter(year=dct['year'] + ).aggregate(Max('numeric_reference'))["numeric_reference__max"] + dct['numeric_reference'] = current_ref and current_ref + 1 or 1 + return dct + + def done(self, request, storage, form_list, **kwargs): + ''' + Save parcels + ''' + r = super(FileWizard, self).done(request, storage, form_list, + return_object=True, **kwargs) + if type(r) not in (list, tuple) or len(r) != 2: + return r + obj, res = r + obj.parcels.clear() + for form in form_list: + if not hasattr(form, 'prefix') \ + or not form.prefix.startswith('parcels-') \ + or not hasattr(form, 'forms'): + continue + for frm in form.forms: + if not frm.is_valid(): + continue + dct = frm.cleaned_data.copy() + if 'parcel' in dct: + try: + parcel = models.Parcel.objects.get(pk=dct['parcel']) + setattr(parcel, self.object_parcel_type, obj) + parcel.save() + except (ValueError, ObjectDoesNotExist): + continue + continue + try: + dct['town'] = models.Town.objects.get(pk=int(dct['town'])) + except (ValueError, ObjectDoesNotExist): + continue + dct['associated_file'], dct['operation'] = None, None + dct[self.object_parcel_type] = obj + if 'DELETE' in dct: + dct.pop('DELETE') + parcel = models.Parcel.objects.filter(**dct).count() + if not parcel: + dct['history_modifier'] = request.user + parcel = models.Parcel(**dct) + parcel.save() + return res + +class FileModificationWizard(FileWizard): + modification = True + +class FileClosingWizard(ClosingWizard): + model = models.File + fields = ['year', 'numeric_reference', 'internal_reference', + 'file_type', 'in_charge', 'general_contractor', 'creation_date', + 'reception_date', 'total_surface', 'total_developed_surface', + 'address', 'address_complement', 'postal_code', 'comment'] + if settings.COUNTRY == 'fr': + fields += ['saisine_type', 'reference_number'] + fields += ['towns'] +class FileDeletionWizard(FileClosingWizard): + def get_formated_datas(self, forms): + datas = super(FileDeletionWizard, self).get_formated_datas(forms) + datas.append((_("Associated operations"), [])) + for operation in models.Operation.objects.filter( + associated_file=self.current_obj).all(): + if operation.end_date: + datas[-1][1].append(('', unicode(operation))) + return datas + + def done(self, request, storage, form_list, **kwargs): + obj = self.get_current_object(request, storage) + for operation in models.Operation.objects.filter( + associated_file=obj).all(): + operation.delete() + obj.delete() + return render_to_response('wizard_done.html', {}, + context_instance=RequestContext(request)) + + +class FileAdministrativeActWizard(OperationAdministrativeActWizard): + model = models.File + +class FileEditAdministrativeActWizard(FileAdministrativeActWizard): + model = AdministrativeAct + edit = True + def get_associated_item(self, request, storage, dct): + return self.get_current_object(request, storage).associated_file |