Project Development

Version 83 (Etienne Pallier, 03/30/2016 10:59 am)

1 1 Etienne Pallier
h1. Project Development
2 2 Etienne Pallier
3 17 Etienne Pallier
Project Installation page : [[Project Installation]]
4 2 Etienne Pallier
5 2 Etienne Pallier
HOWTO Format Redmine Wiki : http://www.redmine.org/projects/redmine/wiki/FrRedmineWikiFormatting
6 2 Etienne Pallier
7 2 Etienne Pallier
{{>toc}}
8 2 Etienne Pallier
9 2 Etienne Pallier
---
10 3 Etienne Pallier
11 3 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}TODO%
12 3 Etienne Pallier
13 1 Etienne Pallier
14 1 Etienne Pallier
15 70 Etienne Pallier
 cf Roadmap
16 35 Etienne Pallier
17 3 Etienne Pallier
18 3 Etienne Pallier
19 57 Etienne Pallier
20 56 Etienne Pallier
---
21 24 Etienne Pallier
22 3 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}LIENS UTILES%
23 70 Etienne Pallier
24 70 Etienne Pallier
25 70 Etienne Pallier
 * pyrossu : pyrossu!
26 4 Etienne Pallier
27 71 Etienne Pallier
 * readonly admin interface : https://gist.github.com/aaugustin/1388243
28 71 Etienne Pallier
29 4 Etienne Pallier
 * Liens vers web local :
30 4 Etienne Pallier
31 4 Etienne Pallier
  * homepage: http://localhost:8000
32 4 Etienne Pallier
  * admin: http://localhost:8000/admin
33 25 Etienne Pallier
34 25 Etienne Pallier
 * Eclipse:
35 26 Etienne Pallier
 
36 26 Etienne Pallier
  * Shift-Ctrl-f (ou Shift-Cmd-f) : reformatage du fichier selon PEP8
37 25 Etienne Pallier
  * Shift-Ctrl-1 : make doc string ...
38 4 Etienne Pallier
39 4 Etienne Pallier
 * Django:
40 4 Etienne Pallier
41 80 Etienne Pallier
  * Un répertoire de modules : https://www.djangopackages.com/
42 79 Etienne Pallier
  * Extensions
43 1 Etienne Pallier
44 1 Etienne Pallier
   * *django_jenkins* : intégration à Jenkins
45 83 Etienne Pallier
   * *factory_boy* : création de grappes de données pour les tests
46 83 Etienne Pallier
   
47 83 Etienne Pallier
    * https://factoryboy.readthedocs.org/en/latest/introduction.html
48 83 Etienne Pallier
    * https://factoryboy.readthedocs.org/en/latest/orms.html 
49 79 Etienne Pallier
50 79 Etienne Pallier
  * Modules très utilisés:
51 79 Etienne Pallier
52 79 Etienne Pallier
   * django_linaration_pagination : affichage de listes paginées
53 79 Etienne Pallier
   * django_sorting : affichage de tableaux triables
54 79 Etienne Pallier
   * django_breadcrumbs : création de fil d'ariane
55 79 Etienne Pallier
   * django_xworkflows : gestion de workflows
56 79 Etienne Pallier
   * easy_thumbnails : gestion de miniatures pour les images
57 79 Etienne Pallier
58 38 Etienne Pallier
  * Coding style: https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/coding-style
59 81 Etienne Pallier
60 82 Etienne Pallier
  * Doc : *https://docs.djangoproject.com/fr (EN FRANCAIS)*
61 1 Etienne Pallier
62 82 Etienne Pallier
   * https://docs.djangoproject.com (EN)
63 82 Etienne Pallier
   * http://www.django-fr.org/planete
64 72 Etienne Pallier
   * https://docs.djangoproject.com/en/1.9/howto/deployment
65 72 Etienne Pallier
   * test fixtures : https://docs.djangoproject.com/en/1.9/howto/initial-data/
66 72 Etienne Pallier
   * managing static files: https://docs.djangoproject.com/en/1.9/howto/static-files/
67 72 Etienne Pallier
   * deploying static files: https://docs.djangoproject.com/en/1.9/howto/static-files/deployment/
