diff options
Diffstat (limited to 'ishtar_common/models.py')
| -rw-r--r-- | ishtar_common/models.py | 245 | 
1 files changed, 135 insertions, 110 deletions
| diff --git a/ishtar_common/models.py b/ishtar_common/models.py index d997d667d..8bdbd93ba 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -731,7 +731,8 @@ class DashboardFormItem(object):          q = cls.objects.filter(**{date_var + '__isnull': False})          if fltr:              q = q.filter(**fltr) -        q = q.filter(**{date_var + '__year': year, date_var + '__month': month}) +        q = q.filter( +            **{date_var + '__year': year, date_var + '__month': month})          return q.distinct('pk')      @classmethod @@ -1020,22 +1021,21 @@ class OrganizationType(GeneralType):          ordering = ('label',)  MODELS = [ -          ('archaeological_operations.models.Operation', _(u"Operation")), -          ('archaeological_operations.models.Parcel', _(u"Parcels")), -          ('archaeological_operations.models.OperationSource', -                                                    _(u"Operation source")), -          ] +    ('archaeological_operations.models.Operation', _(u"Operation")), +    ('archaeological_operations.models.Parcel', _(u"Parcels")), +    ('archaeological_operations.models.OperationSource', +     _(u"Operation source")), +] +  if 'archaeological_files' in settings.INSTALLED_APPS: -    MODELS = [('archaeological_files.models.File', _(u"Archaeological files")), -             ] + MODELS +    MODELS = [('archaeological_files.models.File', _(u"Archaeological files"))]\ +        + MODELS  if 'archaeological_context_records' in settings.INSTALLED_APPS:      MODELS = [('archaeological_context_records.models.ContextRecord', -              _(u"Context records")), -             ] + MODELS +              _(u"Context records")), ] + MODELS  if 'archaeological_finds' in settings.INSTALLED_APPS:      MODELS = [('archaeological_finds.models.BaseFind', -              _(u"Finds")), -             ] + MODELS +              _(u"Finds")), ] + MODELS  def get_model_fields(model): @@ -1069,10 +1069,11 @@ class ImporterType(models.Model):      description = models.CharField(_(u"Description"), blank=True, null=True,                                     max_length=500)      users = models.ManyToManyField('IshtarUser', verbose_name=_(u"Users"), -                                    blank=True, null=True) -    associated_models = models.CharField(_(u"Associated model"), max_length=200, -                                             choices=MODELS) +                                   blank=True, null=True) +    associated_models = models.CharField(_(u"Associated model"), +                                         max_length=200, choices=MODELS)      is_template = models.BooleanField(_(u"Is template"), default=False) +      class Meta:          verbose_name = _(u"Importer - Type")          verbose_name_plural = _(u"Importer - Types") @@ -1083,7 +1084,7 @@ class ImporterType(models.Model):      def get_importer_class(self):          OBJECT_CLS = import_class(self.associated_models)          DEFAULTS = dict([(default.keys, default.values) -                                        for default in self.defaults.all()]) +                         for default in self.defaults.all()])          LINE_FORMAT = []          idx = 0          for column in self.columns.order_by('col_number').all(): @@ -1106,17 +1107,18 @@ class ImporterType(models.Model):              formater_kwargs = {}              if column.regexp_pre_filter:                  formater_kwargs['regexp'] = re.compile( -                                                column.regexp_pre_filter.regexp) -            formater_kwargs['duplicate_fields'] = [field.field_name -                                     for field in column.duplicate_fields.all()] +                    column.regexp_pre_filter.regexp) +            formater_kwargs['duplicate_fields'] = [ +                field.field_name for field in column.duplicate_fields.all()]              formater_kwargs['required'] = column.required              formater = ImportFormater(targets, formater_types,                                        **formater_kwargs)              LINE_FORMAT.append(formater) -        args = {'OBJECT_CLS':OBJECT_CLS, 'DESC':self.description, -                'DEFAULTS':DEFAULTS, 'LINE_FORMAT':LINE_FORMAT} -        name = str(''.join(x for x in slugify(self.name).replace('-', ' ').title() -                       if not x.isspace())) +        args = {'OBJECT_CLS': OBJECT_CLS, 'DESC': self.description, +                'DEFAULTS': DEFAULTS, 'LINE_FORMAT': LINE_FORMAT} +        name = str(''.join( +            x for x in slugify(self.name).replace('-', ' ').title() +            if not x.isspace()))          newclass = type(name, (Importer,), args)          return newclass @@ -1147,6 +1149,7 @@ class ImporterDefault(models.Model):      """      importer_type = models.ForeignKey(ImporterType, related_name='defaults')      target = models.CharField(u"Target", max_length=500) +      class Meta:          verbose_name = _(u"Importer - Default")          verbose_name_plural = _(u"Importer - Defaults") @@ -1157,7 +1160,8 @@ class ImporterDefault(models.Model):      @property      def associated_model(self): -        return get_associated_model(self.importer_type.associated_models, self.keys) +        return get_associated_model(self.importer_type.associated_models, +                                    self.keys)      @property      def values(self): @@ -1175,6 +1179,7 @@ class ImporterDefaultValues(models.Model):                                         related_name='default_values')      target = models.CharField(u"Target", max_length=500)      value = models.CharField(u"Value", max_length=500) +      class Meta:          verbose_name = _(u"Importer - Default value")          verbose_name_plural = _(u"Importer - Default values") @@ -1213,6 +1218,7 @@ class ImporterColumn(models.Model):      description = models.TextField(_("Description"), blank=True, null=True)      regexp_pre_filter = models.ForeignKey("Regexp", blank=True, null=True)      required = models.BooleanField(_(u"Required"), default=False) +      class Meta:          verbose_name = _(u"Importer - Column")          verbose_name_plural = _(u"Importer - Columns") @@ -1225,6 +1231,7 @@ class ImporterDuplicateField(models.Model):      column = models.ForeignKey(ImporterColumn, related_name='duplicate_fields')      field_name = models.CharField(_(u"Field name"), blank=True, null=True,                                    max_length=200) +      class Meta:          verbose_name = _(u"Importer - Duplicate field")          verbose_name_plural = _(u"Importer - Duplicate fields") @@ -1235,6 +1242,7 @@ class Regexp(models.Model):      description = models.CharField(_(u"Description"), blank=True, null=True,                                     max_length=500)      regexp = models.CharField(_(u"Regular expression"), max_length=500) +      class Meta:          verbose_name = _(u"Importer - Regular expression")          verbose_name_plural = _(u"Importer - Regular expressions") @@ -1251,6 +1259,7 @@ class ImportTarget(models.Model):      target = models.CharField(u"Target", max_length=500)      regexp_filter = models.ForeignKey("Regexp", blank=True, null=True)      formater_type = models.ForeignKey("FormaterType") +      class Meta:          verbose_name = _(u"Importer - Target")          verbose_name_plural = _(u"Importer - Targets") @@ -1260,8 +1269,9 @@ class ImportTarget(models.Model):      @property      def associated_model(self): -        return get_associated_model(self.column.importer_type.associated_models, -                                    self.target.split('__')) +        return get_associated_model( +            self.column.importer_type.associated_models, +            self.target.split('__'))      def get_choices(self):          if not self.associated_model or not hasattr(self.associated_model, @@ -1305,14 +1315,13 @@ class TargetKey(models.Model):              v = None              # pk is given              try: -                pk = int(self.value)                  v = self.target.associated_model.objects.get( -                                                pk=unicode(self.value)) +                    pk=unicode(int(self.value)))              except (ValueError, self.target.associated_model.DoesNotExist):                  # try with txt_idx                  try:                      v = self.target.associated_model.objects.get( -                                                    txt_idx=unicode(self.value)) +                        txt_idx=unicode(self.value))                  except (self.target.associated_model.DoesNotExist):                      pass              if v: @@ -1328,9 +1337,10 @@ TARGET_MODELS = [      ('archaeological_operations.models.Period', _(u"Period")),      ('archaeological_context_records.models.Unit', _(u"Unit")),      ('archaeological_finds.models.MaterialType', _(u"Material")), -    ('archaeological_finds.models.ConservatoryState', _(u"Conservatory state")), +    ('archaeological_finds.models.ConservatoryState', +     _(u"Conservatory state")),      ('archaeological_finds.models.PreservationType', _(u"Preservation type")), -    ] +]  TARGET_MODELS_KEYS = [tm[0] for tm in TARGET_MODELS] @@ -1345,13 +1355,13 @@ IMPORTER_TYPES = (  )  IMPORTER_TYPES_DCT = { -    'IntegerFormater':IntegerFormater, -    'FloatFormater':FloatFormater, -    'UnicodeFormater':UnicodeFormater, -    'DateFormater':DateFormater, -    'TypeFormater':TypeFormater, -    'YearFormater':YearFormater, -    'StrToBoolean':StrToBoolean, +    'IntegerFormater': IntegerFormater, +    'FloatFormater': FloatFormater, +    'UnicodeFormater': UnicodeFormater, +    'DateFormater': DateFormater, +    'TypeFormater': TypeFormater, +    'YearFormater': YearFormater, +    'StrToBoolean': StrToBoolean,  }  DATE_FORMATS = ( @@ -1371,6 +1381,7 @@ class FormaterType(models.Model):                                 null=True)      many_split = models.CharField(_(u"Split character(s)"), max_length=10,                                    blank=True, null=True) +      class Meta:          verbose_name = _(u"Importer - Formater type")          verbose_name_plural = _(u"Importer - Formater types") @@ -1378,10 +1389,11 @@ class FormaterType(models.Model):          ordering = ('formater_type', 'options')      def __unicode__(self): -        return u" - ".join([unicode(dict(IMPORTER_TYPES)[self.formater_type]) -                          if self.formater_type in IMPORTER_TYPES_DCT else ''] + -                        [getattr(self, k) for k in ('options', 'many_split') -                                                        if getattr(self, k)]) +        return u" - ".join( +            [unicode(dict(IMPORTER_TYPES)[self.formater_type]) +             if self.formater_type in IMPORTER_TYPES_DCT else ''] + +            [getattr(self, k) for k in ('options', 'many_split') +             if getattr(self, k)])      def get_choices(self):          if self.format_type in IMPORTER_TYPES_CHOICES: @@ -1390,7 +1402,7 @@ class FormaterType(models.Model):      def get_formater_type(self, target):          if self.formater_type not in IMPORTER_TYPES_DCT.keys():              return -        kwargs = {'db_target':target} +        kwargs = {'db_target': target}          if self.many_split:              kwargs['many_split'] = self.many_split          if self.formater_type == 'TypeFormater': @@ -1440,19 +1452,22 @@ class Import(models.Model):                                  default='utf-8', max_length=15)      skip_lines = models.IntegerField(_(u"Skip lines"), default=1)      error_file = models.FileField(_(u"Error file"), -                                     upload_to="upload/imports/", -                                     blank=True, null=True) +                                  upload_to="upload/imports/", +                                  blank=True, null=True)      result_file = models.FileField(_(u"Result file"), -                                     upload_to="upload/imports/", -                                     blank=True, null=True) +                                   upload_to="upload/imports/", +                                   blank=True, null=True)      state = models.CharField(_(u"State"), max_length=2, choices=IMPORT_STATE,                               default='C') -    creation_date = models.DateTimeField(_(u"Creation date"), auto_now_add=True, -                                         blank=True, null=True) +    creation_date = models.DateTimeField(_(u"Creation date"), +                                         auto_now_add=True, blank=True, +                                         null=True)      end_date = models.DateTimeField(_(u"End date"), blank=True,                                      null=True, editable=False) -    seconds_remaining = models.IntegerField(_(u"Seconds remaining"), blank=True, -                                            null=True, editable=False) +    seconds_remaining = models.IntegerField(_(u"Seconds remaining"), +                                            blank=True, null=True, +                                            editable=False) +      class Meta:          verbose_name = _(u"Import")          verbose_name_plural = _(u"Imports") @@ -1496,7 +1511,7 @@ class Import(models.Model):      def get_importer_instance(self):          return self.importer_type.get_importer_class()( -                        skip_lines=self.skip_lines, import_instance=self) +            skip_lines=self.skip_lines, import_instance=self)      @property      def data_table(self): @@ -1505,8 +1520,9 @@ class Import(models.Model):              encodings += [coding for coding, c in ENCODINGS]              for encoding in encodings:                  try: -                    return [line for line in unicodecsv.reader(csv_file, -                                                       encoding=encoding)] +                    return [line +                            for line in unicodecsv.reader(csv_file, +                                                          encoding=encoding)]                  except UnicodeDecodeError:                      if encoding != encodings[-1]:                          csv_file.seek(0) @@ -1526,7 +1542,7 @@ class Import(models.Model):          importer.importation(self.data_table)          # result file          filename = slugify(self.importer_type.name) -        now = datetime.datetime.now().isoformat('-').replace(':','') +        now = datetime.datetime.now().isoformat('-').replace(':', '')          result_file = filename + "_result_%s.csv" % now          result_file = os.sep.join([self.result_file.storage.location,                                     result_file]) @@ -1552,7 +1568,8 @@ class Import(models.Model):      def get_all_imported(self):          imported = [] -        for related, zorg in self._meta.get_all_related_m2m_objects_with_model(): +        for related, zorg in \ +                self._meta.get_all_related_m2m_objects_with_model():              accessor = related.get_accessor_name()              imported += [(accessor, obj)                           for obj in getattr(self, accessor).all()] @@ -1580,15 +1597,18 @@ class Organization(Address, Merge, OwnPerms, ValueGetter):      organization_type = models.ForeignKey(OrganizationType,                                            verbose_name=_(u"Type"))      history = HistoricalRecords() +      class Meta:          verbose_name = _(u"Organization")          verbose_name_plural = _(u"Organizations")          permissions = ( -          ("view_organization", ugettext(u"Can view all Organization")), -          ("view_own_organization", ugettext(u"Can view own Organization")), -          ("add_own_organization", ugettext(u"Can add own Organization")), -          ("change_own_organization", ugettext(u"Can change own Organization")), -          ("delete_own_organization", ugettext(u"Can delete own Organization")), +            ("view_organization", ugettext(u"Can view all Organization")), +            ("view_own_organization", ugettext(u"Can view own Organization")), +            ("add_own_organization", ugettext(u"Can add own Organization")), +            ("change_own_organization", +             ugettext(u"Can change own Organization")), +            ("delete_own_organization", +             ugettext(u"Can delete own Organization")),          )      def __unicode__(self): @@ -1605,30 +1625,31 @@ class Organization(Address, Merge, OwnPerms, ValueGetter):      @property      def associated_filename(self):          values = [unicode(getattr(self, attr)) -                   for attr in ('organization_type', 'name') -                               if getattr(self, attr)] +                  for attr in ('organization_type', 'name') +                  if getattr(self, attr)]          return slugify(u"-".join(values))  class PersonType(GeneralType): -    #rights = models.ManyToManyField(WizardStep, verbose_name=_(u"Rights")) +    # rights = models.ManyToManyField(WizardStep, verbose_name=_(u"Rights"))      groups = models.ManyToManyField(Group, verbose_name=_(u"Groups"),                                      blank=True, null=True) +      class Meta:          verbose_name = _(u"Person type")          verbose_name_plural = _(u"Person types")          ordering = ('label',) -class Person(Address, Merge, OwnPerms, ValueGetter) : +class Person(Address, Merge, OwnPerms, ValueGetter):      _prefix = 'person_'      TYPE = ( -            ('Mr', _(u'Mr')), -            ('Ms', _(u'Miss')), -            ('Mr and Miss', _(u'Mr and Miss')), -            ('Md', _(u'Mrs')), -            ('Dr', _(u'Doctor')), -            ) +        ('Mr', _(u'Mr')), +        ('Ms', _(u'Miss')), +        ('Mr and Miss', _(u'Mr and Miss')), +        ('Md', _(u'Mrs')), +        ('Dr', _(u'Doctor')), +    )      TABLE_COLS = ('name', 'surname', 'email', 'person_types_list',                    'attached_to')      title = models.CharField(_(u"Title"), max_length=2, choices=TYPE, @@ -1636,13 +1657,13 @@ class Person(Address, Merge, OwnPerms, ValueGetter) :      surname = models.CharField(_(u"Surname"), max_length=50, blank=True,                                 null=True)      name = models.CharField(_(u"Name"), max_length=200, blank=True, -                               null=True) +                            null=True)      raw_name = models.CharField(_(u"Raw name"), max_length=300, blank=True, -                               null=True) +                                null=True)      person_types = models.ManyToManyField(PersonType, verbose_name=_(u"Types")) -    attached_to = models.ForeignKey('Organization', related_name='members', -                       on_delete=models.SET_NULL, -                       verbose_name=_(u"Is attached to"), blank=True, null=True) +    attached_to = models.ForeignKey( +        'Organization', related_name='members', on_delete=models.SET_NULL, +        verbose_name=_(u"Is attached to"), blank=True, null=True)      class Meta:          verbose_name = _(u"Person") @@ -1656,9 +1677,8 @@ class Person(Address, Merge, OwnPerms, ValueGetter) :          )      def __unicode__(self): -        values = [unicode(getattr(self, attr)) -                   for attr in ('surname', 'name') -                               if getattr(self, attr)] +        values = [unicode(getattr(self, attr)) for attr in ('surname', 'name') +                  if getattr(self, attr)]          if not values and self.raw_name:              values = [self.raw_name]          if self.attached_to: @@ -1674,21 +1694,23 @@ class Person(Address, Merge, OwnPerms, ValueGetter) :          TYPES = dict(self.TYPE)          if self.title in TYPES:              title = dict(self.TYPE)[self.title] -        values[prefix+'title'] = title +        values[prefix + 'title'] = title          if not self.attached_to: -            values.update(Person.get_empty_values(prefix=prefix + 'attached_to_')) +            values.update( +                Person.get_empty_values(prefix=prefix + 'attached_to_'))          return values      person_types_list_lbl = _(u"Types") +      @property      def person_types_list(self):          return u", ".join([unicode(pt) for pt in self.person_types.all()])      def generate_merge_key(self):          if self.name and self.name.strip(): -            self.merge_key = slugify(self.name.strip()) + ( -                                (u'-' + slugify(self.surname.strip())) -                                                    if self.surname else u'') +            self.merge_key = slugify(self.name.strip()) + \ +                ((u'-' + slugify(self.surname.strip())) +                 if self.surname else u'')          elif self.raw_name and self.raw_name.strip():              self.merge_key = slugify(self.raw_name.strip())          elif self.attached_to: @@ -1707,13 +1729,13 @@ class Person(Address, Merge, OwnPerms, ValueGetter) :              right_name = right_name.split('.')[-1]          if type(right_name) in (list, tuple):              return bool(self.person_types.filter( -                                           txt_idx__in=right_name).count()) or \ -                   bool(self.person_types.filter( +                txt_idx__in=right_name).count()) or \ +                bool(self.person_types.filter(                       groups__permissions__codename__in=right_name).count())          # or self.person_types.filter(wizard__url_name__in=right_name).count())          return bool(self.person_types.filter(txt_idx=right_name).count()) or \ -               bool(self.person_types.filter( -                     groups__permissions__codename=right_name).count()) +            bool(self.person_types.filter( +                 groups__permissions__codename=right_name).count())          # or self.person_types.filter(wizard__url_name=right_name).count())      def full_label(self): @@ -1721,8 +1743,7 @@ class Person(Address, Merge, OwnPerms, ValueGetter) :          if self.title:              values = [unicode(_(self.title))]          values += [unicode(getattr(self, attr)) -                   for attr in ('surname', 'name') -                               if getattr(self, attr)] +                   for attr in ('surname', 'name') if getattr(self, attr)]          if not values and self.raw_name:              values = [self.raw_name]          if self.attached_to: @@ -1732,18 +1753,18 @@ class Person(Address, Merge, OwnPerms, ValueGetter) :      @property      def associated_filename(self):          values = [unicode(getattr(self, attr)) -                   for attr in ('surname', 'name', 'attached_to') -                               if getattr(self, attr)] +                  for attr in ('surname', 'name', 'attached_to') +                  if getattr(self, attr)]          return slugify(u"-".join(values))      def save(self, *args, **kwargs):          super(Person, self).save(*args, **kwargs)          if hasattr(self, 'responsible_town_planning_service'):              for fle in self.responsible_town_planning_service.all(): -                fle.save() # force update of raw_town_planning_service +                fle.save()  # force update of raw_town_planning_service          if hasattr(self, 'general_contractor'):              for fle in self.general_contractor.all(): -                fle.save() # force update of raw_general_contractor +                fle.save()  # force update of raw_general_contractor  class IshtarUser(User): @@ -1763,11 +1784,11 @@ class IshtarUser(User):          person_type = None          if user.is_superuser:              ADMINISTRATOR, created = PersonType.objects.get_or_create( -                                            txt_idx='administrator') +                txt_idx='administrator')              person_type = ADMINISTRATOR          else:              person_type, created = PersonType.objects.get_or_create( -                                                txt_idx='public_access') +                txt_idx='public_access')          person = Person.objects.create(title='Mr', surname=surname,                                         name=name, email=email,                                         history_modifier=user) @@ -1776,7 +1797,7 @@ class IshtarUser(User):                                           person=person)      def has_right(self, right_name): -       return self.person.has_right(right_name) +        return self.person.has_right(right_name)      def full_label(self):          return self.person.full_label() @@ -1798,13 +1819,14 @@ class Author(models.Model):          verbose_name_plural = _(u"Authors")      def __unicode__(self): -        return unicode(self.person) + settings.JOINT + unicode(self.author_type) +        return unicode(self.person) + settings.JOINT + \ +            unicode(self.author_type)      def related_sources(self):          return list(self.treatmentsource_related.all()) + \ -               list(self.operationsource_related.all()) + \ -               list(self.findsource_related.all()) + \ -               list(self.contextrecordsource_related.all()) +            list(self.operationsource_related.all()) + \ +            list(self.findsource_related.all()) + \ +            list(self.contextrecordsource_related.all())  class SourceType(GeneralType): @@ -1833,17 +1855,18 @@ class Source(models.Model):      support_type = models.ForeignKey(SupportType, verbose_name=_(u"Support"),                                       blank=True, null=True,)      format_type = models.ForeignKey(Format, verbose_name=_(u"Format"), -                                     blank=True, null=True,) +                                    blank=True, null=True,)      scale = models.CharField(_(u"Scale"), max_length=30, null=True,                               blank=True)      authors = models.ManyToManyField(Author, verbose_name=_(u"Authors"), -                                 related_name="%(class)s_related") -    associated_url = models.URLField(verify_exists=False, blank=True, null=True, -                           verbose_name=_(u"Numerical ressource (web address)")) +                                     related_name="%(class)s_related") +    associated_url = models.URLField( +        verify_exists=False, blank=True, null=True, +        verbose_name=_(u"Numerical ressource (web address)"))      receipt_date = models.DateField(blank=True, null=True,                                      verbose_name=_(u"Receipt date"))      creation_date = models.DateField(blank=True, null=True, -                                    verbose_name=_(u"Creation date")) +                                     verbose_name=_(u"Creation date"))      item_number = models.IntegerField(_(u"Item number"), default=1)      reference = models.CharField(_(u"Ref."), max_length=25, null=True,                                   blank=True) @@ -1853,7 +1876,7 @@ class Source(models.Model):      comment = models.TextField(_(u"Comment"), blank=True, null=True)      additional_information = models.TextField(_(u"Additional information"),                                                blank=True, null=True) -    TABLE_COLS = ['title', 'source_type', 'authors',] +    TABLE_COLS = ['title', 'source_type', 'authors', ]      class Meta:          abstract = True @@ -1873,8 +1896,10 @@ if settings.COUNTRY == 'fr':          name = models.CharField(u"Nom", max_length=30)          arrondissement = models.ForeignKey(Arrondissement,                                             verbose_name=u"Arrondissement") +          def __unicode__(self): -            return settings.JOINT.join((self.name, unicode(self.arrondissement))) +            return settings.JOINT.join( +                (self.name, unicode(self.arrondissement)))  class Town(models.Model): @@ -1885,8 +1910,8 @@ class Town(models.Model):      if settings.COUNTRY == 'fr':          numero_insee = models.CharField(u"Numéro INSEE", max_length=6,                                          unique=True) -        departement = models.ForeignKey(Department, verbose_name=u"Département", -                                       null=True, blank=True) +        departement = models.ForeignKey( +            Department, verbose_name=u"Département", null=True, blank=True)          canton = models.ForeignKey(Canton, verbose_name=u"Canton", null=True,                                     blank=True)      objects = models.GeoManager() | 
