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.py66
1 files changed, 66 insertions, 0 deletions
diff --git a/ishtar_common/models.py b/ishtar_common/models.py
index 8bdbd93ba..da6eefbfb 100644
--- a/ishtar_common/models.py
+++ b/ishtar_common/models.py
@@ -640,6 +640,72 @@ class BaseHistorizedItem(Imported):
return u"-".join([unicode(item) for item in items])
+class GeneralRelationType(GeneralType):
+ order = models.IntegerField(_(u"Order"), default=1)
+ symmetrical = models.BooleanField(_(u"Symmetrical"))
+ # # an inverse must be set
+ # inverse_relation = models.ForeignKey(
+ # 'RelationType', verbose_name=_(u"Inverse relation"), blank=True,
+ # null=True)
+
+ class Meta:
+ abstract = True
+
+ def clean(self):
+ # cannot have symmetrical and an inverse_relation
+ if self.symmetrical and self.inverse_relation:
+ raise ValidationError(
+ _(u"Cannot have symmetrical and an inverse_relation"))
+
+ def save(self, *args, **kwargs):
+ obj = super(GeneralRelationType, self).save(*args, **kwargs)
+ # after saving check that the inverse_relation of the inverse_relation
+ # point to the saved object
+ if self.inverse_relation \
+ and (not self.inverse_relation.inverse_relation
+ or self.inverse_relation.inverse_relation != self):
+ self.inverse_relation.inverse_relation = self
+ self.inverse_relation.symmetrical = False
+ self.inverse_relation.save()
+ return obj
+
+
+class GeneralRecordRelations(object):
+ def save(self, *args, **kwargs):
+ super(GeneralRecordRelations, self).save(*args, **kwargs)
+
+ # after saving create the symetric or the inverse relation
+
+ sym_rel_type = self.relation_type
+ if not self.relation_type.symmetrical:
+ sym_rel_type = self.relation_type.inverse_relation
+
+ # no symetric/inverse is defined
+ if not sym_rel_type:
+ return
+
+ dct = {'right_record': self.left_record,
+ 'left_record': self.right_record, 'relation_type': sym_rel_type}
+ self.__class__.objects.get_or_create(**dct)
+ return self
+
+
+def post_delete_record_relation(sender, instance, **kwargs):
+ # delete symmetrical or inverse relation
+ sym_rel_type = instance.relation_type
+ if not instance.relation_type.symmetrical:
+ sym_rel_type = instance.relation_type.inverse_relation
+
+ # no symetric/inverse is defined
+ if not sym_rel_type:
+ return
+
+ dct = {'right_record': instance.left_record,
+ 'left_record': instance.right_record,
+ 'relation_type': sym_rel_type}
+ instance.__class__.objects.filter(**dct).delete()
+
+
class ShortMenuItem(object):
def get_short_menu_class(self):
return ''