1 # -*- coding: utf-8 -*-
3 from datetime import datetime
4 from django.db import models
5 from django.contrib.auth.models import get_hexdigest
7 from ais.common import Nmea, mmsi_to_strmmsi
9 class UserMessageCategory(models.Model):
10 id = models.CharField(max_length=10, primary_key=True)
12 db_table = u'user_message_category'
14 class UserMessage(models.Model):
15 id = models.AutoField(primary_key=True)
16 user = models.ForeignKey('User')
17 category = models.ForeignKey(UserMessageCategory, db_column='user_message_category_id')
18 txt = models.TextField()
20 db_table = u'user_message'
22 class User(models.Model):
23 id = models.AutoField(primary_key=True)
24 login = models.CharField(max_length=16, unique=True)
25 password_hash = models.CharField(max_length=75)
26 name = models.CharField(max_length=50)
27 email = models.EmailField()
28 father = models.ForeignKey('User')
29 creation_datetime = models.DateTimeField(auto_now_add=True)
30 phone = models.CharField(max_length=20, blank=True)
31 access_datetime = models.DateTimeField(blank=True, null=True)
36 def __unicode__(self):
39 def set_password(self, raw_password):
42 salt = get_hexdigest(algo, str(random.random()), str(random.random()))[:5]
43 hsh = get_hexdigest(algo, salt, raw_password)
44 self.password_hash = '%s$%s$%s' % (algo, salt, hsh)
45 self.info('Password changed')
47 def check_password(self, raw_password):
48 algo, salt, hsh = self.password_hash.split('$')
49 return hsh == get_hexdigest(algo, salt, raw_password)
52 def update_access_datetime(self):
53 self.access_datetime = datetime.utcnow()
56 def get_and_delete_messages(self):
59 def is_admin_by(self, user_id):
60 if self.id == user_id:
62 if self.father_id is None:
64 return self.father.is_admin_by(user_id)
66 def get_messages(self):
67 messages = UserMessage.objects.filter(user__id = self.id)
69 [ {'category': message.category, \
71 for message in messages \
76 def info(self, message):
77 UserMessage(user_id = self.id, category_id='info', txt=message).save()
80 class Vessel(models.Model):
81 mmsi = models.IntegerField(primary_key=True)
82 name = models.CharField(max_length=20)
83 imo = models.IntegerField()
84 callsign = models.CharField(max_length=7)
85 type = models.IntegerField()
86 destination = models.CharField(max_length=20, blank=True, null=True)
87 updated = models.DateTimeField()
88 source = models.CharField(max_length=8)
89 dim_bow = models.IntegerField(default=0)
90 dim_stern = models.IntegerField(default=0)
91 dim_port = models.IntegerField(default=0)
92 dim_starboard = models.IntegerField(default=0)
93 eta = models.CharField(max_length=8, default='00002460') # format MMDDhhmm
96 def __unicode__(self):
97 return unicode(self.mmsi) # FIXME
98 def get_last_nmea(self):
99 strmmsi = mmsi_to_strmmsi(self.mmsi)
100 return Nmea.new_from_lastinfo(strmmsi)
102 class Fleet(models.Model):
103 name = models.CharField(max_length=50, primary_key=True)
104 vessel = models.ManyToManyField(Vessel, through='FleetVessel')
105 description = models.TextField()
108 def __unicode__(self):
110 def vessel_count(self):
111 return FleetVessel.objects.filter(fleet=self.name).count()
112 def user_count(self):
113 return FleetUser.objects.filter(fleet=self.name).count()
115 class FleetUser(models.Model):
116 id = models.AutoField(primary_key=True)
117 fleet = models.ForeignKey(Fleet, db_column='fleet', to_field='name')
118 user = models.ForeignKey(User)
120 db_table = u'fleet_user'
122 class FleetVessel(models.Model):
123 id = models.AutoField(primary_key=True)
124 fleet = models.ForeignKey(Fleet, db_column='fleet', to_field='name')
125 vessel = models.ForeignKey(Vessel, db_column='mmsi', to_field='mmsi')
127 db_table = u'fleet_vessel'
129 ## manual input source
130 #class MiSource(models.Model):
131 # id = models.IntegerField(primary_key=True)
132 # userid = models.IntegerField()
133 # name = models.TextField(unique=True)
135 # db_table = u'mi_source'
137 ## manual input vessel
138 #class MiVessel(models.Model):
139 # mmsi_txt = models.TextField(primary_key=True) # This field type is a guess.
141 # db_table = u'mi_vessel'
145 #class Ppuser(models.Model):
146 # usr = models.TextField(primary_key=True) # This field type is a guess.
147 # lat = models.FloatField()
148 # lon = models.FloatField()
150 # db_table = u'ppuser'
152 #class Plane(models.Model):
153 # flight = models.CharField(max_length=8)
154 # reg = models.CharField(max_length=8)
155 # ads = models.CharField(max_length=8)
156 # type = models.CharField(max_length=4)
157 # usr = models.TextField() # This field type is a guess.
158 # updated = models.DateTimeField()
160 # db_table = u'plane'
164 class News(models.Model):
165 id = models.AutoField(primary_key=True)
166 created = models.DateTimeField()
167 updated = models.DateTimeField()
168 title = models.TextField()
169 txt = models.TextField()