diff options
Diffstat (limited to 'ishtar_common/models.py')
-rw-r--r-- | ishtar_common/models.py | 66 |
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 '' |