diff options
Diffstat (limited to 'chimere/models.py')
| -rw-r--r-- | chimere/models.py | 74 | 
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) | 
