diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-01-31 17:06:29 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-01-31 17:06:29 +0100 |
commit | 61dee247a1614517c8fb73eb7ada2e33019134b9 (patch) | |
tree | 013b56c339effd0a0540f5cee907986e30fd897a /ishtar_common/models.py | |
parent | bf3794dcccee7a46ab8bf7177ab119ffb437f6dd (diff) | |
download | Ishtar-61dee247a1614517c8fb73eb7ada2e33019134b9.tar.bz2 Ishtar-61dee247a1614517c8fb73eb7ada2e33019134b9.zip |
Search: manage dynamic query parameters (ex: divisions details)
Diffstat (limited to 'ishtar_common/models.py')
-rw-r--r-- | ishtar_common/models.py | 159 |
1 files changed, 106 insertions, 53 deletions
diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 12f7dc47b..7f5857037 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -33,9 +33,10 @@ import tempfile import time from cStringIO import StringIO from subprocess import Popen, PIPE - - from PIL import Image + +from django import forms +from django.apps import apps from django.conf import settings from django.contrib.auth.models import User, Group from django.contrib.contenttypes.fields import GenericForeignKey @@ -1240,9 +1241,62 @@ class Imported(models.Model): abstract = True +class SearchAltName(object): + def __init__(self, search_key, search_query, extra_query=None, + distinct_query=False): + self.search_key = search_key + self.search_query = search_query + self.extra_query = extra_query or {} + self.distinct_query = distinct_query + + +class DynamicRequest(object): + def __init__(self, label, app_name, model_name, form_key, search_key, + type_query, search_query): + self.label = label + self.form_key = form_key + self.search_key = search_key + self.app_name = app_name + self.model_name = model_name + self.type_query = type_query + self.search_query = search_query + + def get_all_types(self): + model = apps.get_app_config(self.app_name).get_model(self.model_name) + return model.objects.filter(available=True) + + def get_form_fields(self): + fields = {} + for item in self.get_all_types().all(): + fields[self.form_key + "-" + item.txt_idx] = forms.CharField( + label=unicode(self.label) + u" " + unicode(item), + required=False + ) + return fields + + def get_extra_query(self, slug): + return { + self.type_query: slug + } + + def get_alt_names(self): + alt_names = {} + for item in self.get_all_types().all(): + alt_names[self.form_key + "-" + item.txt_idx] = SearchAltName( + self.search_key + "-" + item.txt_idx, self.search_query, + self.get_extra_query(item.txt_idx), distinct_query=True + ) + return alt_names + + class FullSearch(models.Model): search_vector = SearchVectorField(_("Search vector"), blank=True, null=True, help_text=_("Auto filled at save")) + + EXTRA_REQUEST_KEYS = {} + DYNAMIC_REQUESTS = {} + ALT_NAMES = {} + BASE_SEARCH_VECTORS = [] PROPERTY_SEARCH_VECTORS = [] INT_SEARCH_VECTORS = [] @@ -1264,6 +1318,23 @@ class FullSearch(models.Model): if issubclass(rel_model, (GeneralType, HierarchicalType)): yield k + @classmethod + def get_alt_names(cls): + alt_names = cls.ALT_NAMES.copy() + for dr_k in cls.DYNAMIC_REQUESTS: + alt_names.update(cls.DYNAMIC_REQUESTS[dr_k].get_alt_names()) + return alt_names + + @classmethod + def get_query_parameters(cls): + query_parameters = {} + for v in cls.get_alt_names().values(): + for language_code, language_lbl in settings.LANGUAGES: + activate(language_code) + query_parameters[unicode(v.search_key)] = v + deactivate() + return query_parameters + def update_search_vector(self, save=True, exclude_parent=False): """ Update the search vector @@ -2692,7 +2763,6 @@ class Department(models.Model): return res - class Address(BaseHistorizedItem): address = models.TextField(_(u"Address"), null=True, blank=True) address_complement = models.TextField(_(u"Address complement"), null=True, @@ -2880,20 +2950,16 @@ class Organization(Address, Merge, OwnPerms, ValueGetter): # alternative names of fields for searches ALT_NAMES = { - 'name': ( + 'name': SearchAltName( pgettext_lazy("key for text search", u"name"), 'name__iexact' ), - 'organization_type': ( + 'organization_type': SearchAltName( pgettext_lazy("key for text search", u"type"), 'organization_type__label__iexact' ), } - for v in ALT_NAMES.values(): - for language_code, language_lbl in settings.LANGUAGES: - activate(language_code) - EXTRA_REQUEST_KEYS[unicode(v[0])] = v[1] - deactivate() + objects = OrganizationManager() # fields @@ -3029,36 +3095,32 @@ class Person(Address, Merge, OwnPerms, ValueGetter): # alternative names of fields for searches ALT_NAMES = { - 'name': ( + 'name': SearchAltName( pgettext_lazy("key for text search", u"name"), 'name__iexact' ), - 'surname': ( + 'surname': SearchAltName( pgettext_lazy("key for text search", u"surname"), 'surname__iexact' ), - 'email': ( + 'email': SearchAltName( pgettext_lazy("key for text search", u"email"), 'email__iexact' ), - 'person_types': ( + 'person_types': SearchAltName( pgettext_lazy("key for text search", u"type"), 'person_types__label__iexact' ), - 'attached_to': ( + 'attached_to': SearchAltName( pgettext_lazy("key for text search", u"organization"), 'attached_to__cached_label__iexact' ), - 'ishtaruser__isnull': ( + 'ishtaruser__isnull': SearchAltName( pgettext_lazy("key for text search", u"has-account"), 'ishtaruser__isnull' ), } - for v in ALT_NAMES.values(): - for language_code, language_lbl in settings.LANGUAGES: - activate(language_code) - EXTRA_REQUEST_KEYS[unicode(v[0])] = v[1] - deactivate() + objects = PersonManager() # fields @@ -3433,36 +3495,31 @@ class IshtarUser(FullSearch): # alternative names of fields for searches ALT_NAMES = { - 'username': ( + 'username': SearchAltName( pgettext_lazy("key for text search", u"username"), 'user_ptr__username__iexact' ), - 'name': ( + 'name': SearchAltName( pgettext_lazy("key for text search", u"name"), 'person__name__iexact' ), - 'surname': ( + 'surname': SearchAltName( pgettext_lazy("key for text search", u"surname"), 'person__surname__iexact' ), - 'email': ( + 'email': SearchAltName( pgettext_lazy("key for text search", u"email"), 'person__email__iexact' ), - 'person_types': ( + 'person_types': SearchAltName( pgettext_lazy("key for text search", u"type"), 'person__person_types__label__iexact' ), - 'attached_to': ( + 'attached_to': SearchAltName( pgettext_lazy("key for text search", u"organization"), 'person__attached_to__cached_label__iexact' ), } - for v in ALT_NAMES.values(): - for language_code, language_lbl in settings.LANGUAGES: - activate(language_code) - EXTRA_REQUEST_KEYS[unicode(v[0])] = v[1] - deactivate() # fields user_ptr = models.OneToOneField(User, primary_key=True, @@ -3807,76 +3864,72 @@ class Document(BaseHistorizedItem, OwnPerms, ImageModel): # alternative names of fields for searches ALT_NAMES = { - 'authors': ( + 'authors': SearchAltName( pgettext_lazy("key for text search", u"author"), 'authors__cached_label__iexact' ), - 'title': ( + 'title': SearchAltName( pgettext_lazy("key for text search", u"title"), 'title__iexact' ), - 'source_type': ( + 'source_type': SearchAltName( pgettext_lazy("key for text search", u"type"), 'source_type__label__iexact' ), - 'reference': ( + 'reference': SearchAltName( pgettext_lazy("key for text search", u"reference"), 'reference__iexact' ), - 'internal_reference': ( + 'internal_reference': SearchAltName( pgettext_lazy("key for text search", u"internal-reference"), 'internal_reference__iexact' ), - 'description': ( + 'description': SearchAltName( pgettext_lazy("key for text search", u"description"), 'description__iexact' ), - 'comment': ( + 'comment': SearchAltName( pgettext_lazy("key for text search", u"comment"), 'comment__iexact' ), - 'additional_information': ( + 'additional_information': SearchAltName( pgettext_lazy("key for text search", u"additional-information"), 'additional_information__iexact' ), - 'duplicate': ( + 'duplicate': SearchAltName( pgettext_lazy("key for text search", u"has-duplicate"), 'duplicate' ), - 'operation': ( + 'operation': SearchAltName( pgettext_lazy("key for text search", u"operation"), 'operations__cached_label__iexact' ), - 'context_record': ( + 'context_record': SearchAltName( pgettext_lazy("key for text search", u"context-record"), 'context_records__cached_label__iexact' ), - 'find': ( + 'find': SearchAltName( pgettext_lazy("key for text search", u"find"), 'finds__cached_label__iexact' ), - 'find__denomination': ( + 'find__denomination': SearchAltName( pgettext_lazy("key for text search", u"find-denomination"), 'finds__denomination__iexact' ), - 'file': ( + 'file': SearchAltName( pgettext_lazy("key for text search", u"file"), 'files__cached_label__iexact' ), - 'site': ( + 'site': SearchAltName( pgettext_lazy("key for text search", u"site"), 'sites__cached_label__iexact' ), - 'warehouse': ( + 'warehouse': SearchAltName( pgettext_lazy("key for text search", u"warehouse"), 'warehouses__name__iexact' ), } - for v in ALT_NAMES.values(): - for language_code, language_lbl in settings.LANGUAGES: - activate(language_code) - EXTRA_REQUEST_KEYS[unicode(v[0])] = v[1] - deactivate() + objects = ExternalIdManager() RELATED_MODELS_ALT = [ |