Project Development

Version 164 (Etienne Pallier, 11/16/2016 09:46 am)

1 1 Etienne Pallier
h1. Project Development
2 2 Etienne Pallier
3 1 Etienne Pallier
4 143 Etienne Pallier
This page describes the development process, and some useful tools.
5 2 Etienne Pallier
6 2 Etienne Pallier
7 145 Etienne Pallier
{{>toc}}
8 145 Etienne Pallier
9 145 Etienne Pallier
10 145 Etienne Pallier
---
11 145 Etienne Pallier
12 145 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}USEFUL LINKS%
13 145 Etienne Pallier
14 145 Etienne Pallier
15 163 Jeremy Barneron
* Django.test Client : https://docs.djangoproject.com/fr/1.10/topics/testing/tools/
16 163 Jeremy Barneron
17 158 Etienne Pallier
* Pyros Demo online (intranet) : http://hyperion2.irap.omp.eu:8000/routine_manager/
18 158 Etienne Pallier
19 143 Etienne Pallier
* I-notify: http://linuxfr.org/news/exploiter-inotify-c-est-simple
20 84 Paul Carensac
21 143 Etienne Pallier
* Project Installation page : [[Project Installation]]
22 1 Etienne Pallier
23 143 Etienne Pallier
* HOWTO Format Redmine Wiki : http://www.redmine.org/projects/redmine/wiki/FrRedmineWikiFormatting
24 1 Etienne Pallier
25 143 Etienne Pallier
* Project's applications : [[Pyros applications]]
26 103 Etienne Pallier
27 143 Etienne Pallier
* Technical components : [[Technical components]]
28 1 Etienne Pallier
29 102 Etienne Pallier
* History of commits : https://gitlab.irap.omp.eu/epallier/pyros/commits/master
30 143 Etienne Pallier
31 130 Etienne Pallier
* OLD pyros version doc (Alexandru) : https://projects.irap.omp.eu/projects/gft/wiki/Documentation_technique_projet
32 130 Etienne Pallier
33 143 Etienne Pallier
34 143 Etienne Pallier
35 143 Etienne Pallier
36 2 Etienne Pallier
37 2 Etienne Pallier
38 2 Etienne Pallier
---
39 3 Etienne Pallier
40 112 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}TODO LIST%
41 112 Etienne Pallier
42 164 Etienne Pallier
[[TODO]]
43 117 Etienne Pallier
44 125 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}PLAN OF WORK (ROADMAP)%
45 122 Etienne Pallier
46 1 Etienne Pallier
47 133 Etienne Pallier
Le stage se déroule du 14 mars au 12 aout, soit environ 5 mois, soit exactement 22 semaines (S1 à S22), ou 44 demi-semaines.
48 132 Etienne Pallier
_*(Ne pas oublier de rédiger le rapport de stage au fur et à mesure)*_
49 132 Etienne Pallier
50 132 Etienne Pallier
Voir le détail de la roadmap: https://projects.irap.omp.eu/projects/inventirap/roadmap
51 132 Etienne Pallier
52 128 Etienne Pallier
All steps below are to be understood with included refactoring, testing, and documenting (in code and on wiki),
53 128 Etienne Pallier
and updating of the Dashboard module
54 1 Etienne Pallier
55 126 Etienne Pallier
* Full Workflow based on Celery (starting from alert reception and until analysis) : 1 week
56 1 Etienne Pallier
57 128 Etienne Pallier
* AlertManager + RequestBuilder : 2-3 weeks
58 128 Etienne Pallier
59 126 Etienne Pallier
* Scheduler (to be integrated in this new architecture, and completed) : 1 week
60 124 Etienne Pallier
61 1 Etienne Pallier
* RoutineManager (+ RequestBuilder) : 2-3 weeks
62 124 Etienne Pallier
63 129 Etienne Pallier
* ObservationManager : 2-3 weeks
64 1 Etienne Pallier
65 124 Etienne Pallier
* AnalysisManager: 2 weeks
66 129 Etienne Pallier
67 1 Etienne Pallier
* Environment Monitoring : observation conditions, weather, site (PLC), and instruments status : 2 weeks
68 132 Etienne Pallier
69 132 Etienne Pallier
70 132 Etienne Pallier
71 132 Etienne Pallier
72 132 Etienne Pallier
|                    |  |_.Prévu |_.Réalisé |
73 135 Etienne Pallier
|/2=.S01 (14/3-18/3) |.1|/2=<."Version 0.1 - wiki + git + easy install (from script)":https://projects.irap.omp.eu/versions/53|/2=<.version 1.1|
74 132 Etienne Pallier
                     |.2|
75 135 Etienne Pallier
|/2=.S02 (21/3-25/3) |.1|/42=<."Version 0.2 - wiki + git + easy install (from script)":https://projects.irap.omp.eu/versions/53|_/42=<.version 0.2 (en cours...)|
76 132 Etienne Pallier
                     |.2|
77 135 Etienne Pallier
|/2=.S03 (28/3-01/4) |.1|
78 132 Etienne Pallier
                     |.2|
79 135 Etienne Pallier
|/2=.S04 (04/4-08/4) |.1|
80 132 Etienne Pallier
                     |.2|
81 135 Etienne Pallier
|/2=.S05 (11/4-15/4) |.1|
82 132 Etienne Pallier
                     |.2|
83 132 Etienne Pallier
|/2=.S06 (18/4-22/4) |.1|
84 135 Etienne Pallier
                     |.2|
85 132 Etienne Pallier
|/2=.S07 (25/4-29/4) |.1|
86 132 Etienne Pallier
                     |.2|
87 132 Etienne Pallier
|/2=.S08 (02/5-06/5) |.1|
88 135 Etienne Pallier
                     |.2|
89 139 Etienne Pallier
|/2=.S09 (09/5-13/5) |.1|
90 135 Etienne Pallier
                     |.2|
91 140 Etienne Pallier
|/2=.S10 (16/5-20/5) |.1|
92 132 Etienne Pallier
                     |.2|
93 141 Etienne Pallier
|/2=.S11 (23/5-27/5) |.1|
94 132 Etienne Pallier
                     |.2|
