summaryrefslogtreecommitdiff
path: root/archaeological_finds/models_treatments.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2019-01-29 12:15:51 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2019-01-29 12:15:51 +0100
commitd1ccd3fe6f240882b2158e046b4e7908a814930f (patch)
tree26118a3e75bd8047de57caae9927ce533709dd80 /archaeological_finds/models_treatments.py
parente059936f31f789b564f262cf7ef04ecccabd1d45 (diff)
downloadIshtar-d1ccd3fe6f240882b2158e046b4e7908a814930f.tar.bz2
Ishtar-d1ccd3fe6f240882b2158e046b4e7908a814930f.zip
Treatments: add a view to get all non modif treatments
- manage go back in the modi treatment hierarchy
Diffstat (limited to 'archaeological_finds/models_treatments.py')
-rw-r--r--archaeological_finds/models_treatments.py70
1 files changed, 69 insertions, 1 deletions
diff --git a/archaeological_finds/models_treatments.py b/archaeological_finds/models_treatments.py
index 5a654cb70..0a04cefb9 100644
--- a/archaeological_finds/models_treatments.py
+++ b/archaeological_finds/models_treatments.py
@@ -601,7 +601,7 @@ class AbsFindTreatments(models.Model):
treatment = models.OneToOneField(Treatment, verbose_name=_(u"Treatment"),
primary_key=True)
# primary_key is set to prevent django to ask for an id column
- # treatment is not a primary key
+ # treatment is not a real primary key
treatment_nb = models.IntegerField(_(u"Order"))
TABLE_COLS = ["treatment__" + col for col in Treatment.TABLE_COLS] + \
['treatment_nb']
@@ -624,6 +624,74 @@ class AbsFindTreatments(models.Model):
self.find, self.treatment, self.treatment_nb)
+class FindNonModifTreatments(AbsFindTreatments):
+ CREATE_SQL = """
+ CREATE VIEW find_nonmodif_treatments_tree AS
+ WITH RECURSIVE rel_tree AS (
+ SELECT f.id AS find_id, of.id AS old_find_id,
+ f.downstream_treatment_id, f.upstream_treatment_id,
+ 1 AS level, ARRAY[]::integer[] AS path_info
+ FROM archaeological_finds_find f
+ INNER JOIN archaeological_finds_find of
+ ON of.downstream_treatment_id = f.upstream_treatment_id
+ WHERE f.downstream_treatment_id is NULL AND
+ f.upstream_treatment_id is NOT NULL
+ UNION ALL
+ SELECT c.id AS find_id, p.old_find_id, c.downstream_treatment_id,
+ c.upstream_treatment_id,
+ p.level + 1, p.path_info||c.downstream_treatment_id
+ FROM archaeological_finds_find c
+ JOIN rel_tree p
+ ON c.downstream_treatment_id = p.upstream_treatment_id
+ AND (p.path_info = ARRAY[]::integer[] OR
+ NOT (c.downstream_treatment_id =
+ ANY(p.path_info[0:array_upper(p.path_info, 1)-1]))
+ )
+ )
+ SELECT DISTINCT find_id, old_find_id, path_info, level
+ FROM rel_tree
+ UNION ALL
+ SELECT id AS find_id, id AS old_find_id,
+ ARRAY[]::integer[] AS path_info, 0 AS level
+ FROM archaeological_finds_find f
+ WHERE f.downstream_treatment_id is NULL
+ ORDER BY find_id;
+
+ CREATE VIEW find_nonmodif_treatments AS
+ SELECT DISTINCT y.find_id,
+ y.old_find_id,
+ ft.treatment_id as treatment_id,
+ 1 AS treatment_nb
+ FROM (SELECT * FROM find_nonmodif_treatments_tree) y
+ INNER JOIN archaeological_finds_find_treatments ft
+ ON ft.find_id = y.old_find_id
+ ORDER BY y.find_id, ft.treatment_id;
+
+ -- deactivate deletion
+ CREATE RULE find_nonmodif_treatments_del AS
+ ON DELETE TO find_nonmodif_treatments
+ DO INSTEAD DELETE FROM archaeological_finds_find where id=NULL;
+ """
+ DELETE_SQL = """
+ DROP VIEW find_nonmodif_treatments;
+ DROP VIEW find_nonmodif_treatments_tree;
+ """
+ TABLE_COLS = ['treatment__treatment_type',
+ 'treatment__upstream',
+ 'treatment__start_date', 'treatment__end_date',
+ 'treatment__location', 'treatment__container',
+ 'treatment__person', 'treatment_nb']
+
+ # search parameters
+ EXTRA_REQUEST_KEYS = {'find_id': 'find_id'}
+
+ class Meta:
+ managed = False
+ db_table = 'find_nonmodif_treatments'
+ unique_together = ('find', 'treatment')
+ ordering = ('find', '-treatment_nb')
+
+
class FindUpstreamTreatments(AbsFindTreatments):
CREATE_SQL = """
CREATE VIEW find_uptreatments_tree AS