diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-08-23 17:35:32 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-08-23 17:35:32 +0200 |
commit | 7ce2bb5bb8fcbb0d6ae4c57e235683bfb8c3437c (patch) | |
tree | 05a55ea77f73225297639c28cc0de56f31432cf1 /archaeological_finds/models.py | |
parent | 91ecf569dc40c7afda72c4ed2d9903c1d2d7c5bd (diff) | |
download | Ishtar-7ce2bb5bb8fcbb0d6ae4c57e235683bfb8c3437c.tar.bz2 Ishtar-7ce2bb5bb8fcbb0d6ae4c57e235683bfb8c3437c.zip |
Treatments: efficient view to get upstream and dowstream - CSV export of tables (refs #3108)
Diffstat (limited to 'archaeological_finds/models.py')
-rw-r--r-- | archaeological_finds/models.py | 106 |
1 files changed, 57 insertions, 49 deletions
diff --git a/archaeological_finds/models.py b/archaeological_finds/models.py index d1f194727..ea68fa807 100644 --- a/archaeological_finds/models.py +++ b/archaeological_finds/models.py @@ -449,43 +449,28 @@ class Find(BaseHistorizedItem, ImageModel, OwnPerms, ShortMenuItem): bf.context_record.operation.get_reference(), self.index) - def upstream_treatments(self): - treatments = [] - base_finds = [bf.pk for bf in self.base_finds.all()] - if self.upstream_treatment and \ - self.upstream_treatment.pk not in treatments: - treatments.append( - (self.upstream_treatment.upstream.distinct( - ).order_by('label').all(), self.upstream_treatment)) - for upstream in self.upstream_treatment.upstream.all(): - if upstream.pk != self.pk and not [ - bf.pk for bf in upstream.base_finds.all() - if bf.pk in base_finds]: - continue - for items, treatment in upstream.upstream_treatments(): - if treatment.pk not in treatments: - treatments.append((treatment.upstream.order_by( - 'label').all(), treatment)) + def _get_treatments(self, model, rel='upstream'): + treatments, findtreats = [], [] + for findtreat in model.objects.filter(find_id=self.pk + ).order_by('treatment_nb', 'treatment__start_date', + 'treatment__end_date' + ).distinct().all(): + if findtreat.pk in findtreats: + continue + findtreats.append(findtreat.pk) + q = getattr(findtreat.treatment, rel).distinct().order_by( + 'label') + treatments.append((q.all(), findtreat.treatment)) return treatments + def upstream_treatments(self): + return self._get_treatments(FindUpstreamTreatments, 'upstream') + def downstream_treatments(self): - treatments = [] - base_finds = [bf.pk for bf in self.base_finds.all()] - if self.downstream_treatment and \ - self.downstream_treatment.pk not in treatments: - treatments.append( - (self.downstream_treatment.downstream.distinct( - ).order_by('label').all(), self.downstream_treatment)) - for downstream in self.downstream_treatment.downstream.all(): - if downstream.pk != self.pk and not [ - bf.pk for bf in downstream.base_finds.all() - if bf.pk in base_finds]: - continue - for items, treatment in downstream.downstream_treatments(): - if treatment.pk not in treatments: - treatments.append((treatment.downstream.order_by( - 'label').all(), treatment)) - return treatments + return self._get_treatments(FindDownstreamTreatments, 'downstream') + + def all_treatments(self): + return self.upstream_treatments() + self.downstream_treatments() def get_department(self): bf = self.get_first_base_find() @@ -705,7 +690,7 @@ class Treatment(BaseHistorizedItem, OwnPerms): other_location = models.CharField(_(u"Other location"), max_length=200, blank=True, null=True) person = models.ForeignKey( - Person, verbose_name=_(u"Person"), blank=True, null=True, + Person, verbose_name=_(u"Doer"), blank=True, null=True, on_delete=models.SET_NULL, related_name='treatments') start_date = models.DateField(_(u"Start date"), blank=True, null=True) end_date = models.DateField(_(u"End date"), blank=True, null=True) @@ -758,9 +743,9 @@ class Treatment(BaseHistorizedItem, OwnPerms): basket.items.add(new) -class AbsFindTreatments(object): +class AbsFindTreatments(models.Model): find = models.ForeignKey(Find, verbose_name=_(u"Find"), - related_name='treatments') + related_name='%(class)s_related') treatment = models.ForeignKey(Treatment, verbose_name=_(u"Treatment"), primary_key=True) # primary_key is set to prevent django to ask for an id column @@ -768,8 +753,18 @@ class AbsFindTreatments(object): treatment_nb = models.IntegerField(_(u"Order")) TABLE_COLS = ['treatment__treatment_type', 'treatment__start_date', 'treatment__end_date', - 'treatment__location', 'treatment__person', - 'treatment_nb'] + 'treatment__location', 'treatment__container', + 'treatment__person', 'treatment_nb'] + EXTRA_FULL_FIELDS_LABELS = { + 'treatment__treatment_type': _(u"Treatment type"), + 'treatment__start_date': _(u"Start date"), + 'treatment__end_date': _(u"End date"), + 'treatment__location': _(u"Location"), + 'treatment__container': _(u"Container"), + 'treatment__person': _(u"Doer"), + 'treatment__upstream': _(u"Related finds"), + 'treatment__downstream': _(u"Related finds"), + } class Meta: abstract = True @@ -779,9 +774,9 @@ class AbsFindTreatments(object): self.find, self.treatment, self.treatment_nb) -class FindDownstreamTreatments(AbsFindTreatments): +class FindUpstreamTreatments(AbsFindTreatments): """ - CREATE VIEW find_downtreatments_tree AS + CREATE VIEW find_uptreatments_tree AS WITH RECURSIVE rel_tree AS ( SELECT id AS find_id, upstream_treatment_id, downstream_treatment_id, 1 AS level, @@ -799,24 +794,30 @@ class FindDownstreamTreatments(AbsFindTreatments): SELECT DISTINCT find_id, path_info, level FROM rel_tree ORDER BY find_id; - CREATE VIEW find_downtreatments AS + CREATE VIEW find_uptreatments AS SELECT DISTINCT find_id, path_info[nb] AS treatment_id, level - nb + 1 AS treatment_nb FROM (SELECT *, generate_subscripts(path_info, 1) AS nb - FROM find_downtreatments_tree) y + FROM find_uptreatments_tree) y WHERE path_info[nb] is not NULL ORDER BY find_id, treatment_id; """ + TABLE_COLS = ['treatment__treatment_type', + 'treatment__upstream', + 'treatment__start_date', 'treatment__end_date', + 'treatment__location', 'treatment__container', + 'treatment__person', 'treatment_nb'] class Meta: managed = False - db_table = 'find_downtreatments' + db_table = 'find_uptreatments' unique_together = ('find', 'treatment') + ordering = ('find', '-treatment_nb') -class FindUpstreamTreatments(AbsFindTreatments): +class FindDownstreamTreatments(AbsFindTreatments): """ - CREATE VIEW find_uptreatments_tree AS + CREATE VIEW find_downtreatments_tree AS WITH RECURSIVE rel_tree AS ( SELECT id AS find_id, downstream_treatment_id, upstream_treatment_id, 1 AS level, @@ -834,19 +835,25 @@ class FindUpstreamTreatments(AbsFindTreatments): SELECT DISTINCT find_id, path_info, level FROM rel_tree ORDER BY find_id; - CREATE VIEW find_uptreatments AS + CREATE VIEW find_downtreatments AS SELECT DISTINCT find_id, path_info[nb] AS treatment_id, level - nb + 1 AS treatment_nb FROM (SELECT *, generate_subscripts(path_info, 1) AS nb - FROM find_uptreatments_tree) y + FROM find_downtreatments_tree) y WHERE path_info[nb] is not NULL ORDER BY find_id, treatment_id; """ + TABLE_COLS = ['treatment__treatment_type', + 'treatment__downstream', + 'treatment__start_date', 'treatment__end_date', + 'treatment__location', 'treatment__container', + 'treatment__person', 'treatment_nb'] class Meta: managed = False - db_table = 'find_uptreatments' + db_table = 'find_downtreatments' unique_together = ('find', 'treatment') + ordering = ('find', '-treatment_nb') class FindTreatments(AbsFindTreatments): @@ -865,6 +872,7 @@ class FindTreatments(AbsFindTreatments): managed = False db_table = 'find_treatments' unique_together = ('find', 'treatment') + ordering = ('find', 'upstream', '-treatment_nb') class TreatmentSource(Source): |