95 151 Etienne Pallier
|/2=.S12 (30/5-03/6) |.1|
96 135 Etienne Pallier
                     |.2|
97 134 Etienne Pallier
|/2=.S13 (06/6-10/6) |.1|
98 1 Etienne Pallier
                     |.2|
99 151 Etienne Pallier
|_/2=.S14 (13/6-17/6) |.1|
100 1 Etienne Pallier
                     |.2|
101 134 Etienne Pallier
|/2=.S15 (20/6-24/6) |.1|
102 134 Etienne Pallier
                     |.2|
103 134 Etienne Pallier
|/2=.S16 (27/6-01/7) |.1|
104 134 Etienne Pallier
                     |.2|
105 134 Etienne Pallier
|/2=.S17 (04/7-08/7) |.1|
106 134 Etienne Pallier
                     |.2|
107 134 Etienne Pallier
|/2=.S18 (11/7-15/7) |.1|
108 134 Etienne Pallier
                     |.2|
109 134 Etienne Pallier
|/2=.S19 (18/7-22/7) |.1|
110 134 Etienne Pallier
                     |.2|
111 134 Etienne Pallier
|/2=.S20 (25/7-29/7) |.1|
112 134 Etienne Pallier
                     |.2|
113 134 Etienne Pallier
|/2=.S21 (01/8-05/8) |.1|
114 134 Etienne Pallier
                     |.2|
115 134 Etienne Pallier
|/2=.S22 (08/8-12/8) |.1|
116 134 Etienne Pallier
                     |.2|
117 132 Etienne Pallier
118 132 Etienne Pallier
119 136 Etienne Pallier
120 132 Etienne Pallier
---
121 136 Etienne Pallier
122 136 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}COMMIT PROCEDURE%
123 136 Etienne Pallier
124 136 Etienne Pallier
125 136 Etienne Pallier
Voici les différentes étapes à respecter au moment de chaque commit:
126 136 Etienne Pallier
127 136 Etienne Pallier
*1) S'assurer que tous les tests passent toujours...*
128 136 Etienne Pallier
129 153 Etienne Pallier
*2) Mettre à jour la version du ou des module(s) modifié(s)*
130 153 Etienne Pallier
(dans pyros/settings.py)
131 1 Etienne Pallier
132 152 Etienne Pallier
*3) Mettre à jour le fichier README (ceci est un exemple, un template)*
133 152 Etienne Pallier
134 136 Etienne Pallier
Date: 11/05/2016
135 137 Etienne Pallier
Version: 0.2.9
136 136 Etienne Pallier
Mise à jour doc install
137 136 Etienne Pallier
(Attention, changement structure BDD)
138 136 Etienne Pallier
Demande (terminée): https://projects.irap.omp.eu/issues/3542
139 137 Etienne Pallier
Version majeure en cours (0.2): https://projects.irap.omp.eu/versions/101
140 136 Etienne Pallier
141 136 Etienne Pallier
Remarques:
142 137 Etienne Pallier
=> Version: 0.2.9 = 9ème commit sur la version 0.2
143 136 Etienne Pallier
=> préciser "(bugfix)" si c'est le cas
144 136 Etienne Pallier
=> ajouter "(Attention, changement structure BDD)" s'il y a eu une modif de la BDD
145 136 Etienne Pallier
=> "Demande (terminée)" ou "Demande (en cours)", ou pas de demande du tout (exceptionnellement)
146 136 Etienne Pallier
=> ces infos permettront de savoir quelle version (et date) exacte du projet on a actuellement sur son disque
147 1 Etienne Pallier
148 136 Etienne Pallier
149 152 Etienne Pallier
*[4) Si c'est la fin d'une version majeure (0.1, 0.2, 0.3, ...)]*
150 136 Etienne Pallier
151 136 Etienne Pallier
* On doit normalement avoir écrit quelques nouveaux tests pour cette version !!!
152 136 Etienne Pallier
* Ajouter cette version en tête de la section "MAIN CHANGES (MILESTONES)" dans le fichier README
153 136 Etienne Pallier
* Mettre à jour la doc install/INSTALLATION à partir du wiki (si nécessaire)
154 1 Etienne Pallier
* Tester une installation du logiciel from scratch 
155 136 Etienne Pallier
156 136 Etienne Pallier
157 152 Etienne Pallier
*5) pull*
158 1 Etienne Pallier
159 136 Etienne Pallier
(au cas où quelqu'un d'autre aurait fait un push)
160 136 Etienne Pallier
161 136 Etienne Pallier
162 152 Etienne Pallier
*6) commit*
163 136 Etienne Pallier
164 136 Etienne Pallier
Reprendre dans le message de commit, faire un simple copier/coller des infos du fichier README (sauf date):
165 136 Etienne Pallier
166 136 Etienne Pallier
Version: 0.2.9
167 1 Etienne Pallier
Mise à jour doc install (bugfix)
168 136 Etienne Pallier
Demande (terminée): https://projects.irap.omp.eu/issues/3542
169 138 Etienne Pallier
Version majeure en cours (0.2): https://projects.irap.omp.eu/versions/101
170 136 Etienne Pallier
171 136 Etienne Pallier
172 152 Etienne Pallier
*[7) push]*
173 136 Etienne Pallier
174 136 Etienne Pallier
(seulement si le commit est important/urgent, ou suite à un ensemble de commits sur un même thème)
175 136 Etienne Pallier
176 122 Etienne Pallier
177 100 Etienne Pallier
---
178 3 Etienne Pallier
179 1 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}DOCUMENTS%
180 1 Etienne Pallier
181 1 Etienne Pallier
182 101 Etienne Pallier
183 146 Etienne Pallier
* Module Planner (Scheduler) : https://projects.irap.omp.eu/attachments/download/2607/IRAP-OFT-CC-SP-0007.pdf
184 146 Etienne Pallier
185 146 Etienne Pallier
186 148 Etienne Pallier
* DOC Paul: https://drive.google.com/folderview?id=0BzmdbXGIqXXMQ3JMTWRyakJyVVU&usp=sharing_eid&ts=571a3c9d
187 148 Etienne Pallier
188 146 Etienne Pallier
* Grammaire (workflow pseudo code): https://docs.google.com/document/d/1wG8Ha8xzEiRdA1I76sN9Te4Gq2ehq48SzFjSTaYRhfA/edit
189 57 Etienne Pallier
190 56 Etienne Pallier
191 24 Etienne Pallier
---
192 3 Etienne Pallier
193 144 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}OTHER USEFUL LINKS%
194 105 Etienne Pallier
195 105 Etienne Pallier
 * CADOR (A Klotz):
