diff options
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 |
commit | d1ccd3fe6f240882b2158e046b4e7908a814930f (patch) | |
tree | 26118a3e75bd8047de57caae9927ce533709dd80 /archaeological_finds/models_treatments.py | |
parent | e059936f31f789b564f262cf7ef04ecccabd1d45 (diff) | |
download | Ishtar-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.py | 70 |
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 |