diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-08-10 12:59:00 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-08-13 18:26:04 +0200 |
commit | 36b6f6e14fffdb1efcfe62dfed6a50d2285568f7 (patch) | |
tree | b3a79525887488ca98e4adccbcab9538c0e6f9a5 | |
parent | 862d49c1bd6fe5bd5cb6312d3e125a333d50158b (diff) | |
download | Ishtar-36b6f6e14fffdb1efcfe62dfed6a50d2285568f7.tar.bz2 Ishtar-36b6f6e14fffdb1efcfe62dfed6a50d2285568f7.zip |
Search administrativ act configuration
-rw-r--r-- | archaeological_files/forms.py | 22 | ||||
-rw-r--r-- | archaeological_operations/forms.py | 18 | ||||
-rw-r--r-- | archaeological_operations/models.py | 120 | ||||
-rw-r--r-- | ishtar_common/views_item.py | 178 |
4 files changed, 232 insertions, 106 deletions
diff --git a/archaeological_files/forms.py b/archaeological_files/forms.py index 645953a78..f78347b6c 100644 --- a/archaeological_files/forms.py +++ b/archaeological_files/forms.py @@ -408,7 +408,9 @@ class FinalFileDeleteForm(FinalForm): confirm_end_msg = _(u"Would you like to delete this archaeological file ?") -class AdministrativeActFileModifySelect(TableSelect): +class AdministrativeActFileModifySelect(TableSelect): # OK + _model = AdministrativeAct + search_vector = forms.CharField( label=_(u"Full text search"), widget=widgets.SearchWidget( 'archaeological-operations', 'administrativeact' @@ -439,7 +441,9 @@ class AdministrativeActFileModifySelect(TableSelect): ('', '--')] + list(settings.ISHTAR_DPTS) -class AdministrativeActFileSelect(TableSelect): +class AdministrativeActFileSelect(TableSelect): # OK + _model = AdministrativeAct + search_vector = forms.CharField( label=_(u"Full text search"), widget=widgets.SearchWidget( 'archaeological-operations', 'administrativeact' @@ -452,17 +456,17 @@ class AdministrativeActFileSelect(TableSelect): act_type = forms.ChoiceField(label=_("Act type"), choices=[]) indexed = forms.NullBooleanField(label=_(u"Indexed?")) associated_file__towns = get_town_field() - parcel = ParcelField(label=_("Parcel (section/number/public domain)")) + parcel = forms.CharField(label=_(u"Parcel")) if settings.ISHTAR_DPTS: associated_file__towns__numero_insee__startswith = forms.ChoiceField( label=_(u"Department"), choices=[]) act_object = forms.CharField(label=_(u"Object"), max_length=300) - signature_date_after = forms.DateField( - label=_(u"Signature date after"), widget=DatePicker) signature_date_before = forms.DateField( label=_(u"Signature date before"), widget=DatePicker) + signature_date_after = forms.DateField( + label=_(u"Signature date after"), widget=DatePicker) associated_file__name = forms.CharField( label=_(u"File name"), max_length=200) associated_file__general_contractor = forms.IntegerField( @@ -523,14 +527,6 @@ class AdministrativeActFileSelect(TableSelect): self.fields[k].choices = [ ('', '--')] + list(settings.ISHTAR_DPTS) - def get_input_ids(self): - ids = super(AdministrativeActFileSelect, self).get_input_ids() - ids.pop(ids.index('parcel')) - ids.append('parcel_0') - ids.append('parcel_1') - ids.append('parcel_2') - return ids - class AdministrativeActFileFormSelection(AdministrativeActOpeFormSelection): SEARCH_AND_SELECT = True diff --git a/archaeological_operations/forms.py b/archaeological_operations/forms.py index dc389c81c..d57a890eb 100644 --- a/archaeological_operations/forms.py +++ b/archaeological_operations/forms.py @@ -471,7 +471,7 @@ RecordRelationsFormSet.form_admin_name = _(u"Operation - 080 - Relations") RecordRelationsFormSet.form_slug = "operation-080-relations" -class OperationSelect(TableSelect): +class OperationSelect(TableSelect): # OK _model = models.Operation search_vector = forms.CharField( @@ -1230,7 +1230,7 @@ class OperationDeletionForm(FinalForm): ######### -class SiteSelect(TableSelect): +class SiteSelect(TableSelect): # OK _model = models.ArchaeologicalSite search_vector = forms.CharField( @@ -1376,7 +1376,9 @@ class SiteUnderwaterForm(ManageOldType): ################################################ -class AdministrativeActOpeSelect(TableSelect): +class AdministrativeActOpeSelect(TableSelect): # OK + _model = models.AdministrativeAct + search_vector = forms.CharField( label=_(u"Full text search"), widget=widgets.SearchWidget( 'archaeological-operations', 'administrativeact' @@ -1393,7 +1395,7 @@ class AdministrativeActOpeSelect(TableSelect): act_type = forms.ChoiceField(label=_("Act type"), choices=[]) indexed = forms.NullBooleanField(label=_(u"Indexed?")) operation__towns = get_town_field() - parcel = ParcelField(label=_("Parcel (section/number/public domain)")) + parcel = forms.CharField(label=_(u"Parcel")) if settings.ISHTAR_DPTS: operation__towns__numero_insee__startswith = forms.ChoiceField( label=_(u"Department"), choices=[]) @@ -1424,14 +1426,6 @@ class AdministrativeActOpeSelect(TableSelect): self.fields[k].choices = [ ('', '--')] + list(settings.ISHTAR_DPTS) - def get_input_ids(self): - ids = super(AdministrativeActOpeSelect, self).get_input_ids() - ids.pop(ids.index('parcel')) - ids.append('parcel_0') - ids.append('parcel_1') - ids.append('parcel_2') - return ids - class AdministrativeActOpeFormSelection(IshtarForm): SEARCH_AND_SELECT = True diff --git a/archaeological_operations/models.py b/archaeological_operations/models.py index 8fa00a215..082bbd2fe 100644 --- a/archaeological_operations/models.py +++ b/archaeological_operations/models.py @@ -1370,6 +1370,117 @@ class AdministrativeAct(BaseHistorizedItem, OwnPerms, ValueGetter): PARENT_SEARCH_VECTORS = ['operator', 'scientist', 'signatory', 'associated_file', 'operation', 'treatment_file', 'treatment'] + # alternative names of fields for searches + ALT_NAMES = { + 'year': ( + pgettext_lazy(TXT_SEARCH_COMMENT, u"year"), + 'signature_date__year' + ), + 'index': ( + pgettext_lazy(TXT_SEARCH_COMMENT, u"index"), + 'index' + ), + 'ref_sra': ( + pgettext_lazy(TXT_SEARCH_COMMENT, u"other-ref"), + 'ref_sra__iexact' + ), + 'operation__code_patriarche': ( + pgettext_lazy(TXT_SEARCH_COMMENT, u"patriarche"), + 'operation__code_patriarche' + ), + 'act_type': ( + pgettext_lazy(TXT_SEARCH_COMMENT, u"type"), + 'act_type__label__iexact' + ), + 'indexed': ( + pgettext_lazy(TXT_SEARCH_COMMENT, u"indexed"), + 'index__isnull' + ), + 'operation__towns': ( + pgettext_lazy(TXT_SEARCH_COMMENT, u"operation-town"), + 'operation__towns__cached_label__iexact' + ), + 'associated_file__towns': ( + pgettext_lazy(TXT_SEARCH_COMMENT, u"file-town"), + 'associated_file__towns__cached_label__iexact' + ), + 'parcel': ( + pgettext_lazy(TXT_SEARCH_COMMENT, u"parcel"), + ('associated_file__parcels__cached_label__iexact', + 'operation__parcels__cached_label__iexact', + 'operation__associated_file__parcels__cached_label__iexact'), + ), + 'operation__towns__numero_insee__startswith': ( + pgettext_lazy(TXT_SEARCH_COMMENT, u"operation-department"), + 'operation__towns__numero_insee__startswith' + ), + 'associated_file__towns__numero_insee__startswith': ( + pgettext_lazy(TXT_SEARCH_COMMENT, u"file-department"), + 'associated_file__towns__numero_insee__startswith' + ), + 'act_object': ( + pgettext_lazy(TXT_SEARCH_COMMENT, u"object"), + 'act_object__icontains' + ), + 'history_creator': ( + pgettext_lazy(TXT_SEARCH_COMMENT, u"created-by"), + 'history_creator__ishtaruser__person__cached_label__iexact' + ), + 'history_modifier': ( + pgettext_lazy(TXT_SEARCH_COMMENT, u"modified-by"), + 'history_modifier__ishtaruser__person__cached_label__iexact' + ), + 'signature_date_before': ( + pgettext_lazy(TXT_SEARCH_COMMENT, u"signature-before"), + 'signature_date__lte' + ), + 'signature_date_after': ( + pgettext_lazy(TXT_SEARCH_COMMENT, u"signature-after"), + 'signature_date__gte' + ), + 'associated_file__name': ( + pgettext_lazy(TXT_SEARCH_COMMENT, u"file-name"), + 'associated_file__name__icontains' + ), + 'associated_file__general_contractor': ( + pgettext_lazy(TXT_SEARCH_COMMENT, u"general-contractor"), + 'associated_file__general_contractor__cached_label__iexact' + ), + 'associated_file__general_contractor__attached_to': ( + pgettext_lazy(TXT_SEARCH_COMMENT, + u"general-contractor-organization"), + 'associated_file__general_contractor__attached_to' + '__cached_label__iexact' + ), + 'associated_file__numeric_reference': ( + pgettext_lazy(TXT_SEARCH_COMMENT, u"file-reference"), + 'associated_file__numeric_reference' + ), + 'associated_file__year': ( + pgettext_lazy(TXT_SEARCH_COMMENT, u"file-year"), + 'associated_file__year' + ), + 'associated_file__internal_reference': ( + pgettext_lazy(TXT_SEARCH_COMMENT, u"file-other-reference"), + 'associated_file__internal_reference__iexact' + ), + 'associated_file__in_charge': ( + pgettext_lazy(TXT_SEARCH_COMMENT, u"file-in-charge"), + 'associated_file__in_charge__cached_label__iexact' + ), + 'associated_file__permit_reference': ( + pgettext_lazy(TXT_SEARCH_COMMENT, u"file-permit-reference"), + 'associated_file__permit_reference__iexact' + ), + } + for v in ALT_NAMES.values(): + EXTRA_REQUEST_KEYS[v[0]] = v[1] + + POST_PROCESS_REQUEST = { + 'operation__towns__numero_insee__startswith': '_get_department_code', + 'associated_file__towns__numero_insee__startswith': + '_get_department_code', + } # fields act_type = models.ForeignKey(ActType, verbose_name=_(u"Act type")) @@ -1492,6 +1603,15 @@ class AdministrativeAct(BaseHistorizedItem, OwnPerms, ValueGetter): dpts.append(dpt) return ', '.join(list(sorted(dpts))) + @classmethod + def _get_department_code(cls, value): + if not settings.ISHTAR_DPTS: + return u"" + for k, v in settings.ISHTAR_DPTS: + if v.lower() == value: + return k + return u"" + @property def related_item(self): if self.operation: diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py index 3b09bc7da..1a0ef61e7 100644 --- a/ishtar_common/views_item.py +++ b/ishtar_common/views_item.py @@ -537,88 +537,91 @@ def _manage_facet_search(model, dct, and_reqs): def _manage_hierarchic_fields(dct, and_reqs): - for req in dct.copy(): - if req.endswith('areas__pk'): - val = _clean_type_val(dct.pop(req)) - reqs = Q(**{req: val}) - base_req = req[:-2] + '__' - req = base_req[:] - for idx in range(HIERARCHIC_LEVELS): - req = req[:-2] + 'parent__pk' - q = Q(**{req: val}) - reqs |= q - req = base_req[:] - for idx in range(HIERARCHIC_LEVELS): - req = req[:-2] + 'children__pk' - q = Q(**{req: val}) - reqs |= q - and_reqs.append(reqs) - continue - - if req.endswith('town__pk') or req.endswith('towns__pk'): - val = _clean_type_val(dct.pop(req)) - reqs = Q(**{req: val}) - base_req = req[:-2] + '__' - req = base_req[:] - for idx in range(HIERARCHIC_LEVELS): - req = req[:-2] + 'parents__pk' - q = Q(**{req: val}) - reqs |= q - req = base_req[:] - for idx in range(HIERARCHIC_LEVELS): - req = req[:-2] + 'children__pk' - q = Q(**{req: val}) - reqs |= q - and_reqs.append(reqs) - continue + for reqs in dct.copy(): + if type(reqs) not in (list, tuple): + reqs = [reqs] + for req in reqs: + if req.endswith('areas__pk'): + val = _clean_type_val(dct.pop(req)) + reqs = Q(**{req: val}) + base_req = req[:-2] + '__' + req = base_req[:] + for idx in range(HIERARCHIC_LEVELS): + req = req[:-2] + 'parent__pk' + q = Q(**{req: val}) + reqs |= q + req = base_req[:] + for idx in range(HIERARCHIC_LEVELS): + req = req[:-2] + 'children__pk' + q = Q(**{req: val}) + reqs |= q + and_reqs.append(reqs) + continue - for k_hr in HIERARCHIC_FIELDS: - if type(req) in (list, tuple): - val = dct.pop(req) - q = None - for idx, r in enumerate(req): - r = _clean_type_val(r) - if not idx: - q = Q(**{r: val}) - else: - q |= Q(**{r: val}) - and_reqs.append(q) - break - elif req.endswith(k_hr + '__pk'): + if req.endswith('town__pk') or req.endswith('towns__pk'): val = _clean_type_val(dct.pop(req)) + reqs = Q(**{req: val}) + base_req = req[:-2] + '__' + req = base_req[:] + for idx in range(HIERARCHIC_LEVELS): + req = req[:-2] + 'parents__pk' + q = Q(**{req: val}) + reqs |= q + req = base_req[:] + for idx in range(HIERARCHIC_LEVELS): + req = req[:-2] + 'children__pk' + q = Q(**{req: val}) + reqs |= q + and_reqs.append(reqs) + continue - if u";" in val: - # OR request - values = val.split(u";") - else: - values = [val] - base_req = req[:] - reqs = None - for val in values: - suffix = "pk" - req = base_req[:] - - if val.startswith(u'"') and val.startswith(u'"'): - # manage search text by label - if u"*" in val: - suffix = "label__icontains" - val = val.replace(u'*', u"") + for k_hr in HIERARCHIC_FIELDS: + if type(req) in (list, tuple): + val = dct.pop(req) + q = None + for idx, r in enumerate(req): + r = _clean_type_val(r) + if not idx: + q = Q(**{r: val}) else: - suffix = "label__iexact" - val = val[1:-1] - req = req[:-2] + suffix + q |= Q(**{r: val}) + and_reqs.append(q) + break + elif req.endswith(k_hr + '__pk'): + val = _clean_type_val(dct.pop(req)) - if not reqs: - reqs = Q(**{req: val}) + if u";" in val: + # OR request + values = val.split(u";") else: - reqs |= Q(**{req: val}) - for idx in range(HIERARCHIC_LEVELS): - req = req[:-(len(suffix))] + 'parent__' + suffix - q = Q(**{req: val}) - reqs |= q - if reqs: - and_reqs.append(reqs) - break + values = [val] + base_req = req[:] + reqs = None + for val in values: + suffix = "pk" + req = base_req[:] + + if val.startswith(u'"') and val.startswith(u'"'): + # manage search text by label + if u"*" in val: + suffix = "label__icontains" + val = val.replace(u'*', u"") + else: + suffix = "label__iexact" + val = val[1:-1] + req = req[:-2] + suffix + + if not reqs: + reqs = Q(**{req: val}) + else: + reqs |= Q(**{req: val}) + for idx in range(HIERARCHIC_LEVELS): + req = req[:-(len(suffix))] + 'parent__' + suffix + q = Q(**{req: val}) + reqs |= q + if reqs: + and_reqs.append(reqs) + break def _manage_clean_search_field(dct): @@ -689,6 +692,16 @@ def _construct_query(relation_types, dct, or_reqs, and_reqs): (key, {key: v}) ) + for k in list(dct.keys()): + if type(k) not in (list, tuple): + continue + first_key = k[0] + value = dct[k][:] + dct.pop(k) + dct[first_key] = value + for other_key in k[1:]: + or_reqs.append((first_key, {other_key: value})) + query = Q(**dct) for k, or_req in or_reqs: alt_dct = dct.copy() @@ -952,11 +965,14 @@ def get_item(model, func_name, default_name, extra_request_keys=[], relation_types = {} for rtype_key in my_relation_types_prefix: relation_types[my_relation_types_prefix[rtype_key]] = set() - for k in list(dct.keys()): - if k.startswith(rtype_key): - relation_types[my_relation_types_prefix[rtype_key]].add( - dct.pop(k) - ) + for keys in list(dct.keys()): + if type(keys) not in (list, tuple): + keys = [keys] + for k in keys: + if k.startswith(rtype_key): + relation_types[my_relation_types_prefix[rtype_key]].add( + dct.pop(k) + ) _manage_bool_fields(model, my_bool_fields, my_reversed_bool_fields, dct, or_reqs) |