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) |