Project Development

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