diff options
-rw-r--r-- | archaeological_context_records/models.py | 18 | ||||
-rw-r--r-- | archaeological_context_records/tests.py | 34 |
2 files changed, 45 insertions, 7 deletions
diff --git a/archaeological_context_records/models.py b/archaeological_context_records/models.py index 9a4fa7880..acc761a86 100644 --- a/archaeological_context_records/models.py +++ b/archaeological_context_records/models.py @@ -282,6 +282,24 @@ class RecordRelations(models.Model): verbose_name = _(u"Record relation") verbose_name_plural = _(u"Record relations") + def save(self, *args, **kwargs): + obj = super(RelationType, self).save(*args, **kwargs) + + # after saving create the symetric or the inverse relation + + sym_rel_type = obj.relation_type + if not obj.relation_type.symmetrical: + sym_rel_type = obj.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':self.relation_type} + RecordRelations.objects.get_or_create(**dct) + return obj + class ContextRecordSource(Source): class Meta: verbose_name = _(u"Context record documentation") diff --git a/archaeological_context_records/tests.py b/archaeological_context_records/tests.py index fb3abb317..aa1e2f7c7 100644 --- a/archaeological_context_records/tests.py +++ b/archaeological_context_records/tests.py @@ -70,17 +70,37 @@ class RecordRelationsTest(TestCase, ContextRecordInit): self.create_context_record({"label":u"CR 2"}) def testRelations(self): - sym_rel = models.RelationType.objects.create(symmetrical=True, + sym_rel_type = models.RelationType.objects.create(symmetrical=True, txt_idx='sym') - rel_1 = models.RelationType.objects.create(symmetrical=False, + rel_type_1 = models.RelationType.objects.create(symmetrical=False, txt_idx='rel_1') # cannot have symmetrical and an inverse_relation with self.assertRaises(ValidationError): rel_test = models.RelationType.objects.create(symmetrical=True, - inverse_relation=rel_1, txt_idx='rel_3') + inverse_relation=rel_type_1, txt_idx='rel_3') rel_test.full_clean() # auto fill inverse relations - rel_2 = models.RelationType.objects.create(symmetrical=False, - inverse_relation=rel_1, txt_idx='rel_2') - self.assertEqual(rel_1.inverse_relation, rel_2) - + rel_type_2 = models.RelationType.objects.create(symmetrical=False, + inverse_relation=rel_type_1, txt_idx='rel_2') + self.assertEqual(rel_type_1.inverse_relation, rel_type_2) + + cr_1 = self.context_records[0] + cr_2 = self.context_records[1] + + # inserting a new symetric relation automatically create the inverse + # relation + rel = models.RecordRelations.objects.create(left_record=cr_1, + right_record=cr_2, relation_type=sym_rel_type) + self.assertEqual(models.RecordRelations.objects.filter(left_record=cr_2, + right_record=cr_1, relation_type=sym_rel_type).count(), 1) + + # remove one symetric relation remove the other + rel.delete() + self.assertEqual(models.RecordRelations.objects.filter(left_record=cr_2, + right_record=cr_1, relation_type=sym_rel_type).count(), 0) + + # for non symetric relation adding one relation add the inverse + rel = models.RecordRelations.objects.create(left_record=cr_1, + right_record=cr_2, relation_type=rel_type_1) + self.assertEqual(models.RecordRelations.objects.filter(left_record=cr_2, + right_record=cr_1, relation_type=rel_type_2).count(), 1) |