diff options
Diffstat (limited to 'ishtar_common/models.py')
| -rw-r--r-- | ishtar_common/models.py | 81 | 
1 files changed, 63 insertions, 18 deletions
| diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 6228ea1d0..c536b64ae 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -329,8 +329,36 @@ class GeneralType(Cached, models.Model):          return u""      @classmethod +    def _get_initial_types(cls, initial, type_pks): +        new_vals = [] +        for value in initial: +            try: +                pk = int(value) +            except ValueError: +                continue +            if pk in type_pks: +                continue +            try: +                extra_type = cls.objects.get(pk=pk) +                new_vals.append((extra_type.pk, unicode(extra_type))) +            except cls.DoesNotExist: +                continue +        return new_vals + +    @classmethod      def get_types(cls, dct={}, instances=False, exclude=[], empty_first=True, -                  default=None): +                  default=None, initial=None): +        types = cls._pre_get_types(dct, instances, exclude, empty_first, +                                   default) +        if not initial: +            return types +        new_vals = cls._get_initial_types(initial, [idx for idx, lbl in types]) +        types += new_vals +        return types + +    @classmethod +    def _pre_get_types(cls, dct={}, instances=False, exclude=[], +                       empty_first=True, default=None):          # cache          cache_key = None          if not instances: @@ -1384,8 +1412,8 @@ class Merge(models.Model):                                               blank=True, null=True)      merge_exclusion = models.ManyToManyField("self",                                               blank=True, null=True) -    exclude_from_merge = models.NullBooleanField(default=False, -                                                 blank=True, null=True) +    archived = models.NullBooleanField(default=False, +                                       blank=True, null=True)      # 1 for one word similarity, 2 for two word similarity, etc.      MERGE_CLEMENCY = None      EMPTY_MERGE_KEY = '--' @@ -1394,7 +1422,7 @@ class Merge(models.Model):          abstract = True      def generate_merge_key(self): -        if self.exclude_from_merge: +        if self.archived:              return          self.merge_key = slugify(self.name if self.name else '')          if not self.merge_key: @@ -1402,7 +1430,7 @@ class Merge(models.Model):          self.merge_key = self.merge_key      def generate_merge_candidate(self): -        if self.exclude_from_merge: +        if self.archived:              return          if not self.merge_key:              self.generate_merge_key() @@ -1413,7 +1441,7 @@ class Merge(models.Model):                            .exclude(pk=self.pk)\                            .exclude(merge_exclusion=self)\                            .exclude(merge_candidate=self)\ -                          .exclude(exclude_from_merge=True) +                          .exclude(archived=True)          if not self.MERGE_CLEMENCY:              q = q.filter(merge_key=self.merge_key)          else: @@ -1432,6 +1460,14 @@ class Merge(models.Model):          self.generate_merge_candidate()          return item +    def archive(self): +        self.archived = True +        self.save() +        for m in self.merge_candidate.all(): +            m.delete() +        for m in self.merge_exclusion.all(): +            m.delete() +      def merge(self, item):          merge_model_objects(self, item)          self.generate_merge_candidate() @@ -1848,6 +1884,7 @@ class TargetKey(models.Model):  TARGET_MODELS = [      ('OrganizationType', _(u"Organization type")), +    ('TitleType', _(u"Title")),      ('SourceType', _(u"Source type")),      ('AuthorType', _(u"Author type")),      ('Format', _(u"Format")), @@ -2222,6 +2259,13 @@ class PersonType(GeneralType):          ordering = ('label',) +class TitleType(GeneralType): +    class Meta: +        verbose_name = _(u"Title type") +        verbose_name_plural = _(u"Title types") +        ordering = ('label',) + +  class Person(Address, Merge, OwnPerms, ValueGetter):      _prefix = 'person_'      TYPE = ( @@ -2235,8 +2279,10 @@ class Person(Address, Merge, OwnPerms, ValueGetter):                    'attached_to')      SHOW_URL = 'show-person'      MODIFY_URL = 'person_modify' -    title = models.CharField(_(u"Title"), max_length=100, choices=TYPE, -                             blank=True, null=True) +    old_title = models.CharField(_(u"Title"), max_length=100, choices=TYPE, +                                 blank=True, null=True) +    title = models.ForeignKey(TitleType, verbose_name=_(u"Title"), +                              blank=True, null=True)      surname = models.CharField(_(u"Surname"), max_length=50, blank=True,                                 null=True)      name = models.CharField(_(u"Name"), max_length=200, blank=True, @@ -2250,6 +2296,7 @@ class Person(Address, Merge, OwnPerms, ValueGetter):      attached_to = models.ForeignKey(          'Organization', related_name='members', on_delete=models.SET_NULL,          verbose_name=_(u"Is attached to"), blank=True, null=True) +    history = HistoricalRecords()      class Meta:          verbose_name = _(u"Person") @@ -2283,11 +2330,6 @@ class Person(Address, Merge, OwnPerms, ValueGetter):      def get_values(self, prefix=''):          values = super(Person, self).get_values(prefix=prefix) -        title = '' -        TYPES = dict(self.TYPE) -        if self.title in TYPES: -            title = dict(self.TYPE)[self.title] -        values[prefix + 'title'] = title          if not self.attached_to:              values.update(                  Person.get_empty_values(prefix=prefix + 'attached_to_')) @@ -2354,7 +2396,7 @@ class Person(Address, Merge, OwnPerms, ValueGetter):      def full_label(self):          values = []          if self.title: -            values = [unicode(_(self.title))] +            values = [self.title.label]          values += [unicode(getattr(self, attr))                     for attr in ('surname', 'name') if getattr(self, attr)]          if not values and self.raw_name: @@ -2425,7 +2467,7 @@ class IshtarUser(User):          else:              person_type, created = PersonType.objects.get_or_create(                  txt_idx='public_access') -        person = Person.objects.create(title='Mr', surname=surname, +        person = Person.objects.create(surname=surname,                                         name=name, email=email,                                         history_modifier=user)          person.person_types.add(person_type) @@ -2565,7 +2607,7 @@ if settings.COUNTRY == 'fr':                  (self.name, unicode(self.arrondissement))) -class Town(models.Model): +class Town(Imported, models.Model):      name = models.CharField(_(u"Name"), max_length=100)      surface = models.IntegerField(_(u"Surface (m2)"), blank=True, null=True)      center = models.PointField(_(u"Localisation"), srid=settings.SRID, @@ -2602,7 +2644,7 @@ class OperationType(GeneralType):      @classmethod      def get_types(cls, dct={}, instances=False, exclude=[], empty_first=True, -                  default=None): +                  default=None, initial=[]):          tuples = []          dct['available'] = True          if not instances and empty_first and not default: @@ -2619,7 +2661,10 @@ class OperationType(GeneralType):          if exclude:              items = items.exclude(txt_idx__in=exclude)          current_preventive, current_lst = None, None -        for item in items.order_by(*cls._meta.ordering).all(): +        item_list = list(items.order_by(*cls._meta.ordering).all()) +        new_vals = cls._get_initial_types(initial, [i.pk for i in item_list]) +        item_list += new_vals +        for item in item_list:              if not current_lst or item.preventive != current_preventive:                  if current_lst:                      tuples.append(current_lst) | 
