Project Development

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