68 72 Etienne Pallier
   * install on Windows: https://docs.djangoproject.com/en/1.9/howto/windows/
69 72 Etienne Pallier
   * writing migrations: https://docs.djangoproject.com/en/1.9/howto/writing-migrations/
70 72 Etienne Pallier
   * migrations : https://docs.djangoproject.com/en/1.9/topics/migrations/
71 72 Etienne Pallier
   * Django settings: https://docs.djangoproject.com/en/1.9/topics/settings/
72 1 Etienne Pallier
   * Testing: https://docs.djangoproject.com/en/1.9/topics/testing/
73 72 Etienne Pallier
   * User authentication: https://docs.djangoproject.com/en/1.9/topics/auth/
74 72 Etienne Pallier
75 82 Etienne Pallier
  * Autres ressources:
76 82 Etienne Pallier
77 82 Etienne Pallier
   * django-admin command: https://docs.djangoproject.com/en/1.9/ref/django-admin
78 82 Etienne Pallier
   * http://stackoverflow.com/questions/tagged/django
79 82 Etienne Pallier
   * https://www.djangopackages.com/
80 82 Etienne Pallier
   * http://forum.django-fr.org
81 82 Etienne Pallier
   * La mailing list : django@lists.afpy.org
82 44 Etienne Pallier
83 44 Etienne Pallier
84 72 Etienne Pallier
 * Image processing with Python : https://pillow.readthedocs.org/en/latest/handbook/overview.html
85 4 Etienne Pallier
86 4 Etienne Pallier
 * Git docs: 
87 19 Etienne Pallier
88 4 Etienne Pallier
  * Permissions gitlab: https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/permissions/permissions.md
89 4 Etienne Pallier
  * https://git-scm.com/docs
90 4 Etienne Pallier
  * https://git-scm.com/book/fr/v1/Les-bases-de-Git-Travailler-avec-des-d%C3%A9p%C3%B4ts-distants
91 4 Etienne Pallier
  * les workflows: https://aresu.dsi.cnrs.fr/spip.php?article219
92 15 Etienne Pallier
  * Git for Eclipse users : http://wiki.eclipse.org/EGit/Git_For_Eclipse_Users
93 4 Etienne Pallier
  * Git sur sourcesup (avec jenkins) : https://services.renater.fr/sourcesup/formation/chap04#gestion_d_un_projet_avec_git_jenkins_sonar_et_nexus
94 4 Etienne Pallier
95 4 Etienne Pallier
 * CADOR web interface: http://cador.obs-hp.fr/ros/manual/cador_actions.html
96 4 Etienne Pallier
97 4 Etienne Pallier
 * pylint (analyse de code) : https://www.pylint.org
98 4 Etienne Pallier
99 4 Etienne Pallier
 * pyreverse (uml diagrams generation, inclus dans pylint) : https://www.logilab.org/blogentry/6883
100 4 Etienne Pallier
101 4 Etienne Pallier
 * tox (a generic virtualenv management and test command line tool) : https://testrun.org/tox/latest/index.html
102 4 Etienne Pallier
103 5 Etienne Pallier
---
104 5 Etienne Pallier
105 5 Etienne Pallier
106 5 Etienne Pallier
---
107 5 Etienne Pallier
108 5 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}I - DATABASE SCHEMA (v0.2.1)%
109 5 Etienne Pallier
110 5 Etienne Pallier
111 6 Etienne Pallier
{{thumbnail(PYROS_PDM_v021.png, size=300, title=Pyros data model)}}
112 7 Etienne Pallier
113 6 Etienne Pallier
---
114 7 Etienne Pallier
115 6 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}II - Get the project (from gitlab)%
116 20 Etienne Pallier
117 20 Etienne Pallier
h3. Gitlab management interface
118 20 Etienne Pallier
119 20 Etienne Pallier
https://gitlab.irap.omp.eu/epallier/pyros
120 20 Etienne Pallier
121 20 Etienne Pallier
https://gitlab.irap.omp.eu/epallier/pyros/team
122 20 Etienne Pallier
123 6 Etienne Pallier
h3. Get the project
124 8 Etienne Pallier
125 8 Etienne Pallier
https://projects.irap.omp.eu/projects/pyros/wiki/Project_Installation#II-Get-the-project-from-gitlab
126 7 Etienne Pallier
127 7 Etienne Pallier
---
128 11 Etienne Pallier
129 11 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}III - INSTALLATION%
130 11 Etienne Pallier
131 11 Etienne Pallier
https://projects.irap.omp.eu/projects/pyros/wiki/Project_Installation#III-INSTALLATION
132 11 Etienne Pallier
133 11 Etienne Pallier
---
134 6 Etienne Pallier
135 6 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}IV - CONFIGURATION of the Django Back Office (administration interface)%
136 6 Etienne Pallier
137 6 Etienne Pallier
[[django_backoffice_config|Configuration of the Django Back office (admin)]]
138 9 Etienne Pallier
139 9 Etienne Pallier
---
140 13 Etienne Pallier
141 43 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}V - EVOLUTION OF THE PROJECT%
142 1 Etienne Pallier
143 43 Etienne Pallier
144 43 Etienne Pallier
145 43 Etienne Pallier
h3. Linking the User model to the django's one
146 43 Etienne Pallier
147 43 Etienne Pallier
* Modifications in models.py :
148 43 Etienne Pallier
149 43 Etienne Pallier
    * Rename User model to PyrosUser
