New message table
authorJean-Michel Nirgal Vourgère <jmv@nirgal.com>
Fri, 6 Aug 2010 19:14:56 +0000 (19:14 +0000)
committerJean-Michel Nirgal Vourgère <jmv@nirgal.com>
Fri, 6 Aug 2010 19:14:56 +0000 (19:14 +0000)
User messages for user add/delete

bin/djais/models.py
bin/djais/views.py
html_templates/base.html
html_templates/user_delete.html
structure.sql
www/global.css

index a1e5b638762b27a769efab7d364fbba48ff69e44..e88b1268a4d77f4ba7042636c3c2fa256d458294 100644 (file)
@@ -4,6 +4,19 @@ from django.contrib.auth.models import get_hexdigest
 
 from ais.common import Nmea, mmsi_to_strmmsi
 
 
 from ais.common import Nmea, mmsi_to_strmmsi
 
+class UserMessageCategory(models.Model):
+    id = models.CharField(max_length=10, primary_key=True)
+    class Meta:
+        db_table = u'user_message_category'
+
+class UserMessage(models.Model):
+    id = models.AutoField(primary_key=True)
+    user = models.ForeignKey('User')
+    category = models.ForeignKey(UserMessageCategory, db_column='user_message_category_id')
+    txt = models.TextField()
+    class Meta:
+        db_table = u'user_message'
+
 class User(models.Model):
     id = models.AutoField(primary_key=True)
     login = models.CharField(max_length=16, unique=True)
 class User(models.Model):
     id = models.AutoField(primary_key=True)
     login = models.CharField(max_length=16, unique=True)
@@ -26,6 +39,7 @@ class User(models.Model):
         salt = get_hexdigest(algo, str(random.random()), str(random.random()))[:5]
         hsh = get_hexdigest(algo, salt, raw_password)
         self.password_hash = '%s$%s$%s' % (algo, salt, hsh)
         salt = get_hexdigest(algo, str(random.random()), str(random.random()))[:5]
         hsh = get_hexdigest(algo, salt, raw_password)
         self.password_hash = '%s$%s$%s' % (algo, salt, hsh)
+        self.info('Password changed')
 
     def check_password(self, raw_password):
         algo, salt, hsh = self.password_hash.split('$')
 
     def check_password(self, raw_password):
         algo, salt, hsh = self.password_hash.split('$')
@@ -41,6 +55,20 @@ class User(models.Model):
             return False
         return self.father.is_admin_by(user_id)
 
             return False
         return self.father.is_admin_by(user_id)
 
+    def get_messages(self):
+        messages = UserMessage.objects.filter(user__id = self.id)
+        messages_dict = \
+            [ {'category': message.category, \
+               'txt': message.txt} \
+            for message in messages \
+            ]
+        messages.delete()
+        return messages_dict
+    
+    def info(self, message):
+        UserMessage(user_id = self.id, category_id='info', txt=message).save()
+
+
 class Vessel(models.Model):
     mmsi = models.IntegerField(primary_key=True)
     name = models.CharField(max_length=20)
 class Vessel(models.Model):
     mmsi = models.IntegerField(primary_key=True)
     name = models.CharField(max_length=20)
index 97d0b347563540b867cf4e043e0f343676f06331..268cc45ab5db12bb9a9cc170958365b8b530c88d 100644 (file)
@@ -490,12 +490,14 @@ def fleet_users(request, fleetname):
                     message = u'User %s already has access.' % user.login
                 except FleetUser.DoesNotExist:
                     FleetUser(fleet=fleet, user=user).save()
                     message = u'User %s already has access.' % user.login
                 except FleetUser.DoesNotExist:
                     FleetUser(fleet=fleet, user=user).save()
-                    message = u'Granted access to user %s.' % user.login
+                    #TODO log
+                    request.user.info(u'Granted access to user %s.' % user.login)
             elif action == u'revoke':
                 try:
                     fu = FleetUser.objects.get(fleet=fleet, user=user)
                     fu.delete()
             elif action == u'revoke':
                 try:
                     fu = FleetUser.objects.get(fleet=fleet, user=user)
                     fu.delete()
-                    message = u'Revoked access to user %s.' % user.login
+                    #TODO log
+                    request.user.info(u'Revoked access to user %s.' % user.login)
                 except FleetUser.DoesNotExist:
                     message = u'User %s didn\'t have access.' % user.login
             else:
                 except FleetUser.DoesNotExist:
                     message = u'User %s didn\'t have access.' % user.login
             else:
