un debut d'amusement en django, pour rire
authorThomas NOEL <thomas@zepok.sn.auf>
Mon, 27 Oct 2008 21:38:09 +0000 (21:38 +0000)
committerThomas NOEL <thomas@zepok.sn.auf>
Mon, 27 Oct 2008 21:38:09 +0000 (21:38 +0000)
django/README [new file with mode: 0644]
django/bases/__init__.py [new file with mode: 0644]
django/bases/manage.py [new file with mode: 0755]
django/bases/nssauth/__init__.py [new file with mode: 0644]
django/bases/nssauth/admin.py [new file with mode: 0644]
django/bases/nssauth/models.py [new file with mode: 0644]
django/bases/nssauth/views.py [new file with mode: 0644]
django/bases/settings.py [new file with mode: 0644]
django/bases/urls.py [new file with mode: 0644]

diff --git a/django/README b/django/README
new file mode 100644 (file)
index 0000000..25441e9
--- /dev/null
@@ -0,0 +1,36 @@
+
+Inspiration http://fxp0.org.ua/2007/jan/31/setup-libpam-mysql-libnss-mysql-bg-django-admin/
+
+Nécessite Django 1.0
+====================
+ * Ubuntu Hardy : prendre le .deb de Intrepid (http://packages.ubuntu.com/intrepid/python-django)
+ * Debian Etch : python-django dans backports.org
+ * Debian Lenny, Ubuntu Intrepid : aptitude install python-django
+
+Mise en place
+=============
+ $ cd bases
+ $ ./manage.py syncdb 
+Creating table auth_permission
+(...)
+You just installed Django's auth system, which means you don't have any superusers defined.
+Would you like to create one now? (yes/no): yes
+Username (Leave blank to use 'thomas'): admin
+E-mail address: nobody@nowhere.com
+Password: admin
+Password (again): admin
+Superuser created successfully.
+(...)
+Installing index for nssauth.User model
+ $ manage.py runserver
+
+et aller sur http://localhost:8080/admin/
+
+
+TODO pour continuer à s'amuser
+==============================
+ * customizer un peu l'admin form
+ * faire des vues
+ * prog outils en ligne de commande
+ * quelques formulaires (newform)
+
diff --git a/django/bases/__init__.py b/django/bases/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/django/bases/manage.py b/django/bases/manage.py
new file mode 100755 (executable)
index 0000000..bcdd55e
--- /dev/null
@@ -0,0 +1,11 @@
+#!/usr/bin/python
+from django.core.management import execute_manager
+try:
+    import settings # Assumed to be in the same directory.
+except ImportError:
+    import sys
+    sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
+    sys.exit(1)
+
+if __name__ == "__main__":
+    execute_manager(settings)
diff --git a/django/bases/nssauth/__init__.py b/django/bases/nssauth/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/django/bases/nssauth/admin.py b/django/bases/nssauth/admin.py
new file mode 100644 (file)
index 0000000..ea26fd9
--- /dev/null
@@ -0,0 +1,6 @@
+from bases.nssauth.models import User, Group
+from django.contrib import admin
+
+admin.site.register(User)
+admin.site.register(Group)
+
diff --git a/django/bases/nssauth/models.py b/django/bases/nssauth/models.py
new file mode 100644 (file)
index 0000000..dfa3d41
--- /dev/null
@@ -0,0 +1,52 @@
+# -*- coding: utf-8 -*-
+
+from django.db import models
+
+SHELLS = (  
+    ('/bin/sh', 'Bash'),  
+    ('/bin/false', 'Pas de shell'),  
+)  
+  
+class Group(models.Model):
+    gid = models.AutoField(primary_key=True)  
+    name = models.CharField(max_length=15, unique=True, db_index=True)  
+    password = models.CharField(max_length=128, db_index=True, default='x')  
+    class Admin:  
+        pass  
+      
+    def __unicode__(self):
+        return self.name
+
+class User(models.Model):
+    uid = models.AutoField(primary_key=True)  
+    username = models.CharField(max_length=15, unique=True, db_index=True)  
+    group = models.ForeignKey(Group, verbose_name='groupe de base', related_name='primary_group', db_column='gid')  
+    groups = models.ManyToManyField(Group, verbose_name='groupes', blank=True)  
+    gecos = models.CharField(max_length=128, blank=True)  
+    homedir = models.CharField(max_length=128, default='/home/')  
+    shell = models.CharField(max_length=128, default='/bin/sh', choices=SHELLS)  
+    password = models.CharField(max_length=128, db_index=True, help_text='Si fourni en clair, il sera chiffré lors de l\'enregistrement')  
+    lstchg = models.PositiveIntegerField(default=1, editable=False, help_text='nombre de jours, comptés à partir du 1er janvier 1970, depuis le dernier changement de mot de passe')
+    min = models.PositiveIntegerField(default=0, help_text='nombre de jours à attendre avant de pouvoir changer le mot de passe')
+    max = models.PositiveIntegerField(default=99999, help_text='nombre de jours après lesquels le mot de passe doit être changé')  
+    warn = models.PositiveIntegerField(default=0, help_text='nombre de jours avant la fin de validité du mot de passe et pendant lesquels l´utilisateur est averti')  
+    expire = models.IntegerField(default=-1, help_text='nombre de jours, comptés à partir du 1er janvier 1970, depuis que le compte est désactivé')  
+    inact = models.PositiveIntegerField(default=0, help_text='nombre de jours après la fin de validité provoquant la désactivation du compte')  
+    flag = models.PositiveIntegerField(default=0, editable=False)  
+    is_active = models.BooleanField('active', default=True)  
+    class Admin:  
+        pass
+
+    def save(self):  
+        super(User, self).save()  
+        if self.uid:  
+            if self.password and not self.password.startswith('$1$'):  
+                import crypt,random  
+                salt = ('$1$%s') % ''.join(random.sample('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ./0123456789', 8))  
+                password = crypt.crypt(self.password, salt)  
+                self.password = password  
+                self.save()  
+                  
+    def __unicode__(self):  
+        return self.username  
+
diff --git a/django/bases/nssauth/views.py b/django/bases/nssauth/views.py
new file mode 100644 (file)
index 0000000..60f00ef
--- /dev/null
@@ -0,0 +1 @@
+# Create your views here.
diff --git a/django/bases/settings.py b/django/bases/settings.py
new file mode 100644 (file)
index 0000000..881a661
--- /dev/null
@@ -0,0 +1,81 @@
+# Django settings for bases project.
+
+DEBUG = True
+TEMPLATE_DEBUG = DEBUG
+
+ADMINS = (
+    # ('Your Name', 'your_email@domain.com'),
+)
+
+MANAGERS = ADMINS
+
+DATABASE_ENGINE = 'sqlite3'           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
+DATABASE_NAME = '/var/tmp/bases-nssauth.sqlite3'             # Or path to database file if using sqlite3.
+DATABASE_USER = ''             # Not used with sqlite3.
+DATABASE_PASSWORD = ''         # Not used with sqlite3.
+DATABASE_HOST = ''             # Set to empty string for localhost. Not used with sqlite3.
+DATABASE_PORT = ''             # Set to empty string for default. Not used with sqlite3.
+
+# 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.
+# If running in a Windows environment this must be set to the same as your
+# system time zone.
+TIME_ZONE = 'Africa/Dakar'
+
+# Language code for this installation. All choices can be found here:
+# http://www.i18nguy.com/unicode/language-identifiers.html
+LANGUAGE_CODE = 'fr-fr'
+
+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
+
+# Absolute path to the directory that holds media.
+# Example: "/home/media/media.lawrence.com/"
+MEDIA_ROOT = ''
+
+# URL that handles the media served from MEDIA_ROOT. Make sure to use a
+# trailing slash if there is a path component (optional in other cases).
+# Examples: "http://media.lawrence.com", "http://example.com/media/"
+MEDIA_URL = ''
+
+# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
+# trailing slash.
+# Examples: "http://foo.com/media/", "/media/".
+ADMIN_MEDIA_PREFIX = '/media/'
+
+# Make this unique, and don't share it with anybody.
+SECRET_KEY = 'l2^#r!yuh^_608if1s+e6pbj8y)u5lzd81uy$0jumb&bfuz=i%'
+
+# List of callables that know how to import templates from various sources.
+TEMPLATE_LOADERS = (
+    'django.template.loaders.filesystem.load_template_source',
+    'django.template.loaders.app_directories.load_template_source',
+#     'django.template.loaders.eggs.load_template_source',
+)
+
+MIDDLEWARE_CLASSES = (
+    'django.middleware.common.CommonMiddleware',
+    'django.contrib.sessions.middleware.SessionMiddleware',
+    'django.contrib.auth.middleware.AuthenticationMiddleware',
+)
+
+ROOT_URLCONF = 'bases.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.admin',
+    'bases.nssauth',
+)
diff --git a/django/bases/urls.py b/django/bases/urls.py
new file mode 100644 (file)
index 0000000..175d6f6
--- /dev/null
@@ -0,0 +1,17 @@
+from django.conf.urls.defaults import *
+
+# Uncomment the next two lines to enable the admin:
+from django.contrib import admin
+admin.autodiscover()
+
+urlpatterns = patterns('',
+    # Example:
+    # (r'^bases/', include('bases.foo.urls')),
+
+    # Uncomment the admin/doc line below and add 'django.contrib.admindocs' 
+    # to INSTALLED_APPS to enable admin documentation:
+    # (r'^admin/doc/', include('django.contrib.admindocs.urls')),
+
+    # Uncomment the next line to enable the admin:
+    (r'^admin/(.*)', admin.site.root),
+)