150 43 Etienne Pallier
    * Rename user table name to pyros_user
151 43 Etienne Pallier
    * Change all occurences (User -> PyrosUser, users -> pyros_users, ...)
152 43 Etienne Pallier
    * from django.contrib.auth.models import User <== add at the beginning of the file
153 43 Etienne Pallier
    * user = models.OneToOneField(User, on_delete=models.CASCADE) <== add this field in PyrosUser declaration
154 43 Etienne Pallier
    * delete fields in PyrosUser : name, firstname, email, login, pass
155 43 Etienne Pallier
156 43 Etienne Pallier
* Modifications in admin.py :
157 43 Etienne Pallier
158 43 Etienne Pallier
    * Change all occurences (User* -> PyrosUser*, users -> pyros_users, ...)
159 43 Etienne Pallier
160 43 Etienne Pallier
<pre>
161 43 Etienne Pallier
$ python manage.py makemigrations pyrosapp
162 43 Etienne Pallier
$ python manage.py migrate
163 43 Etienne Pallier
</pre>
164 43 Etienne Pallier
165 43 Etienne Pallier
---
166 43 Etienne Pallier
167 43 Etienne Pallier
h3. Manage static files (for admin but also for each application)
168 41 Etienne Pallier
169 41 Etienne Pallier
./manage.py runserver
170 41 Etienne Pallier
171 41 Etienne Pallier
if DEBUG=False, we have errors, missing static files :
172 41 Etienne Pallier
173 41 Etienne Pallier
<pre>
174 41 Etienne Pallier
Not Found: /static/admin/css/base.css
175 41 Etienne Pallier
Not Found: /static/admin/css/login.css
176 41 Etienne Pallier
Not Found: /admin/login
177 41 Etienne Pallier
Not Found: /static/admin/css/base.css
178 41 Etienne Pallier
Not Found: /static/admin/css/login.css
179 41 Etienne Pallier
Not Found: /static/admin/css/base.css
180 41 Etienne Pallier
Not Found: /static/admin/css/login.css
181 41 Etienne Pallier
Not Found: /static/admin/css/base.css
182 41 Etienne Pallier
Not Found: /static/admin/css/dashboard.css
183 41 Etienne Pallier
Not Found: /static/admin/css/base.css
184 41 Etienne Pallier
Not Found: /static/admin/css/base.css
185 41 Etienne Pallier
186 41 Etienne Pallier
</pre>
187 41 Etienne Pallier
188 41 Etienne Pallier
189 41 Etienne Pallier
=> We have to activate the static files management
190 41 Etienne Pallier
191 41 Etienne Pallier
(see https://docs.djangoproject.com/en/1.9/howto/static-files)
192 41 Etienne Pallier
193 41 Etienne Pallier
In pyros/urls.py, add this:
194 41 Etienne Pallier
<pre>
195 41 Etienne Pallier
196 41 Etienne Pallier
from django.conf import settings
197 41 Etienne Pallier
from django.conf.urls.static import static
198 41 Etienne Pallier
199 41 Etienne Pallier
urlpatterns = [
200 41 Etienne Pallier
    url(r'^admin/', admin.site.urls),
201 41 Etienne Pallier
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
202 41 Etienne Pallier
</pre>
203 41 Etienne Pallier
204 41 Etienne Pallier
STATIC_ROOT must be defined in settings and says where is the root of all static files
205 41 Etienne Pallier
206 41 Etienne Pallier
Edit settings.py, add:
207 41 Etienne Pallier
<pre>
208 41 Etienne Pallier
STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'public', 'static')
209 41 Etienne Pallier
</pre>
210 41 Etienne Pallier
211 41 Etienne Pallier
212 41 Etienne Pallier
./manage.py collectstatic
213 41 Etienne Pallier
214 41 Etienne Pallier
=> 56 static files copied to '.../PYROS/public/static'
215 41 Etienne Pallier
216 41 Etienne Pallier
(in fact it is in public/static/admin/)
217 41 Etienne Pallier
218 41 Etienne Pallier
Cette commande copie tous les fichiers statiques de toutes les applis
219 41 Etienne Pallier
dans public/static
220 41 Etienne Pallier
221 41 Etienne Pallier
Apache viendra lire ce dossier unique
222 41 Etienne Pallier
223 41 Etienne Pallier
A chq changement d’un fichier statique d’une appli, exécuter « collectstatic » pour mettre à jour le dossier final public/static (auquel on ne doit pas toucher manuellement, c’est un dossier « final »)
224 41 Etienne Pallier
225 41 Etienne Pallier
226 39 Etienne Pallier
---
227 39 Etienne Pallier
228 45 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}DJANGO SHELL (top cool)%
229 45 Etienne Pallier
230 51 Etienne Pallier
cf page 60 for the ORM methods
231 51 Etienne Pallier
232 45 Etienne Pallier
<pre>
233 45 Etienne Pallier
./manage.py shell
234 45 Etienne Pallier
Python 3.5.1 (default, Mar  2 2016, 03:38:02) 
235 45 Etienne Pallier
(InteractiveConsole)
236 46 Etienne Pallier
237 45 Etienne Pallier
>>> import django
238 46 Etienne Pallier
239 45 Etienne Pallier
>>> from pyrosapp.models import *
240 46 Etienne Pallier
241 45 Etienne Pallier
>>> country = Country(name='mexico', quota=1)
242 45 Etienne Pallier
>>> country.save()
243 50 Etienne Pallier
(ajout si pas d’id, modif si id)
244 50 Etienne Pallier
245 45 Etienne Pallier
>>> country = Country(name='france')
246 45 Etienne Pallier
>>> country.save()
247 45 Etienne Pallier
>>> country.pk
248 45 Etienne Pallier
>>> 2
249 45 Etienne Pallier
250 45 Etienne Pallier
>>> countries = Country.objects.all()
251 45 Etienne Pallier
>>> countries.count
252 45 Etienne Pallier
>>> <bound method QuerySet.count of <Country: mexico>, <Country: france>>
253 45 Etienne Pallier
>>> countries.count()
254 45 Etienne Pallier
>>> 2
255 45 Etienne Pallier
>>> print(countries)
256 45 Etienne Pallier
>>> <Country: mexico>, <Country: france>
257 45 Etienne Pallier
>>> print(countries.query)
258 45 Etienne Pallier
>>> SELECT country.id, country.name, country.desc, country.quota FROM country
259 45 Etienne Pallier
260 45 Etienne Pallier
>>> cs = countries.filter(name__icontains='fran')
261 45 Etienne Pallier
>>> print(cs)
262 45 Etienne Pallier
>>> <Country: france>
263 45 Etienne Pallier
264 45 Etienne Pallier
>>> cs = countries.filter(name__startswith='me')
265 45 Etienne Pallier
>>> print(cs)
266 45 Etienne Pallier
>>> <Country: mexico>
267 45 Etienne Pallier
268 45 Etienne Pallier
</pre>
269 45 Etienne Pallier
270 45 Etienne Pallier
271 45 Etienne Pallier
---
272 45 Etienne Pallier
273 47 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}HOWTO (divers)%
274 47 Etienne Pallier
275 64 Etienne Pallier
h3. Models
276 1 Etienne Pallier
277 64 Etienne Pallier
1) Relationships between models (1-1, 1-N, N-M) (p55)
278 1 Etienne Pallier
279 61 Etienne Pallier
models.ManyToManyField : représente une relation de type N-N
280 61 Etienne Pallier
(peu importe de quel côté on le déclare)
281 1 Etienne Pallier
282 61 Etienne Pallier
models.OneToOneField : attention, le sens est important, on n’accèdera d’une table à l’autre que dans un sens
283 48 Etienne Pallier
284 61 Etienne Pallier
task <=> user
285 61 Etienne Pallier
task.user
286 1 Etienne Pallier
user.task_set
287 64 Etienne Pallier
288 64 Etienne Pallier
2) Quelques options pour les champs
289 64 Etienne Pallier
290 64 Etienne Pallier
Chaque type de champ possède ses propres propriétés. Cependant, certaines sont communes et souvent utilisées comme :
291 64 Etienne Pallier
292 64 Etienne Pallier
    verbose_name: label du champ
