Added eta field to postgres
[ais.git] / bin / djais / models.py
1 # -*- coding: utf-8 -*-
2
3 from datetime import datetime
4 from django.db import models
5 from django.contrib.auth.models import get_hexdigest
6
7 from ais.common import Nmea, mmsi_to_strmmsi
8
9 class UserMessageCategory(models.Model):
10     id = models.CharField(max_length=10, primary_key=True)
11     class Meta:
12         db_table = u'user_message_category'
13
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()
19     class Meta:
20         db_table = u'user_message'
21
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)
32     class Meta:
33         db_table = u'user'
34         ordering = ('id',)
35
36     def __unicode__(self):
37         return self.login
38
39     def set_password(self, raw_password):
40         import random
41         algo = 'sha1'
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')
46
47     def check_password(self, raw_password):
48         algo, salt, hsh = self.password_hash.split('$')
49         return hsh == get_hexdigest(algo, salt, raw_password)
50
51
52     def update_access_datetime(self):
53         self.access_datetime = datetime.utcnow()
54         self.save()
55
56     def get_and_delete_messages(self):
57         return None
58
59     def is_admin_by(self, user_id):
60         if self.id == user_id:
61             return True
62         if self.father_id is None:
63             return False
64         return self.father.is_admin_by(user_id)
65
66     def get_messages(self):
67         messages = UserMessage.objects.filter(user__id = self.id)
68         messages_dict = \
69             [ {'category': message.category, \
70                'txt': message.txt} \
71             for message in messages \
72             ]
73         messages.delete()
74         return messages_dict
75     
76     def info(self, message):
77         UserMessage(user_id = self.id, category_id='info', txt=message).save()
78
79
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
94     class Meta:
95         db_table = u'vessel'
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)
101
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()
106     class Meta:
107         db_table = u'fleet'
108     def __unicode__(self):
109         return self.name
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()
114
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)
119     class Meta:
120         db_table = u'fleet_user'
121
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')
126     class Meta:
127         db_table = u'fleet_vessel'
128     
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)
134 #    class Meta:
135 #        db_table = u'mi_source'
136 #
137 ## manual input vessel
138 #class MiVessel(models.Model):
139 #    mmsi_txt = models.TextField(primary_key=True) # This field type is a guess.
140 #    class Meta:
141 #        db_table = u'mi_vessel'
142
143
144 # Plane plotter
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()
149 #    class Meta:
150 #        db_table = u'ppuser'
151 #
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()
159 #    class Meta:
160 #        db_table = u'plane'
161
162
163
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()
170     class Meta:
171         db_table = u'news'