#!/usr/local/bin/python # -*- coding: utf-8 -*- from django.db import models from django.conf import settings from django.contrib.auth.models import User, Group from math import sqrt class GLatLng(models.Model): lat = models.DecimalField(max_digits=8, decimal_places=2, verbose_name='latitude') lon = models.DecimalField(max_digits=8, decimal_places=2, verbose_name='longitude') def distdeg(self, lat, lon): return sqrt((self.lat - lat)**2 + (self.lon - lon)**2) def js(self): return 'new GLatLng(%f,%f)' % (self.lat, self.lon) def __unicode__(self): return '%f , %f' % (self.lat, self.lon) class Meta: verbose_name = 'GLatLng' verbose_name_plural = 'GLatLng entities' class Admin: list_display = ('id', 'lat', 'lon') class GMap2(models.Model): name = models.CharField(max_length=100, verbose_name='name') center = models.ForeignKey(GLatLng, null=True, blank=True) zoom = models.IntegerField(default=13) dragging_enabled = models.BooleanField(default=True) infowindow_enabled = models.BooleanField(default=True) double_clickzoom_enabled = models.BooleanField(default=True) continuouszoom_enabled = models.BooleanField(default=False) googlebar_enabled = models.BooleanField(default=False) scrollwheelzoom_enabled = models.BooleanField(default=False) def init_js(self): code = '' if self.center: code = 'map.setCenter(new GLatLng(%f, %f), %d);' % (self.center.lat, self.center.lon, self.zoom) if not self.dragging_enabled: code +='\nmap.disableDragging();' if not self.infowindow_enabled: code +='\nmap.disableInfoWindow();' if not self.double_clickzoom_enabled: code +='\nmap.disableDoubleClickZoom();' if self.continuouszoom_enabled: code +='\nmap.enableContinuousZoom();' if self.googlebar_enabled: code +='\nmap.enableGoogleBar();' if self.scrollwheelzoom_enabled: code +='\nmap.enableScrollWheelZoom();' return code def __unicode__(self): return self.name class Meta: verbose_name = 'GMap2' verbose_name_plural = 'GMap2 entities' class Admin: list_display = ('name', 'center', 'zoom', 'dragging_enabled') class Layer(models.Model): map = models.ForeignKey(GMap2) name = models.CharField(max_length=100, verbose_name='name', null=True, blank=True) zorder = models.IntegerField(default=0) def __unicode__(self): return self.name class Admin: list_display = ('name', 'map') class Style(models.Model): name = models.CharField(max_length=100, verbose_name='name') opacity = models.SmallIntegerField(default=100, help_text='0:transparent 100:opaque') color = models.CharField(max_length=7, null=True, blank=True, help_text='#RRGGBB') class Meta: verbose_name = 'Style' class Admin: list_display = ('name', 'opacity', 'color',) class Overlay(models.Model): style = models.ForeignKey(Style, null=True, blank=True) def __unicode__(self): return str(self.id) class Projection(models.Model): overlay = models.ForeignKey(Overlay) layer = models.ForeignKey(Layer) class Admin: list_display = ('overlay', 'layer') class GPoly(models.Model): POLY_TYPES = ( ('p','polygon'), ('l','polyline'), ('d','direction'), ('c','circle'), ('r','r'), ) overlay = models.OneToOneField(Overlay) type = models.CharField(max_length=1, choices=POLY_TYPES) def __unicode__(self): return self.overlay.name class Meta: verbose_name = 'GPoly' verbose_name_plural = 'GPoly entities' class Admin: list_display = ('overlay', 'type',) class GIcon(models.Model): name = models.CharField(max_length=20, verbose_name='name') image = models.ImageField(upload_to='icons') sizex = models.SmallIntegerField(default=32) sizey = models.SmallIntegerField(default=32) anchorx = models.SmallIntegerField(default=16) anchory = models.SmallIntegerField(default=32) shadow_icon = models.ForeignKey('self', null=True, blank=True, related_name='shadow_parents') print_icon = models.ForeignKey('self', null=True, blank=True, related_name='print_parents') mozprint_icon = models.ForeignKey('self', null=True, blank=True, related_name='mozprint_parents') drag_cross_icon = models.ForeignKey('self', null=True, blank=True, related_name='drag_cross_parents') def display(self): return '' % self.get_image_url() display.allow_tags=True def js(self): code = 'var icon = new GIcon(G_DEFAULT_ICON);' code += 'icon.image = "%s";' % self.get_absolute_url() code += 'icon.iconSize = new GSize(%d, %d);' % (self.sizex, self.sizey) code += 'icon.iconAnchor = new GPoint(%d, %d);' % (self.anchorx, self.anchory) return code def __unicode__(self): return self.name class Meta: verbose_name = 'GIcon' verbose_name_plural = 'GIcon entities' class Admin: list_display = ('name', 'image', 'display') class GMarkerOptions(models.Model): title = models.CharField(max_length=100, verbose_name='title') icon = models.ForeignKey(GIcon, null=True, blank=True) clickable = models.BooleanField(default=False) draggable = models.BooleanField(default=False) bouncy = models.BooleanField(default=False) bounce_gravity = models.IntegerField(default=1) def image(self): if not self.icon: return 'no icon' return '' % self.icon.get_image_url() image.allow_tags=True def js(self): content = "" if self.icon: content += "icon:%s" % self.icon.image.get_absolute_url() code ='{%s}' % content return code def __unicode__(self): return self.title class Meta: verbose_name = 'GMarkerOptions' verbose_name_plural = 'GMarkerOptions entities' class Admin: list_display = ('title', 'image', 'clickable', 'draggable') class GMarker(models.Model): overlay = models.OneToOneField(Overlay) position = models.ForeignKey(GLatLng) options = models.ForeignKey(GMarkerOptions, null=True, blank=True) def image(self): if not self.options: return 'no icon' if not self.options.icon: return 'no icon' return '' % self.options.icon.get_image_url() image.allow_tags=True def js(self): code = 'marker = new GMarker(%s' % position.js() if self.options: code += ', %s' % self.options.js() code += ');' code += 'map.addOverlay(marker);' return code def __unicode__(self): return self.overlay.name class Meta: verbose_name = 'GMarker' verbose_name_plural = 'GMarker entities' class Admin: list_display = ('overlay', 'options', 'image') class PolyPoint(models.Model): position = models.ForeignKey(GLatLng, core=True) poly = models.ForeignKey(GPoly, edit_inline=True, num_in_admin=3, min_num_in_admin=1, num_extra_on_change=1) indice = models.IntegerField() class Meta: verbose_name = 'PolyPoint' verbose_name_plural = 'PolyPoint entities' class _Admin: list_display = ('poly', 'indice') class GDirection(models.Model): query = models.CharField(max_length=100, verbose_name='query', null=True, blank=True) start = models.ForeignKey(GLatLng, related_name='start_dirs', null=True, blank=True) end = models.ForeignKey(GLatLng, related_name='end_dirs', null=True, blank=True) polyline = models.ForeignKey(GPoly, null=True, blank=True) def __unicode__(self): return str(self.id) def js(self): return 'loadFromWaypoints([%s, %s], queryopts);' % (self.start.js(), self.end.js()) def get_icon_start(self): self.start.gmarker_set.all()[0].options.icon def get_icon_end(self): self.start.gmarker_set.all()[0].options.icon class Meta: verbose_name = 'GDirection' verbose_name_plural = 'GDirection entities' class Admin: list_display = ('id', 'query', 'start', 'end') class DirectionStep(models.Model): point = models.ForeignKey(GLatLng, core=True) direction = models.ForeignKey(GDirection, edit_inline=True, num_in_admin=1, min_num_in_admin=1, num_extra_on_change=1) indice = models.IntegerField() class Properties(models.Model): overlay = models.ForeignKey(Overlay) desc = models.CharField(max_length=100, verbose_name='description') user = models.ForeignKey(User, null=True, blank=True) date = models.DateTimeField(auto_now_add=True) class Meta: verbose_name = 'Properties entity' verbose_name_plural = 'Properties entities' class Admin: list_display = ('date', 'overlay', 'user')