index 5c4bf974cdb2368d41f2315b45be7b527825c28a..865b5b451ecbf3d3415c0a144bb9cec6dce28cc7 100644 (file)
 {% block breadcrumbs %}
 You are here: <a href='/'>home</a>
 {% endblock %}
 {% block breadcrumbs %}
 You are here: <a href='/'>home</a>
 {% endblock %}
+
+
 <div style="padding:1ex;">
 <div style="padding:1ex;">
-{% block content %}{% endblock %}
-</div>
+    {% for message in user.get_messages %}
+        <div class=message>
+        {{ message.category.id }}: {{ message.txt }}
+        </div>
+    {% endfor %}
+    {% block content %}{% endblock %}
+    </div>
 </div>
 
 <div id=footer>
 </div>
 
 <div id=footer>
index ded0681911071f5cf30049f415c711ef322d33cc..727bdaf31919928b2d4d0d763028aaffcfe55135 100644 (file)
@@ -8,8 +8,8 @@
 {% block content %}
 <h3>Delete user acccount {{ auser.name }}</h3>
 You are about to delete acount {{ auser.name }}. <br>
 {% block content %}
 <h3>Delete user acccount {{ auser.name }}</h3>
 You are about to delete acount {{ auser.name }}. <br>
-This will also delete sub-accounts.<br>
+<b>This will also delete sub-accounts.</b><br>
 Are you sure?<br>
 Are you sure?<br>
-<a href="?confirm=yes">Yes, delete it</a><br>
+<a href="?confirm=yes" class=button>Yes, delete it</a><br>
 
 {% endblock %}
 
 {% endblock %}
index b2c27f1d34b5f7b731515c00e816d7dfed1d397b..a5bc93733957af1f9627eecb2694d860272f8ce1 100644 (file)
@@ -132,6 +132,37 @@ CREATE TABLE mi_vessel (
 );
 
 
 );
 
 
+--
+-- Name: news; Type: TABLE; Schema: public; Owner: -; Tablespace: 
+--
+
+CREATE TABLE news (
+    id integer NOT NULL,
+    updated timestamp without time zone DEFAULT now() NOT NULL,
+    title text NOT NULL,
+    txt text NOT NULL,
+    created timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: news_id_seq; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE news_id_seq
+    INCREMENT BY 1
+    NO MAXVALUE
+    NO MINVALUE
+    CACHE 1;
+
+
+--
+-- Name: news_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
+--
+
+ALTER SEQUENCE news_id_seq OWNED BY news.id;
+
+
 --
 -- Name: plane; Type: TABLE; Schema: public; Owner: -; Tablespace: 
 --
 --
 -- Name: plane; Type: TABLE; Schema: public; Owner: -; Tablespace: 
 --
@@ -169,7 +200,8 @@ CREATE TABLE "user" (
     id integer NOT NULL,
     father_id integer,
     creation_datetime timestamp without time zone DEFAULT now() NOT NULL,
     id integer NOT NULL,
     father_id integer,
     creation_datetime timestamp without time zone DEFAULT now() NOT NULL,
-    phone character varying(20) DEFAULT ''::character varying NOT NULL
+    phone character varying(20) DEFAULT ''::character varying NOT NULL,
+    access_datetime timestamp without time zone
 );
 
 
 );
 
 
@@ -191,6 +223,45 @@ CREATE SEQUENCE user_id_seq
 ALTER SEQUENCE user_id_seq OWNED BY "user".id;
 
 
 ALTER SEQUENCE user_id_seq OWNED BY "user".id;
 
 
+--
+-- Name: user_message; Type: TABLE; Schema: public; Owner: -; Tablespace: 
+--
+
+CREATE TABLE user_message (
+    id integer NOT NULL,
+    user_id integer NOT NULL,
+    user_message_category_id character varying(10) NOT NULL,
+    txt text DEFAULT ''::text NOT NULL
+);
+
+
+--
+-- Name: user_message_category; Type: TABLE; Schema: public; Owner: -; Tablespace: 
+--
+
+CREATE TABLE user_message_category (
+    id character varying(10) NOT NULL
+);
+
+
+--
+-- Name: user_message_id_seq; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE user_message_id_seq
+    INCREMENT BY 1
+    NO MAXVALUE
+    NO MINVALUE
+    CACHE 1;
+
+
+--
+-- Name: user_message_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
+--
+
+ALTER SEQUENCE user_message_id_seq OWNED BY user_message.id;
+
+
 --
 -- Name: vessel; Type: TABLE; Schema: public; Owner: -; Tablespace: 
 --
 --
 -- Name: vessel; Type: TABLE; Schema: public; Owner: -; Tablespace: 
 --