196 105 Etienne Pallier
197 106 Etienne Pallier
  * CADOR (portail de tous les telescopes) : http://cador.obs-hp.fr/ros/manual/cador_actions.html
198 106 Etienne Pallier
(click on "Manage", "CGI", or "Majordome")
199 106 Etienne Pallier
(or click on "Sequenced scenes" 1-5, each one is relative to a telescope underneath)
200 107 Etienne Pallier
(or click on "Rejected scenes" 1-5)
201 108 Etienne Pallier
  * Requests list: http://cador.obs-hp.fr/ros/manage/manage/liste_requete.php?hashuser=mdhxdjfu2scsrnfy2ry9
202 110 Etienne Pallier
  * Accès manuel: http://cador.obs-hp.fr/ros/manual
203 111 Etienne Pallier
  * Liste des scenes (sequences) TO BE PLANNED: http://cador.obs-hp.fr/ros/scenes_cador.php
204 70 Etienne Pallier
  * Historique des plannings : http://cador.obs-hp.fr/ros/sequenced/
205 119 Etienne Pallier
206 149 Etienne Pallier
 * VOEvent:
207 150 Etienne Pallier
208 149 Etienne Pallier
  * Protocole VTP: http://wiki.ivoa.net/twiki/bin/view/IVOA/VTPRFC
209 149 Etienne Pallier
210 119 Etienne Pallier
 * Celery: http://celery.readthedocs.org/en/latest/getting-started/first-steps-with-celery.html#first-steps
211 120 Etienne Pallier
212 121 Etienne Pallier
 * Created new user 'pyros' with password 'DjangoPyros'
213 70 Etienne Pallier
214 4 Etienne Pallier
 * pyrossu : pyrossu!
215 86 Etienne Pallier
216 86 Etienne Pallier
 * Alexandru work: https://projects.irap.omp.eu/projects/gft/wiki/Documentation_technique_projet#Fetch-the-project-from-github-via-git
217 71 Etienne Pallier
218 71 Etienne Pallier
 * readonly admin interface : https://gist.github.com/aaugustin/1388243
219 4 Etienne Pallier
220 4 Etienne Pallier
 * Liens vers web local :
221 4 Etienne Pallier
222 4 Etienne Pallier
  * homepage: http://localhost:8000
223 25 Etienne Pallier
  * admin: http://localhost:8000/admin
224 25 Etienne Pallier
225 26 Etienne Pallier
 * Eclipse:
226 26 Etienne Pallier
 
227 25 Etienne Pallier
  * Shift-Ctrl-f (ou Shift-Cmd-f) : reformatage du fichier selon PEP8
228 4 Etienne Pallier
  * Shift-Ctrl-1 : make doc string ...
229 4 Etienne Pallier
230 4 Etienne Pallier
 * Django:
231 80 Etienne Pallier
232 79 Etienne Pallier
  * Un répertoire de modules : https://www.djangopackages.com/
233 1 Etienne Pallier
  * Extensions
234 1 Etienne Pallier
235 83 Etienne Pallier
   * *django_jenkins* : intégration à Jenkins
236 83 Etienne Pallier
   * *factory_boy* : création de grappes de données pour les tests
237 83 Etienne Pallier
   
238 83 Etienne Pallier
    * https://factoryboy.readthedocs.org/en/latest/introduction.html
239 79 Etienne Pallier
    * https://factoryboy.readthedocs.org/en/latest/orms.html 
240 79 Etienne Pallier
241 79 Etienne Pallier
  * Modules très utilisés:
242 79 Etienne Pallier
243 79 Etienne Pallier
   * django_linaration_pagination : affichage de listes paginées
244 79 Etienne Pallier
   * django_sorting : affichage de tableaux triables
245 79 Etienne Pallier
   * django_breadcrumbs : création de fil d'ariane
246 79 Etienne Pallier
   * django_xworkflows : gestion de workflows
247 79 Etienne Pallier
   * easy_thumbnails : gestion de miniatures pour les images
248 38 Etienne Pallier
249 81 Etienne Pallier
  * Coding style: https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/coding-style
250 82 Etienne Pallier
251 1 Etienne Pallier
  * Doc : *https://docs.djangoproject.com/fr (EN FRANCAIS)*
252 82 Etienne Pallier
253 82 Etienne Pallier
   * https://docs.djangoproject.com (EN)
254 72 Etienne Pallier
   * http://www.django-fr.org/planete
255 72 Etienne Pallier
   * https://docs.djangoproject.com/en/1.9/howto/deployment
256 72 Etienne Pallier
   * test fixtures : https://docs.djangoproject.com/en/1.9/howto/initial-data/
257 72 Etienne Pallier
   * managing static files: https://docs.djangoproject.com/en/1.9/howto/static-files/
258 72 Etienne Pallier
   * deploying static files: https://docs.djangoproject.com/en/1.9/howto/static-files/deployment/
259 72 Etienne Pallier
   * install on Windows: https://docs.djangoproject.com/en/1.9/howto/windows/
260 72 Etienne Pallier
   * writing migrations: https://docs.djangoproject.com/en/1.9/howto/writing-migrations/
261 72 Etienne Pallier
   * migrations : https://docs.djangoproject.com/en/1.9/topics/migrations/
262 1 Etienne Pallier
   * Django settings: https://docs.djangoproject.com/en/1.9/topics/settings/
263 72 Etienne Pallier
   * Testing: https://docs.djangoproject.com/en/1.9/topics/testing/
