summaryrefslogtreecommitdiff
path: root/ishtar_common/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common/models.py')
-rw-r--r--ishtar_common/models.py81
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)