@@ -228,6 +299,13 @@ ALTER TABLE fleet_vessel ALTER COLUMN id SET DEFAULT nextval('fleet_vessel_id_se
 ALTER TABLE mi_source ALTER COLUMN id SET DEFAULT nextval('mi_source_id_seq'::regclass);
 
 
 ALTER TABLE mi_source ALTER COLUMN id SET DEFAULT nextval('mi_source_id_seq'::regclass);
 
 
+--
+-- Name: id; Type: DEFAULT; Schema: public; Owner: -
+--
+
+ALTER TABLE news ALTER COLUMN id SET DEFAULT nextval('news_id_seq'::regclass);
+
+
 --
 -- Name: id; Type: DEFAULT; Schema: public; Owner: -
 --
 --
 -- Name: id; Type: DEFAULT; Schema: public; Owner: -
 --
@@ -235,6 +313,13 @@ ALTER TABLE mi_source ALTER COLUMN id SET DEFAULT nextval('mi_source_id_seq'::re
 ALTER TABLE "user" ALTER COLUMN id SET DEFAULT nextval('user_id_seq'::regclass);
 
 
 ALTER TABLE "user" ALTER COLUMN id SET DEFAULT nextval('user_id_seq'::regclass);
 
 
+--
+-- Name: id; Type: DEFAULT; Schema: public; Owner: -
+--
+
+ALTER TABLE user_message ALTER COLUMN id SET DEFAULT nextval('user_message_id_seq'::regclass);
+
+
 --
 -- Name: fleet_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: 
 --
 --
 -- Name: fleet_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: 
 --
@@ -323,6 +408,22 @@ ALTER TABLE ONLY "user"
     ADD CONSTRAINT user_login_unique UNIQUE (login);
 
 
     ADD CONSTRAINT user_login_unique UNIQUE (login);
 
 
+--
+-- Name: user_message_category_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: 
+--
+
+ALTER TABLE ONLY user_message_category
+    ADD CONSTRAINT user_message_category_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: user_message_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: 
+--
+
+ALTER TABLE ONLY user_message
+    ADD CONSTRAINT user_message_pkey PRIMARY KEY (id);
+
+
 --
 -- Name: user_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: 
 --
 --
 -- Name: user_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: 
 --
@@ -339,6 +440,13 @@ ALTER TABLE ONLY vessel
     ADD CONSTRAINT vessel_pkey PRIMARY KEY (mmsi);
 
 
     ADD CONSTRAINT vessel_pkey PRIMARY KEY (mmsi);
 
 
+--
+-- Name: user_message_user_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: 
+--
+
+CREATE INDEX user_message_user_idx ON user_message USING btree (user_id);
+
+
 --
 -- Name: fleet_user_fleet_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
 --
 --
 -- Name: fleet_user_fleet_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
 --
@@ -379,6 +487,22 @@ ALTER TABLE ONLY "user"
     ADD CONSTRAINT user_father_id_fkey FOREIGN KEY (father_id) REFERENCES "user"(id);
 
 
     ADD CONSTRAINT user_father_id_fkey FOREIGN KEY (father_id) REFERENCES "user"(id);
 
 
+--
+-- Name: user_message_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY user_message
+    ADD CONSTRAINT user_message_user_id_fkey FOREIGN KEY (user_message_category_id) REFERENCES user_message_category(id) ON UPDATE CASCADE ON DELETE CASCADE;
+
+
+--
+-- Name: user_message_user_message_category_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY user_message
+    ADD CONSTRAINT user_message_user_message_category_id_fkey FOREIGN KEY (user_message_category_id) REFERENCES user_message_category(id) ON UPDATE CASCADE ON DELETE CASCADE;
+
+
 --
 -- PostgreSQL database dump complete
 --
 --
 -- PostgreSQL database dump complete
 --
index 32757f2f687d67a5a1e9ad0a1e300e93dcd48ab3..ee61f9abd6e211bcf4f3a2fbb067860d6079ddde 100644 (file)
@@ -105,3 +105,11 @@ ul.errorlist {
 ul.errorlist li {
     list-style-image: url('/errorbullet.png');
 }
 ul.errorlist li {
     list-style-image: url('/errorbullet.png');
 }
+
+div.message {
+    background:#ffffd0;
+    border: 1px solid yellow;
+    -moz-border-radius: 3px;
+    -webkit-border-radius: 3px;
+    padding: 0.5ex;
+}