\documentclass[8pt]{beamer}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[frenchb]{babel}
\usepackage{graphicx}
\usepackage{xcolor}
\usepackage{pstricks}
\usepackage{alltt}
\usepackage{hyperref}

\usepackage{palatino}
\setbeamercovered{transparent}
\setbeamercolor{section in head/foot}{use=structure,bg=structure.fg!25!bg}
\useoutertheme[subsection=false,footline=authortitle]{miniframes}
\setbeamertemplate{frametitle}[default][center]
\logo{\includegraphics[width=2cm]{images/logoCrans.png}}
\setbeamertemplate{background}{%
\begin{pspicture}
 \put(1.5,9.8){\includegraphics[width=7cm]{images/fondSwitchs.png}}
\end{pspicture}
}

\author{Vincent Le Gallic}
\institute{Séminaire Technique du Cr@ns}
\date{21 février 2012}
\title{Intranet 2}


\newcommand{\lien}[1]{\textcolor{blue}{\textsl{#1}}}
\begin{document}
\begin{frame}
 \maketitle
\end{frame}

\begin{frame}
 \frametitle{Pourquoi L'Intranet 2 ?}
 
\begin{itemize}[<+->]
 \item Parce que c'est du Python
 \item Parce que Django, c'est cool
 \item C'est modulaire et ça permet de coder des services rapidement
 \item Pour gérer la base de données des prises
 \item Pour rajouter plein de services sympa (gestion des comptes plus kikoo, impression v2, carte wifi...)
\end{itemize}

\end{frame}


\section{Django : Comment ça marche ?}
\subsection{}
\begin{frame}[fragile]
\frametitle{Bienvenue dans l'univers de Django}
\begin{itemize}[<+->]
  \item \texttt{\$ sudo apt-get install python-django}
  \item Créer un nouveau \textbf{projet} : \texttt{\$ django-admin startproject blabla}
  \item Un projet contient : 
  \begin{itemize}
    \item \texttt{\_\_init\_\_.py} : "Ceci est un package"
    \item \texttt{manage.py} : Script d'administration du projet
    \item \texttt{settings.py} : Les paramètres du projet
    \item \texttt{urls.py} : "Table of Contents" du projet
  \end{itemize}
  \item La philosophie : "MVC : Modèle Vue Contrôleur"
  \begin{itemize}
    \item Modèle : ce que sont les objets (\verb@models.py@)
    \item Vue : l'affichage des données (\verb@views.py@ \& \verb@templates@)
    \item Contrôleur : interaction de l'utilisateur avec les données
  \end{itemize}
\end{itemize}
\end{frame}

\section{La programmation par copier/coller}
\subsection{}
\begin{frame}[fragile]
\frametitle{Apprenons par l'exemple}
On va créer pas-à-pas une page sur l'intranet qui affiche le mot de passe des news.

\begin{itemize}[<+->]
  \item Cloner le dépot (sur vo)
  \begin{itemize}
    \item \texttt{ssh legallic@vo}
    \item \texttt{vo\% git clone /localhome/django/intranet}
  \end{itemize}
  \item Dans \texttt{setting.py} modifier \texttt{MEDIA\_ROOT}
  \item Dans \texttt{url.py} rajouter \begin{verbatim}url('^static/(?P<path>.*)\$', 'django.views.static.serve',
   {'document_root':'static/'})}\end{verbatim}
  \item On peut alors le tester : \verb@vo% python manage.py runserver vo:1337@
  et on va voir sur \lien{vo.crans.org:1337}
  \item Bon, évidemment, on peut pas se logger. On a besoin d'une base d'authentification.
\end{itemize}
\end{frame}

\begin{frame}
En fait, il y a deux backends d'authentification :
\begin{itemize}
  \item Celui par défaut (utilisant la base pgsql)
  \item Celui du crans (utilisant ldap  (ici, ldap\_test))
\end{itemize}
\end{frame}

\begin{frame}[fragile]
\frametitle{S'authentifier}
\begin{itemize}[<+->]
  \item Il faut modifier \texttt{settings.py}
\begin{verbatim}
  DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': '/localhome/legallic/intranet/sqlite_base',
        },
    'switchs': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': '/localhome/legallic/intranet/sqlite_base',
        },
  }\end{verbatim}
  \item Il y a deux bases (ici elles pointent vers la même) : le choix est réalisé par \verb@DATABASE_ROUTERS@
  \item On lui dit qu'on a mis une nouvelle base : \verb@vo% python manage.py syncdb@ (au passage il demande de créer un superuser)
  \item On peut se logger en superuser sur \lien{vo:1337/admin} et ajouter des \\	
 utilisateurs en interface graphique.
\end{itemize}
\end{frame}

\section{Créons une application}
\subsection{}
\begin{frame}[fragile]
\frametitle{Création de l'app}
\begin{itemize}[<+->]
  \item \verb@ python manage.py startapp infos@ (ensuite il faut le déplacer dans apps)
  \item On obtient : dans \verb@./infos/@
  \begin{itemize}
    \item \verb@__init__.py@
    \item \verb@models.py@
    \item \verb@tests.py@
    \item \verb@views.py@
  \end{itemize}
  \item On dit à Django d'utiliser cette app, dans \verb@settings.py@ :
  \begin{verbatim}
    INSTALLED_APPS = (...
         'infos',
    )
\end{verbatim}
(dans la version crans, il faut l'ajouter dans \verb@INTRANET_APPS@)
  \item On crée l'objet dont on a besoin dans \verb@models.py@ :
  \begin{verbatim}
class Information(models.Model):
   titre=models.CharField(max_length=200)
   contenu=models.CharField(max_length=4096)
  \end{verbatim}
\end{itemize}
\end{frame}

\begin{frame}[fragile]
\begin{itemize}[<+->]
  \item Si on fait \verb@ vo% python manage.py sql infos@ on voit la commande SQL qui sera utilisée pour créer la table.
  \begin{verbatim}
BEGIN;
CREATE TABLE "infos_information" (
    "id" integer NOT NULL PRIMARY KEY,
    "titre" varchar(200) NOT NULL,
    "contenu" varchar(4096) NOT NULL
)
;
COMMIT;
  \end{verbatim}
  \item Puis on la crée vraiment \verb@ vo% python manage.py syncdb@
\end{itemize}
\end{frame}

\begin{frame}[fragile]
\begin{itemize}[<+->]
  \item L'app \verb@infos@ doit contenir un \verb@urls.py@ :
  \begin{verbatim}
from django.conf.urls.defaults import patterns, url

import views

urlpatterns = patterns('',
    url('^$', views.plouf),
)
  \end{verbatim}
  \item Il faut définir la fonction \verb@plouf@ dans \verb@views.py@
\begin{verbatim}
from django.http import HttpResponse
from django.contrib.auth.decorators import login_required
from apps.infos.models import Information

@login_required
def plouf(request):
    infos_liste = Information.objects.all()
    output = "\n\n".join(["= %s =<br/>%s<br/>"%
              (i.titre,i.contenu) for i in liste_infos])
    return HttpResponse(output)
\end{verbatim}
\end{itemize}
\end{frame}

\begin{frame}[fragile]
\frametitle{Les templates : mise en place}
\begin{itemize}[<+->]
  \item Dans \verb@settings.py@:
    \begin{verbatim}TEMPLATE_DIRS = (MEDIA_ROOT + 'templates/',)\end{verbatim}
  \item Dans \verb@templates/plouf.html@ :
  \begin{verbatim}
{% extends "template.html" %}
{% block title %}Informations utiles{% endblock %}
{% block content %}
{% if infos_liste %}
    <ul>
    {% for info in infos_liste %}
        <h1>{{ info.titre }}</h1>
        {{ info.contenu }}
    {% endfor %}
    </ul>
{% else %}
    Je n'ai rien à écrire.
{% endif %}
{% endblock %}
  \end{verbatim}
\end{itemize}
\end{frame}


\begin{frame}[fragile]
\frametitle{Les templates : utilisation}
\begin{itemize}[<+->]
  \item On remplace \verb@views.py@ par
\begin{verbatim}
import django.shortcuts
from django.http import HttpResponse
from django.contrib.auth.decorators import login_required
from apps.infos.models import Information

@login_required
def plouf(request):
    """Do Something."""
    infos_liste = Information.objects.all()
    return django.shortcuts.render_to_response("plouf.html",
                                 {"infos_liste":infos_liste})
\end{verbatim}
\end{itemize}
\end{frame}


\section{L'intranet 2}
\subsection{}
\begin{frame}[fragile]
\frametitle{Il est où ?}
\begin{itemize}[<+->]
  \item Sur \texttt{o2}
  \item Sur \lien{http://intranet2.crans.org}
  \item L'authentification utilise la base \verb@ldap@
\end{itemize}
\end{frame}

\begin{frame}[fragile]
\frametitle{Il sert à quoi ?} %à rien
\begin{itemize}[<+->]
  \item À contenir la base de données des prises
  \item À avoir la correspondance prise $\leftrightarrow$ chambre
  \item À noter quelles prises doivent changer de brassage (crans/crous) [le crous peut également demander des changement de prises]
  \item À valider lesdits changement après avoir fait le branchement physique
  \item À linker vers des pages qui ne marchent pas
\end{itemize}
\end{frame}
\end{document}