293 64 Etienne Pallier
    null : valeur NULL autorisée ou non en base de données
294 64 Etienne Pallier
    blank : valeur vide autorisée lors de la validation du champ dans un formulaire
295 64 Etienne Pallier
    default : valeur par défaut pour une nouvelle instance
296 64 Etienne Pallier
    editable : le champ doit-il apparaître automatiquement dans les formulaires
297 64 Etienne Pallier
    ...
298 64 Etienne Pallier
299 64 Etienne Pallier
300 64 Etienne Pallier
301 47 Etienne Pallier
302 47 Etienne Pallier
h3. Pour relier une appli python pure à un projet django :
303 47 Etienne Pallier
304 47 Etienne Pallier
=> Ajouter le src/ dans le pythonpath
305 47 Etienne Pallier
306 47 Etienne Pallier
307 47 Etienne Pallier
h3. Séparer le code métier :
308 47 Etienne Pallier
309 47 Etienne Pallier
=> installer le code métier comme un module via pip
310 47 Etienne Pallier
Couches :
311 47 Etienne Pallier
* présentation
312 47 Etienne Pallier
* métier
313 47 Etienne Pallier
* modèle
314 47 Etienne Pallier
315 49 Etienne Pallier
h3. ORM
316 49 Etienne Pallier
317 49 Etienne Pallier
(cf page 60)
318 49 Etienne Pallier
319 59 Etienne Pallier
<pre>
320 73 Etienne Pallier
b = Book(name='Two scoops of django',
321 73 Etienne Pallier
             release=date(2013, 08, 31))
