summaryrefslogtreecommitdiff
path: root/archaeological_files/wizards.py
diff options
context:
space:
mode:
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
commit8d594a01220d5cbbe9d6e856d1aef04bbb8daf3e (patch)
tree1f1887c1153c40cd4323c482856e5f281ec1dc97 /archaeological_files/wizards.py
parent980bf7d6c548f09636b94fd53e575ab8c2e10d2e (diff)
downloadIshtar-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/wizards.py')
-rw-r--r--archaeological_files/wizards.py155
1 files changed, 155 insertions, 0 deletions
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