264 72 Etienne Pallier
   * User authentication: https://docs.djangoproject.com/en/1.9/topics/auth/
265 82 Etienne Pallier
266 82 Etienne Pallier
  * Autres ressources:
267 82 Etienne Pallier
268 82 Etienne Pallier
   * django-admin command: https://docs.djangoproject.com/en/1.9/ref/django-admin
269 82 Etienne Pallier
   * http://stackoverflow.com/questions/tagged/django
270 82 Etienne Pallier
   * https://www.djangopackages.com/
271 82 Etienne Pallier
   * http://forum.django-fr.org
272 44 Etienne Pallier
   * La mailing list : django@lists.afpy.org
273 44 Etienne Pallier
274 72 Etienne Pallier
275 4 Etienne Pallier
 * Image processing with Python : https://pillow.readthedocs.org/en/latest/handbook/overview.html
276 4 Etienne Pallier
277 19 Etienne Pallier
 * Git docs: 
278 4 Etienne Pallier
279 131 Etienne Pallier
  * From svn: https://git-scm.com/course/svn.html
280 4 Etienne Pallier
  * Permissions gitlab: https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/permissions/permissions.md
281 4 Etienne Pallier
  * https://git-scm.com/docs
282 4 Etienne Pallier
  * https://git-scm.com/book/fr/v1/Les-bases-de-Git-Travailler-avec-des-d%C3%A9p%C3%B4ts-distants
283 15 Etienne Pallier
  * les workflows: https://aresu.dsi.cnrs.fr/spip.php?article219
284 4 Etienne Pallier
  * Git for Eclipse users : http://wiki.eclipse.org/EGit/Git_For_Eclipse_Users
285 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
286 4 Etienne Pallier
287 4 Etienne Pallier
 * CADOR web interface: http://cador.obs-hp.fr/ros/manual/cador_actions.html
288 4 Etienne Pallier
289 4 Etienne Pallier
 * pylint (analyse de code) : https://www.pylint.org
290 4 Etienne Pallier
291 4 Etienne Pallier
 * pyreverse (uml diagrams generation, inclus dans pylint) : https://www.logilab.org/blogentry/6883
292 4 Etienne Pallier
293 4 Etienne Pallier
 * tox (a generic virtualenv management and test command line tool) : https://testrun.org/tox/latest/index.html
294 5 Etienne Pallier
295 5 Etienne Pallier
---
296 5 Etienne Pallier
297 5 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}I - DATABASE SCHEMA (v0.2.1)%
298 5 Etienne Pallier
299 6 Etienne Pallier
300 7 Etienne Pallier
{{thumbnail(PYROS_PDM_v021.png, size=300, title=Pyros data model)}}
301 6 Etienne Pallier
302 7 Etienne Pallier
---
303 6 Etienne Pallier
304 20 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}II - Get the project (from gitlab)%
305 20 Etienne Pallier
306 20 Etienne Pallier
h3. Gitlab management interface
307 20 Etienne Pallier
308 20 Etienne Pallier
https://gitlab.irap.omp.eu/epallier/pyros
309 20 Etienne Pallier
310 20 Etienne Pallier
https://gitlab.irap.omp.eu/epallier/pyros/team
311 6 Etienne Pallier
312 8 Etienne Pallier
h3. Get the project
313 8 Etienne Pallier
314 7 Etienne Pallier
https://projects.irap.omp.eu/projects/pyros/wiki/Project_Installation#II-Get-the-project-from-gitlab
315 7 Etienne Pallier
316 11 Etienne Pallier
---
317 11 Etienne Pallier
318 11 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}III - INSTALLATION%
319 11 Etienne Pallier
320 11 Etienne Pallier
https://projects.irap.omp.eu/projects/pyros/wiki/Project_Installation#III-INSTALLATION
321 11 Etienne Pallier
322 6 Etienne Pallier
---
323 6 Etienne Pallier
324 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)%
325 6 Etienne Pallier
326 9 Etienne Pallier
[[django_backoffice_config|Configuration of the Django Back office (admin)]]
327 9 Etienne Pallier
328 13 Etienne Pallier
---
329 43 Etienne Pallier
330 1 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}V - EVOLUTION OF THE PROJECT%
331 43 Etienne Pallier
332 43 Etienne Pallier
333 43 Etienne Pallier
334 43 Etienne Pallier
h3. Linking the User model to the django's one
335 43 Etienne Pallier
336 43 Etienne Pallier
* Modifications in models.py :
337 43 Etienne Pallier
338 43 Etienne Pallier
    * Rename User model to PyrosUser
339 43 Etienne Pallier
    * Rename user table name to pyros_user
340 43 Etienne Pallier
    * Change all occurences (User -> PyrosUser, users -> pyros_users, ...)
341 43 Etienne Pallier
    * from django.contrib.auth.models import User <== add at the beginning of the file
342 43 Etienne Pallier
    * user = models.OneToOneField(User, on_delete=models.CASCADE) <== add this field in PyrosUser declaration
343 43 Etienne Pallier
    * delete fields in PyrosUser : name, firstname, email, login, pass
344 43 Etienne Pallier
345 43 Etienne Pallier
* Modifications in admin.py :
346 43 Etienne Pallier
347 43 Etienne Pallier
    * Change all occurences (User* -> PyrosUser*, users -> pyros_users, ...)
