diff options
Diffstat (limited to 'archaeological_files/wizards.py')
| -rw-r--r-- | archaeological_files/wizards.py | 155 | 
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 | 
