a1e5b638762b27a769efab7d364fbba48ff69e44
[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 User(models.Model):
8     id = models.AutoField(primary_key=True)
9     login = models.CharField(max_length=16, unique=True)
10     password_hash = models.CharField(max_length=75)
11     name = models.CharField(max_length=50)
12     email = models.EmailField()
13     father = models.ForeignKey('User')
14     creation_datetime = models.DateTimeField(auto_now_add=True)
15     phone = models.CharField(max_length=20, blank=True)
16     class Meta:
17         db_table = u'user'
18         ordering = ('id',)
19
20     def __unicode__(self):
21         return self.login
22
23     def set_password(self, raw_password):
24         import random
25         algo = 'sha1'
26         salt = get_hexdigest(algo, str(random.random()), str(random.random()))[:5]
27         hsh = get_hexdigest(algo, salt, raw_password)
28         self.password_hash = '%s$%s$%s' % (algo, salt, hsh)
29
30     def check_password(self, raw_password):
31         algo, salt, hsh = self.password_hash.split('$')
32         return hsh == get_hexdigest(algo, salt, raw_password)
33
34     def get_and_delete_messages(self):
35         return None
36
37     def is_admin_by(self, user_id):
38         if self.id == user_id:
39             return True
40         if self.father_id is None:
41             return False
42         return self.father.is_admin_by(user_id)
43
44 class Vessel(models.Model):
45     mmsi = models.IntegerField(primary_key=True)
46     name = models.CharField(max_length=20)
47     imo = models.IntegerField()
48     callsign = models.CharField(max_length=7)
49     type = models.IntegerField()
50     destination = models.CharField(max_length=20)
51     updated = models.DateTimeField()
52     source = models.CharField(max_length=8)
53     class Meta:
54         db_table = u'vessel'
55     def __unicode__(self):
56         return unicode(self.mmsi) # FIXME
57     def get_last_nmea(self):
58         strmmsi = mmsi_to_strmmsi(self.mmsi)
59         return Nmea.new_from_lastinfo(strmmsi)
60
61 class Fleet(models.Model):
62     name = models.CharField(max_length=50, primary_key=True)
63     vessel = models.ManyToManyField(Vessel, through='FleetVessel')
64     description = models.TextField()
65     class Meta:
66         db_table = u'fleet'
67     def __unicode__(self):
68         return self.name
69     def vessel_count(self):
70         return FleetVessel.objects.filter(fleet=self.name).count()
71     def user_count(self):
72         return FleetUser.objects.filter(fleet=self.name).count()
73
74 class FleetUser(models.Model):
75     id = models.AutoField(primary_key=True)
76     fleet = models.ForeignKey(Fleet, db_column='fleet', to_field='name')
77     user = models.ForeignKey(User)
78     class Meta:
79         db_table = u'fleet_user'
80
81 class FleetVessel(models.Model):
82     id = models.AutoField(primary_key=True)
83     fleet = models.ForeignKey(Fleet, db_column='fleet', to_field='name')
84     vessel = models.ForeignKey(Vessel, db_column='mmsi', to_field='mmsi')
85     class Meta:
86         db_table = u'fleet_vessel'
87     
88 ## manual input source
89 #class MiSource(models.Model):
90 #    id = models.IntegerField(primary_key=True)
91 #    userid = models.IntegerField()
92 #    name = models.TextField(unique=True)
93 #    class Meta:
94 #        db_table = u'mi_source'
95 #
96 ## manual input vessel
97 #class MiVessel(models.Model):
98 #    mmsi_txt = models.TextField(primary_key=True) # This field type is a guess.
99 #    class Meta:
100 #        db_table = u'mi_vessel'
101
102
103 # Plane plotter
104 #class Ppuser(models.Model):
105 #    usr = models.TextField(primary_key=True) # This field type is a guess.
106 #    lat = models.FloatField()
107 #    lon = models.FloatField()
108 #    class Meta:
109 #        db_table = u'ppuser'
110 #
111 #class Plane(models.Model):
112 #    flight = models.CharField(max_length=8)
113 #    reg = models.CharField(max_length=8)
114 #    ads = models.CharField(max_length=8)
115 #    type = models.CharField(max_length=4)
116 #    usr = models.TextField() # This field type is a guess.
117 #    updated = models.DateTimeField()
118 #    class Meta:
119 #        db_table = u'plane'
120
121
122
123 class News(models.Model):
124     id = models.AutoField(primary_key=True)
125     created = models.DateTimeField()
126     updated = models.DateTimeField()
127     title = models.TextField()
128     txt = models.TextField()
129     class Meta:
130         db_table = u'news'