348 43 Etienne Pallier
349 43 Etienne Pallier
<pre>
350 43 Etienne Pallier
$ python manage.py makemigrations pyrosapp
351 43 Etienne Pallier
$ python manage.py migrate
352 43 Etienne Pallier
</pre>
353 43 Etienne Pallier
354 43 Etienne Pallier
---
355 43 Etienne Pallier
356 41 Etienne Pallier
h3. Manage static files (for admin but also for each application)
357 41 Etienne Pallier
358 41 Etienne Pallier
./manage.py runserver
359 41 Etienne Pallier
360 41 Etienne Pallier
if DEBUG=False, we have errors, missing static files :
361 41 Etienne Pallier
362 41 Etienne Pallier
<pre>
363 41 Etienne Pallier
Not Found: /static/admin/css/base.css
364 41 Etienne Pallier
Not Found: /static/admin/css/login.css
365 41 Etienne Pallier
Not Found: /admin/login
366 41 Etienne Pallier
Not Found: /static/admin/css/base.css
367 41 Etienne Pallier
Not Found: /static/admin/css/login.css
368 41 Etienne Pallier
Not Found: /static/admin/css/base.css
369 41 Etienne Pallier
Not Found: /static/admin/css/login.css
370 41 Etienne Pallier
Not Found: /static/admin/css/base.css
371 41 Etienne Pallier
Not Found: /static/admin/css/dashboard.css
372 41 Etienne Pallier
Not Found: /static/admin/css/base.css
373 41 Etienne Pallier
Not Found: /static/admin/css/base.css
374 41 Etienne Pallier
375 41 Etienne Pallier
</pre>
376 41 Etienne Pallier
377 41 Etienne Pallier
378 41 Etienne Pallier
=> We have to activate the static files management
379 41 Etienne Pallier
380 41 Etienne Pallier
(see https://docs.djangoproject.com/en/1.9/howto/static-files)
381 41 Etienne Pallier
382 41 Etienne Pallier
In pyros/urls.py, add this:
383 41 Etienne Pallier
<pre>
384 41 Etienne Pallier
385 41 Etienne Pallier
from django.conf import settings
386 41 Etienne Pallier
from django.conf.urls.static import static
387 41 Etienne Pallier
388 41 Etienne Pallier
urlpatterns = [
389 41 Etienne Pallier
    url(r'^admin/', admin.site.urls),
390 41 Etienne Pallier
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
391 41 Etienne Pallier
</pre>
392 41 Etienne Pallier
393 41 Etienne Pallier
STATIC_ROOT must be defined in settings and says where is the root of all static files
394 41 Etienne Pallier
395 41 Etienne Pallier
Edit settings.py, add:
396 41 Etienne Pallier
<pre>
397 41 Etienne Pallier
STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'public', 'static')
398 41 Etienne Pallier
</pre>
399 41 Etienne Pallier
400 41 Etienne Pallier
401 41 Etienne Pallier
./manage.py collectstatic
402 41 Etienne Pallier
403 41 Etienne Pallier
=> 56 static files copied to '.../PYROS/public/static'
404 41 Etienne Pallier
405 41 Etienne Pallier
(in fact it is in public/static/admin/)
406 41 Etienne Pallier
407 41 Etienne Pallier
Cette commande copie tous les fichiers statiques de toutes les applis
408 41 Etienne Pallier
dans public/static
409 41 Etienne Pallier
410 41 Etienne Pallier
Apache viendra lire ce dossier unique
411 41 Etienne Pallier
412 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 »)
413 41 Etienne Pallier
414 39 Etienne Pallier
415 39 Etienne Pallier
---
416 45 Etienne Pallier
417 45 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}DJANGO SHELL (top cool)%
418 51 Etienne Pallier
419 51 Etienne Pallier
cf page 60 for the ORM methods
420 45 Etienne Pallier
421 45 Etienne Pallier
<pre>
422 45 Etienne Pallier
./manage.py shell
423 45 Etienne Pallier
Python 3.5.1 (default, Mar  2 2016, 03:38:02) 
424 46 Etienne Pallier
(InteractiveConsole)
425 45 Etienne Pallier
426 46 Etienne Pallier
>>> import django
427 45 Etienne Pallier
428 46 Etienne Pallier
>>> from pyrosapp.models import *
429 45 Etienne Pallier
430 45 Etienne Pallier
>>> country = Country(name='mexico', quota=1)
431 50 Etienne Pallier
>>> country.save()
432 50 Etienne Pallier
(ajout si pas d’id, modif si id)
433 45 Etienne Pallier
434 45 Etienne Pallier
>>> country = Country(name='france')
435 45 Etienne Pallier
>>> country.save()
436 45 Etienne Pallier
>>> country.pk
437 45 Etienne Pallier
>>> 2
438 45 Etienne Pallier
439 45 Etienne Pallier
>>> countries = Country.objects.all()
440 45 Etienne Pallier
>>> countries.count
441 45 Etienne Pallier
>>> <bound method QuerySet.count of <Country: mexico>, <Country: france>>
442 45 Etienne Pallier
>>> countries.count()
443 45 Etienne Pallier
>>> 2
444 45 Etienne Pallier
>>> print(countries)
445 45 Etienne Pallier
>>> <Country: mexico>, <Country: france>
446 45 Etienne Pallier
>>> print(countries.query)
447 45 Etienne Pallier
>>> SELECT country.id, country.name, country.desc, country.quota FROM country
448 45 Etienne Pallier
449 45 Etienne Pallier
>>> cs = countries.filter(name__icontains='fran')
450 45 Etienne Pallier
>>> print(cs)
451 45 Etienne Pallier
>>> <Country: france>
452 45 Etienne Pallier
453 45 Etienne Pallier
>>> cs = countries.filter(name__startswith='me')
454 45 Etienne Pallier
>>> print(cs)
455 45 Etienne Pallier
>>> <Country: mexico>
456 45 Etienne Pallier
457 45 Etienne Pallier
</pre>
458 45 Etienne Pallier
459 45 Etienne Pallier
460 45 Etienne Pallier
---
461 47 Etienne Pallier
462 47 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}HOWTO (divers)%
463 64 Etienne Pallier
464 1 Etienne Pallier
h3. Models
465 64 Etienne Pallier
466 1 Etienne Pallier
1) Relationships between models (1-1, 1-N, N-M) (p55)
467 61 Etienne Pallier
468 61 Etienne Pallier
models.ManyToManyField : représente une relation de type N-N
469 1 Etienne Pallier
(peu importe de quel côté on le déclare)
470 61 Etienne Pallier
471 48 Etienne Pallier
models.OneToOneField : attention, le sens est important, on n’accèdera d’une table à l’autre que dans un sens
472 61 Etienne Pallier
473 61 Etienne Pallier
task <=> user
474 1 Etienne Pallier
task.user
475 64 Etienne Pallier
user.task_set
476 64 Etienne Pallier
477 64 Etienne Pallier
2) Quelques options pour les champs
478 64 Etienne Pallier
479 64 Etienne Pallier
Chaque type de champ possède ses propres propriétés. Cependant, certaines sont communes et souvent utilisées comme :
480 64 Etienne Pallier
481 64 Etienne Pallier
    verbose_name: label du champ
