summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@proxience.com>2015-01-25 13:39:09 +0100
committerÉtienne Loks <etienne.loks@proxience.com>2015-01-25 13:39:09 +0100
commitd8d25570ad28f3ea852a55784b0b0e9c52b6b86e (patch)
treedafd829767f91b12fdc045c587c60e372ae39ea8
parent9d00d653ef214b781f4de4e78ff80b56ebbd49be (diff)
downloadIshtar-d8d25570ad28f3ea852a55784b0b0e9c52b6b86e.tar.bz2
Ishtar-d8d25570ad28f3ea852a55784b0b0e9c52b6b86e.zip
Automatically add symetric/inverse for context records relations
-rw-r--r--archaeological_context_records/models.py18
-rw-r--r--archaeological_context_records/tests.py34
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)