diff options
| -rw-r--r-- | archaeological_operations/data_importer.py | 86 | ||||
| -rw-r--r-- | archaeological_operations/ishtar_menu.py | 141 | ||||
| -rw-r--r-- | archaeological_operations/urls.py | 183 | ||||
| -rw-r--r-- | archaeological_operations/utils.py | 186 | ||||
| -rw-r--r-- | archaeological_operations/views.py | 277 | ||||
| -rw-r--r-- | archaeological_operations/widgets.py | 9 | ||||
| -rw-r--r-- | archaeological_operations/wizards.py | 6 | 
7 files changed, 489 insertions, 399 deletions
| diff --git a/archaeological_operations/data_importer.py b/archaeological_operations/data_importer.py index 252fdcca0..9cbdca05c 100644 --- a/archaeological_operations/data_importer.py +++ b/archaeological_operations/data_importer.py @@ -17,15 +17,14 @@  # See the file COPYING for details. -import copy, datetime, re +import re  from django.db import IntegrityError  from django.template.defaultfilters import slugify -from django.utils.translation import ugettext_lazy as _  from ishtar_common.data_importer import *  from ishtar_common.models import Town, OrganizationType, SourceType, \ -                                 SupportType, Format, AuthorType +    SupportType, Format, AuthorType  from archaeological_operations import models  from archaeological_operations.forms import OPERATOR @@ -33,13 +32,14 @@ from archaeological_operations.utils import parse_parcels  RE_PERMIT_REFERENCE = re.compile('[A-Za-z]*(.*)') +  class ImportParcelFormater(ImportFormater): -    NEED = ['town',] +    NEED = ['town', ]      PARCEL_OWNER_KEY = 'associated_file'      def post_process(self, obj, context, value, owner=None):          value = value.strip() -        base_dct = {self.PARCEL_OWNER_KEY:obj, 'history_modifier':owner} +        base_dct = {self.PARCEL_OWNER_KEY: obj, 'history_modifier': owner}          if 'parcels' in context:              for key in context['parcels']:                  if context['parcels'][key]: @@ -49,8 +49,9 @@ class ImportParcelFormater(ImportFormater):              try:                  models.Parcel.objects.get_or_create(**parcel_dct)              except IntegrityError: -                raise ImporterError("Erreur d'import parcelle, contexte : %s" \ -                                                    % unicode(parcel_dct)) +                raise ImporterError("Erreur d'import parcelle, contexte : %s" +                                    % unicode(parcel_dct)) +  class ImportYearFormater(ImportFormater):      def post_process(self, obj, context, value, owner=None): @@ -60,6 +61,7 @@ class ImportYearFormater(ImportFormater):          obj.year = value.year          obj.save() +  class TownFormater(Formater):      def __init__(self, town_full_dct={}, town_dct={}):          self._town_full_dct = town_full_dct @@ -70,13 +72,13 @@ class TownFormater(Formater):          for town in Town.objects.all():              key = (slugify(town.name.strip()), town.numero_insee[:2])              if key in self._town_full_dct: -                print("Danger! %s is ambiguous with another town on the same "\ -                      "department."% town.name) +                print("Danger! %s is ambiguous with another town on the same " +                      "department." % town.name)                  continue              self._town_full_dct[key] = town              key = slugify(town.name.strip())              if key in self._town_dct: -                print("Warning %s is ambiguous with no department provided" %\ +                print("Warning %s is ambiguous with no department provided" %                        town.name)                  continue              self._town_dct[key] = town @@ -98,6 +100,7 @@ class TownFormater(Formater):          if key in self._town_dct:              return self._town_dct[key] +  class TownINSEEFormater(Formater):      def __init__(self):          self._town_dct = {} @@ -114,6 +117,7 @@ class TownINSEEFormater(Formater):          self._town_dct[value] = q.all()[0]          return self._town_dct[value] +  class SurfaceFormater(Formater):      def test(self):          assert self.format(u"352 123") == 352123 @@ -133,14 +137,13 @@ class SurfaceFormater(Formater):          try:              return int(value.replace(' ', '')) * factor          except ValueError: -            raise ImporterError("Erreur import surface : %s" \ -                                                    % unicode(value)) +            raise ImporterError("Erreur import surface : %s" % unicode(value)) -#RE_ADD_CD_POSTAL_TOWN = re.compile("(.*)[, ](\d{5}) (.*?) *(?: "\ -#                                   "*CEDEX|cedex|Cedex *\d*)*") +# RE_ADD_CD_POSTAL_TOWN = re.compile("(.*)[, ](\d{5}) (.*?) *(?: "\ +#                                    "*CEDEX|cedex|Cedex *\d*)*") -RE_NAME_ADD_CD_POSTAL_TOWN = re.compile("(.+)?[, ]*" + NEW_LINE_BREAK \ -                                      + "(.+)?[, ]*(\d{2} *\d{3})[, ]*(.+)") +RE_NAME_ADD_CD_POSTAL_TOWN = re.compile( +    "(.+)?[, ]*" + NEW_LINE_BREAK + "(.+)?[, ]*(\d{2} *\d{3})[, ]*(.+)")  RE_ADD_CD_POSTAL_TOWN = re.compile("(.+)?[, ]*(\d{2} *\d{3})[, ]*(.+)") @@ -148,14 +151,15 @@ RE_CD_POSTAL_FILTER = re.compile("(\d*) (\d*)")  RE_ORGA = re.compile("([^,]*)") +  class OperationImporterBibracte(Importer):      OBJECT_CLS = models.Operation      DESC = u"Exports Bibracte : importeur pour l'onglet opération"      DEFAULTS = { -                ('operator',):{ -                    'organization_type':OPERATOR -                    }, -               } +        ('operator',): { +            'organization_type': OPERATOR +        }, +    }      LINE_FORMAT = [          # CODE OPE          ImportFormater('operation_code', IntegerFormater(),), @@ -165,9 +169,9 @@ class OperationImporterBibracte(Importer):          ImportFormater('operation_type', TypeFormater(models.OperationType),),          # NOM          ImportFormater('common_name', UnicodeFormater(120),), -        # OPERATEUR +        # OPERATEUR          ImportFormater('operator__name', UnicodeFormater(120),), -        # resp. lien IMPORT avec personne +        # resp. lien IMPORT avec personne          ImportFormater('in_charge__raw_name', UnicodeFormater(300),),          # début          ImportFormater('start_date', DateFormater(['%Y/%m/%d']),), @@ -181,23 +185,25 @@ class OperationImporterBibracte(Importer):  RE_PARCEL_SECT_NUM = re.compile("([A-Za-z]*)([0-9]*)")  RE_NUM_INSEE = re.compile("([0-9]*)") +  class ParcelImporterBibracte(Importer):      OBJECT_CLS = models.Parcel      DESC = u"Exports Bibracte : importeur pour l'onglet parcelles"      DEFAULTS = { -                ('operator',):{ -                    'organization_type':OrganizationType.objects.get( -                                             txt_idx="operator")}, -               } +        ('operator',): { +            'organization_type': OrganizationType.objects.get( +                txt_idx="operator")}, +    }      LINE_FORMAT = [          # code OA          ImportFormater('operation__operation_code', IntegerFormater(),),          # identifiant parcelle -        ImportFormater(['section', 'parcel_number'], -                     [UnicodeFormater(4), UnicodeFormater(6),], -                    regexp=RE_PARCEL_SECT_NUM, -                    regexp_formater_args=[[0], [1]], required=False, -                    duplicate_fields=['external_id'],), +        ImportFormater( +            ['section', 'parcel_number'], +            [UnicodeFormater(4), UnicodeFormater(6), ], +            regexp=RE_PARCEL_SECT_NUM, +            regexp_formater_args=[[0], [1]], required=False, +            duplicate_fields=['external_id'],),          # numero parcelle          ImportFormater('parcel_number', UnicodeFormater(6),                         required=False,), @@ -211,7 +217,7 @@ class ParcelImporterBibracte(Importer):          # numero INSEE commune          ImportFormater('town__numero_insee', UnicodeFormater(6),                         regexp=RE_NUM_INSEE, required=False,), -        # nom departement +        # nom departement          None,          # lieu dit adresse          ImportFormater('address', UnicodeFormater(500), @@ -224,8 +230,7 @@ MAIN_AUTHOR, created = AuthorType.objects.get_or_create(txt_idx='main_author')  class DocImporterBibracte(Importer):      OBJECT_CLS = models.OperationSource      DEFAULTS = { -        ('authors',):{ -                    'author_type':MAIN_AUTHOR}, +        ('authors',): {'author_type': MAIN_AUTHOR},      }      DESC = u"Exports Bibracte : importeur pour l'onglet documentation"      LINE_FORMAT = [ @@ -233,17 +238,20 @@ class DocImporterBibracte(Importer):          ImportFormater('operation__operation_code', IntegerFormater(),),          # identifiant documentation          ImportFormater('external_id', UnicodeFormater(12),), -        # type -        ImportFormater('source_type', TypeFormater(SourceType), required=False), +        # type +        ImportFormater('source_type', TypeFormater(SourceType), +                       required=False),          # nature support -        ImportFormater('support_type', TypeFormater(SupportType), required=False), +        ImportFormater('support_type', TypeFormater(SupportType), +                       required=False),          # nombre element          ImportFormater('item_number', IntegerFormater(), required=False),          # auteur -        ImportFormater('authors__person__raw_name', UnicodeFormater(300), required=False), +        ImportFormater('authors__person__raw_name', UnicodeFormater(300), +                       required=False),          # annee          ImportFormater('creation_date', DateFormater(['%Y']),), -        # format +        # format          ImportFormater('format_type', TypeFormater(Format), required=False),          # description legende          ImportFormater('description', UnicodeFormater(1000), required=False), diff --git a/archaeological_operations/ishtar_menu.py b/archaeological_operations/ishtar_menu.py index 249c86185..8c9fbbbc3 100644 --- a/archaeological_operations/ishtar_menu.py +++ b/archaeological_operations/ishtar_menu.py @@ -27,28 +27,35 @@ import models  FILES_AVAILABLE = 'archaeological_files' in settings.INSTALLED_APPS  MENU_SECTIONS = [ -    (30, SectionItem('operation_management', _(u"Operation"), +    (30, SectionItem( +        'operation_management', _(u"Operation"),          childs=[ -            MenuItem('operation_search', _(u"Search"), +            MenuItem( +                'operation_search', _(u"Search"),                  model=models.Operation,                  access_controls=['view_operation',                                   'view_own_operation']), -            MenuItem('operation_creation', _(u"Creation"), +            MenuItem( +                'operation_creation', _(u"Creation"),                  model=models.Operation,                  access_controls=['add_operation',                                   'add_own_operation']), -            MenuItem('operation_modification', _(u"Modification"), -              model=models.Operation, -              access_controls=['change_operation', -                               'change_own_operation']), -            MenuItem('operation_closing', _(u"Closing"), -              model=models.Operation, -              access_controls=['close_operation']), -            MenuItem('operation_deletion', _(u"Deletion"), -              model=models.Operation, -              access_controls=['change_operation', -                               'change_own_operation']), -            SectionItem('operation_source', _(u"Documentation"), +            MenuItem( +                'operation_modification', _(u"Modification"), +                model=models.Operation, +                access_controls=['change_operation', +                                 'change_own_operation']), +            MenuItem( +                'operation_closing', _(u"Closing"), +                model=models.Operation, +                access_controls=['close_operation']), +            MenuItem( +                'operation_deletion', _(u"Deletion"), +                model=models.Operation, +                access_controls=['change_operation', +                                 'change_own_operation']), +            SectionItem( +                'operation_source', _(u"Documentation"),                  childs=[                      MenuItem('operation_source_search',                               _(u"Search"), @@ -72,58 +79,74 @@ MENU_SECTIONS = [                                                'change_own_operation']),                  ])          ]), -    ), -    (102, SectionItem('dashboard', _(u"Dashboard"), -        childs=[ -                MenuItem('dashboard_main', _(u"General informations"), +     ), +    ( +        102, SectionItem( +            'dashboard', _(u"Dashboard"), +            childs=[ +                MenuItem( +                    'dashboard_main', _(u"General informations"),                      model=models.Operation,                      access_controls=['change_operation']), -                MenuItem('dashboard_operation', _(u"Operations"), +                MenuItem( +                    'dashboard_operation', _(u"Operations"),                      model=models.Operation,                      access_controls=['change_operation']), -        ]), +            ]),      ),  ]  if FILES_AVAILABLE: -    MENU_SECTIONS.insert(1,  -      (35, SectionItem('administrativact_management', _(u"Administrative Act"), -        childs=[ -            MenuItem('administrativact_register', -                pgettext_lazy('admin act register',u"Register"), -                model=models.AdministrativeAct, -                access_controls=['view_administrativeact', -                                 'view_own_administrativeact']), -               ]) -      ) +    MENU_SECTIONS.insert( +        1, +        ( +            35, SectionItem( +                'administrativact_management', _(u"Administrative Act"), +                childs=[ +                    MenuItem( +                        'administrativact_register', +                        pgettext_lazy('admin act register', u"Register"), +                        model=models.AdministrativeAct, +                        access_controls=['view_administrativeact', +                                         'view_own_administrativeact']), +                ]) +        )      ) -    MENU_SECTIONS[0][1].childs.insert(5, -            SectionItem('admin_act_operations', -                        _(u"Administrative act"), +    MENU_SECTIONS[0][1].childs.insert( +        5, +        SectionItem( +            'admin_act_operations', +            _(u"Administrative act"),              childs=[ -                MenuItem('operation_administrativeactop_search', -                         _(u"Search"), -                  model=models.Operation, -                  access_controls=['change_operation', -                                   'change_own_operation']), -                MenuItem('operation_administrativeactop', -                         _(u"Add"), -                  model=models.Operation, -                  access_controls=['change_operation', -                                   'change_own_operation']), -                MenuItem('operation_administrativeactop_modification', -                         _(u"Modification"), -                  model=models.AdministrativeAct, -                  access_controls=['change_operation', -                                   'change_own_operation']), -                MenuItem('operation_administrativeactop_deletion', -                         _(u"Deletion"), -                  model=models.AdministrativeAct, -                  access_controls=['operation_deletion', -                                   'delete_own_operation']), -                MenuItem('operation_administrativeact_document', -                         _(u"Documents"), -                  model=models.AdministrativeAct, -                  access_controls=['change_operation', 'change_own_operation']), -                ],) +                MenuItem( +                    'operation_administrativeactop_search', +                    _(u"Search"), +                    model=models.Operation, +                    access_controls=[ +                        'change_operation', 'change_own_operation']), +                MenuItem( +                    'operation_administrativeactop', +                    _(u"Add"), +                    model=models.Operation, +                    access_controls=['change_operation', +                                     'change_own_operation']), +                MenuItem( +                    'operation_administrativeactop_modification', +                    _(u"Modification"), +                    model=models.AdministrativeAct, +                    access_controls=['change_operation', +                                     'change_own_operation']), +                MenuItem( +                    'operation_administrativeactop_deletion', +                    _(u"Deletion"), +                    model=models.AdministrativeAct, +                    access_controls=[ +                        'operation_deletion', 'delete_own_operation']), +                MenuItem( +                    'operation_administrativeact_document', +                    _(u"Documents"), +                    model=models.AdministrativeAct, +                    access_controls=['change_operation', +                                     'change_own_operation']), +            ],)      ) diff --git a/archaeological_operations/urls.py b/archaeological_operations/urls.py index f448fd6a7..e0909af8b 100644 --- a/archaeological_operations/urls.py +++ b/archaeological_operations/urls.py @@ -22,96 +22,99 @@ from django.conf.urls.defaults import *  import views  # forms -urlpatterns = patterns('', -       url(r'operation_administrativeactop_search/(?P<step>.+)?$', -           views.operation_administrativeactop_search_wizard, -           name='operation_administrativeactop_search'), -       url(r'operation_administrativeactop/(?P<step>.+)?$', -           views.operation_administrativeactop_wizard, -           name='operation_administrativeactop'), -       url(r'operation_administrativeactop_modification/(?P<step>.+)?$', -           views.operation_administrativeactop_modification_wizard, -           name='operation_administrativeactop_modification'), -       url(r'operation_administrativeactop_deletion/(?P<step>.+)?$', -           views.operation_administrativeactop_deletion_wizard, -           name='operation_administrativeactop_deletion'), -       url(r'operation_source_search/(?P<step>.+)?$', -           views.operation_source_search_wizard, -           name='operation_source_search'), -       url(r'operation_source_creation/(?P<step>.+)?$', -           views.operation_source_creation_wizard, -           name='operation_source_creation'), -       url(r'operation_source_modification/(?P<step>.+)?$', -           views.operation_source_modification_wizard, -           name='operation_source_modification'), -       url(r'operation_source_deletion/(?P<step>.+)?$', -           views.operation_source_deletion_wizard, -           name='operation_source_deletion'), -       url(r'operation_search/(?P<step>.+)?$', -           views.operation_search_wizard, name='operation_search'), -       url(r'operation_creation/(?P<step>.+)?$', -           views.operation_creation_wizard, name='operation_creation'), -       url(r'operation_add/(?P<file_id>\d+)$', -           views.operation_add, name='operation_add'), -       url(r'operation_modification/(?P<step>.+)?$', -           views.operation_modification_wizard, -           name='operation_modification'), -       url(r'operation_modify/(?P<pk>.+)/$', -           views.operation_modify, name='operation_modify'), -       url(r'operation_closing/(?P<step>.+)?$', -           views.operation_closing_wizard, name='operation_closing'), -       url(r'operation_deletion/(?P<step>.+)?$', -           views.operation_deletion_wizard, name='operation_deletion'), -       url(r'administrativact_register/(?P<step>.+)?$', -           views.administrativact_register_wizard, -           name='administrativact_register'), +urlpatterns = patterns( +    '', +    url(r'operation_administrativeactop_search/(?P<step>.+)?$', +        views.operation_administrativeactop_search_wizard, +        name='operation_administrativeactop_search'), +    url(r'operation_administrativeactop/(?P<step>.+)?$', +        views.operation_administrativeactop_wizard, +        name='operation_administrativeactop'), +    url(r'operation_administrativeactop_modification/(?P<step>.+)?$', +        views.operation_administrativeactop_modification_wizard, +        name='operation_administrativeactop_modification'), +    url(r'operation_administrativeactop_deletion/(?P<step>.+)?$', +        views.operation_administrativeactop_deletion_wizard, +        name='operation_administrativeactop_deletion'), +    url(r'operation_source_search/(?P<step>.+)?$', +        views.operation_source_search_wizard, +        name='operation_source_search'), +    url(r'operation_source_creation/(?P<step>.+)?$', +        views.operation_source_creation_wizard, +        name='operation_source_creation'), +    url(r'operation_source_modification/(?P<step>.+)?$', +        views.operation_source_modification_wizard, +        name='operation_source_modification'), +    url(r'operation_source_deletion/(?P<step>.+)?$', +        views.operation_source_deletion_wizard, +        name='operation_source_deletion'), +    url(r'operation_search/(?P<step>.+)?$', +        views.operation_search_wizard, name='operation_search'), +    url(r'operation_creation/(?P<step>.+)?$', +        views.operation_creation_wizard, name='operation_creation'), +    url(r'operation_add/(?P<file_id>\d+)$', +        views.operation_add, name='operation_add'), +    url(r'operation_modification/(?P<step>.+)?$', +        views.operation_modification_wizard, +        name='operation_modification'), +    url(r'operation_modify/(?P<pk>.+)/$', +        views.operation_modify, name='operation_modify'), +    url(r'operation_closing/(?P<step>.+)?$', +        views.operation_closing_wizard, name='operation_closing'), +    url(r'operation_deletion/(?P<step>.+)?$', +        views.operation_deletion_wizard, name='operation_deletion'), +    url(r'administrativact_register/(?P<step>.+)?$', +        views.administrativact_register_wizard, +        name='administrativact_register'),  ) -urlpatterns += patterns('archaeological_operations.views', -     url(r'autocomplete-operation/$', 'autocomplete_operation', -           name='autocomplete-operation'), -     url(r'get-operation/(?P<type>.+)?$', 'get_operation', -           name='get-operation'), -     url(r'get-operation-full/(?P<type>.+)?$', 'get_operation', -           name='get-operation-full', kwargs={'full':True}), -     url(r'get-available-operation-code/(?P<year>.+)?$', -           'get_available_operation_code', name='get_available_operation_code'), -     url(r'revert-operation/(?P<pk>.+)/(?P<date>.+)$', -           'revert_operation', name='revert-operation'), -     url(r'show-operation(?:/(?P<pk>.+))?/(?P<type>.+)?$', -           'show_operation', name='show-operation'), -     url(r'show-historized-operation/(?P<pk>.+)?/(?P<date>.+)?$', -           'show_operation', name='show-historized-operation'), -     url(r'get-administrativeactop/(?P<type>.+)?$', -           'get_administrativeactop', name='get-administrativeactop'), -     url(r'get-administrativeact/(?P<type>.+)?$', -           'get_administrativeact', name='get-administrativeact'), -     url(r'get-administrativeact-full/(?P<type>.+)?$', -           'get_administrativeact', name='get-administrativeact-full', -           kwargs={'full':True}), -     url(r'show-administrativeact(?:/(?P<pk>.+))?/(?P<type>.+)?$', -           'show_administrativeact', name='show-administrativeact'), -     # allow specialization for operations -     url(r'show-administrativeact(?:/(?P<pk>.+))?/(?P<type>.+)?$', -           'show_administrativeact', name='show-administrativeactop'), -     # allow specialization for files -     url(r'show-administrativeact(?:/(?P<pk>.+))?/(?P<type>.+)?$', -           'show_administrativeact', name='show-administrativeactfile'), -     url(r'generatedoc-administrativeactop/(?P<pk>.+)?/(?P<template_pk>.+)?$', -           'generatedoc_administrativeactop', -           name='generatedoc-administrativeactop'), -     url(r'get-operationsource/(?P<type>.+)?$', -           'get_operationsource', name='get-operationsource'), -     url(r'dashboard_operation/$', 'dashboard_operation', -         name='dashboard-operation'), -     url(r'autocomplete-archaeologicalsite/$', -          'autocomplete_archaeologicalsite', -          name='autocomplete-archaeologicalsite'), -     url(r'new-archaeologicalsite/(?:(?P<parent_name>[^/]+)/)?(?:(?P<limits>[^/]+)/)?$', -           'new_archaeologicalsite', name='new-archaeologicalsite'), -     url(r'autocomplete-patriarche/$', 'autocomplete_patriarche', -           name='autocomplete-patriarche'), -     url(r'operation_administrativeact_document/$', -           'administrativeactfile_document', -           name='operation-administrativeact-document'), +urlpatterns += patterns( +    'archaeological_operations.views', +    url(r'autocomplete-operation/$', 'autocomplete_operation', +        name='autocomplete-operation'), +    url(r'get-operation/(?P<type>.+)?$', 'get_operation', +        name='get-operation'), +    url(r'get-operation-full/(?P<type>.+)?$', 'get_operation', +        name='get-operation-full', kwargs={'full': True}), +    url(r'get-available-operation-code/(?P<year>.+)?$', +        'get_available_operation_code', name='get_available_operation_code'), +    url(r'revert-operation/(?P<pk>.+)/(?P<date>.+)$', +        'revert_operation', name='revert-operation'), +    url(r'show-operation(?:/(?P<pk>.+))?/(?P<type>.+)?$', +        'show_operation', name='show-operation'), +    url(r'show-historized-operation/(?P<pk>.+)?/(?P<date>.+)?$', +        'show_operation', name='show-historized-operation'), +    url(r'get-administrativeactop/(?P<type>.+)?$', +        'get_administrativeactop', name='get-administrativeactop'), +    url(r'get-administrativeact/(?P<type>.+)?$', +        'get_administrativeact', name='get-administrativeact'), +    url(r'get-administrativeact-full/(?P<type>.+)?$', +        'get_administrativeact', name='get-administrativeact-full', +        kwargs={'full': True}), +    url(r'show-administrativeact(?:/(?P<pk>.+))?/(?P<type>.+)?$', +        'show_administrativeact', name='show-administrativeact'), +    # allow specialization for operations +    url(r'show-administrativeact(?:/(?P<pk>.+))?/(?P<type>.+)?$', +        'show_administrativeact', name='show-administrativeactop'), +    # allow specialization for files +    url(r'show-administrativeact(?:/(?P<pk>.+))?/(?P<type>.+)?$', +        'show_administrativeact', name='show-administrativeactfile'), +    url(r'generatedoc-administrativeactop/(?P<pk>.+)?/(?P<template_pk>.+)?$', +        'generatedoc_administrativeactop', +        name='generatedoc-administrativeactop'), +    url(r'get-operationsource/(?P<type>.+)?$', +        'get_operationsource', name='get-operationsource'), +    url(r'dashboard_operation/$', 'dashboard_operation', +        name='dashboard-operation'), +    url(r'autocomplete-archaeologicalsite/$', +        'autocomplete_archaeologicalsite', +        name='autocomplete-archaeologicalsite'), +    url(r'new-archaeologicalsite/(?:(?P<parent_name>[^/]+)/)?' +        r'(?:(?P<limits>[^/]+)/)?$', +        'new_archaeologicalsite', name='new-archaeologicalsite'), +    url(r'autocomplete-patriarche/$', 'autocomplete_patriarche', +        name='autocomplete-patriarche'), +    url(r'operation_administrativeact_document/$', +        'administrativeactfile_document', +        name='operation-administrativeact-document'),  ) diff --git a/archaeological_operations/utils.py b/archaeological_operations/utils.py index 60b1585ef..53bfedc62 100644 --- a/archaeological_operations/utils.py +++ b/archaeological_operations/utils.py @@ -21,23 +21,24 @@ DELIMITER = ";"  QUOTECHAR = '"'  import datetime -import csv, codecs  import re  from django.conf import settings -from django.db import transaction +from django.core.exceptions import ObjectDoesNotExist  from django.template.defaultfilters import slugify  from django.contrib.auth.models import User  from ishtar_common.models import Town, Person, PersonType, OrganizationType, \      Organization, SourceType -from archaeological_files.models import PermitType, File, FileType -from archaeological_operations.models import Operation, OperationType, Period, \ -                            AdministrativeAct, ActType, OperationSource, Parcel +from archaeological_files.models import PermitType +from archaeological_operations.models import OperationType, Period, \ +    ActType +  def get_default_person():      return User.objects.order_by('pk').all()[0] +  def _get_parse_string(trunc_number=None):      def parse_string(value):          value = value.strip() @@ -51,20 +52,24 @@ def _get_parse_string(trunc_number=None):  parse_string = _get_parse_string() +  def parse_multivalue(value): -    s1 = re.sub('(.)([A-Z][a-z]+)', r'\1 \2', name) +    s1 = re.sub('(.)([A-Z][a-z]+)', r'\1 \2', value)      s1 = re.sub('([a-z0-9])([A-Z])', r'\1 \2', s1)      return re.sub('([0-9])([a-z])', r'\1 \2', s1)  ope_types = {} + +  def _init_ope_types():      for k in settings.ISHTAR_OPE_TYPES.keys():          ot, created = OperationType.objects.get_or_create( -                             txt_idx=settings.ISHTAR_OPE_TYPES[k][0], -                             defaults={'label':settings.ISHTAR_OPE_TYPES[k][1], -                                       'preventive':k[0]==u'préventive'}) +            txt_idx=settings.ISHTAR_OPE_TYPES[k][0], +            defaults={'label': settings.ISHTAR_OPE_TYPES[k][1], +                      'preventive': k[0] == u'préventive'})          ope_types[k] = ot +  def parse_operationtype(value, preventive, owner):      value = (preventive.strip(), value.strip())      if not ope_types: @@ -75,6 +80,8 @@ def parse_operationtype(value, preventive, owner):  periods = {}  periods_keys = [] + +  def _init_period():      for k in settings.ISHTAR_PERIODS.keys():          periods[k] = Period.objects.get(txt_idx=settings.ISHTAR_PERIODS[k]) @@ -92,6 +99,7 @@ def _init_period():      period_names_keys.sort(key=len)      period_names_keys.reverse() +  def parse_period(value):      value = parse_string(value)      value = value[3:] if value.startswith('EUR') else value @@ -119,6 +127,7 @@ REPLACED_PERIOD_DCT = dict(_REPLACED_PERIOD)  period_names = {}  period_names_keys = {} +  def parse_period_name(value):      if not period_names:          _init_period() @@ -138,36 +147,41 @@ def parse_period_name(value):  _CACHED_PERMIT_TYPES = {} +  def _init_permit_type():      for k in settings.ISHTAR_PERMIT_TYPES:          txt_idx, label = settings.ISHTAR_PERMIT_TYPES[k] -        permit_type, created = PermitType.objects.get_or_create(txt_idx=txt_idx, -                              defaults={'label':label, -                                        'available':True}) +        permit_type, created = PermitType.objects.get_or_create( +            txt_idx=txt_idx, defaults={'label': label, +                                       'available': True})          _CACHED_PERMIT_TYPES[k] = permit_type +  def parse_permittype(value):      value = parse_string(value).lower()      if not _CACHED_PERMIT_TYPES:          _init_permit_type()      if value not in _CACHED_PERMIT_TYPES: -        if not "" in _CACHED_PERMIT_TYPES: +        if "" not in _CACHED_PERMIT_TYPES:              return          value = ""      return _CACHED_PERMIT_TYPES[value]  _CACHED_ADMIN_ACT_TYPES = {} + +  def parse_admin_act_typ(value, code, owner):      value = parse_string(value).lower()      code = parse_string(code).lower()      if not value or not code:          return      if code not in _CACHED_ADMIN_ACT_TYPES: -        act_type, created = ActType.objects.get_or_create(txt_idx=code, -                                                     defaults={'label':value}) -        _CACHED_ADMIN_ACT_TYPES[code]  = act_type +        act_type, created = ActType.objects.get_or_create( +            txt_idx=code, defaults={'label': value}) +        _CACHED_ADMIN_ACT_TYPES[code] = act_type      return _CACHED_ADMIN_ACT_TYPES[code] +  def parse_fileref(value):      value = parse_string(value).split('/')[0]      value = value.split('.')[0] @@ -176,6 +190,7 @@ def parse_fileref(value):          return None      return int(match.group()) +  def parse_orga(value, alternate_value, owner):      value = parse_string(value)      if not value: @@ -194,6 +209,7 @@ def parse_orga(value, alternate_value, owner):                                         history_modifier=owner)      return orga +  def parse_bool(value):      value = parse_string(value)      if value.lower() in ('yes', 'oui'): @@ -204,6 +220,7 @@ def parse_bool(value):          value = None      return value +  def parse_date(value):      value = parse_string(value).split(' ')[0]      try: @@ -211,6 +228,7 @@ def parse_date(value):      except:          return None +  def parse_yearref(value):      value = parse_string(value).split('.')[0]      match = re.search('[0-9].[0-9]*', value) @@ -218,6 +236,7 @@ def parse_yearref(value):          return None      return int(match.group()) +  def parse_surface(value):      value = parse_string(value)      value = value.replace(',', '.') @@ -230,6 +249,7 @@ def parse_surface(value):      except:          return None +  def parse_year(value):      value = parse_string(value)      try: @@ -240,6 +260,7 @@ def parse_year(value):          return None      return yr +  def parse_trunc_patriarche(value):      value = parse_string(value)      if not value: @@ -251,6 +272,7 @@ def parse_trunc_patriarche(value):          return      return '18' + unicode(value) +  def parse_operation_code(value):      value = parse_string(value)      code = value.split('.')[-1] @@ -259,12 +281,14 @@ def parse_operation_code(value):      except:          return +  def parse_title(value):      value = parse_string(value)      if not value:          return      return value.title() +  def parse_name_surname(value):      value = parse_string(value)      items = value.split(' ') @@ -273,40 +297,41 @@ def parse_name_surname(value):      if len(items) > 1:          name = " ".join(items[:-1])          surname = items[-1] -    values = {"surname":parse_title(surname)[:30], -              "name":parse_title(name)[:30]} +    values = {"surname": parse_title(surname)[:30], +              "name": parse_title(name)[:30]}      if not values['surname'] and not values['name']:          return      q = Person.objects.filter(**values)      if q.count():          return q.all()[0]      else: -        defaults = {'history_modifier':get_default_user(), -                    'title':''} +        defaults = {'history_modifier': get_default_user(), +                    'title': ''}          defaults.update(values)          p = Person.objects.create(**defaults)          p.person_types.add(PersonType.objects.get( -                                txt_idx='head_scientist')) +            txt_idx='head_scientist'))          return p +  def parse_person(surname, name, old_ref, owner): -    value = parse_string(value) -    values = {"surname":parse_title(surname), -              "name":parse_title(name)} +    values = {"surname": parse_title(surname), +              "name": parse_title(name)}      if not values['surname'] and not values['name']:          return      q = Person.objects.filter(**values)      if q.count():          return q.all()[0]      else: -        defaults = {'history_modifier':owner, -                    'title':''} +        defaults = {'history_modifier': owner, +                    'title': ''}          defaults.update(values)          p = Person.objects.create(**defaults)          p.person_types.add(PersonType.objects.get( -                                txt_idx='head_scientist')) +            txt_idx='head_scientist'))          return p +  def parse_comment_addr_nature(nature, addr, owner):      addr = parse_string(addr)      nature = parse_string(nature) @@ -322,57 +347,60 @@ def parse_comment_addr_nature(nature, addr, owner):  # si pas de start date : premier janvier de year  ope_types = { -    'AET':('other_study', -           'Autre étude', True), -    'APP':('assistance_preparation_help', -           'Aide à la préparation de publication', True), -    'DOC':('documents_study', -           'Étude documentaire', True), -    'EV':('evaluation', -          "Fouille d'évaluation", True), -    'FOU':('ancient_excavation', -           "Fouille ancienne", True), -    'FP':('prog_excavation', -          "Fouille programmée", False), -    'MH':('building_study', "Fouille avant MH", True), -    'OPD':('arch_diagnostic', -           "Diagnostic archéologique", True), -    'PAN':('analysis_program', -           "Programme d'analyses", False), -    'PCR':('collective_research_project', -           "Projet collectif de recherche", False), -    'PMS':('specialized_eqp_prospection', -           "Prospection avec matériel spécialisé", False), -    'PRD':('diachronic_prospection', +    'AET': ('other_study', +            'Autre étude', True), +    'APP': ('assistance_preparation_help', +            'Aide à la préparation de publication', True), +    'DOC': ('documents_study', +            'Étude documentaire', True), +    'EV': ('evaluation', +           "Fouille d'évaluation", True), +    'FOU': ('ancient_excavation', +            "Fouille ancienne", True), +    'FP': ('prog_excavation', +           "Fouille programmée", False), +    'MH': ('building_study', "Fouille avant MH", True), +    'OPD': ('arch_diagnostic', +            "Diagnostic archéologique", True), +    'PAN': ('analysis_program', +            "Programme d'analyses", False), +    'PCR': ('collective_research_project', +            "Projet collectif de recherche", False), +    'PMS': ('specialized_eqp_prospection', +            "Prospection avec matériel spécialisé", False), +    'PRD': ('diachronic_prospection', +            "Prospection diachronique", False), +    'PI': ('diachronic_prospection',             "Prospection diachronique", False), -    'PI':('diachronic_prospection', -           "Prospection diachronique", False), -    'PRM':('metal_detector_prospection', -           "Prospection détecteur de métaux", False), -    'PRT':('thematic_prospection', -           "Prospection thématique", False), -    'PT':('thematic_prospection', +    'PRM': ('metal_detector_prospection', +            "Prospection détecteur de métaux", False), +    'PRT': ('thematic_prospection', +            "Prospection thématique", False), +    'PT': ('thematic_prospection',             "Prospection thématique", False), -    'RAR':('cave_art_record', -           "Relevé d'art rupestre", False), -    'SD':('sampling_research', -          "Sondage", False), -    'SP':('prev_excavation', -          "Fouille préventive", True), -    'SU':('emergency_excavation', -          "Fouille préventive d'urgence", True), +    'RAR': ('cave_art_record', +            "Relevé d'art rupestre", False), +    'SD': ('sampling_research', +           "Sondage", False), +    'SP': ('prev_excavation', +           "Fouille préventive", True), +    'SU': ('emergency_excavation', +           "Fouille préventive d'urgence", True),  }  _CACHED_OPE_TYPES = {} +  def _prepare_ope_types():      for k in ope_types.keys():          txt_idx, label, preventive = ope_types[k] -        ot, created = OperationType.objects.get_or_create(txt_idx=txt_idx, -                              defaults={'label':label, 'preventive':preventive}) +        ot, created = OperationType.objects.get_or_create( +            txt_idx=txt_idx, defaults={'label': label, +                                       'preventive': preventive})          if k not in _CACHED_OPE_TYPES.keys():              _CACHED_OPE_TYPES[k] = ot +  def parse_patriarche_operationtype(value):      if value not in _CACHED_OPE_TYPES.keys():          return None @@ -380,6 +408,7 @@ def parse_patriarche_operationtype(value):  _dpt_re_filter = re.compile('^\([0-9]*\) ') +  def parse_ope_name(value):      if not value:          return '' @@ -389,6 +418,7 @@ def parse_ope_name(value):      value = _dpt_re_filter.sub('', value)      return value +  def parse_ha(value):      value = parse_string(value)      try: @@ -397,6 +427,7 @@ def parse_ha(value):          value = None      return value +  def parse_rapp_index(value):      value = parse_string(value)      items = re.findall(r'[0-9]+$', value) @@ -405,16 +436,18 @@ def parse_rapp_index(value):  _CACHED_DOC_TYPES = {} +  def parse_doc_types(value):      value = parse_string(value)      if value not in _CACHED_DOC_TYPES:          if value not in settings.ISHTAR_DOC_TYPES:              return          _CACHED_DOC_TYPES[value], created = SourceType.objects.get_or_create( -                            txt_idx=value, -                            defaults={"label":settings.ISHTAR_DOC_TYPES[value]}) +            txt_idx=value, +            defaults={"label": settings.ISHTAR_DOC_TYPES[value]})      return _CACHED_DOC_TYPES[value] +  def parse_insee(value):      value = parse_string(value)      values = [] @@ -427,15 +460,20 @@ def parse_insee(value):              town = Town.objects.get(numero_insee=value)              towns.append(town)          except: -            #sys.stderr.write('Numero INSEE : %s non existant en base' % value) +            # sys.stderr.write('Numero INSEE : %s non existant en base' +            # % value)              continue      return towns  PARCEL_YEAR_REGEXP = re.compile(r"^([0-9]{4})[ :]+") -PARCEL_SECTION_REGEXP = re.compile(ur"(?: )*(?:[Ss]ection(?:s)?)?(?: )*([A-Z][A-Z0-9]{0,3})[ :]*((?:(?: |;|,|[Pp]arcelle(?:s)?|n°|et|à|to)*[0-9]+[p]?)+)") +PARCEL_SECTION_REGEXP = re.compile( +    ur"(?: )*(?:[Ss]ection(?:s)?)?(?: )*([A-Z][A-Z0-9]{0,3})[ :]*" +    ur"((?:(?: |;|,|[Pp]arcelle(?:s)?|n°|et|à|to)*[0-9]+[p]?)+)")  PARCEL_NB_RANGE_REGEXP = re.compile(ur'([0-9]+[p]?) (?:à|to) ([0-9]+[p]?)') -PARCEL_NB_REGEXP = re.compile(ur'(?: |;|,|[Pp]arcelle(?:s)?|n°|et|à|to)*([0-9]+[p]?)') +PARCEL_NB_REGEXP = re.compile( +    ur'(?: |;|,|[Pp]arcelle(?:s)?|n°|et|à|to)*([0-9]+[p]?)') +  def parse_parcels(parcel_str, insee_code=None, owner=None):      parcels, town = [], None @@ -456,7 +494,7 @@ def parse_parcels(parcel_str, insee_code=None, owner=None):          for num in PARCEL_NB_REGEXP.findall(nums):              if len(unicode(num)) > 6:                  continue -            dct = {'year':year, 'section':sector, 'parcel_number':num} +            dct = {'year': year, 'section': sector, 'parcel_number': num}              if town:                  dct['town'] = town              if owner: @@ -471,8 +509,8 @@ def parse_parcels(parcel_str, insee_code=None, owner=None):              except ValueError:                  continue              for num in xrange(lower_range, higher_range): -                dct = {'year':year, 'section':sector, -                       'parcel_number':unicode(num)} +                dct = {'year': year, 'section': sector, +                       'parcel_number': unicode(num)}                  if town:                      dct['town'] = town                  if owner: diff --git a/archaeological_operations/views.py b/archaeological_operations/views.py index 5e7288caa..34473c7b1 100644 --- a/archaeological_operations/views.py +++ b/archaeological_operations/views.py @@ -38,9 +38,9 @@ import models  def autocomplete_patriarche(request, non_closed=True):      if (not request.user.has_perm('ishtar_common.view_operation',                                    models.Operation) -        and not request.user.has_perm('ishtar_common.view_own_operation', -                                      models.Operation) -        and not request.user.ishtaruser.has_right('operation_search')): +            and not request.user.has_perm('ishtar_common.view_own_operation', +                                          models.Operation) +            and not request.user.ishtaruser.has_right('operation_search')):          return HttpResponse(mimetype='text/plain')      if not request.GET.get('term'):          return HttpResponse(mimetype='text/plain') @@ -51,21 +51,21 @@ def autocomplete_patriarche(request, non_closed=True):      if non_closed:          query = query & Q(end_date__isnull=True)      limit = 15 -    operations = models.Operation.objects.filter(query -                                ).order_by('code_patriarche')[:limit] -    data = json.dumps([{'id':operation.code_patriarche, -                        'value':operation.code_patriarche} -                         for operation in operations]) +    operations = models.Operation.objects\ +        .filter(query).order_by('code_patriarche')[:limit] +    data = json.dumps([{'id': operation.code_patriarche, +                        'value': operation.code_patriarche} +                       for operation in operations])      return HttpResponse(data, mimetype='text/plain')  def autocomplete_archaeologicalsite(request):      if (not request.user.has_perm( -                      'archaeological_operations.view_archaeologicalsite', -                      models.ArchaeologicalSite) +            'archaeological_operations.view_archaeologicalsite', +            models.ArchaeologicalSite)          and not request.user.has_perm( -                      'archaeological_operations.view_own_archaeologicalsite', -                      models.ArchaeologicalSite)): +            'archaeological_operations.view_own_archaeologicalsite', +            models.ArchaeologicalSite)):          return HttpResponse(mimetype='text/plain')      if not request.GET.get('term'):          return HttpResponse(mimetype='text/plain') @@ -75,23 +75,24 @@ def autocomplete_archaeologicalsite(request):          qt = Q(reference__icontains=q) | Q(name__icontains=q)          query = query & qt      limit = 15 -    sites = models.ArchaeologicalSite.objects.filter(query -                                        ).order_by('reference')[:limit] -    data = json.dumps([{'id':site.pk, -                        'value':unicode(site)[:60]} -                         for site in sites]) +    sites = models.ArchaeologicalSite.objects\ +        .filter(query).order_by('reference')[:limit] +    data = json.dumps([{'id': site.pk, +                        'value': unicode(site)[:60]} +                       for site in sites])      return HttpResponse(data, mimetype='text/plain')  new_archaeologicalsite = new_item(models.ArchaeologicalSite,                                    ArchaeologicalSiteForm) +  def autocomplete_operation(request, non_closed=True): -    person_types = request.user.ishtaruser.person.person_type +    # person_types = request.user.ishtaruser.person.person_type      if (not request.user.has_perm('ishtar_common.view_operation',                                    models.Operation)          and not request.user.has_perm('ishtar_common.view_own_operation',                                        models.Operation) -        and not request.user.ishtaruser.has_right('operation_search')): +            and not request.user.ishtaruser.has_right('operation_search')):          return HttpResponse(mimetype='text/plain')      if not request.GET.get('term'):          return HttpResponse(mimetype='text/plain') @@ -100,7 +101,7 @@ def autocomplete_operation(request, non_closed=True):      for q in q.split(' '):          extra = Q(towns__name__icontains=q)          try: -            value = int(q) +            int(q)              extra = extra | Q(year=q) | Q(operation_code=q)          except ValueError:              pass @@ -109,76 +110,85 @@ def autocomplete_operation(request, non_closed=True):          query = query & Q(end_date__isnull=True)      limit = 15      operations = models.Operation.objects.filter(query)[:limit] -    data = json.dumps([{'id':operation.pk, 'value':unicode(operation)} -                                          for operation in operations]) +    data = json.dumps([{'id': operation.pk, 'value': unicode(operation)} +                       for operation in operations])      return HttpResponse(data, mimetype='text/plain') +  def get_available_operation_code(request, year=None):      if not request.user.has_perm('ishtar_common.view_operation',                                   models.Operation)\         and not request.user.has_perm('ishtar_common.view_own_operation',                                       models.Operation):          return HttpResponse(mimetype='text/plain') -    data = json.dumps({'id':models.Operation.get_available_operation_code(year)}) +    data = json.dumps({'id': +                       models.Operation.get_available_operation_code(year)})      return HttpResponse(data, mimetype='text/plain') -get_operation = get_item(models.Operation, 'get_operation', 'operation', -    bool_fields = ['end_date__isnull'], -    dated_fields = ['start_date__lte', 'start_date__gte', -                    'excavation_end_date__lte', 'excavation_end_date__gte'], -    extra_request_keys={'common_name':'common_name__icontains', -                        'end_date':'end_date__isnull', -                        'year_index':('year', 'operation_code'), -                        'start_before':'start_date__lte', -                        'start_after':'start_date__gte', -                        'end_before':'excavation_end_date__lte', -                        'end_after':'excavation_end_date__gte', -                        'parcel_0':('parcels__section', -                                    'associated_file__parcels__section'), -                        'parcel_1':('parcels__parcel_number', -                                    'associated_file__parcels__parcel_number'), -                        'history_creator':\ -                                     'history_creator__ishtaruser__person__pk', +get_operation = get_item( +    models.Operation, 'get_operation', 'operation', +    bool_fields=['end_date__isnull'], +    dated_fields=['start_date__lte', 'start_date__gte', +                  'excavation_end_date__lte', 'excavation_end_date__gte'], +    extra_request_keys={'common_name': 'common_name__icontains', +                        'end_date': 'end_date__isnull', +                        'year_index': ('year', 'operation_code'), +                        'start_before': 'start_date__lte', +                        'start_after': 'start_date__gte', +                        'end_before': 'excavation_end_date__lte', +                        'end_after': 'excavation_end_date__gte', +                        'parcel_0': ('parcels__section', +                                     'associated_file__parcels__section'), +                        'parcel_1': ( +                            'parcels__parcel_number', +                            'associated_file__parcels__parcel_number'), +                        'history_creator': +                        'history_creator__ishtaruser__person__pk',                          }, -    ) +)  show_operation = show_item(models.Operation, 'operation')  revert_operation = revert_item(models.Operation) -get_operationsource = get_item(models.OperationSource, +get_operationsource = get_item( +    models.OperationSource,      'get_operationsource', 'operationsource', -    extra_request_keys={'operation__towns':'operation__towns__pk', -                  'operation__operation_type':'operation__operation_type__pk', -                  'operation__year':'operation__year'}) +    extra_request_keys={ +        'operation__towns': 'operation__towns__pk', +        'operation__operation_type': 'operation__operation_type__pk', +        'operation__year': 'operation__year'}) -get_administrativeactop = get_item(models.AdministrativeAct, +get_administrativeactop = get_item( +    models.AdministrativeAct,      'get_administrativeactop', 'administrativeactop', -    extra_request_keys={'associated_file__towns':'associated_file__towns__pk', -                        'operation__towns':'operation__towns__pk', -                        'act_type__intented_to':'act_type__intented_to', -                        'year':'signature_date__year', -                        'history_creator':\ -                                     'history_creator__ishtaruser__person__pk', +    extra_request_keys={'associated_file__towns': 'associated_file__towns__pk', +                        'operation__towns': 'operation__towns__pk', +                        'act_type__intented_to': 'act_type__intented_to', +                        'year': 'signature_date__year', +                        'history_creator': +                        'history_creator__ishtaruser__person__pk',                          }, -    relative_session_names={'operation':'operation__pk'}) +    relative_session_names={'operation': 'operation__pk'}) -get_administrativeact = get_item(models.AdministrativeAct, +get_administrativeact = get_item( +    models.AdministrativeAct,      'get_administrativeact', 'administrativeact', -    extra_request_keys={'year':'signature_date__year', -                        'indexed':'index__isnull', -                        'history_creator':\ -                                     'history_creator__ishtaruser__person__pk', -                        'operation__towns':'operation__towns__pk'}, -    reversed_bool_fields = ['index__isnull'],) +    extra_request_keys={'year': 'signature_date__year', +                        'indexed': 'index__isnull', +                        'history_creator': +                        'history_creator__ishtaruser__person__pk', +                        'operation__towns': 'operation__towns__pk'}, +    reversed_bool_fields=['index__isnull'],)  show_administrativeact = show_item(models.AdministrativeAct,                                     'administrativeact') +  def dashboard_operation(request, *args, **kwargs):      """      Operation dashboard      """      dct = {'dashboard': models.OperationDashboard()} -    return render_to_response('ishtar/dashboards/dashboard_operation.html', dct, -                              context_instance=RequestContext(request)) +    return render_to_response('ishtar/dashboards/dashboard_operation.html', +                              dct, context_instance=RequestContext(request))  operation_search_wizard = SearchWizard.as_view([      ('general-operation_search', OperationFormSelection)], @@ -200,22 +210,23 @@ if FILES_AVAILABLE:      wizard_steps.insert(0, ('filechoice-operation_creation',                              OperationFormFileChoice)) -operation_creation_wizard = OperationWizard.as_view(wizard_steps, +operation_creation_wizard = OperationWizard.as_view( +    wizard_steps,      label=_(u"New operation"),      condition_dict={ -        'preventive-operation_creation':\ -            is_preventive('general-operation_creation', models.OperationType, -            'operation_type', 'prev_excavation'), -        'preventivediag-operation_creation':\ -            is_preventive('general-operation_creation', models.OperationType, -            'operation_type', 'arch_diagnostic'), -        'townsgeneral-operation_creation':has_associated_file( +        'preventive-operation_creation': +        is_preventive('general-operation_creation', models.OperationType, +                      'operation_type', 'prev_excavation'), +        'preventivediag-operation_creation': +        is_preventive('general-operation_creation', models.OperationType, +                      'operation_type', 'arch_diagnostic'), +        'townsgeneral-operation_creation': has_associated_file(              'filechoice-operation_creation', negate=True), -        'towns-operation_creation':has_associated_file( +        'towns-operation_creation': has_associated_file(              'filechoice-operation_creation'), -        'parcelsgeneral-operation_creation':has_associated_file( +        'parcelsgeneral-operation_creation': has_associated_file(              'filechoice-operation_creation', negate=True), -        'parcels-operation_creation':has_associated_file( +        'parcels-operation_creation': has_associated_file(              'filechoice-operation_creation'),      },      url_name='operation_creation',) @@ -234,37 +245,39 @@ operation_modification_wizard = OperationModificationWizard.as_view([      ('final-operation_modification', FinalForm)],      label=_(u"Operation modification"),      condition_dict={ -        'preventive-operation_modification':is_preventive( +        'preventive-operation_modification': is_preventive(              'general-operation_modification', models.OperationType,              'operation_type', 'prev_excavation'), -        'preventivediag-operation_modification':is_preventive( +        'preventivediag-operation_modification': is_preventive(              'general-operation_modification', models.OperationType,              'operation_type', 'arch_diagnostic'), -        'townsgeneral-operation_modification':has_associated_file( +        'townsgeneral-operation_modification': has_associated_file(              'general-operation_modification', negate=True), -        'towns-operation_modification':has_associated_file( +        'towns-operation_modification': has_associated_file(              'general-operation_modification'), -        'parcelsgeneral-operation_modification':has_associated_file( +        'parcelsgeneral-operation_modification': has_associated_file(              'general-operation_modification', negate=True), -        'parcels-operation_modification':has_associated_file( +        'parcels-operation_modification': has_associated_file(              'general-operation_modification'), -         }, +},      url_name='operation_modification',) +  def operation_modify(request, pk): -    view = operation_modification_wizard(request) -    OperationModificationWizard.session_set_value(request, -                        'selec-operation_modification', 'pk', pk, reset=True) +    operation_modification_wizard(request) +    OperationModificationWizard.session_set_value( +        request, 'selec-operation_modification', 'pk', pk, reset=True)      return redirect(reverse('operation_modification', -                            kwargs={'step':'general-operation_modification'})) +                            kwargs={'step': 'general-operation_modification'})) +  def operation_add(request, file_id): -    view = operation_creation_wizard(request) +    operation_creation_wizard(request)      OperationWizard.session_set_value( -                    request, 'filechoice-operation_creation', 'associated_file', -                    file_id, reset=True) +        request, 'filechoice-operation_creation', 'associated_file', +        file_id, reset=True)      return redirect(reverse('operation_creation', -                            kwargs={'step':'general-operation_creation'})) +                            kwargs={'step': 'general-operation_creation'}))  operation_closing_wizard = OperationClosingWizard.as_view([      ('selec-operation_closing', OperationFormSelection), @@ -286,7 +299,7 @@ operation_source_search_wizard = SearchWizard.as_view([  operation_source_creation_wizard = OperationSourceWizard.as_view([      ('selec-operation_source_creation', SourceOperationFormSelection), -    ('source-operation_source_creation',OperationSourceForm), +    ('source-operation_source_creation', OperationSourceForm),      ('authors-operation_source_creation', AuthorFormset),      ('final-operation_source_creation', FinalForm)],      label=_(u"Operation: source creation"), @@ -308,44 +321,45 @@ operation_source_deletion_wizard = OperationSourceDeletionWizard.as_view([  operation_administrativeactop_search_wizard = SearchWizard.as_view([      ('general-operation_administrativeactop_search', -    AdministrativeActOpeFormSelection)], +     AdministrativeActOpeFormSelection)],      label=_(u"Administrative act search"),      url_name='operation_administrativeactop_search',)  operation_administrativeactop_wizard = \ -                                OperationAdministrativeActWizard.as_view([ -    ('selec-operation_administrativeactop', OperationFormSelection), -    ('administrativeact-operation_administrativeactop', -     AdministrativeActOpeForm), -    ('final-operation_administrativeactop', FinalForm)], -    label=_(u"Operation: new administrative act"), -    url_name='operation_administrativeactop',) +    OperationAdministrativeActWizard.as_view([ +        ('selec-operation_administrativeactop', OperationFormSelection), +        ('administrativeact-operation_administrativeactop', +         AdministrativeActOpeForm), +        ('final-operation_administrativeactop', FinalForm)], +        label=_(u"Operation: new administrative act"), +        url_name='operation_administrativeactop',)  operation_administrativeactop_modification_wizard = \ -                                OperationEditAdministrativeActWizard.as_view([ -    ('selec-operation_administrativeactop_modification', -     AdministrativeActOpeFormSelection), -    ('administrativeact-operation_administrativeactop_modification', -     AdministrativeActOpeForm), -    ('final-operation_administrativeactop_modification', FinalForm)], -    label=_(u"Operation: administrative act modification"), -    url_name='operation_administrativeactop_modification',) +    OperationEditAdministrativeActWizard.as_view([ +        ('selec-operation_administrativeactop_modification', +         AdministrativeActOpeFormSelection), +        ('administrativeact-operation_administrativeactop_modification', +         AdministrativeActOpeForm), +        ('final-operation_administrativeactop_modification', FinalForm)], +        label=_(u"Operation: administrative act modification"), +        url_name='operation_administrativeactop_modification',)  operation_administrativeactop_deletion_wizard = \ -                                AdministrativeActDeletionWizard.as_view([ -    ('selec-operation_administrativeactop_deletion', -     AdministrativeActOpeFormSelection), -    ('final-operation_administrativeactop_deletion', -     FinalAdministrativeActDeleteForm)], -    label=_(u"Operation: administrative act deletion"), -    url_name='operation_administrativeactop_deletion',) +    AdministrativeActDeletionWizard.as_view([ +        ('selec-operation_administrativeactop_deletion', +         AdministrativeActOpeFormSelection), +        ('final-operation_administrativeactop_deletion', +         FinalAdministrativeActDeleteForm)], +        label=_(u"Operation: administrative act deletion"), +        url_name='operation_administrativeactop_deletion',)  administrativact_register_wizard = SearchWizard.as_view([      ('general-administrativact_register', -                AdministrativeActRegisterFormSelection)], -    label=pgettext_lazy('admin act register',u"Register"), +     AdministrativeActRegisterFormSelection)], +    label=pgettext_lazy('admin act register', u"Register"),      url_name='administrativact_register',) +  def generatedoc_administrativeactop(request, pk, template_pk=None):      if (not request.user.has_perm('ishtar_common.view_operation',                                    models.Operation) @@ -358,8 +372,8 @@ def generatedoc_administrativeactop(request, pk, template_pk=None):      except models.AdministrativeAct.DoesNotExist:          doc = None      if doc: -        MIMES = {'odt':'application/vnd.oasis.opendocument.text', -                 'ods':'application/vnd.oasis.opendocument.spreadsheet'} +        MIMES = {'odt': 'application/vnd.oasis.opendocument.text', +                 'ods': 'application/vnd.oasis.opendocument.spreadsheet'}          ext = doc.split('.')[-1]          doc_name = act_file.get_filename() + "." + ext          mimetype = 'text/csv' @@ -367,43 +381,46 @@ def generatedoc_administrativeactop(request, pk, template_pk=None):              mimetype = MIMES[ext]          response = HttpResponse(open(doc), mimetype=mimetype)          response['Content-Disposition'] = 'attachment; filename=%s' % \ -                                                                doc_name +            doc_name          return response      return HttpResponse(mimetype='text/plain') +  def administrativeactfile_document(request, operation=True):      search_form = AdministrativeActOpeFormSelection      if not operation: -        from archaeological_files.forms import AdministrativeActFileFormSelection +        from archaeological_files.forms import \ +            AdministrativeActFileFormSelection          search_form = AdministrativeActFileFormSelection      dct = {}      if request.POST:          dct['search_form'] = search_form(request.POST)          dct['template_form'] = DocumentGenerationAdminActForm( -                                                        operation=operation) +            operation=operation)          c_object = None          try:              if dct['search_form'].is_valid():                  c_object = \ -                   DocumentGenerationAdminActForm._associated_model.objects.get( -                            pk=dct['search_form'].cleaned_data.get('pk')) +                    DocumentGenerationAdminActForm._associated_model\ +                    .objects.get(pk=dct['search_form'].cleaned_data.get('pk'))          except DocumentGenerationAdminActForm._associated_model.DoesNotExist:              pass          if c_object: -            dct['template_form'] = DocumentGenerationAdminActForm(request.POST, -                                operation=operation, -                                obj=c_object) +            dct['template_form'] = DocumentGenerationAdminActForm( +                request.POST, operation=operation, obj=c_object)              if dct['template_form'].is_valid(): -                return generatedoc_administrativeactop(request, +                return generatedoc_administrativeactop( +                    request,                      dct['search_form'].cleaned_data.get('pk'),                      dct['template_form'].cleaned_data.get('document_template'))      else:          dct['search_form'] = search_form()          dct['template_form'] = DocumentGenerationAdminActForm( -                                                        operation=operation) +            operation=operation)      return render_to_response('ishtar/administrativeact_document.html', dct,                                context_instance=RequestContext(request)) +  def reset_wizards(request):      for wizard_class, url_name in (              (OperationWizard, 'operation_creation'), @@ -413,10 +430,10 @@ def reset_wizards(request):              (OperationSourceWizard, 'operation_source_creation'),              (OperationSourceWizard, 'operation_source_modification'),              (OperationSourceDeletionWizard, 'operation_source_deletion'), -            (OperationAdministrativeActWizard, 'operation_administrativeactop'), +            (OperationAdministrativeActWizard, +             'operation_administrativeactop'),              (OperationEditAdministrativeActWizard, -                        'operation_administrativeactop_modification'), +             'operation_administrativeactop_modification'),              (AdministrativeActDeletionWizard, -                        'operation_administrativeactop_deletion'), -        ): +             'operation_administrativeactop_deletion'),):          wizard_class.session_reset(request, url_name) diff --git a/archaeological_operations/widgets.py b/archaeological_operations/widgets.py index 6c4ebe79a..e3c0cd2ea 100644 --- a/archaeological_operations/widgets.py +++ b/archaeological_operations/widgets.py @@ -17,15 +17,15 @@  # See the file COPYING for details. -from django import forms  from django.forms import widgets  from django.utils.safestring import mark_safe  from django.utils.translation import ugettext_lazy as _ +  class ParcelWidget(widgets.MultiWidget):      def __init__(self, attrs=None):          if not attrs: -            attrs = {'class':'widget-parcel'} +            attrs = {'class': 'widget-parcel'}          elif 'class' not in attrs:              attrs['class'] = 'widget-parcel'          else: @@ -33,7 +33,7 @@ class ParcelWidget(widgets.MultiWidget):          _widgets = (              widgets.TextInput(attrs=attrs),              widgets.TextInput(attrs=attrs), -            ) +        )          super(ParcelWidget, self).__init__(_widgets, attrs)      def decompress(self, value): @@ -44,9 +44,10 @@ class ParcelWidget(widgets.MultiWidget):      def format_output(self, rendered_widgets):          return u' / '.join(rendered_widgets) +  class SelectParcelWidget(widgets.TextInput):      def render(self, *args, **kwargs):          render = super(SelectParcelWidget, self).render(*args, **kwargs)          render += u" <button name='formset_add' value='add'>%s</button>" \ -                                                                % _(u"Add") +            % _(u"Add")          return mark_safe(render) diff --git a/archaeological_operations/wizards.py b/archaeological_operations/wizards.py index 644bc7390..93787fca2 100644 --- a/archaeological_operations/wizards.py +++ b/archaeological_operations/wizards.py @@ -253,7 +253,7 @@ class OperationWizard(Wizard):          for idx, parcel in enumerate(self.get_available_parcels(file)):              parcel_pk, parcel_name = parcel              post_data["%s-%d-parcel" % (parcel_form_key, idx)] = parcel_pk -        post_data[parcel_form_key+'-TOTAL_FORMS'] = idx + 1 +        post_data[parcel_form_key + '-TOTAL_FORMS'] = idx + 1          request.POST = post_data          return super(OperationWizard, self).post(*args, **kwargs) @@ -447,7 +447,7 @@ def is_preventive(form_name, model, type_key='operation_type', key=''):              return False          try:              typ = request.session[storage.prefix][ -                'step_data'][form_name][form_name+'-'+type_key] +                'step_data'][form_name][form_name + '-' + type_key]              if type(typ) in (list, tuple):                  typ = typ[0]              typ = int(typ) @@ -475,7 +475,7 @@ def has_associated_file(form_name, file_key='associated_file', negate=False):              return negate          try:              file_id = request.session[storage.prefix][ -                'step_data'][form_name][form_name+'-'+file_key] +                'step_data'][form_name][form_name + '-' + file_key]              if type(file_id) in (list, tuple):                  file_id = file_id[0]              file_id = int(file_id) | 
