Improved error message when looking for an invalid mmsi number
[ais.git] / bin / djais / models.py
1 # -*- coding: utf-8 -*-
2
3 import os, os.path
4 from datetime import datetime
5 from django.db import models
6 from django.contrib.auth.models import get_hexdigest
7
8 from ais.common import Nmea, mmsi_to_strmmsi
9
10 class UserMessageCategory(models.Model):
11     id = models.CharField(max_length=10, primary_key=True)
12     class Meta:
13         db_table = u'user_message_category'
14
15 class UserMessage(models.Model):
16     id = models.AutoField(primary_key=True)
17     user = models.ForeignKey('User')
18     category = models.ForeignKey(UserMessageCategory, db_column='user_message_category_id')
19     txt = models.TextField()
20     class Meta:
21         db_table = u'user_message'
22
23 class User(models.Model):
24     id = models.AutoField(primary_key=True)
25     login = models.CharField(max_length=16, unique=True)
26     password_hash = models.CharField(max_length=75)
27     name = models.CharField(max_length=50)
28     email = models.EmailField()
29     father = models.ForeignKey('User')
30     creation_datetime = models.DateTimeField(auto_now_add=True)
31     phone = models.CharField(max_length=20, blank=True)
32     access_datetime = models.DateTimeField(blank=True, null=True)
33     class Meta:
34         db_table = u'user'
35         ordering = ('id',)
36
37     def __unicode__(self):
38         return self.login
39
40     def set_password(self, raw_password):
41         import random
42         algo = 'sha1'
43         salt = get_hexdigest(algo, str(random.random()), str(random.random()))[:5]
44         hsh = get_hexdigest(algo, salt, raw_password)
45         self.password_hash = '%s$%s$%s' % (algo, salt, hsh)
46         self.info('Password changed')
47
48     def check_password(self, raw_password):
49         algo, salt, hsh = self.password_hash.split('$')
50         return hsh == get_hexdigest(algo, salt, raw_password)
51
52
53     def update_access_datetime(self):
54         self.access_datetime = datetime.utcnow()
55         self.save()
56
57     def get_and_delete_messages(self):
58         return None
59
60     def is_admin_by(self, user_id):
61         if self.id == user_id:
62             return True
63         if self.father_id is None:
64             return False
65         return self.father.is_admin_by(user_id)
66
67     def get_messages(self):
68         messages = UserMessage.objects.filter(user__id = self.id)
69         messages_dict = \
70             [ {'category': message.category, \
71                'txt': message.txt} \
72             for message in messages \
73             ]
74         messages.delete()
75         return messages_dict
76     
77     def info(self, message, category_id='info'):
78         UserMessage(user_id = self.id, category_id=category_id, txt=message).save()
79
80
81 class Vessel(models.Model):
82     mmsi = models.IntegerField(primary_key=True)
83     name = models.CharField(max_length=20)
84     imo = models.IntegerField()
85     callsign = models.CharField(max_length=7)
86     type = models.IntegerField(default=0)
87     destination = models.CharField(max_length=20, blank=True, null=True)
88     updated = models.DateTimeField()
89     source = models.CharField(max_length=8)
90     dim_bow = models.IntegerField(default=0)
91     dim_stern = models.IntegerField(default=0)
92     dim_port = models.IntegerField(default=0)
93     dim_starboard = models.IntegerField(default=0)
94     eta = models.CharField(max_length=8, default='00002460') # format MMDDhhmm
95     class Meta:
96         db_table = u'vessel'
97     def __unicode__(self):
98         return unicode(self.mmsi) # FIXME
99     def get_last_nmea(self):
100         strmmsi = mmsi_to_strmmsi(self.mmsi)
101         return Nmea.new_from_lastinfo(strmmsi)
102
103 class Fleet(models.Model):
104     name = models.CharField(max_length=50, primary_key=True)
105     vessel = models.ManyToManyField(Vessel, through='FleetVessel')
106     description = models.TextField()
107     class Meta:
108         db_table = u'fleet'
109     def __unicode__(self):
110         return self.name
111     def vessel_count(self):
112         return FleetVessel.objects.filter(fleet=self.name).count()
113     def user_count(self):
114         return FleetUser.objects.filter(fleet=self.name).count()
115     def job_count(self):
116         if os.path.exists('/var/lib/ais/cron/fleets/%s.cron' % self.name):
117             return 1
118         else:
119             return 0
120
121 class FleetUser(models.Model):
122     id = models.AutoField(primary_key=True)
123     fleet = models.ForeignKey(Fleet, db_column='fleet', to_field='name')
124     user = models.ForeignKey(User)
125     class Meta:
126         db_table = u'fleet_user'
127
128 class FleetVessel(models.Model):
129     id = models.AutoField(primary_key=True)
130     fleet = models.ForeignKey(Fleet, db_column='fleet', to_field='name')
131     vessel = models.ForeignKey(Vessel, db_column='mmsi', to_field='mmsi')
132     class Meta:
133         db_table = u'fleet_vessel'
134     
135 ## manual input source
136 #class MiSource(models.Model):
137 #    id = models.IntegerField(primary_key=True)
138 #    userid = models.IntegerField()
139 #    name = models.TextField(unique=True)
140 #    class Meta:
141 #        db_table = u'mi_source'
142 #
143 ## manual input vessel
144 #class MiVessel(models.Model):
145 #    mmsi_txt = models.TextField(primary_key=True) # This field type is a guess.
146 #    class Meta:
147 #        db_table = u'mi_vessel'
148
149
150 # Plane plotter
151 #class Ppuser(models.Model):
152 #    usr = models.TextField(primary_key=True) # This field type is a guess.
153 #    lat = models.FloatField()
154 #    lon = models.FloatField()
155 #    class Meta:
156 #        db_table = u'ppuser'
157 #
158 #class Plane(models.Model):
159 #    flight = models.CharField(max_length=8)
160 #    reg = models.CharField(max_length=8)
161 #    ads = models.CharField(max_length=8)
162 #    type = models.CharField(max_length=4)
163 #    usr = models.TextField() # This field type is a guess.
164 #    updated = models.DateTimeField()
165 #    class Meta:
166 #        db_table = u'plane'
167
168
169
170 class News(models.Model):
171     id = models.AutoField(primary_key=True)
172     created = models.DateTimeField()
173     updated = models.DateTimeField()
174     title = models.TextField()
175     txt = models.TextField()
176     class Meta:
177         db_table = u'news'