Project Development

Version 152 (Etienne Pallier, 08/04/2016 03:44 pm)

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