Nouvelle version de Gcast pour le serveur ToIP sous Wheezy.
authorDarko Stanar <darko.stanar@auf.org>
Thu, 10 Nov 2016 22:48:33 +0000 (17:48 -0500)
committerDarko Stanar <darko.stanar@auf.org>
Thu, 10 Nov 2016 22:48:33 +0000 (17:48 -0500)
README [deleted file]
auf_montreal_asterisk_users2/.gitignore [new file with mode: 0644]
auf_montreal_asterisk_users2/__init__.py [new file with mode: 0644]
auf_montreal_asterisk_users2/gcast/__init__.py [new file with mode: 0644]
auf_montreal_asterisk_users2/gcast/admin.py [new file with mode: 0644]
auf_montreal_asterisk_users2/gcast/models.py [new file with mode: 0644]
auf_montreal_asterisk_users2/gcast/views.py [new file with mode: 0644]
auf_montreal_asterisk_users2/manage.py [new file with mode: 0644]
auf_montreal_asterisk_users2/requirements.txt [new file with mode: 0644]
auf_montreal_asterisk_users2/settings.py [new file with mode: 0644]
auf_montreal_asterisk_users2/urls.py [new file with mode: 0644]

diff --git a/README b/README
deleted file mode 100644 (file)
index 41b8e06..0000000
--- a/README
+++ /dev/null
@@ -1,9 +0,0 @@
-1. A ajouter dans apache :
-
-       WSGIScriptAlias / ...[chemin-de-l'appli].../project/wsgi.py
-       Alias /admin_media/ /usr/share/pyshared/django/contrib/admin/media/
-
-2. dans le répertoire 'project', faire 'cp conf.py.edit conf.py' et renseigner les données de connexion à la BdD
-
-3. mise en place (dans le répertoire project):
-       :~$ python manage.py syncdb
diff --git a/auf_montreal_asterisk_users2/.gitignore b/auf_montreal_asterisk_users2/.gitignore
new file mode 100644 (file)
index 0000000..8e8af3f
--- /dev/null
@@ -0,0 +1,30 @@
+# binaires
+*.pyc
+*.pyo
+
+# Fichier temporaires:
+.*.swp
+*~
+\#*#
+src/*
+
+# DB de dev
+*.db
+
+# restants de merge
+*.orig
+*.rej
+
+# Configuration du projet - par environnement
+conf.py
+django.wsgi
+
+# buildout
+.installed.cfg
+bin
+develop-eggs
+downloads
+eggs
+log
+parts
+tmp
diff --git a/auf_montreal_asterisk_users2/__init__.py b/auf_montreal_asterisk_users2/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/auf_montreal_asterisk_users2/gcast/__init__.py b/auf_montreal_asterisk_users2/gcast/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/auf_montreal_asterisk_users2/gcast/admin.py b/auf_montreal_asterisk_users2/gcast/admin.py
new file mode 100644 (file)
index 0000000..0e2e7b6
--- /dev/null
@@ -0,0 +1,26 @@
+# -*- encoding: utf-8 -*-
+
+import sys
+from django.contrib import admin
+from models import Compte
+
+class CompteAdmin(admin.ModelAdmin):
+
+    class Meta:
+        model = Compte
+
+    search_fields = ('exten', )
+    fields = ['exten', 'categorie', 'nat', 'fullname', 'email', 'bureau', 'status' ]
+    list_display = ('exten', 'fullname', 'calcul_cidname', 'email', 'categorie', 'secret', 'voicemailcode', 'nat', 'bureau', 'pavillon', 'status')
+    list_filter = ['categorie']
+    list_search = (['exten', 'fullname'])
+    list_per_page = sys.maxint
+
+    #def change_view(self, *args, **kwargs):
+    #    """
+    #    La modification permet de changer les codes générés.
+    #    """
+    #    self.fields = self.fields + ['secret', 'voicemailcode', ]
+    #    return super(CompteAdmin, self).change_view(*args, **kwargs)
+
+admin.site.register(Compte, CompteAdmin)
diff --git a/auf_montreal_asterisk_users2/gcast/models.py b/auf_montreal_asterisk_users2/gcast/models.py
new file mode 100644 (file)
index 0000000..3009e23
--- /dev/null
@@ -0,0 +1,73 @@
+# -*- encoding: utf-8 -*-
+
+from django.db import models
+import random
+import unicodedata
+import telnetlib
+
+# Create your models here.
+
+STATUS = (
+    ('bureau','Bureau occupé'),
+    ('bureau-vide','Bureau vide'),
+    ('salle-reunion','Salle de reunion'),
+    ('pas-de-sonnerie','Sonnerie désactivé'),
+    )
+
+CATEGORIES = (
+    ('users-locaux','Restreint aux appels locaux'),
+    ('users-ameriquenord','Appels en Amérique du Nord seulement'),
+    ('users-outremer','Autorisé à faire des appels internationaux'),
+    )
+
+NAT = (
+    ('no','Pas de NAT'),
+    ('yes','NAT autorisé')
+    )
+
+class Compte(models.Model):
+    exten = models.CharField(max_length=8, unique=True)
+    categorie = models.CharField(max_length=64,choices=CATEGORIES, default=CATEGORIES[0][0])
+    fullname = models.CharField(max_length=256)
+    cidname = models.CharField(max_length=256)
+    email = models.CharField(max_length=256)
+    secret = models.CharField(max_length=16)
+    voicemailcode = models.CharField(max_length=8)
+    pavillon = models.CharField(max_length=4, default=543,editable=False) 
+    bureau = models.CharField(max_length=8)
+    nat = models.CharField(max_length=8,choices=NAT, default=NAT[0][0])
+    status = models.CharField(max_length=20,choices=STATUS, default=STATUS[0][0])
+
+    def __unicode__(self):
+        return self.fullname
+
+    def calcul_secret(self):
+        return "O".join(reversed(self.exten+"FuA"))
+
+    def calcul_voicemailcode(self):
+        return random.randrange(1000,9999)
+
+    #def calcul_email(self):
+    #    prenom = self.fullname.split(' ',1)[0]
+    #    nom = self.fullname.split(' ',1)[1]
+    #    prenom_sans_accent = unicodedata.normalize("NFKD", prenom).encode("ascii", "ignore")
+    #    nom_sans_accent = unicodedata.normalize("NFKD", nom).encode("ascii", "ignore")
+    #    return prenom_sans_accent.lower() + '.' + nom_sans_accent.lower() + '@auf.org'
+    
+    #  self.cidname = self.calcul_cidname() 
+    def calcul_cidname(self):
+        return self.fullname
+
+    def save(self, *args, **kwargs):
+        """Enregistrer ou modifier un compte dans la BD après avoir calculé certains champs qui dérivent de d'autres"""
+        self.cidname = self.calcul_cidname()
+       self.secret = self.calcul_secret()
+       if not self.id:
+            self.voicemailcode = self.calcul_voicemailcode()
+      #      self.secret = self.calcul_secret()
+                
+            # on declanche le script sur new-toip par un telnet 
+        obj = super(Compte, self).save(*args, **kwargs)   
+        #tn = telnetlib.Telnet("new-toip.b.ca.auf", "10")
+        #tn.read_all()        
+        return obj
diff --git a/auf_montreal_asterisk_users2/gcast/views.py b/auf_montreal_asterisk_users2/gcast/views.py
new file mode 100644 (file)
index 0000000..60f00ef
--- /dev/null
@@ -0,0 +1 @@
+# Create your views here.
diff --git a/auf_montreal_asterisk_users2/manage.py b/auf_montreal_asterisk_users2/manage.py
new file mode 100644 (file)
index 0000000..f9726f9
--- /dev/null
@@ -0,0 +1,10 @@
+#!/usr/bin/env python
+import os
+import sys
+
+if __name__ == "__main__":
+    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
+
+    from django.core.management import execute_from_command_line
+
+    execute_from_command_line(sys.argv)
diff --git a/auf_montreal_asterisk_users2/requirements.txt b/auf_montreal_asterisk_users2/requirements.txt
new file mode 100644 (file)
index 0000000..822ad98
--- /dev/null
@@ -0,0 +1,3 @@
+Django==1.8.7
+MySQL-python==1.3.7
+South==1.0-0.1
diff --git a/auf_montreal_asterisk_users2/settings.py b/auf_montreal_asterisk_users2/settings.py
new file mode 100644 (file)
index 0000000..2679639
--- /dev/null
@@ -0,0 +1,151 @@
+# Django settings for auf_montreal_asterisk_users project.
+
+DEBUG = True
+TEMPLATE_DEBUG = DEBUG
+
+ADMINS = (
+    # ('Your Name', 'your_email@example.com'),
+)
+
+MANAGERS = ADMINS
+
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
+        'NAME': 'asterisk2',                      # Or path to database file if using sqlite3.
+        'USER': 'asterisk',                      # Not used with sqlite3.
+        'PASSWORD': 'Nam1t08a!K1ck',                  # Not used with sqlite3.
+        'HOST': 'new-toip.b.ca.auf',                      # Set to empty string for localhost. Not used with sqlite3.
+        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
+    }
+}
+
+# Hosts/domain names that are valid for this site; required if DEBUG is False
+# See https://docs.djangoproject.com/en/{{ docs_version }}/ref/settings/#allowed-hosts
+ALLOWED_HOSTS = []
+
+# Local time zone for this installation. Choices can be found here:
+# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
+# although not all choices may be available on all operating systems.
+# On Unix systems, a value of None will cause Django to use the same
+# timezone as the operating system.
+# If running in a Windows environment this must be set to the same as your
+# system time zone.
+TIME_ZONE = 'America/Montreal'
+
+# Language code for this installation. All choices can be found here:
+# http://www.i18nguy.com/unicode/language-identifiers.html
+LANGUAGE_CODE = 'en-us'
+
+SITE_ID = 1
+
+# If you set this to False, Django will make some optimizations so as not
+# to load the internationalization machinery.
+USE_I18N = True
+
+# If you set this to False, Django will not format dates, numbers and
+# calendars according to the current locale
+USE_L10N = True
+
+# Absolute filesystem path to the directory that will hold user-uploaded files.
+# Example: "/home/media/media.lawrence.com/media/"
+MEDIA_ROOT = ''
+
+# URL that handles the media served from MEDIA_ROOT. Make sure to use a
+# trailing slash.
+# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
+MEDIA_URL = ''
+
+# Absolute path to the directory static files should be collected to.
+# Don't put anything in this directory yourself; store your static files
+# in apps' "static/" subdirectories and in STATICFILES_DIRS.
+# Example: "/home/media/media.lawrence.com/static/"
+STATIC_ROOT = ''
+
+# URL prefix for static files.
+# Example: "http://media.lawrence.com/static/"
+STATIC_URL = '/static/'
+
+# URL prefix for admin static files -- CSS, JavaScript and images.
+# Make sure to use a trailing slash.
+# Examples: "http://foo.com/static/admin/", "/static/admin/".
+ADMIN_MEDIA_PREFIX = '/static/admin/'
+
+# Additional locations of static files
+STATICFILES_DIRS = (
+    # Put strings here, like "/home/html/static" or "C:/www/django/static".
+    # Always use forward slashes, even on Windows.
+    # Don't forget to use absolute paths, not relative paths.
+)
+
+# List of finder classes that know how to find static files in
+# various locations.
+STATICFILES_FINDERS = (
+    'django.contrib.staticfiles.finders.FileSystemFinder',
+    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
+#    'django.contrib.staticfiles.finders.DefaultStorageFinder',
+)
+
+# Make this unique, and don't share it with anybody.
+SECRET_KEY = 'ajwudis^7ktvnbb9!w1uz&)p$xpit2n85=dy5mxp19l77ih1^9'
+
+# List of callables that know how to import templates from various sources.
+TEMPLATE_LOADERS = (
+    'django.template.loaders.filesystem.Loader',
+    'django.template.loaders.app_directories.Loader',
+#     'django.template.loaders.eggs.Loader',
+)
+
+MIDDLEWARE_CLASSES = (
+    'django.middleware.common.CommonMiddleware',
+    'django.contrib.sessions.middleware.SessionMiddleware',
+    'django.middleware.csrf.CsrfViewMiddleware',
+    'django.contrib.auth.middleware.AuthenticationMiddleware',
+    'django.contrib.messages.middleware.MessageMiddleware',
+)
+
+ROOT_URLCONF = 'urls'
+
+TEMPLATE_DIRS = (
+    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
+    # Always use forward slashes, even on Windows.
+    # Don't forget to use absolute paths, not relative paths.
+)
+
+INSTALLED_APPS = (
+    'django.contrib.auth',
+    'django.contrib.contenttypes',
+    'django.contrib.sessions',
+    'django.contrib.sites',
+    'django.contrib.messages',
+    'django.contrib.staticfiles',
+    # Uncomment the next line to enable the admin:
+    'django.contrib.admin',
+    # Uncomment the next line to enable admin documentation:
+    # 'django.contrib.admindocs',
+    'gcast',
+    #'south',
+)
+
+# A sample logging configuration. The only tangible logging
+# performed by this configuration is to send an email to
+# the site admins on every HTTP 500 error.
+# See http://docs.djangoproject.com/en/dev/topics/logging for
+# more details on how to customize your logging configuration.
+LOGGING = {
+    'version': 1,
+    'disable_existing_loggers': False,
+    'handlers': {
+        'mail_admins': {
+            'level': 'ERROR',
+            'class': 'django.utils.log.AdminEmailHandler'
+        }
+    },
+    'loggers': {
+        'django.request': {
+            'handlers': ['mail_admins'],
+            'level': 'ERROR',
+            'propagate': True,
+        },
+    }
+}
diff --git a/auf_montreal_asterisk_users2/urls.py b/auf_montreal_asterisk_users2/urls.py
new file mode 100644 (file)
index 0000000..65633b4
--- /dev/null
@@ -0,0 +1,17 @@
+from django.conf.urls import patterns, include, url
+
+# Uncomment the next two lines to enable the admin:
+from django.contrib import admin
+admin.autodiscover()
+
+urlpatterns = patterns('',
+    # Examples:
+    # url(r'^$', 'auf_montreal_asterisk_users.views.home', name='home'),
+    # url(r'^auf_montreal_asterisk_users/', include('auf_montreal_asterisk_users.foo.urls')),
+
+    # Uncomment the admin/doc line below to enable admin documentation:
+    # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
+
+    # Uncomment the next line to enable the admin:
+    url(r'^admin/', include(admin.site.urls)),
+)