TP : Agenda - Templates

date:2012-05-01 22:52
tags:django, python
category:Django
author:Rémy Hubscher

Énoncé

Nous souhaitons réaliser un agenda qui nous permettra :

  • De gérer plusieurs agenda
  • D’intégrer des événements dans l’agenda
  • D’ajouter, modifier, supprimer, déplacer un événement

L’IHM

En fait vous allez voir que ce qu’il y a de plus dur dans un agenda web, c’est l’IHM.

Ce n’est pas le but de ce TP, mais à quoi bon avoir un code basé sur Django si au niveau du frontend, la qualité ne suit pas ?

Comme IHM, je vous propose d’utiliser FullCalendar.

Installation des static

On va extraire fullcalendar dans le répertoire static/schedule/fullcalendar de notre app schedule.

schedule/
├── static
│   └── schedule
│       ├── fullcalendar
│       │   ├── fullcalendar.css
│       │   ├── fullcalendar.js
│       │   ├── fullcalendar.min.js
│       │   ├── fullcalendar.print.css
│       │   └── gcal.js
│       └── js
│           ├── jquery-1.7.1.min.js
│           └── jquery-ui-1.8.17.custom.min.js
├── ...
└── views.py

Mise en place du template

On va récupèrer le template agenda-views.html et le configurer pour Django

schedule/
├── templates
│   └── schedule
│       └── base.html
├── ...
└── views.py

base.html

{% load static from staticfiles %}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<link rel='stylesheet' type='text/css' href='{% static 'schedule/fullcalendar/fullcalendar.css' %}' />
<link rel='stylesheet' type='text/css' href='{% static 'schedule/fullcalendar/fullcalendar.print.css' %}' media='print' />
<script type='text/javascript' src='{% static 'schedule/js/jquery-1.7.1.min.js' %}'></script>
<script type='text/javascript' src='{% static 'schedule/js/jquery-ui-1.8.17.custom.min.js' %}'></script>
<script type='text/javascript' src='{% static 'schedule/fullcalendar/fullcalendar.min.js' %}'></script>
<script type='text/javascript'>

    $(document).ready(function() {

            var date = new Date();
            var d = date.getDate();
            var m = date.getMonth();
            var y = date.getFullYear();

            $('#calendar').fullCalendar({
                    header: {
                            left: 'prev,next today',
                            center: 'title',
                            right: 'month,agendaWeek,agendaDay'
                    },
                    editable: true,
                    events: [
                            {
                                    title: 'All Day Event',
                                    start: new Date(y, m, 1)
                            },
                            {
                                    title: 'Long Event',
                                    start: new Date(y, m, d-5),
                                    end: new Date(y, m, d-2)
                            },
                            {
                                    id: 999,
                                    title: 'Repeating Event',
                                    start: new Date(y, m, d-3, 16, 0),
                                    allDay: false
                            },
                            {
                                    id: 999,
                                    title: 'Repeating Event',
                                    start: new Date(y, m, d+4, 16, 0),
                                    allDay: false
                            },
                            {
                                    title: 'Meeting',
                                    start: new Date(y, m, d, 10, 30),
                                    allDay: false
                            },
                            {
                                    title: 'Lunch',
                                    start: new Date(y, m, d, 12, 0),
                                    end: new Date(y, m, d, 14, 0),
                                    allDay: false
                            },
                            {
                                    title: 'Birthday Party',
                                    start: new Date(y, m, d+1, 19, 0),
                                    end: new Date(y, m, d+1, 22, 30),
                                    allDay: false
                            },
                            {
                                    title: 'Click for Google',
                                    start: new Date(y, m, 28),
                                    end: new Date(y, m, 29),
                                    url: 'http://google.com/'
                            }
                    ]
            });

    });

</script>
<style type='text/css'>

    body {
            margin-top: 40px;
            text-align: center;
            font-size: 14px;
            font-family: "Lucida Grande",Helvetica,Arial,Verdana,sans-serif;
            }

    #calendar {
            width: 900px;
            margin: 0 auto;
            }

</style>
</head>
<body>
<div id='calendar'></div>
</body>
</html>

Vérification du template avec TemplateView

On créé le fichier d’URLs :

# -*- coding: utf-8 -*-
from django.conf.urls import patterns, include, url
from django.views.generic import TemplateView

urlpatterns = patterns('',
    url(r'^$', TemplateView.as_view(template_name="schedule/base.html"), name='schedule'),
)

On le lie au fichier principal :

# -*- coding: utf-8 -*-
from django.conf.urls import patterns, include, url
from django.views.generic import RedirectView
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    url(r'^$', RedirectView.as_view(url='todo/')),
    url(r'^grappelli/', include('grappelli.urls')),
    url(r'^admin/', include(admin.site.urls)),
    url(r'^todo/', include('todo.urls')),
    url(r'^schedule/', include('schedule.urls')),
)

from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns()
../_images/schedule.png