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