Added phone in user profiles
authorJean-Michel Nirgal Vourgère <jmv@nirgal.com>
Fri, 30 Jul 2010 21:07:55 +0000 (21:07 +0000)
committerJean-Michel Nirgal Vourgère <jmv@nirgal.com>
Fri, 30 Jul 2010 21:07:55 +0000 (21:07 +0000)
Added source name in source definition file

bin/djais/models.py
bin/djais/views.py
bin/inputs/common.py
bin/inputs/config.py
bin/inputs/run.py

index df45c79a9feb8671d382804a512a3f816b628519..8209629215ec1d987bfcab5c85b94929cbdbcef8 100644 (file)
@@ -12,6 +12,7 @@ class User(models.Model):
     email = models.EmailField()
     father = models.ForeignKey('User')
     creation_datetime = models.DateTimeField(auto_now_add=True)
+    phone = models.CharField(max_length=20, blank=True)
     class Meta:
         db_table = u'user'
         ordering = ('id',)
index c07ee169a238d2d69108b4b4dd764bf19e413730..b62b50784b9b59d459de7150142c335ee699d25b 100644 (file)
@@ -2,6 +2,7 @@
 
 import os
 from datetime import *
+import re
 from time import time as get_timestamp
 import crack
 import struct
@@ -20,6 +21,7 @@ from ais.show_targets_ships import *
 from ais.common import Nmea, NmeaFeeder, strmmsi_to_mmsi, SHIP_TYPES, STATUS_CODES, AIS_STATUS_NOT_AVAILABLE, AIS_ROT_NOT_AVAILABLE, AIS_LATLON_SCALE, AIS_LON_NOT_AVAILABLE, AIS_LAT_NOT_AVAILABLE, AIS_COG_SCALE, AIS_COG_NOT_AVAILABLE, AIS_NO_HEADING, AIS_SOG_SCALE, AIS_SOG_NOT_AVAILABLE, AIS_SOG_MAX_SPEED, add_nmea1, add_nmea5_partial, load_fleet_to_uset
 from ais.ntools import datetime_to_timestamp, clean_ais_charset
 from ais.inputs.stats import STATS_DIR
+from ais.inputs.config import peers_get_config
 
 def auth(username, raw_password):
     try:
@@ -533,12 +535,15 @@ def users(request):
     else:
         return render_to_response('users.html', {'users':users}, RequestContext(request))
 
+phone_re = re.compile('^\\+.+')
 
 class UserEditForm(forms.Form):
     login = forms.RegexField(regex=r'^[a-zA-Z0-9_]+$', max_length=16,
         error_message ='Login must only contain letters, numbers and underscores')
     name = forms.CharField(max_length=50)
     email = forms.EmailField()
+    phone = forms.RegexField(regex='\\+.+', max_length=20, required=False,
+        error_message ='Phones must start with a \'+\'')
     def __init__(self, *args, **kargs):
         forms.Form.__init__(self, *args, **kargs)
         self.old_login = kargs['initial']['login']
@@ -568,12 +573,14 @@ def user_edit(request, login):
     initial['login'] = user.login
     initial['name'] = user.name
     initial['email'] = user.email
+    initial['phone'] = user.phone
     if request.method == 'POST':
         form = UserEditForm(request.POST, initial=initial)
         if form.is_valid():
             user.login = form.cleaned_data['login']
             user.name = form.cleaned_data['name']
             user.email = form.cleaned_data['email']
+            user.phone = form.cleaned_data['phone']
             user.save()
             return HttpResponseRedirect('/user/')
     else: # GET
@@ -642,7 +649,7 @@ def logout(request):
 
 @http_authenticate(auth, 'ais')
 def sources(request):
-    sources = ( 'NMMT', 'NMKT', 'NMRW', 'NMNZ', 'NMEZ', 'NMAS', 'NMAH', 'NMBB' )
+    #sources = ( 'NMMT', 'NMKT', 'NMRW', 'NMNZ', 'NMEZ', 'NMAS', 'NMAH', 'NMBB' )
     now = int(get_timestamp())
     periods = ({
         #'name_tiny': '2h',
@@ -666,33 +673,35 @@ def sources(request):
         'seconds': 90*24*60*60
         })
         
-    for source in sources:
+    sources = peers_get_config()
+    for id4, source in sources.iteritems():
+        source['id4'] = id4
         for period in periods:
-            args = os.path.join(STATS_DIR, source+'-'+period['name_tiny']+'-bytes.png'), \
+            args = os.path.join(STATS_DIR, id4+'-'+period['name_tiny']+'-bytes.png'), \
                 '--lazy', \
                 '-l', '0', \
-                '--title', source+' - Bandwidth usage - '+period['name_long'], \
-                '--start', '%d' % (now-period['seconds']), \
+                '--title', source['name'] + ' - Bandwidth usage - ' + period['name_long'], \
+                '--start', '%d' % (now - period['seconds']), \
                 '--end', '%d' % now, \
                 '--vertical-label', 'bps', \
-                'DEF:bytes=%s:bytes:AVERAGE' % os.path.join(STATS_DIR, source+'.rrd'), \
-                'DEF:rawbytes=%s:rawbytes:AVERAGE' % os.path.join(STATS_DIR, source+'.rrd'), \
+                'DEF:bytes=%s:bytes:AVERAGE' % os.path.join(STATS_DIR, id4+'.rrd'), \
+                'DEF:rawbytes=%s:rawbytes:AVERAGE' % os.path.join(STATS_DIR, id4+'.rrd'), \
                 'CDEF:bits=bytes,8,*', \
                 'CDEF:rawbits=rawbytes,8,*', \
                 'LINE:bits#00FF00:IP payload', \
                 'LINE:rawbits#FF0000:IP with headers'
             rrdtool.graph(*args)