482 64 Etienne Pallier
    null : valeur NULL autorisée ou non en base de données
483 64 Etienne Pallier
    blank : valeur vide autorisée lors de la validation du champ dans un formulaire
484 64 Etienne Pallier
    default : valeur par défaut pour une nouvelle instance
485 64 Etienne Pallier
    editable : le champ doit-il apparaître automatiquement dans les formulaires
486 64 Etienne Pallier
    ...
487 64 Etienne Pallier
488 64 Etienne Pallier
489 47 Etienne Pallier
490 47 Etienne Pallier
491 47 Etienne Pallier
h3. Pour relier une appli python pure à un projet django :
492 47 Etienne Pallier
493 47 Etienne Pallier
=> Ajouter le src/ dans le pythonpath
494 47 Etienne Pallier
495 47 Etienne Pallier
496 47 Etienne Pallier
h3. Séparer le code métier :
497 47 Etienne Pallier
498 47 Etienne Pallier
=> installer le code métier comme un module via pip
499 47 Etienne Pallier
Couches :
500 47 Etienne Pallier
* présentation
501 47 Etienne Pallier
* métier
502 47 Etienne Pallier
* modèle
503 49 Etienne Pallier
504 49 Etienne Pallier
h3. ORM
505 49 Etienne Pallier
506 49 Etienne Pallier
(cf page 60)
507 59 Etienne Pallier
508 73 Etienne Pallier
<pre>
509 161 Etienne Pallier
510 161 Etienne Pallier
Exemple: Book
511 161 Etienne Pallier
===========================
512 161 Etienne Pallier
513 73 Etienne Pallier
b = Book(name='Two scoops of django',
514 1 Etienne Pallier
             release=date(2013, 08, 31))
515 73 Etienne Pallier
b.save()
516 73 Etienne Pallier
=> ajout car pas d’id, 
517 74 Etienne Pallier
518 74 Etienne Pallier
b.name ='Two scoops of django - Best practices'
519 1 Etienne Pallier
b.save()
520 74 Etienne Pallier
=> modif car il y a un id
521 74 Etienne Pallier
522 1 Etienne Pallier
b.delete()
523 75 Etienne Pallier
524 49 Etienne Pallier
Toutes les instances:
525 49 Etienne Pallier
Book.objects.all()
526 75 Etienne Pallier
527 59 Etienne Pallier
Liste filtrée:
528 49 Etienne Pallier
books = Book.objects.filter(
529 49 Etienne Pallier
        release__gte=date(2013, 01, 01)
530 49 Etienne Pallier
      ).exclude(
531 49 Etienne Pallier
        borrowed=True
532 49 Etienne Pallier
      )