322 1 Etienne Pallier
b.save()
323 73 Etienne Pallier
=> ajout car pas d’id, 
324 73 Etienne Pallier
325 74 Etienne Pallier
b.name ='Two scoops of django - Best practices'
326 74 Etienne Pallier
b.save()
327 1 Etienne Pallier
=> modif car il y a un id
328 74 Etienne Pallier
329 74 Etienne Pallier
b.delete()
330 1 Etienne Pallier
331 75 Etienne Pallier
Toutes les instances:
332 49 Etienne Pallier
Book.objects.all()
333 49 Etienne Pallier
334 75 Etienne Pallier
Liste filtrée:
335 59 Etienne Pallier
books = Book.objects.filter(
336 49 Etienne Pallier
        release__gte=date(2013, 01, 01)
337 49 Etienne Pallier
      ).exclude(
338 49 Etienne Pallier
        borrowed=True
339 49 Etienne Pallier
      )
340 49 Etienne Pallier
341 49 Etienne Pallier
A! La requete est exécutée le plus tard possible, seulement quand django a vraiment besoin de l’exécuter
342 49 Etienne Pallier
343 75 Etienne Pallier
Liste ordonnée:
344 49 Etienne Pallier
books = Book.objects.exclude(borrowed=True).order_by('title')
345 49 Etienne Pallier
print (books.author)
346 49 Etienne Pallier
347 75 Etienne Pallier
Une instance précise:
348 49 Etienne Pallier
Book.objects.get(pk=12)
349 49 Etienne Pallier
350 77 Etienne Pallier
</pre>
351 75 Etienne Pallier
352 77 Etienne Pallier
353 75 Etienne Pallier
Liens vers objets associés:
354 1 Etienne Pallier
355 1 Etienne Pallier
Retrouver les livres disponibles d'un auteur :
356 77 Etienne Pallier
>> author = Author.objects.get(pk=25)
357 77 Etienne Pallier
>> author.books.filter(borrowed=False)
358 1 Etienne Pallier
(books est le related name déclaré dans la relation manytomany)
359 1 Etienne Pallier
360 1 Etienne Pallier
361 77 Etienne Pallier
362 75 Etienne Pallier
Ajouter un livre à une catégorie :
363 77 Etienne Pallier
>> category = Category.objects.get(pk=5)
364 77 Etienne Pallier
>> book = Book.objects.get(pk=12)
365 77 Etienne Pallier
>> category.books.add(book)
366 75 Etienne Pallier
367 75 Etienne Pallier
Supprimer l'association de livres à une catégorie :
368 77 Etienne Pallier
>> category = Category.objects.get(pk=5)
369 77 Etienne Pallier
>> category.books.clear()
370 47 Etienne Pallier
371 47 Etienne Pallier
---
372 53 Etienne Pallier
373 53 Etienne Pallier
h3. Serveur Web
374 53 Etienne Pallier
375 53 Etienne Pallier
Apache : gère tous les fichiers statiques (images, html…), et délègue les fichiers python au serveur django
376 53 Etienne Pallier
377 53 Etienne Pallier
Moteur web django sera soit du wsgi soit du unicorn
378 53 Etienne Pallier
Par défaut, 1 seul worker, mais on peut en configurer plusieurs,
379 53 Etienne Pallier
l’idéal étant de faire nb coeurs + 1 (le worker maître qui fait le dispatching aux autres)
380 53 Etienne Pallier
381 53 Etienne Pallier
Frontend : Apache ou Ngininx
382 53 Etienne Pallier
Backend : gunicorn (gère facilement des workers) ou uwsgi
383 53 Etienne Pallier
384 53 Etienne Pallier
==> gunicorn library.wsgi
385 53 Etienne Pallier
(à la place de manage runserver ==> A EVITER EN PROD)
386 53 Etienne Pallier
387 53 Etienne Pallier
pip install gunicorn
388 53 Etienne Pallier
389 53 Etienne Pallier
gunicorn library.wsgi
390 53 Etienne Pallier
ou
391 53 Etienne Pallier
gunicorn - - workers 5 library.wsgi
392 53 Etienne Pallier
393 53 Etienne Pallier
(gunicorn == tomcat, serveur d’appli Python)
394 53 Etienne Pallier
395 53 Etienne Pallier
1) URL arrive à Apache, qui dispatche (il gère seul les fichiers statiques, et les fichiers python il les transmet à Django)
396 53 Etienne Pallier
2) le fichier library/urls.py prend le relai pour tout ce qui est django
397 53 Etienne Pallier
398 65 Etienne Pallier
399 65 Etienne Pallier
*On peut ajouter un fichier urls.py pour gérer les urls de l’appli
400 65 Etienne Pallier
(on garde le urls.py général du projet pour gérer les grandes urls):*
401 65 Etienne Pallier
402 1 Etienne Pallier
403 66 Etienne Pallier
<pre>
404 66 Etienne Pallier
Déclaration d'une URL
405 65 Etienne Pallier
406 65 Etienne Pallier
# books/urls.py
407 65 Etienne Pallier
from django.conf.urls import patterns, include, url
408 65 Etienne Pallier
urlpatterns = [
409 65 Etienne Pallier
    url(r'^book_list$', 'books.views.book_list', name='book_list'),
410 65 Etienne Pallier
]
411 65 Etienne Pallier
412 65 Etienne Pallier
Inclusion des URLs de l'application au projet
413 65 Etienne Pallier
414 65 Etienne Pallier
# library/urls.py
415 65 Etienne Pallier
...
416 65 Etienne Pallier
urlpatterns = [
417 65 Etienne Pallier
    ...
418 65 Etienne Pallier
    url(r'^books/', include('books.urls', namespace='books')),
419 1 Etienne Pallier
]
420 60 Etienne Pallier
421 60 Etienne Pallier
</pre>
422 60 Etienne Pallier
423 60 Etienne Pallier
h3. MTV design pattern
424 60 Etienne Pallier
425 60 Etienne Pallier
426 60 Etienne Pallier
MTV == MVC :
427 60 Etienne Pallier
428 60 Etienne Pallier
Model = Model
429 60 Etienne Pallier
Template = View
430 60 Etienne Pallier
View = Controller
431 60 Etienne Pallier
432 60 Etienne Pallier
433 60 Etienne Pallier
CREATION DE LA VUE (en fait, le controleur) : slide 23
434 60 Etienne Pallier
views.py = CONTROLEUR
435 60 Etienne Pallier
436 60 Etienne Pallier
437 60 Etienne Pallier
Template = LA VUE (slide 24)
438 60 Etienne Pallier
(on peut user Jinja à la place du moteur django par défaut)
439 60 Etienne Pallier
440 60 Etienne Pallier
Dans chq appli, on crée un dossier templates/ et un sous-dossier du nom de l’appli/
441 60 Etienne Pallier
(==> todo/templates/todo/)
442 60 Etienne Pallier
443 60 Etienne Pallier
Même principe pour les fichiers statiques :
444 60 Etienne Pallier
src/static/appli1, appli2, appli3…
445 60 Etienne Pallier
446 60 Etienne Pallier
NOMENCLATURE template :
447 60 Etienne Pallier
nommodèle_action.html
448 60 Etienne Pallier
(ex: book_list.html)
449 60 Etienne Pallier
450 60 Etienne Pallier
*On pourrait tout mettre dans le urls.py du projet, MAIS c’est mieux
451 60 Etienne Pallier
de créer un fichier urls.py PAR APPLI, puis de les inclure dans le fichier urls.py principal*
452 60 Etienne Pallier
453 60 Etienne Pallier
Class-based views ==> classes controleurs
454 60 Etienne Pallier
Les méthodes get() et post() sont déjà définies, et on peut les surcharger…
455 60 Etienne Pallier
456 60 Etienne Pallier
Avec un template (gabarit), on peut générer autre chose que du html,
457 60 Etienne Pallier
on peut par ex générer du texte, du pdf, un email, un xml…
458 60 Etienne Pallier
459 60 Etienne Pallier
460 60 Etienne Pallier
461 60 Etienne Pallier
Vue liste (et détail) :
462 60 Etienne Pallier
https://docs.djangoproject.com/fr/1.8/topics/class-based-views/generic-display/
463 60 Etienne Pallier
1) todo/views.py
464 60 Etienne Pallier
from django.views.generic import ListView
465 60 Etienne Pallier
from books.models import Publisher
466 60 Etienne Pallier
467 60 Etienne Pallier
class PublisherList(ListView):
468 60 Etienne Pallier
    model = Publisher
469 60 Etienne Pallier
470 60 Etienne Pallier
471 60 Etienne Pallier
2) todolist/urls.py
472 60 Etienne Pallier
from django.conf.urls import url
473 60 Etienne Pallier
from books.views import PublisherList
474 60 Etienne Pallier
475 60 Etienne Pallier
urlpatterns = [
476 60 Etienne Pallier
    url(r'^publishers/$', PublisherList.as_view()),
477 60 Etienne Pallier
]
478 60 Etienne Pallier
479 60 Etienne Pallier
3) todo/templates/todo/
480 60 Etienne Pallier
481 60 Etienne Pallier
482 60 Etienne Pallier
483 60 Etienne Pallier
- Vue Liste : par défaut le template reçoit un objet « objects_list »
484 53 Etienne Pallier
- Vue détail : object (on peut faire object.pk, …)
485 53 Etienne Pallier
486 53 Etienne Pallier
487 53 Etienne Pallier
488 53 Etienne Pallier
---
489 40 Etienne Pallier
490 6 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}INSTALLATION FROM THE BEGINNING (for dev only, history of the initial project creation)%
491 6 Etienne Pallier
492 1 Etienne Pallier
493 1 Etienne Pallier
[[pyros_install_from_start|Pyros installation from the beginning]]