Project Development
Version 175 (Etienne Pallier, 10/03/2018 10:35 am)
1 | 1 | Etienne Pallier | h1. Project Development |
---|---|---|---|
2 | 2 | Etienne Pallier | |
3 | 1 | Etienne Pallier | |
4 | 143 | Etienne Pallier | This page describes the development process, and some useful tools. |
5 | 2 | Etienne Pallier | |
6 | 2 | Etienne Pallier | |
7 | 145 | Etienne Pallier | {{>toc}} |
8 | 145 | Etienne Pallier | |
9 | 145 | Etienne Pallier | |
10 | 145 | Etienne Pallier | --- |
11 | 145 | Etienne Pallier | |
12 | 145 | Etienne Pallier | h2. %{margin-left:0px; font-weight:bold; font-size:25px; display:block; color:red;}USEFUL LINKS% |
13 | 145 | Etienne Pallier | |
14 | 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 | 175 | Etienne Pallier | 1) Installer le plugin : |
748 | 1 | Etienne Pallier | |
749 | 1 | Etienne Pallier | |
750 | 175 | Etienne Pallier | (cf http://plantuml.com/eclipse) |
751 | 175 | Etienne Pallier | |
752 | 175 | Etienne Pallier | Menu Help/Install New Software... |
753 | 175 | Etienne Pallier | |
754 | 175 | Etienne Pallier | Entrer l'adresse suivante, et sélectionner/installer PlantUML |
755 | 175 | Etienne Pallier | |
756 | 175 | Etienne Pallier | http://hallvard.github.io/plantuml/ |
757 | 175 | Etienne Pallier | |
758 | 168 | Quentin Durand | |
759 | 168 | Quentin Durand | 2) Créer un graphique UML |
760 | 159 | Etienne Pallier | |
761 | 159 | Etienne Pallier | - Créer un fichier texte (voir exemple ci-dessous) |
762 | 159 | Etienne Pallier | |
763 | 159 | Etienne Pallier | - Window/Show View/Other/Plantuml |
764 | 159 | Etienne Pallier | |
765 | 159 | Etienne Pallier | => le diagramme doit alors s'afficher |
766 | 159 | Etienne Pallier | |
767 | 159 | Etienne Pallier | |
768 | 159 | Etienne Pallier | |
769 | 159 | Etienne Pallier | |
770 | 159 | Etienne Pallier | |
771 | 88 | Etienne Pallier | --- |
772 | 96 | Etienne Pallier | |
773 | 95 | Etienne Pallier | h3. Pyreverse (included in pylint) : useful for generating uml class diagrams |
774 | 1 | Etienne Pallier | |
775 | 96 | Etienne Pallier | https://www.logilab.org/blogentry/6883 |
776 | 96 | Etienne Pallier | |
777 | 96 | Etienne Pallier | <pre> |
778 | 96 | Etienne Pallier | $ cd PYROS/ |
779 | 96 | Etienne Pallier | |
780 | 96 | Etienne Pallier | $ pyreverse -o png -p pyrosapp -a 1 -A src/pyrosapp/ |
781 | 96 | Etienne Pallier | |
782 | 97 | Etienne Pallier | $ pyreverse -o png -p pyrosapp -s 1 -S src/pyrosapp/ |
783 | 97 | Etienne Pallier | |
784 | 96 | Etienne Pallier | $ pyreverse -ASmy -k -o png -p pyrosappadmin src/pyrosapp/admin.py |
785 | 1 | Etienne Pallier | </pre> |
786 | 99 | Etienne Pallier | |
787 | 99 | Etienne Pallier | {{thumbnail(classes_pyrosapp.png, size=300)}} |
788 | 99 | Etienne Pallier | {{thumbnail(classes_pyrosappadmin.png, size=300)}} |
789 | 99 | Etienne Pallier | {{thumbnail(classes_dashboard.png, size=300)}} |
790 | 98 | Etienne Pallier | |
791 | 98 | Etienne Pallier | |
792 | 89 | Etienne Pallier | h3. django-extensions and graphviz : useful for generating an image of all the models and their relationships |
793 | 91 | Etienne Pallier | |
794 | 89 | Etienne Pallier | {{thumbnail(models.png, size=300, title=Pyros data model)}} |
795 | 90 | Etienne Pallier | |
796 | 89 | Etienne Pallier | django-extensions: http://django-extensions.readthedocs.org/en/latest/installation_instructions.html |
797 | 92 | Etienne Pallier | |
798 | 92 | Etienne Pallier | GraphViz (development) installation : |
799 | 92 | Etienne Pallier | |
800 | 92 | Etienne Pallier | <pre> |
801 | 92 | Etienne Pallier | MacOS with macport: |
802 | 92 | Etienne Pallier | $ sudo port install graphviz-devel |
803 | 92 | Etienne Pallier | |
804 | 92 | Etienne Pallier | Ubuntu: |
805 | 92 | Etienne Pallier | $ sudo apt-get install graphviz-dev |
806 | 92 | Etienne Pallier | |
807 | 92 | Etienne Pallier | Windows: |
808 | 92 | Etienne Pallier | Download it |
809 | 92 | Etienne Pallier | </pre> |
810 | 93 | Etienne Pallier | |
811 | 1 | Etienne Pallier | Python pygraphviz package installation: |
812 | 92 | Etienne Pallier | <pre> |
813 | 1 | Etienne Pallier | $ pip install pygraphviz |
814 | 1 | Etienne Pallier | => errors on MacOS (using macport) : "fatal error: 'graphviz/cgraph.h' file not found" |
815 | 93 | Etienne Pallier | => $ pip install --install-option="--include-path=/opt/local/include" --install-option="--library-path=/opt/local/lib" pygraphviz |
816 | 1 | Etienne Pallier | </pre> |
817 | 93 | Etienne Pallier | |
818 | 93 | Etienne Pallier | Python django-extensions package installation: |
819 | 93 | Etienne Pallier | <pre> |
820 | 93 | Etienne Pallier | $ pip install django-bootstrap3 |
821 | 93 | Etienne Pallier | $ pip install django-extensions |
822 | 93 | Etienne Pallier | ($ pip install --upgrade django-extensions) |
823 | 92 | Etienne Pallier | </pre> |
824 | 93 | Etienne Pallier | |
825 | 93 | Etienne Pallier | Generate the image: |
826 | 93 | Etienne Pallier | <pre> |
827 | 92 | Etienne Pallier | $ cd src/ |
828 | 93 | Etienne Pallier | $ python manage.py graph_models -a -g -o models.png |
829 | 92 | Etienne Pallier | </pre> |
830 | 89 | Etienne Pallier | |
831 | 89 | Etienne Pallier | --- |
832 | 6 | Etienne Pallier | |
833 | 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)% |
834 | 1 | Etienne Pallier | |
835 | 1 | Etienne Pallier | |
836 | 1 | Etienne Pallier | [[pyros_install_from_start|Pyros installation from the beginning]] |