summaryrefslogtreecommitdiff
path: root/archaeological_context_records
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2021-06-21 11:42:59 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2021-06-21 11:42:59 +0200
commit24af25278bff6927e0d442f537efeb6c7bf7182c (patch)
tree7e3804a3de1bd2ca6e18a3e557036a4d4ef3afe4 /archaeological_context_records
parentf5680038fdd0bb230c160fd4df3d2c1deab07faf (diff)
downloadIshtar-24af25278bff6927e0d442f537efeb6c7bf7182c.tar.bz2
Ishtar-24af25278bff6927e0d442f537efeb6c7bf7182c.zip
Context records: auto generate relation tree on insert and update
Diffstat (limited to 'archaeological_context_records')
-rw-r--r--archaeological_context_records/models.py24
-rw-r--r--archaeological_context_records/tests.py49
2 files changed, 69 insertions, 4 deletions
diff --git a/archaeological_context_records/models.py b/archaeological_context_records/models.py
index 454e83e8a..5dfaa427a 100644
--- a/archaeological_context_records/models.py
+++ b/archaeological_context_records/models.py
@@ -1217,7 +1217,23 @@ class RecordRelations(GeneralRecordRelations, models.Model):
return self.left_record.uuid, self.right_record.uuid, self.relation_type.txt_idx
-post_delete.connect(post_delete_record_relation, sender=RecordRelations)
+def post_delete_cr_record_relation(sender, instance, **kwargs):
+ if getattr(sender, "_no_post_treatments", False):
+ return
+ post_delete_record_relation(sender, instance, **kwargs)
+ ContextRecordTree.update(instance.left_record_id)
+ ContextRecordTree.update(instance.right_record_id)
+
+
+def post_save_cr_record_relation(sender, instance, **kwargs):
+ if getattr(sender, "_no_post_treatments", False):
+ return
+ ContextRecordTree.update(instance.left_record_id)
+ ContextRecordTree.update(instance.right_record_id)
+
+
+post_delete.connect(post_delete_cr_record_relation, sender=RecordRelations)
+post_save.connect(post_save_cr_record_relation, sender=RecordRelations)
class RecordRelationView(models.Model):
@@ -1363,9 +1379,9 @@ class ContextRecordTree(RelationsViews):
cr_id integer NOT NULL,
cr_parent_id integer NOT NULL,
CONSTRAINT fk1_{table} FOREIGN KEY(cr_id)
- REFERENCES {fk_table}(id),
+ REFERENCES {fk_table}(id) ON DELETE CASCADE,
CONSTRAINT fk2_{table} FOREIGN KEY(cr_parent_id)
- REFERENCES {fk_table}(id)
+ REFERENCES {fk_table}(id) ON DELETE CASCADE
);
CREATE INDEX {table}_id ON {table} (cr_id);
CREATE INDEX {table}_parent_id ON {table} (cr_parent_id);
@@ -1377,11 +1393,13 @@ class ContextRecordTree(RelationsViews):
"archaeological_context_records.ContextRecord",
verbose_name=_("Context record"),
related_name="context_record_tree_parent",
+ on_delete=models.CASCADE
)
cr_parent = models.ForeignKey(
"archaeological_context_records.ContextRecord",
verbose_name=_("Context record parent"),
related_name="context_record_tree_child",
+ on_delete=models.CASCADE
)
class Meta:
diff --git a/archaeological_context_records/tests.py b/archaeological_context_records/tests.py
index 6b3e9f648..0d1c84c7f 100644
--- a/archaeological_context_records/tests.py
+++ b/archaeological_context_records/tests.py
@@ -973,6 +973,7 @@ class RecordRelationsTest(ContextRecordInit, TestCase):
(1, 3), (2, 3), (3, 4), (3, 5), (4, 6), (4, 7), (4, 8),
(5, 9), (5, 10)
)
+ models.RecordRelations._no_post_treatments = True
for child_idx, parent_idx in relations:
models.RecordRelations.objects.create(
left_record=crs[child_idx - 1],
@@ -996,10 +997,11 @@ class RecordRelationsTest(ContextRecordInit, TestCase):
cr_parent_id=crs[2].pk, cr_id=crs[0].pk)
self.assertGreaterEqual(q.count(), 1)
+ ## use tables
self.assertIsNone(models.ContextRecordTree.check_engine()) # no change
profile.parent_relations_engine = "T"
profile.save()
- profile = get_current_profile(force=True)
+ get_current_profile(force=True)
self.assertTrue(models.ContextRecordTree.check_engine()) # change to table
q = models.ContextRecordTree.objects.filter(cr=crs[0], cr_parent=crs[1])
self.assertEqual(q.count(), 0) # empty table
@@ -1075,6 +1077,45 @@ class RecordRelationsTest(ContextRecordInit, TestCase):
cr_parent=crs[10 - 1], cr=crs[14 - 1]).count()
self.assertEqual(nb, 0)
+ # auto update
+ models.RecordRelations._no_post_treatments = False
+ models.RecordRelations.objects.create(
+ left_record=crs[3 - 1],
+ right_record=crs[4 - 1],
+ relation_type=rel_type_1
+ )
+ nb = models.ContextRecordTree.objects.filter(
+ cr_parent=crs[6 - 1], cr=crs[3 - 1]).count()
+ self.assertEqual(nb, 1)
+ models.RecordRelations.objects.create(
+ left_record=crs[3 - 1],
+ right_record=crs[5 - 1],
+ relation_type=rel_type_1
+ )
+ nb = models.ContextRecordTree.objects.filter(
+ cr_parent=crs[10 - 1], cr=crs[14 - 1]).count()
+ self.assertEqual(nb, 1)
+
+ # delete
+ nb = models.ContextRecordTree.objects.filter(
+ cr_parent=crs[13 - 1], cr=crs[1 - 1]).count()
+ self.assertEqual(nb, 1)
+ crs[3 - 1].delete()
+ nb = models.ContextRecordTree.objects.filter(
+ cr_parent=crs[13 - 1], cr=crs[1 - 1]).count()
+ self.assertEqual(nb, 0)
+
+ # delete on views
+ profile = get_current_profile()
+ profile.parent_relations_engine = "V"
+ profile.save()
+ get_current_profile(force=True)
+ models.ContextRecordTree.objects.filter(pk__isnull=False).delete()
+ crs[4 - 1].delete()
+ q = models.ContextRecordTree.objects.filter(
+ cr_parent_id=crs[1 - 1].pk, cr_id=crs[6 - 1].pk)
+ self.assertGreaterEqual(q.count(), 0)
+
def _test_tree_(self, test_trees, context_record):
crs = self.context_records
for tree in test_trees:
@@ -1094,6 +1135,12 @@ class RecordRelationsTest(ContextRecordInit, TestCase):
models.ContextRecordTree.update(crs[cr_idx].id)
self._test_tree_(test_trees, cr_idx + 1)
+ def tearDown(self):
+ models.ContextRecordTree.objects.filter(pk__isnull=False).delete()
+ profile = get_current_profile()
+ profile.parent_relations_engine = "V"
+ profile.save()
+
class ContextRecordWizardCreationTest(WizardTest, ContextRecordInit, TestCase):
fixtures = OPERATION_TOWNS_FIXTURES