533 1 Etienne Pallier
534 161 Etienne Pallier
Attention, la requete est exécutée le plus tard possible, seulement quand django a vraiment besoin de l’exécuter
535 75 Etienne Pallier
536 49 Etienne Pallier
Liste ordonnée:
537 49 Etienne Pallier
books = Book.objects.exclude(borrowed=True).order_by('title')
538 75 Etienne Pallier
print (books.author)
539 49 Etienne Pallier
540 77 Etienne Pallier
Une instance précise:
541 75 Etienne Pallier
Book.objects.get(pk=12)
542 77 Etienne Pallier
543 1 Etienne Pallier
544 1 Etienne Pallier
545 1 Etienne Pallier
546 162 Etienne Pallier
547 161 Etienne Pallier
Liens vers objets associés:
548 161 Etienne Pallier
===========================
549 161 Etienne Pallier
550 77 Etienne Pallier
Retrouver les livres disponibles d'un auteur :
551 77 Etienne Pallier
>> author = Author.objects.get(pk=25)
552 1 Etienne Pallier
>> author.books.filter(borrowed=False)
553 1 Etienne Pallier
(books est le related name déclaré dans la relation manytomany)
554 77 Etienne Pallier
555 75 Etienne Pallier
556 77 Etienne Pallier
Ajouter un livre à une catégorie :
557 77 Etienne Pallier
>> category = Category.objects.get(pk=5)
558 77 Etienne Pallier
>> book = Book.objects.get(pk=12)
559 75 Etienne Pallier
>> category.books.add(book)
560 75 Etienne Pallier
561 1 Etienne Pallier
Supprimer l'association de livres à une catégorie :
562 1 Etienne Pallier
>> category = Category.objects.get(pk=5)
563 77 Etienne Pallier
>> category.books.clear()
564 161 Etienne Pallier
565 161 Etienne Pallier
</pre>
566 47 Etienne Pallier
567 53 Etienne Pallier
---
568 53 Etienne Pallier
569 53 Etienne Pallier
h3. Serveur Web
570 104 Paul Carensac
571 157 Etienne Pallier
<pre>
572 157 Etienne Pallier
573 104 Paul Carensac
Passer sur le port 80 :
574 104 Paul Carensac
575 104 Paul Carensac
venv_py35_pyros ==> lib ==> python3.5 ==> site-packages ==> django ==> core ==> management ==> commands
576 104 Paul Carensac
Edit runserver.py and change "default_port"
577 104 Paul Carensac
578 53 Etienne Pallier
579 53 Etienne Pallier
Apache : gère tous les fichiers statiques (images, html…), et délègue les fichiers python au serveur django
580 53 Etienne Pallier
581 53 Etienne Pallier
Moteur web django sera soit du wsgi soit du unicorn
582 53 Etienne Pallier
Par défaut, 1 seul worker, mais on peut en configurer plusieurs,
583 53 Etienne Pallier
l’idéal étant de faire nb coeurs + 1 (le worker maître qui fait le dispatching aux autres)
584 53 Etienne Pallier
585 53 Etienne Pallier
Frontend : Apache ou Ngininx
586 53 Etienne Pallier
Backend : gunicorn (gère facilement des workers) ou uwsgi
587 53 Etienne Pallier
588 53 Etienne Pallier
==> gunicorn library.wsgi
589 53 Etienne Pallier
(à la place de manage runserver ==> A EVITER EN PROD)
590 53 Etienne Pallier
591 53 Etienne Pallier
pip install gunicorn
592 53 Etienne Pallier
593 53 Etienne Pallier
gunicorn library.wsgi
594 53 Etienne Pallier
ou
595 53 Etienne Pallier
gunicorn - - workers 5 library.wsgi
596 53 Etienne Pallier
597 156 Etienne Pallier
(gunicorn est un équivalent de tomcat, c'est un serveur d’appli Python)
598 53 Etienne Pallier
599 53 Etienne Pallier
1) URL arrive à Apache, qui dispatche (il gère seul les fichiers statiques, et les fichiers python il les transmet à Django)
600 53 Etienne Pallier
2) le fichier library/urls.py prend le relai pour tout ce qui est django
601 65 Etienne Pallier
602 65 Etienne Pallier
603 65 Etienne Pallier
*On peut ajouter un fichier urls.py pour gérer les urls de l’appli
604 65 Etienne Pallier
(on garde le urls.py général du projet pour gérer les grandes urls):*
605 157 Etienne Pallier
606 157 Etienne Pallier
</pre>
607 157 Etienne Pallier
608 1 Etienne Pallier
609 66 Etienne Pallier
610 66 Etienne Pallier
<pre>
611 65 Etienne Pallier
Déclaration d'une URL
612 65 Etienne Pallier
613 65 Etienne Pallier
# books/urls.py
614 65 Etienne Pallier
from django.conf.urls import patterns, include, url
615 65 Etienne Pallier
urlpatterns = [
616 65 Etienne Pallier
    url(r'^book_list$', 'books.views.book_list', name='book_list'),
617 65 Etienne Pallier
]
618 65 Etienne Pallier
619 65 Etienne Pallier
Inclusion des URLs de l'application au projet
620 65 Etienne Pallier
621 65 Etienne Pallier
# library/urls.py
622 65 Etienne Pallier
...
623 65 Etienne Pallier
urlpatterns = [
624 65 Etienne Pallier
    ...
625 1 Etienne Pallier
    url(r'^books/', include('books.urls', namespace='books')),
626 60 Etienne Pallier
]
627 60 Etienne Pallier
628 60 Etienne Pallier
</pre>
629 60 Etienne Pallier
630 60 Etienne Pallier
h3. MTV design pattern
631 60 Etienne Pallier
632 60 Etienne Pallier
633 60 Etienne Pallier
MTV == MVC :
634 60 Etienne Pallier
635 60 Etienne Pallier
Model = Model
636 60 Etienne Pallier
Template = View
637 60 Etienne Pallier
View = Controller
638 60 Etienne Pallier
639 60 Etienne Pallier
640 60 Etienne Pallier
CREATION DE LA VUE (en fait, le controleur) : slide 23
641 60 Etienne Pallier
views.py = CONTROLEUR
642 60 Etienne Pallier
643 60 Etienne Pallier
644 60 Etienne Pallier
Template = LA VUE (slide 24)
645 60 Etienne Pallier
(on peut user Jinja à la place du moteur django par défaut)
646 60 Etienne Pallier
647 60 Etienne Pallier
Dans chq appli, on crée un dossier templates/ et un sous-dossier du nom de l’appli/
648 60 Etienne Pallier
(==> todo/templates/todo/)
649 60 Etienne Pallier
650 60 Etienne Pallier
Même principe pour les fichiers statiques :
651 60 Etienne Pallier
src/static/appli1, appli2, appli3…
652 60 Etienne Pallier
653 60 Etienne Pallier
NOMENCLATURE template :
654 60 Etienne Pallier
nommodèle_action.html
655 60 Etienne Pallier
(ex: book_list.html)
656 60 Etienne Pallier
657 60 Etienne Pallier
*On pourrait tout mettre dans le urls.py du projet, MAIS c’est mieux
658 60 Etienne Pallier
de créer un fichier urls.py PAR APPLI, puis de les inclure dans le fichier urls.py principal*
659 60 Etienne Pallier
660 60 Etienne Pallier
Class-based views ==> classes controleurs
661 60 Etienne Pallier
Les méthodes get() et post() sont déjà définies, et on peut les surcharger…
662 60 Etienne Pallier
663 60 Etienne Pallier
Avec un template (gabarit), on peut générer autre chose que du html,
664 60 Etienne Pallier
on peut par ex générer du texte, du pdf, un email, un xml…
665 60 Etienne Pallier
666 60 Etienne Pallier
667 60 Etienne Pallier
668 60 Etienne Pallier
Vue liste (et détail) :
669 60 Etienne Pallier
https://docs.djangoproject.com/fr/1.8/topics/class-based-views/generic-display/
670 60 Etienne Pallier
1) todo/views.py
671 60 Etienne Pallier
from django.views.generic import ListView
672 60 Etienne Pallier
from books.models import Publisher
673 60 Etienne Pallier
674 60 Etienne Pallier
class PublisherList(ListView):
675 60 Etienne Pallier
    model = Publisher