-            args = os.path.join(STATS_DIR, source+'-'+period['name_tiny']+'-counts.png'), \
+            args = os.path.join(STATS_DIR, id4+'-'+period['name_tiny']+'-counts.png'), \
                 '--lazy', \
                 '-l', '0', \
-                '--title', source+' - Packet\'izer stats - '+period['name_long'], \
+                '--title', source['name'] + ' - Packet\'izer stats - ' + period['name_long'], \
                 '--start', '%d' % (now-period['seconds']), \
                 '--end', '%d' % now, \
                 '--vertical-label', 'Hz', \
-                'DEF:packets=%s:packets:AVERAGE' % os.path.join(STATS_DIR, source+'.rrd'), \
-                'DEF:lines=%s:lines:AVERAGE' % os.path.join(STATS_DIR, source+'.rrd'), \
+                'DEF:packets=%s:packets:AVERAGE' % os.path.join(STATS_DIR, id4+'.rrd'), \
+                'DEF:lines=%s:lines:AVERAGE' % os.path.join(STATS_DIR, id4+'.rrd'), \
                 'LINE:packets#FF0000:input packets', \
                 'LINE:lines#00FF00:AIVDM lines'
             rrdtool.graph(*args)
 
-    return render_to_response('sources.html', {'sources':sources, 'periods': periods}, RequestContext(request))
+    return render_to_response('sources.html', {'sources':sources.values(), 'periods': periods}, RequestContext(request))
index d9ba4567acf31e13512199da53e6d17d74bc8dd3..cad9c803b23223dcbb2b0690853b2f5b54ad70da 100644 (file)
@@ -6,10 +6,10 @@ AIS input basic functions
 __all__ = [
     'NMEA_DIR',
     'DEFAULT_MTU',
+    'SourceLogger',
     'Source', 
     'get_source_by_id4', 'refresh_all_stats',
-    'SourceLogger',
-    'ais_line_reader']
+    ]
 
 import os.path
 import logging
@@ -77,6 +77,7 @@ class Source:
         config_outpeers = sources_config[id4].get('out', ())
         self.outpeers = outpeers_from_config(config_outpeers)
         logging.info('Outpeers for %s: %s', id4, self.outpeers)
+        self.name = sources_config[id4].get('name', id4)
 
 def get_source_by_id4(id4):
     '''
@@ -92,5 +93,3 @@ def refresh_all_stats():
     '''
     for source in __all_sources__.itervalues():
         source.stats.refresh()
-    
-
index 1c4c6b59286c667fe875dcca064212ad64282dc8..9a8c868f538282a6d7c8dbf610f56f663c297f90 100644 (file)
@@ -36,20 +36,24 @@ def peers_get_config():
         assert len(spl)==3, \
             'line #%s: There should be exactaly 3 strings sepatated by spaces' % \
             lineno
-        id4, io, definition = line.split(' ')
+        id4, io, definition = spl
         assert len(id4)==4, 'source name (first parameter) must be 4 char long.'
-        assert io in ('in', 'out'), \
-            "line #%s: second parameter must be either 'in' or 'out'.\r%s" % \
-            (lineno, line)
         logging.debug('%s %s %s', id4, io, definition)
         if id4 not in SOURCES:
             SOURCES[id4] = {}
         if io == 'in':
             SOURCES[id4]['in'] = definition
-        else: # 'out'
+        elif io ==  'out':
             if not SOURCES[id4].has_key('out'):
                 SOURCES[id4]['out'] = []
             SOURCES[id4]['out'].append(definition)
+        elif io ==  'name':
+            SOURCES[id4]['name'] = definition
+        else:
+            raise AssertionError( \
+                "line #%s: second parameter must be either 'in' or 'out'.\r%s" % \
+                (lineno, line))
+
     logging.debug('SOURCES \n%s', pprint.pformat(SOURCES))
 
     logging.debug('SOURCES (raw):\n%s', pprint.pformat(SOURCES))
@@ -57,6 +61,8 @@ def peers_get_config():
         assert len(id4) == 4, \
             'Invalid ID %s in SOURCES. It should be 4 characters long.'
 
+        if 'name' not in settings:
+            settings['name'] =id4
         try:
             in_ = settings['in']
         except KeyError:
index 672559ef07f86d13e6b44f276c3a14676f9ed03b..f0994b6606f491ea368ce917024145ad672b6d77 100644 (file)
@@ -6,7 +6,7 @@ This is the main runner for AIS inputs.
 '''
 
 import sys
-import logging
+import logging, logging.handlers
 from select import select
 from time import time as get_timestamp
 
@@ -37,8 +37,14 @@ def main():
         loglevel = logging.DEBUG
     else:
         loglevel = logging.INFO
+
     logging.basicConfig(level=loglevel,
         format='%(asctime)s %(levelname)s %(message)s')
+    #rootlogger = logging.getLogger('')
+    #rootlogger.setLevel(loglevel)
+    #loghandler = logging.handlers.SysLogHandler()
+    #loghandler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s'))
+    #rootlogger.addHandler(loghandler)
     
     try:
         config = peers_get_config()