diff options
Diffstat (limited to 'ishtar_common')
| -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 '' | 
