#!/usr/bin/env python # -*- coding: utf-8 -*- # Copyright (C) 2008 Étienne Loks # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # See the file COPYING for details. """ Models description """ from django.utils.translation import ugettext_lazy as _ from django.contrib.gis.db import models from django.contrib import admin from chimere import settings from chimere.main.widgets import PointField, RouteField class News(models.Model): """News of the site """ title = models.CharField(_("Name"), max_length=150) available = models.BooleanField(_("Available")) date = models.DateField(_("Date"), auto_now_add=True) content = models.TextField() def __unicode__(self): ordering = ["-date"] return self.title class Meta: verbose_name = _("News") class Category(models.Model): """Category of Point Of Interest (POI) """ name = models.CharField(_("Name"), max_length=150) available = models.BooleanField(_("Available")) order = models.IntegerField(_("Order")) def __unicode__(self): return self.name class Meta: ordering = ["order"] verbose_name = _("Category") class Icon(models.Model): '''Icon ''' name = models.CharField(_("Name"), max_length=150) image = models.ImageField(_("Image"), upload_to='icons', height_field='height', width_field='width') def __unicode__(self): return self.name class Meta: verbose_name = _("Icon") class SubCategory(models.Model): '''Sub-category ''' category = models.ForeignKey(Category, verbose_name=_("Category")) name = models.CharField(_("Name"), max_length=150) available = models.BooleanField(_("Available")) icon = models.ForeignKey(Icon, verbose_name=_("Icon")) color = models.CharField(max_length=10, blank=True, null=True) order = models.IntegerField(_("Order")) TYPE = (('M', _('Marker')), ('R', _('Route')), ('B', _('Both')),) item_type = models.CharField(_("Item type"), max_length=1, choices=TYPE) def __unicode__(self): return u"%s / %s" % (self.category.name, self.name) class Meta: ordering = ["category", "order"] verbose_name = _("Subcategory") def getAvailable(item_types=None): '''Get list of tuples with first the category and second the associated subcategories ''' sub_categories = {} subcategories = None if not item_types: subcategories = SubCategory.objects.filter(category__available=True, available=True) else: subcategories = SubCategory.objects.filter(category__available=True, item_type__in=item_types) for sub_category in subcategories: if sub_category.category not in sub_categories: sub_categories[sub_category.category] = [] sub_categories[sub_category.category].append(sub_category) return [(category, sub_cats) for category, sub_cats \ in sub_categories.items()] getAvailable = staticmethod(getAvailable) class Marker(models.Model): '''Marker for a POI ''' name = models.CharField(_("Name"), max_length=150) subcategory = models.ForeignKey(SubCategory, verbose_name=_("Subcategory")) point = PointField(_("Localisation")) picture = models.ImageField(_("Image"), upload_to='upload', blank=True, height_field='height', width_field='width') STATUS = (('S', _('Submited')), ('A', _('Available')), ('D', _('Disabled')),) STATUS_DCT = {} for key, label in STATUS: STATUS_DCT[key] = label status = models.CharField(_("Status"), max_length=1, choices=STATUS) objects = models.GeoManager() def __unicode__(self): return self.name class Meta: ordering = ('subcategory__category', 'subcategory', 'status', 'name') verbose_name = _("Point of interest") def getLatitude(self): '''Return the latitude ''' return self.point.y def getLongitude(self): '''Return the longitude ''' return self.point.x def getProperty(self, propertymodel, safe=None): """Get the property of an associated property model. If safe set to True, verify if the property is available """ if safe and not propertymodel.available: return try: property = Property.objects.get(propertymodel=propertymodel, marker=self) except Property.DoesNotExist: return return property def getProperties(self): """Get all the property availables """ properties = [] for pm in PropertyModel.objects.filter(available=True): property = self.getProperty(pm) if property: properties.append(property) return properties def getGeoJSON(self): '''Return a GeoJSON string ''' return """{"type":"Feature", "geometry":%(geometry)s, \ "properties":{"pk": %(id)d, "name": "%(name)s", \ "icon_path":"%(icon_path)s", "icon_width":%(icon_width)d, \ "icon_height":%(icon_height)d}}""" % {'id':self.id, 'name':self.name, 'icon_path':self.subcategory.icon.image, 'geometry':self.point.geojson, 'icon_width':self.subcategory.icon.image.width, 'icon_height':self.subcategory.icon.image.height,} class Route(models.Model): '''Route on the map ''' name = models.CharField(_("Name"), max_length=150) subcategory = models.ForeignKey(SubCategory, verbose_name=_("Subcategory")) route = RouteField(_("Route")) picture = models.ImageField(_("Image"), upload_to='upload', blank=True, height_field='height', width_field='width') STATUS = (('S', _('Submited')), ('A', _('Available')), ('D', _('Disabled')),) STATUS_DCT = {} for key, label in STATUS: STATUS_DCT[key] = label status = models.CharField(_("Status"), max_length=1, choices=STATUS) objects = models.GeoManager() def __unicode__(self): return self.name class Meta: ordering = ('subcategory__category', 'subcategory', 'status', 'name') verbose_name = _("Route") def getLatitude(self): '''Return the latitude ''' return self.point.y def getLongitude(self): '''Return the longitude ''' return self.point.x def getProperty(self, propertymodel, safe=None): """Get the property of an associated property model. If safe set to True, verify if the property is available """ if safe and not propertymodel.available: return try: property = Property.objects.get(propertymodel=propertymodel, marker=self) except Property.DoesNotExist: return return property def getProperties(self): """Get all the property availables """ properties = [] for pm in PropertyModel.objects.filter(available=True): property = self.getProperty(pm) if property: properties.append(property) return properties def getGeoJSON(self): '''Return a GeoJSON string ''' color = '#000' if self.subcategory.color: color = self.subcategory.color return """{"type":"Feature", "geometry":%(geometry)s, \ "properties":{"pk": %(id)d, "name": "%(name)s", \ "color":"%(color)s"}}""" % {'id':self.id, 'name':self.name, 'color':color, 'geometry':self.route.geojson,} class Area(models.Model): """Rectangular area of the map """ name = models.CharField(_("Name"), max_length=150) order = models.IntegerField(_("Order")) available = models.BooleanField(_("Available")) upper_left_corner = models.PointField(_("Upper left corner"), default='POINT(0 0)') lower_right_corner = models.PointField(_("Lower right corner"), default='POINT(0 0)') objects = models.GeoManager() def __unicode__(self): return self.name class Meta: ordering = ('order', 'name') verbose_name = _("Area") def getAvailable(): '''Get available areas ''' return Area.objects.filter(available=True) getAvailable = staticmethod(getAvailable) class PropertyModel(models.Model): '''Model for a property ''' name = models.CharField(_("Name"), max_length=150) order = models.IntegerField(_("Order")) available = models.BooleanField(_("Available")) TYPE = (('T', _('Text')), ('L', _('Long text')), ('P', _('Password'))) TYPE_WIDGET = {'T':'TextInput', 'L':'Textarea', 'P':'PasswordInput'} type = models.CharField(_("Type"), max_length=1, choices=TYPE) def __unicode__(self): return self.name class Meta: ordering = ('order',) verbose_name = _("Property model") def getNamedId(self): '''Get the name used as named id (easily sortable) ''' return 'property_%d_%d' % (self.order, self.id) class Property(models.Model): '''Property for a POI ''' marker = models.ForeignKey(Marker, verbose_name=_("Point of interest")) propertymodel = models.ForeignKey(PropertyModel, verbose_name=_("Property model")) value = models.CharField(_("Value"), max_length=1000) def __unicode__(self): return "%s : %s" % (str(self.propertymodel), self.value) class Meta: verbose_name = _("Property")