diff options
Diffstat (limited to 'archaeological_operations/utils.py')
| -rw-r--r-- | archaeological_operations/utils.py | 186 | 
1 files changed, 112 insertions, 74 deletions
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:  | 