676 60 Etienne Pallier
677 60 Etienne Pallier
678 60 Etienne Pallier
2) todolist/urls.py
679 60 Etienne Pallier
from django.conf.urls import url
680 60 Etienne Pallier
from books.views import PublisherList
681 60 Etienne Pallier
682 60 Etienne Pallier
urlpatterns = [
683 60 Etienne Pallier
    url(r'^publishers/$', PublisherList.as_view()),
684 60 Etienne Pallier
]
685 60 Etienne Pallier
686 60 Etienne Pallier
3) todo/templates/todo/
687 60 Etienne Pallier
688 60 Etienne Pallier
689 60 Etienne Pallier
690 53 Etienne Pallier
- Vue Liste : par défaut le template reçoit un objet « objects_list »
691 53 Etienne Pallier
- Vue détail : object (on peut faire object.pk, …)
692 53 Etienne Pallier
693 53 Etienne Pallier
694 53 Etienne Pallier
695 40 Etienne Pallier
---
696 87 Etienne Pallier
697 87 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}USEFUL TOOLS FOR DEV%
698 88 Etienne Pallier
699 159 Etienne Pallier
700 159 Etienne Pallier
701 159 Etienne Pallier
702 159 Etienne Pallier
---
703 159 Etienne Pallier
704 159 Etienne Pallier
h3. PlantUML
705 159 Etienne Pallier
706 159 Etienne Pallier
Pour créer des diagrammes UML à la volée, à partir d'un fichier texte, au fur et à mesure de la frappe
707 159 Etienne Pallier
708 159 Etienne Pallier
1) Installer le plugin : Menu Help/Install New Software... 
709 159 Etienne Pallier
710 159 Etienne Pallier
Entrer l'adresse suivante, et sélectionner PlantUML
711 159 Etienne Pallier
712 159 Etienne Pallier
http://plantuml.sourceforge.net/updatesitejuno/
713 159 Etienne Pallier
714 159 Etienne Pallier
715 159 Etienne Pallier
2) Ensuite, il faut aussi installer graphviz :
716 159 Etienne Pallier
717 159 Etienne Pallier
$ sudo apt-get install graphviz
718 159 Etienne Pallier
719 159 Etienne Pallier
(ou $ sudo yum install graphviz)
720 159 Etienne Pallier
721 159 Etienne Pallier
722 159 Etienne Pallier
3) Créer un graphique UML
723 159 Etienne Pallier
724 159 Etienne Pallier
Depuis Eclipse:
725 159 Etienne Pallier
726 159 Etienne Pallier
- Créer un fichier texte (voir exemple ci-dessous)
727 159 Etienne Pallier
728 159 Etienne Pallier
- Window/Show View/Other/Plantuml
729 159 Etienne Pallier
730 159 Etienne Pallier
=> le diagramme doit alors s'afficher
731 159 Etienne Pallier
732 159 Etienne Pallier
733 159 Etienne Pallier
734 159 Etienne Pallier
735 159 Etienne Pallier
736 88 Etienne Pallier
---
737 96 Etienne Pallier
738 95 Etienne Pallier
h3. Pyreverse (included in pylint) : useful for generating uml class diagrams
739 1 Etienne Pallier
740 96 Etienne Pallier
https://www.logilab.org/blogentry/6883
741 96 Etienne Pallier
742 96 Etienne Pallier
<pre>
743 96 Etienne Pallier
$ cd PYROS/
744 96 Etienne Pallier
745 96 Etienne Pallier
$ pyreverse -o png -p pyrosapp -a 1 -A src/pyrosapp/
746 96 Etienne Pallier
747 97 Etienne Pallier
$ pyreverse -o png -p pyrosapp -s 1 -S src/pyrosapp/
748 97 Etienne Pallier
749 96 Etienne Pallier
$ pyreverse -ASmy -k -o png -p pyrosappadmin src/pyrosapp/admin.py
750 1 Etienne Pallier
</pre>
751 99 Etienne Pallier
752 99 Etienne Pallier
{{thumbnail(classes_pyrosapp.png, size=300)}}
753 99 Etienne Pallier
{{thumbnail(classes_pyrosappadmin.png, size=300)}}
754 99 Etienne Pallier
{{thumbnail(classes_dashboard.png, size=300)}}
755 98 Etienne Pallier
756 98 Etienne Pallier
757 89 Etienne Pallier
h3. django-extensions and graphviz : useful for generating an image of all the models and their relationships
758 91 Etienne Pallier
759 89 Etienne Pallier
{{thumbnail(models.png, size=300, title=Pyros data model)}}
760 90 Etienne Pallier
761 89 Etienne Pallier
django-extensions: http://django-extensions.readthedocs.org/en/latest/installation_instructions.html
762 92 Etienne Pallier
763 92 Etienne Pallier
GraphViz (development) installation :
764 92 Etienne Pallier
765 92 Etienne Pallier
<pre>
766 92 Etienne Pallier
MacOS with macport:
767 92 Etienne Pallier
$ sudo port install graphviz-devel
768 92 Etienne Pallier
769 92 Etienne Pallier
Ubuntu:
770 92 Etienne Pallier
$ sudo apt-get install graphviz-dev
771 92 Etienne Pallier
772 92 Etienne Pallier
Windows:
773 92 Etienne Pallier
Download it
774 92 Etienne Pallier
</pre>
775 93 Etienne Pallier
776 1 Etienne Pallier
Python pygraphviz package installation:
777 92 Etienne Pallier
<pre>
778 1 Etienne Pallier
$ pip install pygraphviz
779 1 Etienne Pallier
=> errors on MacOS (using macport) : "fatal error: 'graphviz/cgraph.h' file not found"
780 93 Etienne Pallier
=> $ pip install --install-option="--include-path=/opt/local/include"  --install-option="--library-path=/opt/local/lib" pygraphviz
781 1 Etienne Pallier
</pre>
782 93 Etienne Pallier
783 93 Etienne Pallier
Python django-extensions package installation:
784 93 Etienne Pallier
<pre>
785 93 Etienne Pallier
$ pip install django-bootstrap3
786 93 Etienne Pallier
$ pip install django-extensions
787 93 Etienne Pallier
($ pip install --upgrade django-extensions)
788 92 Etienne Pallier
</pre>
789 93 Etienne Pallier
790 93 Etienne Pallier
Generate the image:
791 93 Etienne Pallier
<pre>
792 92 Etienne Pallier
$ cd src/
793 93 Etienne Pallier
$ python manage.py graph_models -a -g -o models.png
794 92 Etienne Pallier
</pre>
795 89 Etienne Pallier
796 89 Etienne Pallier
---
797 6 Etienne Pallier
798 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)%
799 1 Etienne Pallier
800 1 Etienne Pallier
801 1 Etienne Pallier
[[pyros_install_from_start|Pyros installation from the beginning]]