diff options
Diffstat (limited to 'chimere/main/models.py')
-rw-r--r-- | chimere/main/models.py | 325 |
1 files changed, 325 insertions, 0 deletions
diff --git a/chimere/main/models.py b/chimere/main/models.py new file mode 100644 index 0000000..14f3481 --- /dev/null +++ b/chimere/main/models.py @@ -0,0 +1,325 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (C) 2008 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> + +# 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 <http://www.gnu.org/licenses/>. + +# 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 ColorTheme(models.Model): + """Color theme + """ + name = models.CharField(_("Name"), max_length=150) + def __unicode__(self): + return self.name + class Meta: + verbose_name = _("Color theme") + +class Color(models.Model): + """Color + """ + code = models.CharField(_("Code"), max_length=6) + order = models.IntegerField(_("Order")) + color_theme = models.ForeignKey(ColorTheme, verbose_name=_("Color theme")) + def __unicode__(self): + return self.code + class Meta: + ordering = ["order"] + verbose_name = _("Color") + +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")) + description = models.TextField(blank=True, null=True) + 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_theme = models.ForeignKey(ColorTheme, verbose_name=_("Color theme"), + 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, color="#000"): + '''Return a GeoJSON string + ''' + if '#' not in color: + color = '#' + 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':'forms.TextInput', + 'L':'TextareaWidget', + 'P':'forms.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") + |