support app
authorOlivier Larchevêque <olivier.larcheveque@auf.org>
Tue, 23 Aug 2011 16:02:40 +0000 (12:02 -0400)
committerOlivier Larchevêque <olivier.larcheveque@auf.org>
Tue, 23 Aug 2011 16:02:40 +0000 (12:02 -0400)
12 files changed:
project/settings.py
project/support/__init__.py [new file with mode: 0755]
project/support/admin.py [new file with mode: 0644]
project/support/models.py [new file with mode: 0755]
project/support/templates/support/docs.html [new file with mode: 0644]
project/support/templates/support/faq.html [new file with mode: 0644]
project/support/templates/support/faq_et_ressources.html [new file with mode: 0644]
project/support/tests.py [new file with mode: 0755]
project/support/urls.py [new file with mode: 0644]
project/support/views.py [new file with mode: 0755]
project/templates/menu.html [new file with mode: 0644]
project/urls.py

index d0b071e..2ab6005 100644 (file)
@@ -56,6 +56,9 @@ INSTALLED_APPS = (
     'django.contrib.sessions',
     'django.contrib.admin',
     'south',
+    
+    # Notre application de support
+    'support',
 )
 
 TEMPLATE_CONTEXT_PROCESSORS = (
diff --git a/project/support/__init__.py b/project/support/__init__.py
new file mode 100755 (executable)
index 0000000..e69de29
diff --git a/project/support/admin.py b/project/support/admin.py
new file mode 100644 (file)
index 0000000..7fdee84
--- /dev/null
@@ -0,0 +1,42 @@
+# -*- encoding: utf-8 -*-
+
+from django.contrib import admin
+from django.conf import settings
+from models import FAQ
+
+class FAQAdmin(admin.ModelAdmin):
+    """
+    Cette classe permet de spécifier comment fonctionne les interfaces d'administrations du modèle FAQ :
+    * liste 
+    * édition
+
+    Celà se fait, en spécifiant certaines propriétés de la classe, ou encore en surchargeant des méthodes
+    particulières.
+    
+    Les interfaces d'administrations, font parties intégrantes du framework Django,
+    et les options disponibles sont présentées ici :
+    https://docs.djangoproject.com/en/1.2/ref/contrib/admin
+    """
+
+    # Cette option définie les champs qui seront présentées dans la vue en liste.
+    # Si on se référence au modèle FAQ, _todo n'est pas un champs du modèle, mais
+    # il fait référence à une méthode définie ci-dessous.
+    list_display = ("question", "_todo", "public", )
+
+    def _todo(self, obj):
+        """
+        Cette méthode est exploitée par la liste list_display. Elle prends en paramètre 'obj',
+        qui est un objet FAQ.
+        (Cette méthode est appelée pour représentrer la valeur de la colonne '_todo' pour chaque ligne.)
+        """
+        if obj.reponse != "":
+            return """<img alt="True" src="%simg/admin/icon-yes.gif">""" % settings.ADMIN_MEDIA_PREFIX
+        else:
+            return """<img alt="False" src="%simg/admin/icon-no.gif">""" % settings.ADMIN_MEDIA_PREFIX
+    # Cette option permet de renommer la colonne
+    _todo.short_description = u"Traité"
+    # Cette option autorise l'utilisation du HTML dans le résultat de la méthode
+    _todo.allow_tags = True
+
+
+admin.site.register(FAQ, FAQAdmin)
diff --git a/project/support/models.py b/project/support/models.py
new file mode 100755 (executable)
index 0000000..4b49e99
--- /dev/null
@@ -0,0 +1,20 @@
+# -*- encoding: utf-8 -*-
+
+from django.db import models
+
+class FAQ(models.Model):
+    """
+    Modèle de données représentant le couple question / réponse.
+    Le champs public, permettra par exemple de contrôler l'affichage
+    des FAQ dans le portail.
+    """
+    question = models.TextField(verbose_name=u"Question")
+    reponse = models.TextField(verbose_name=u"Réponse", blank=True)
+    public = models.BooleanField(verbose_name=u"Public", default=False)
+
+class Ressource(models.Model):
+    """
+    À vous de construire le modèle, vous trouverez les champs disponibles ici
+    https://docs.djangoproject.com/en/1.2/ref/models/fields
+    """
+    pass
diff --git a/project/support/templates/support/docs.html b/project/support/templates/support/docs.html
new file mode 100644 (file)
index 0000000..4c46475
--- /dev/null
@@ -0,0 +1,8 @@
+{% extends 'base.html' %}
+
+{% block sous_titre %}Support{% endblock %}
+
+{% block main %}
+<h1>Ressources documentaires</h1>
+
+{% endblock %}
diff --git a/project/support/templates/support/faq.html b/project/support/templates/support/faq.html
new file mode 100644 (file)
index 0000000..636168b
--- /dev/null
@@ -0,0 +1,28 @@
+{% extends 'base.html' %}
+
+{% block sous_titre %}Support{% endblock %}
+
+{% block main %}
+<h1>FAQ</h1>
+
+
+{% comment %}
+{% endcomment %}
+
+<a name="sommaire"><h2>Sommaire</h2></a>
+<ul>
+{% for faq in faq_public_liste %}
+    <li><a href="#faq-{{ faq.id}}">{{ faq.question }}</a></li>
+{% endfor %}
+<ul>
+
+<h2>Réponses</h2>
+{% for faq in faq_public_liste %}
+    <div>
+        <a name="faq-{{ faq.id }}"><h4>Question {{faq.id }} : {{ faq.question }}</h4></a>
+        <p>{{ faq.reponse|linebreaks }}</p>
+        <a style="float:right;" href="#sommaire">↑</a>
+    </div>
+{% endfor %}
+
+{% endblock %}
diff --git a/project/support/templates/support/faq_et_ressources.html b/project/support/templates/support/faq_et_ressources.html
new file mode 100644 (file)
index 0000000..841dde8
--- /dev/null
@@ -0,0 +1,8 @@
+{% extends 'base.html' %}
+
+{% block sous_titre %}Support{% endblock %}
+
+{% block main %}
+<h1>FAQ et Ressources documentaires</h1>
+
+{% endblock %}
diff --git a/project/support/tests.py b/project/support/tests.py
new file mode 100755 (executable)
index 0000000..2247054
--- /dev/null
@@ -0,0 +1,23 @@
+"""
+This file demonstrates two different styles of tests (one doctest and one
+unittest). These will both pass when you run "manage.py test".
+
+Replace these with more appropriate tests for your application.
+"""
+
+from django.test import TestCase
+
+class SimpleTest(TestCase):
+    def test_basic_addition(self):
+        """
+        Tests that 1 + 1 always equals 2.
+        """
+        self.failUnlessEqual(1 + 1, 2)
+
+__test__ = {"doctest": """
+Another way to test that 1 + 1 is equal to 2.
+
+>>> 1 + 1 == 2
+True
+"""}
+
diff --git a/project/support/urls.py b/project/support/urls.py
new file mode 100644 (file)
index 0000000..6f78321
--- /dev/null
@@ -0,0 +1,17 @@
+# -*- encoding: utf-8 -*
+
+from django.conf.urls.defaults import patterns, url, include
+from django.conf import settings
+
+urlpatterns = patterns(
+    'project.support.views',
+
+    # une page qui listera toutes les FAQ et les fichiers uploadés
+    url(r'^$', 'faq_et_ressources', name='faq_et_ressources'),
+
+    # une page qui listera toutes les FAQ
+    url(r'^faq/$', 'faq', name='faq'),
+
+    # une page qui listera tous les fichiers uploadés
+    url(r'^docs/$', 'docs', name='ressources_documentaires'),
+)
diff --git a/project/support/views.py b/project/support/views.py
new file mode 100755 (executable)
index 0000000..003aa81
--- /dev/null
@@ -0,0 +1,26 @@
+# -*- encoding: utf-8 -*-
+
+from django.template import Context, RequestContext
+from django.shortcuts import redirect, render_to_response
+from models import FAQ
+
+def faq_et_ressources(request):
+    """
+    """
+    data = {}
+    return render_to_response('support/faq_et_ressources.html', data, RequestContext(request))
+
+def faq(request):
+    """
+    Page qui liste les pages de FAQ publiées.
+    """
+    data = {
+        'faq_public_liste' : FAQ.objects.filter(public=True),
+    }
+    return render_to_response('support/faq.html', data, RequestContext(request))
+
+def docs(request):
+    """
+    """
+    data = {}
+    return render_to_response('support/docs.html', data, RequestContext(request))
diff --git a/project/templates/menu.html b/project/templates/menu.html
new file mode 100644 (file)
index 0000000..b45f033
--- /dev/null
@@ -0,0 +1,25 @@
+{% load auf_menu %}
+
+
+{% comment %}
+le tag 'url' permet de générer la bonne URL
+en fonction de du pattern défini dans le fichier project/support/urls.py
+On dissocie ainsi le couplage URL / view, facilitant le renommage des URLs
+sans impacter tout le code où elle est utilisé.
+Utiliser le tag 'url' est une bonne pratique, il ne faut donc pas mettre 
+d'URL en dur dans les templates ou les vues.
+{% endcomment %}
+
+<ul class="menu">
+  <li class="{% menu_actif request '^support' %}">
+    <a href="{% url faq_et_ressources %}">Support</a>
+    <ul>
+        <li class="{% menu_actif request 'faq$' %}">
+          <a href="{% url faq %}">FAQ</a>
+        </li>
+        <li class="{% menu_actif request 'docs$' %}">
+          <a href="{% url ressources_documentaires %}">Ressources</a>
+        </li>
+    </ul>
+  </li>
+</ul>
index 40bcec7..37d3113 100644 (file)
@@ -12,6 +12,12 @@ urlpatterns = patterns(
     ######## page d'accueil de demo ######
     (r'^$', 'auf.django.skin.views.demo'),
     ######################################
+
+    # les urls apportées par notre application sont définies
+    # à l'intérieur même du module.
+    # ici, elles seront toutes préfixées par le mots 'support' dans l'URL.
+    url(r'^support/', include('project.support.urls')),
+
     url(r'^admin_tools/', include('admin_tools.urls')),
     (r'^admin/', include(admin.site.urls)),
     (r'^connexion/$', 'django.contrib.auth.views.login'),