summaryrefslogtreecommitdiff
path: root/chimere/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'chimere/models.py')
-rw-r--r--chimere/models.py74
1 files changed, 54 insertions, 20 deletions
diff --git a/chimere/models.py b/chimere/models.py
index d8bf638..7cf911a 100644
--- a/chimere/models.py
+++ b/chimere/models.py
@@ -38,6 +38,7 @@ from django import forms
from django.conf import settings
from django.contrib.auth.models import User, Permission, ContentType, Group
from django.contrib.gis.db import models
+from django.contrib.postgres.search import SearchVectorField, SearchVector
from django.core.files import File
from django.core.exceptions import ObjectDoesNotExist
from django.core.urlresolvers import reverse
@@ -603,6 +604,8 @@ class GeographicItem(models.Model):
_("Normalised weight"), blank=True, null=True,
help_text=_("The weight normalised to be between 0 and 1. "
"Automatically recalculated."))
+ search_vector = SearchVectorField(_("Search vector"), blank=True, null=True,
+ help_text=_("Auto filled at save"))
class Meta:
abstract = True
@@ -1071,22 +1074,39 @@ def geometry_post_save(pre_save_geom_values):
or kwargs['instance'].pk not in pre_save_geom_values:
return
instance = kwargs['instance']
+ changed = False
+
pre = pre_save_geom_values[instance.pk]
# force the reinit of modified_since_import
- if pre['modified_since_import'] != instance.modified_since_import:
- return
- if (instance.import_version != pre['import_version']
- and instance.modified_since_import):
- instance.modified_since_import = False
- instance.save()
- return
- if instance.modified_since_import:
- return
- if [key for key in pre if pre not in (
- 'import_version', 'modified_since_import') and
- getattr(instance, key) != pre[key]]:
- instance.modified_since_import = True
+ if pre['modified_since_import'] == instance.modified_since_import:
+ if (instance.import_version != pre['import_version']
+ and instance.modified_since_import):
+ instance.modified_since_import = False
+ changed = True
+ elif not instance.modified_since_import and \
+ [key for key in pre if pre not in (
+ 'import_version', 'modified_since_import') and
+ getattr(instance, key) != pre[key]]:
+ instance.modified_since_import = True
+ changed = True
+
+ if not getattr(instance, '_search_updated', None):
+ instance._search_updated = True
+ q = instance.__class__.objects.filter(pk=instance.pk)
+ q = q.annotate(
+ search=SearchVector(
+ 'name', 'description',
+ 'keywords',
+ 'categories__keywords',
+ 'properties__search_value',
+ config=settings.CHIMERE_SEARCH_LANGUAGE
+ ))
+ instance.search_vector = q.all()[0].search
+ changed = True
+
+ if changed:
instance.save()
+
return geom_post_save
@@ -2116,8 +2136,9 @@ class PropertyModel(models.Model):
return self.slug
def getNamedId(self):
- '''Get the name used as named id (easily sortable)
- '''
+ """
+ Get the name used as named id (easily sortable)
+ """
return 'property_%d_%d' % (self.order, self.id)
@classmethod
@@ -2153,17 +2174,26 @@ class PropertyModelChoice(models.Model):
class Property(models.Model):
- '''Property for a POI
- '''
+ """
+ Property for a POI
+ """
marker = models.ForeignKey(
- Marker, verbose_name=_("Point of interest"), blank=True, null=True)
+ Marker, verbose_name=_("Point of interest"), blank=True, null=True,
+ related_name='properties'
+ )
route = models.ForeignKey(
- Route, verbose_name=_("Route"), blank=True, null=True)
+ Route, verbose_name=_("Route"), blank=True, null=True,
+ related_name='properties'
+ )
polygon = models.ForeignKey(
- Polygon, verbose_name=_("Polygon"), blank=True, null=True)
+ Polygon, verbose_name=_("Polygon"), blank=True, null=True,
+ related_name='properties'
+ )
propertymodel = models.ForeignKey(PropertyModel,
verbose_name=_("Property model"))
value = models.TextField(_("Value"))
+ search_value = models.TextField(_("Search value"), blank=True, null=True,
+ help_text=_("Auto filled at save"))
def __str__(self):
if self.propertymodel.type == 'C':
@@ -2194,3 +2224,7 @@ class Property(models.Model):
return None
else:
return self.value
+
+ def save(self, *args, **kwargs):
+ self.search_value = str(self.python_value or "")
+ super(Property, self).save(*args, **kwargs)