summaryrefslogtreecommitdiff
path: root/ishtar_common/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common/models.py')
-rw-r--r--ishtar_common/models.py159
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 = [