source: src/django_gheat/gheat/models.py@ 9579

Last change on this file since 9579 was 9579, checked in by rick, 13 years ago

Map a SSID to an organization to play nice with differnt SSIDs.

File size: 4.1 KB
Line 
1from gheat import managers
2import datetime
3import binascii
4import hashlib
5
6from django.core import validators
7from django.db import models
8from django.dispatch import receiver
9from django.utils.encoding import smart_unicode
10from django.utils.translation import ugettext_lazy as _
11
12class BinaryField(models.Field):
13 MAGIC = '###MAGIC###'
14 description = _('Binary object using base64 (up to %(max_length)s)')
15
16 __metaclass__ = models.SubfieldBase
17
18 def __init__(self, *args, **kwargs):
19 # base64 roughly max the binary size with with 4 times
20 kwargs['max_length'] = kwargs['max_length'] * 4 + len(self.MAGIC)
21 super(BinaryField, self).__init__(*args, **kwargs)
22 self.validators.append(validators.MaxLengthValidator(self.max_length))
23
24 def to_python(self,value):
25 if value.startswith(self.MAGIC):
26 return binascii.a2b_base64(value[len(self.MAGIC):])
27 else:
28 return value
29
30 def get_db_prep_value(self, value, connection, prepared=False):
31 target = self.MAGIC + binascii.b2a_base64(value)
32 if len(target) > self.max_length:
33 raise ValueError(len(target))
34 return target
35
36 def get_prep_lookup(self, lookup_type, value):
37 raise TypeError('Lookup type %r not supported.' % lookup_type)
38
39 def get_internal_type(self):
40 return 'TextField'
41
42class TileCache(models.Model):
43 key = models.CharField(max_length=34,unique=True)
44 data = BinaryField(max_length=10000)
45 creation_time = models.DateTimeField(auto_now_add=True)
46
47 def __unicode__(self):
48 return self.key
49
50 @staticmethod
51 def make_key(source):
52 return hashlib.md5(source).hexdigest()
53
54class WirelessClient(models.Model):
55 mac = models.CharField(max_length=17, unique=True)
56 def __unicode__(self):
57 return self.mac
58
59
60ORGANIZATION_CHOICES = (
61 ('WirelessLeiden', 'Wireless Leiden'),
62)
63
64class Accespoint(models.Model):
65 mac = models.CharField(max_length=17)
66 ssid = models.CharField(max_length=64)
67 organization = models.CharField(max_length="50",choices=ORGANIZATION_CHOICES,null=True,blank=True)
68 encryptie = models.BooleanField()
69 class Meta:
70 unique_together = ('mac', 'ssid')
71 def __unicode__(self):
72 return "%s - %s" % (self.mac, self.ssid)
73
74 @staticmethod
75 def get_organization(ssid):
76 """ Try to determine the organization via the SSID """
77 organization = ''
78 if ssid.startswith('ap') and ssid.endswith('wleiden.net'):
79 organization = 'WirelessLeiden'
80 elif ssid.startswith('ap') and 'WirelessLeiden' in ssid:
81 organization = 'WirelessLeiden'
82 return organization
83
84 def save(self, *args, **kwargs):
85 self.organization = self.get_organization(self.ssid)
86 super(Accespoint, self).save(*args, **kwargs)
87
88class Gebruiker(models.Model):
89 naam = models.CharField(max_length=64)
90 email = models.CharField(max_length=64)
91 def __unicode__(self):
92 return "%s - %s" % (self.naam, self.email)
93
94class Apparatuur(models.Model):
95 antenne = models.CharField(max_length=64)
96 kaart = models.CharField(max_length=64)
97 def __unicode__(self):
98 return "%s - %s" % (self.antenne, self.kaart)
99
100class MeetRondje(models.Model):
101 datum = models.DateTimeField(blank=True,null=True)
102 naam = models.CharField(max_length=64)
103 gebruiker = models.ForeignKey(Gebruiker)
104 apparatuur = models.ForeignKey(Apparatuur)
105 def __unicode__(self):
106 return "%s - %s" % (self.gebruiker.naam, self.naam)
107
108class MeetBestand(models.Model):
109 meetrondje = models.ForeignKey(MeetRondje)
110 bestand = models.FileField(upload_to='meet-bestand/%Y/%m/%d')
111
112
113class Meting(models.Model):
114 meetrondje = models.ForeignKey(MeetRondje)
115 accespoint = models.ForeignKey(Accespoint)
116 latitude = models.FloatField(name='Latitude', db_column='lat')
117 longitude = models.FloatField(name='Longitude', db_column='lng')
118 signaal = models.IntegerField(max_length=3)
119 objects = managers.MetingManager()
120 def __unicode__(self):
121 return "%s @ %.5f,%.5f : %s" % (self.accespoint.ssid, float(self.latitude), float(self.longitude), self.signaal)
122 class Meta:
123 # This implies that you cannot have multiple messurements on the same
124 # location for a single 'run', thus the data needs cleaned before to make
125 # this properly hold.
126 unique_together = ('meetrondje', 'accespoint', 'latitude', 'longitude'),
Note: See TracBrowser for help on using the repository browser.