Wiki

Version 189 (Etienne Pallier, 03/22/2016 10:16 am)

1 1 Etienne Pallier
h1. Technical Documentation for the PYROS project (FGFT-CC)
2 1 Etienne Pallier
3 1 Etienne Pallier
4 1 Etienne Pallier
HOWTO Format Redmine Wiki : http://www.redmine.org/projects/redmine/wiki/FrRedmineWikiFormatting
5 1 Etienne Pallier
6 1 Etienne Pallier
{{>toc}}
7 1 Etienne Pallier
8 1 Etienne Pallier
9 121 Etienne Pallier
---
10 1 Etienne Pallier
11 121 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}I - TODO%
12 121 Etienne Pallier
13 126 Etienne Pallier
 * installation sur windows
14 125 Etienne Pallier
15 126 Etienne Pallier
 * gitlab
16 1 Etienne Pallier
17 126 Etienne Pallier
 * séparation des BD Django et Pyros
18 125 Etienne Pallier
19 126 Etienne Pallier
 * intégration dans Eclipse
20 126 Etienne Pallier
21 174 Etienne Pallier
 * Intégration des modules Django déjà développés
22 125 Etienne Pallier
23 121 Etienne Pallier
24 3 Etienne Pallier
---
25 1 Etienne Pallier
26 140 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}I - DATABASE SCHEMA (v0.2.1)%
27 116 Etienne Pallier
28 116 Etienne Pallier
29 117 Etienne Pallier
{{thumbnail(PYROS_PDM_v021.png, size=300, title=Pyros data model)}}
30 121 Etienne Pallier
31 121 Etienne Pallier
32 121 Etienne Pallier
---
33 116 Etienne Pallier
34 141 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}II - Get the project (from gitlab)%
35 141 Etienne Pallier
36 141 Etienne Pallier
https://gitlab.irap.omp.eu/epallier/pyros
37 141 Etienne Pallier
38 161 Etienne Pallier
https://gitlab.irap.omp.eu/epallier/pyros.git
39 161 Etienne Pallier
40 161 Etienne Pallier
ssh git@gitlab.irap.omp.eu:epallier/pyros.git
41 141 Etienne Pallier
42 1 Etienne Pallier
43 169 Etienne Pallier
44 169 Etienne Pallier
h3. Get the project from the terminal
45 169 Etienne Pallier
46 174 Etienne Pallier
<pre>
47 1 Etienne Pallier
git clone https://gitlab.irap.omp.eu/epallier/pyros.git PYROS
48 1 Etienne Pallier
49 174 Etienne Pallier
(or also : git clone git@gitlab.irap.omp.eu:epallier/pyros.git)
50 174 Etienne Pallier
</pre>
51 174 Etienne Pallier
52 174 Etienne Pallier
If you just want a static copy of the project (without synchronization) just remove the .git/ folder :
53 174 Etienne Pallier
<pre>
54 174 Etienne Pallier
$ rm -r .git/
55 174 Etienne Pallier
</pre>
56 169 Etienne Pallier
57 169 Etienne Pallier
h3. Get the project from Eclipse
58 169 Etienne Pallier
59 169 Etienne Pallier
TODO:
60 169 Etienne Pallier
61 141 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}III - INSTALLATION%
62 2 Etienne Pallier
63 120 Etienne Pallier
64 120 Etienne Pallier
---
65 120 Etienne Pallier
66 184 Etienne Pallier
h3. Install MySql (only if necessary)
67 2 Etienne Pallier
68 49 Etienne Pallier
 * Linux Ubuntu
69 49 Etienne Pallier
<pre>
70 107 Paul Carensac
71 107 Paul Carensac
$ sudo apt-get install mysql-server
72 107 Paul Carensac
$ sudo apt-get install mysql-client
73 107 Paul Carensac
74 49 Etienne Pallier
</pre>
75 49 Etienne Pallier
76 49 Etienne Pallier
 * Linux CentOS
77 49 Etienne Pallier
<pre>
78 49 Etienne Pallier
TODO:
79 49 Etienne Pallier
$ sudo yum install mysql
80 49 Etienne Pallier
...
81 49 Etienne Pallier
</pre>
82 49 Etienne Pallier
83 49 Etienne Pallier
 * Mac OS X
84 1 Etienne Pallier
Install XAMPP
85 1 Etienne Pallier
(but you could also use the pre-installed Mac OS MySql)
86 177 Etienne Pallier
<pre>
87 177 Etienne Pallier
TODO:
88 49 Etienne Pallier
</pre>
89 1 Etienne Pallier
90 49 Etienne Pallier
 * Windows
91 177 Etienne Pallier
Install XAMPP
92 49 Etienne Pallier
<pre>
93 49 Etienne Pallier
TODO:
94 49 Etienne Pallier
</pre>
95 49 Etienne Pallier
96 49 Etienne Pallier
97 49 Etienne Pallier
---
98 1 Etienne Pallier
99 185 Etienne Pallier
h3. Install Python3.5 (only if necessary)
100 1 Etienne Pallier
101 11 Etienne Pallier
102 11 Etienne Pallier
 * Mac OS X :
103 1 Etienne Pallier
<pre>
104 183 Etienne Pallier
105 24 Etienne Pallier
1) Installer MacPort
106 24 Etienne Pallier
(TODO: doc)
107 24 Etienne Pallier
108 24 Etienne Pallier
2) Installer le "port" python35
109 1 Etienne Pallier
$ sudo port install python35
110 183 Etienne Pallier
111 1 Etienne Pallier
</pre>
112 1 Etienne Pallier
113 1 Etienne Pallier
 * Linux (Ubuntu) :
114 1 Etienne Pallier
<pre>
115 107 Paul Carensac
sudo add-apt-repository ppa:fkrull/deadsnakes
116 107 Paul Carensac
sudo apt-get update
117 107 Paul Carensac
sudo apt-get install python3.5
118 107 Paul Carensac
119 107 Paul Carensac
sudo pip install virtualenv
120 23 Etienne Pallier
</pre>
121 1 Etienne Pallier
122 1 Etienne Pallier
123 183 Etienne Pallier
 * Windows 10 :
124 183 Etienne Pallier
<pre>
125 187 Etienne Pallier
TODO:
126 183 Etienne Pallier
</pre>
127 3 Etienne Pallier
128 4 Etienne Pallier
---
129 5 Etienne Pallier
130 59 Etienne Pallier
h3. Get the project (from git)
131 59 Etienne Pallier
132 78 Etienne Pallier
<pre>
133 1 Etienne Pallier
134 188 Etienne Pallier
$ git clone https://gitlab.irap.omp.eu/epallier/pyros.git PYROS
135 1 Etienne Pallier
</pre>
136 1 Etienne Pallier
137 186 Etienne Pallier
This creates a PYROS/ folder containing the project (with a .git/ subfolder for synchronization with the git repository)
138 59 Etienne Pallier
139 59 Etienne Pallier
140 59 Etienne Pallier
---
141 59 Etienne Pallier
142 3 Etienne Pallier
h3. Create virtualenv with python3.5 dedicated to pyros project (inside the project folder)
143 127 Etienne Pallier
144 131 Etienne Pallier
<pre>
145 1 Etienne Pallier
146 133 Etienne Pallier
$ cd private/
147 3 Etienne Pallier
148 3 Etienne Pallier
$ which python3.5
149 3 Etienne Pallier
/opt/local/bin/python3.5
150 15 Etienne Pallier
151 127 Etienne Pallier
$ virtualenv-3.5 venv_py35_pyros -p /opt/local/bin/python3.5
152 3 Etienne Pallier
=> creates a venv_py35_pyros/ folder inside PYROS/private/
153 1 Etienne Pallier
154 131 Etienne Pallier
</pre>
155 1 Etienne Pallier
156 7 Etienne Pallier
---
157 3 Etienne Pallier
158 65 Etienne Pallier
h3. Activate the python virtual environment (from inside the project)
159 7 Etienne Pallier
160 55 Etienne Pallier
<pre>
161 1 Etienne Pallier
162 65 Etienne Pallier
$ pwd
163 134 Etienne Pallier
.../PYROS/private
164 1 Etienne Pallier
165 65 Etienne Pallier
$ source ./venv_py35_pyros/bin/activate
166 65 Etienne Pallier
167 3 Etienne Pallier
$ python -V
168 1 Etienne Pallier
Python 3.5.1
169 3 Etienne Pallier
170 3 Etienne Pallier
$ which pip
171 77 Etienne Pallier
.../PYROS/venv_py35_pyros/bin/pip
172 16 Etienne Pallier
173 18 Etienne Pallier
Upgrade pip to last version available :
174 3 Etienne Pallier
$ pip install --upgrade pip
175 3 Etienne Pallier
Collecting pip
176 3 Etienne Pallier
  Downloading pip-8.1.1-py2.py3-none-any.whl (1.2MB)
177 3 Etienne Pallier
Installing collected packages: pip
178 3 Etienne Pallier
  Found existing installation: pip 7.1.2
179 3 Etienne Pallier
    Uninstalling pip-7.1.2:
180 3 Etienne Pallier
      Successfully uninstalled pip-7.1.2
181 1 Etienne Pallier
Successfully installed pip-8.1.1
182 55 Etienne Pallier
183 55 Etienne Pallier
</pre>
184 18 Etienne Pallier
185 27 Etienne Pallier
h3. Install needed python packages (from within the virtual environment)
186 18 Etienne Pallier
187 66 Etienne Pallier
First, be sure that the virtual environment is activated:
188 66 Etienne Pallier
<pre>
189 66 Etienne Pallier
$ python -V
190 66 Etienne Pallier
Python 3.5.1
191 66 Etienne Pallier
</pre>
192 66 Etienne Pallier
193 62 Etienne Pallier
 * *Automatic Installation of all packages*
194 62 Etienne Pallier
<pre>
195 90 Etienne Pallier
$ pip install -r REQUIREMENTS.txt
196 62 Etienne Pallier
</pre>
197 62 Etienne Pallier
198 93 Etienne Pallier
 * *Or, manual installation of each package*
199 62 Etienne Pallier
200 62 Etienne Pallier
  * *Install Django* :
201 32 Etienne Pallier
<pre>
202 3 Etienne Pallier
$ pip install django
203 3 Etienne Pallier
Collecting django
204 3 Etienne Pallier
  Downloading Django-1.9.4-py2.py3-none-any.whl (6.6MB)
205 3 Etienne Pallier
Installing collected packages: django
206 3 Etienne Pallier
Successfully installed django-1.9.4
207 3 Etienne Pallier
208 3 Etienne Pallier
$ pip install django-admin-tools
209 3 Etienne Pallier
Collecting django-admin-tools
210 3 Etienne Pallier
  Downloading django_admin_tools-0.7.2-py2.py3-none-any.whl (289kB)
211 3 Etienne Pallier
Installing collected packages: django-admin-tools
212 3 Etienne Pallier
Successfully installed django-admin-tools-0.7.2
213 3 Etienne Pallier
214 21 Etienne Pallier
$ pip install django-debug-toolbar
215 21 Etienne Pallier
Collecting django-debug-toolbar
216 21 Etienne Pallier
  Downloading django_debug_toolbar-1.4-py2.py3-none-any.whl (212kB)
217 21 Etienne Pallier
Requirement already satisfied (use --upgrade to upgrade): Django>=1.7 in ./venv_py35_pyros/lib/python3.5/site-packages (from django-debug-toolbar)
218 21 Etienne Pallier
Collecting sqlparse (from django-debug-toolbar)
219 21 Etienne Pallier
  Downloading sqlparse-0.1.19.tar.gz (58kB)
220 21 Etienne Pallier
Building wheels for collected packages: sqlparse
221 21 Etienne Pallier
  Running setup.py bdist_wheel for sqlparse ... done
222 21 Etienne Pallier
  Stored in directory: /Users/epallier/Library/Caches/pip/wheels/7b/d4/72/6011bb100dd5fc213164e4bbee13d4e03261dd54ce6a5de6b8
223 21 Etienne Pallier
Successfully built sqlparse
224 21 Etienne Pallier
Installing collected packages: sqlparse, django-debug-toolbar
225 21 Etienne Pallier
Successfully installed django-debug-toolbar-1.4 sqlparse-0.1.19
226 21 Etienne Pallier
227 21 Etienne Pallier
$ pip install django-extensions
228 21 Etienne Pallier
Collecting django-extensions
229 21 Etienne Pallier
  Downloading django_extensions-1.6.1-py2.py3-none-any.whl (202kB)
230 21 Etienne Pallier
Collecting six>=1.2 (from django-extensions)
231 21 Etienne Pallier
  Downloading six-1.10.0-py2.py3-none-any.whl
232 21 Etienne Pallier
Installing collected packages: six, django-extensions
233 21 Etienne Pallier
Successfully installed django-extensions-1.6.1 six-1.10.0
234 21 Etienne Pallier
235 21 Etienne Pallier
$ pip install django-suit
236 21 Etienne Pallier
Collecting django-suit
237 21 Etienne Pallier
  Downloading django-suit-0.2.18.tar.gz (587kB)
238 21 Etienne Pallier
Building wheels for collected packages: django-suit
239 1 Etienne Pallier
  Running setup.py bdist_wheel for django-suit ... done
240 1 Etienne Pallier
  Stored in directory: /Users/epallier/Library/Caches/pip/wheels/12/8b/9a/e02ab0ad9229881638aa040d47d77c8f562999533811927d41
241 1 Etienne Pallier
Successfully built django-suit
242 1 Etienne Pallier
Installing collected packages: django-suit
243 1 Etienne Pallier
Successfully installed django-suit-0.2.18
244 21 Etienne Pallier
245 32 Etienne Pallier
</pre>
246 32 Etienne Pallier
247 63 Etienne Pallier
  * *Install the web application server gunicorn (will be used in production instead of the dev django web server)* :
248 32 Etienne Pallier
<pre>
249 25 Etienne Pallier
$ pip install gunicorn
250 25 Etienne Pallier
Collecting gunicorn
251 25 Etienne Pallier
  Downloading gunicorn-19.4.5-py2.py3-none-any.whl (112kB)
252 21 Etienne Pallier
Installing collected packages: gunicorn
253 26 Etienne Pallier
Successfully installed gunicorn-19.4.5
254 1 Etienne Pallier
</pre>
255 1 Etienne Pallier
256 63 Etienne Pallier
  * *Install the python mysql client*:
257 32 Etienne Pallier
<pre>
258 32 Etienne Pallier
$ pip install mysqlclient
259 72 Etienne Pallier
...
260 72 Etienne Pallier
</pre>
261 33 Etienne Pallier
262 73 Etienne Pallier
   * => Issue under Mac OS X:
263 72 Etienne Pallier
<pre>
264 3 Etienne Pallier
$ pip install mysqlclient
265 3 Etienne Pallier
Collecting mysqlclient
266 1 Etienne Pallier
  Downloading mysqlclient-1.3.7.tar.gz (79kB)
267 22 Etienne Pallier
Building wheels for collected packages: mysqlclient
268 3 Etienne Pallier
  Running setup.py bdist_wheel for mysqlclient ... error
269 3 Etienne Pallier
270 1 Etienne Pallier
  ----------------------------------------
271 1 Etienne Pallier
  Failed building wheel for mysqlclient
272 1 Etienne Pallier
  Running setup.py clean for mysqlclient
273 1 Etienne Pallier
Failed to build mysqlclient
274 1 Etienne Pallier
Installing collected packages: mysqlclient
275 1 Etienne Pallier
  Running setup.py install for mysqlclient ... done
276 1 Etienne Pallier
Successfully installed mysqlclient-1.3.7
277 1 Etienne Pallier
278 1 Etienne Pallier
BOUH !!!
279 1 Etienne Pallier
280 1 Etienne Pallier
$ pip install --upgrade wheel
281 1 Etienne Pallier
Collecting wheel
282 1 Etienne Pallier
  Downloading wheel-0.29.0-py2.py3-none-any.whl (66kB)
283 1 Etienne Pallier
Installing collected packages: wheel
284 1 Etienne Pallier
  Found existing installation: wheel 0.24.0
285 1 Etienne Pallier
    Uninstalling wheel-0.24.0:
286 1 Etienne Pallier
      Successfully uninstalled wheel-0.24.0
287 1 Etienne Pallier
Successfully installed wheel-0.29.0
288 1 Etienne Pallier
289 1 Etienne Pallier
$ pip uninstall mysqlclient
290 1 Etienne Pallier
291 1 Etienne Pallier
$ pip install mysqlclient
292 1 Etienne Pallier
Collecting mysqlclient
293 1 Etienne Pallier
  Using cached mysqlclient-1.3.7.tar.gz
294 1 Etienne Pallier
Building wheels for collected packages: mysqlclient
295 1 Etienne Pallier
  Running setup.py bdist_wheel for mysqlclient ... done
296 1 Etienne Pallier
  Stored in directory: /Users/epallier/Library/Caches/pip/wheels/9b/06/50/d11418c26cf8f2156b13d4363b5afde8e7e75ebb8540d0228d
297 1 Etienne Pallier
Successfully built mysqlclient
298 1 Etienne Pallier
Installing collected packages: mysqlclient
299 1 Etienne Pallier
Successfully installed mysqlclient-1.3.7
300 1 Etienne Pallier
301 1 Etienne Pallier
YES !!!
302 1 Etienne Pallier
303 1 Etienne Pallier
</pre>
304 1 Etienne Pallier
305 107 Paul Carensac
   * => Issues under Ubuntu:
306 107 Paul Carensac
<pre>
307 107 Paul Carensac
$ pip install mysqlclient
308 107 Paul Carensac
Collecting mysqlclient
309 107 Paul Carensac
  Downloading mysqlclient-1.3.7.tar.gz (79kB)
310 107 Paul Carensac
    100% |████████████████████████████████| 81kB 1.5MB/s
311 107 Paul Carensac
    Complete output from command python setup.py egg_info:
312 107 Paul Carensac
    /bin/sh: 1: mysql_config: not found
313 107 Paul Carensac
    Traceback (most recent call last):
314 107 Paul Carensac
      File "<string>", line 1, in <module>
315 107 Paul Carensac
    [...]
316 107 Paul Carensac
    ----------------------------------------
317 107 Paul Carensac
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-q6j4inuz/mysqlclient/
318 1 Etienne Pallier
319 108 Paul Carensac
BOUH !!!
320 108 Paul Carensac
321 107 Paul Carensac
$ sudo apt-get install libmysqlclient-dev
322 108 Paul Carensac
323 107 Paul Carensac
$ pip install mysqlclient
324 107 Paul Carensac
Collecting mysqlclient
325 107 Paul Carensac
  Using cached mysqlclient-1.3.7.tar.gz
326 107 Paul Carensac
Building wheels for collected packages: mysqlclient
327 107 Paul Carensac
  Running setup.py bdist_wheel for mysqlclient ... error
328 107 Paul Carensac
329 107 Paul Carensac
    _mysql.c:40:20: fatal error: Python.h: No such file or directory
330 107 Paul Carensac
     #include "Python.h"
331 107 Paul Carensac
                        ^
332 107 Paul Carensac
    compilation terminated.
333 107 Paul Carensac
    error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
334 107 Paul Carensac
    
335 107 Paul Carensac
    ----------------------------------------
336 107 Paul Carensac
Command "/home/carens_p/pyros/venv_py35_pyros/bin/python3.5 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-k3klv92j/mysqlclient/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-gz242xxs-record/install-record.txt --single-version-externally-managed --compile --install-headers /home/carens_p/pyros/venv_py35_pyros/include/site/python3.5/mysqlclient" failed with error code 1 in /tmp/pip-build-k3klv92j/mysqlclient/
337 107 Paul Carensac
338 108 Paul Carensac
BOUH !!!
339 108 Paul Carensac
340 107 Paul Carensac
$ sudo apt-get install python3.5-dev
341 108 Paul Carensac
342 107 Paul Carensac
$ pip install mysqlclient
343 107 Paul Carensac
344 107 Paul Carensac
YES !!!
345 107 Paul Carensac
346 107 Paul Carensac
</pre>
347 12 Etienne Pallier
348 82 Etienne Pallier
 * *Set Requirements*
349 82 Etienne Pallier
350 82 Etienne Pallier
<pre>
351 82 Etienne Pallier
$ pip freeze > REQUIREMENTS.txt
352 82 Etienne Pallier
</pre>
353 12 Etienne Pallier
354 12 Etienne Pallier
---
355 28 Etienne Pallier
356 7 Etienne Pallier
h3. Create Django project pyros
357 38 Etienne Pallier
358 38 Etienne Pallier
<pre>
359 1 Etienne Pallier
360 83 Etienne Pallier
From inside the project:
361 83 Etienne Pallier
$ pwd
362 83 Etienne Pallier
.../PYROS/
363 83 Etienne Pallier
364 1 Etienne Pallier
$ django-admin startproject pyros
365 1 Etienne Pallier
366 149 Etienne Pallier
Rename the project folder "pyros/" as "src/"
367 149 Etienne Pallier
368 84 Etienne Pallier
$ mv pyros src
369 84 Etienne Pallier
370 1 Etienne Pallier
We have then this architecture:
371 86 Etienne Pallier
372 86 Etienne Pallier
PYROS
373 172 Etienne Pallier
├── REQUIREMENTS.txt
374 86 Etienne Pallier
├── private
375 137 Etienne Pallier
│   └── venv_py35_pyros
376 83 Etienne Pallier
├── public
377 83 Etienne Pallier
│   └── static
378 83 Etienne Pallier
├── src
379 83 Etienne Pallier
│   ├── manage.py
380 1 Etienne Pallier
│   ├── pyros
381 84 Etienne Pallier
│   │   ├── __init__.py
382 84 Etienne Pallier
│   │   ├── settings.py
383 84 Etienne Pallier
│   │   ├── urls.py
384 1 Etienne Pallier
│   │   └── wsgi.py
385 137 Etienne Pallier
386 142 Etienne Pallier
</pre>
387 3 Etienne Pallier
388 3 Etienne Pallier
389 1 Etienne Pallier
390 142 Etienne Pallier
391 142 Etienne Pallier
---
392 142 Etienne Pallier
393 142 Etienne Pallier
h3. Test the project
394 142 Etienne Pallier
395 142 Etienne Pallier
<pre>
396 142 Etienne Pallier
397 150 Etienne Pallier
$ cd src/
398 150 Etienne Pallier
399 1 Etienne Pallier
$ ./manage.py runserver
400 38 Etienne Pallier
(or gunicorn pyros.wsgi)
401 3 Etienne Pallier
==> http://localhost:8000
402 87 Etienne Pallier
...
403 87 Etienne Pallier
...
404 87 Etienne Pallier
Ctrl-c
405 87 Etienne Pallier
406 1 Etienne Pallier
</pre>
407 142 Etienne Pallier
408 142 Etienne Pallier
409 142 Etienne Pallier
410 142 Etienne Pallier
---
411 142 Etienne Pallier
412 142 Etienne Pallier
h3. The Web server
413 142 Etienne Pallier
414 142 Etienne Pallier
415 142 Etienne Pallier
Apache : gère tous les fichiers statiques (images, html…), et délègue les fichiers python au serveur django (par défaut)
416 142 Etienne Pallier
417 143 Etienne Pallier
Le fichier pyros/urls.py prend le relai pour tout ce qui est django
418 143 Etienne Pallier
419 142 Etienne Pallier
Le moteur web django sera soit du wsgi soit du unicorn
420 142 Etienne Pallier
421 142 Etienne Pallier
Par défaut, 1 seul worker, mais on peut en configurer plusieurs, l’idéal étant de faire "nb coeurs + 1" 
422 142 Etienne Pallier
(le worker maître qui fait le dispatching aux autres)
423 142 Etienne Pallier
424 142 Etienne Pallier
Frontend : Apache ou Ngininx
425 142 Etienne Pallier
426 142 Etienne Pallier
Backend : gunicorn (gère facilement des workers) ou uwsgi
427 142 Etienne Pallier
428 152 Etienne Pallier
<pre>
429 152 Etienne Pallier
$ gunicorn pyros.wsgi
430 1 Etienne Pallier
(à la place de manage runserver => A EVITER EN PROD)
431 152 Etienne Pallier
432 1 Etienne Pallier
Ou encore:
433 1 Etienne Pallier
434 152 Etienne Pallier
$ gunicorn --workers 5 library.wsgi
435 152 Etienne Pallier
</pre>
436 3 Etienne Pallier
437 42 Etienne Pallier
---
438 7 Etienne Pallier
439 3 Etienne Pallier
h3. Set Database engine as MySql
440 3 Etienne Pallier
441 41 Etienne Pallier
Edit src/pyros/settings.py
442 3 Etienne Pallier
443 3 Etienne Pallier
<pre>
444 3 Etienne Pallier
DATABASES = {
445 1 Etienne Pallier
    'default': {
446 3 Etienne Pallier
        'ENGINE': 'django.db.backends.mysql',
447 1 Etienne Pallier
        'NAME': 'pyros',
448 1 Etienne Pallier
        'USER': 'root',
449 1 Etienne Pallier
        'PASSWORD': ''
450 41 Etienne Pallier
    }
451 3 Etienne Pallier
}
452 7 Etienne Pallier
</pre>
453 3 Etienne Pallier
454 43 Etienne Pallier
---
455 7 Etienne Pallier
456 43 Etienne Pallier
h3. Import database into Django (with inspectdb)
457 3 Etienne Pallier
458 101 Etienne Pallier
From src/ :
459 94 Etienne Pallier
460 3 Etienne Pallier
<pre>
461 44 Etienne Pallier
$ ./manage.py inspectdb > models.py
462 94 Etienne Pallier
</pre>
463 44 Etienne Pallier
464 97 Etienne Pallier
Issue on Mac OS X:
465 3 Etienne Pallier
<pre>
466 3 Etienne Pallier
Traceback (most recent call last):
467 3 Etienne Pallier
  File "/Users/epallier/Documents/_W_more/PROJECTS/GFT/SOFT/PYROS/pyros/venv_py35_pyros/lib/python3.5/site-packages/django/db/backends/mysql/base.py", line 25, in <module>
468 3 Etienne Pallier
    import MySQLdb as Database
469 3 Etienne Pallier
  File "/Users/epallier/Documents/_W_more/PROJECTS/GFT/SOFT/PYROS/pyros/venv_py35_pyros/lib/python3.5/site-packages/MySQLdb/__init__.py", line 19, in <module>
470 3 Etienne Pallier
    import _mysql
471 3 Etienne Pallier
ImportError: dlopen(/Users/epallier/Documents/_W_more/PROJECTS/GFT/SOFT/PYROS/pyros/venv_py35_pyros/lib/python3.5/site-packages/_mysql.cpython-35m-darwin.so, 2): Library not loaded: libmysqlclient.18.dylib
472 3 Etienne Pallier
  Referenced from: /Users/epallier/Documents/_W_more/PROJECTS/GFT/SOFT/PYROS/pyros/venv_py35_pyros/lib/python3.5/site-packages/_mysql.cpython-35m-darwin.so
473 3 Etienne Pallier
  Reason: image not found
474 3 Etienne Pallier
475 3 Etienne Pallier
=> BOUH !!!
476 3 Etienne Pallier
477 3 Etienne Pallier
LA SOLUTION EST ICI : http://stackoverflow.com/questions/6383310/python-mysqldb-library-not-loaded-libmysqlclient-18-dylib
478 3 Etienne Pallier
479 124 Etienne Pallier
Il suffit de faire ceci:
480 3 Etienne Pallier
481 124 Etienne Pallier
$ sudo mkdir -p /usr/local/lib   
482 124 Etienne Pallier
$ sudo ln -s /Applications/XAMPP/xamppfiles/lib/libmysql* /usr/local/lib/
483 124 Etienne Pallier
484 124 Etienne Pallier
Mais on peut aussi faire ceci:
485 3 Etienne Pallier
486 123 Etienne Pallier
Okay, so the offending file is /Users/epallier/Documents/_W_more/PROJECTS/GFT/SOFT/PYROS/pyros/venv_py35_pyros/lib/python3.5/site-packages/_mysql.cpython-35m-darwin.so
487 123 Etienne Pallier
488 123 Etienne Pallier
Next, figure out where _mysql.so thinks it should find libmysqlclient.18.dylib:
489 123 Etienne Pallier
490 1 Etienne Pallier
$ otool -L /Users/epallier/Documents/_W_more/PROJECTS/GFT/SOFT/PYROS/pyros/venv_py35_pyros/lib/python3.5/site-packages/_mysql.cpython-35m-darwin.so
491 10 Etienne Pallier
/Users/epallier/Documents/_W_more/PROJECTS/GFT/SOFT/PYROS/pyros/venv_py35_pyros/lib/python3.5/site-packages/_mysql.cpython-35m-darwin.so:
492 3 Etienne Pallier
	libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0)
493 3 Etienne Pallier
...
494 3 Etienne Pallier
495 123 Etienne Pallier
So, it's looking for libmysqlclient.18.dylib with no path information, let's fix that:
496 123 Etienne Pallier
497 1 Etienne Pallier
$ locate libmysqlclient.18.dylib
498 1 Etienne Pallier
/Applications/XAMPP/xamppfiles/lib/libmysqlclient.18.dylib
499 1 Etienne Pallier
/Library/SystemMigration/History/Migration-68137DFB-CB6A-4FBB-81E2-11BDB5D01E48/QuarantineRoot/usr/lib/libmysqlclient.18.dylib
500 1 Etienne Pallier
501 10 Etienne Pallier
$ sudo install_name_tool -change libmysqlclient.18.dylib /Applications/XAMPP/xamppfiles/lib/libmysqlclient.18.dylib /Users/epallier/Documents/_W_more/PROJECTS/GFT/SOFT/PYROS/pyros/venv_py35_pyros/lib/python3.5/site-packages/_mysql.cpython-35m-darwin.so
502 123 Etienne Pallier
503 123 Etienne Pallier
Now _mysql.so knows the full path to the library and everything works, regardless of environment variables.
504 10 Etienne Pallier
505 10 Etienne Pallier
$ otool -L /Users/epallier/Documents/_W_more/PROJECTS/GFT/SOFT/PYROS/pyros/venv_py35_pyros/lib/python3.5/site-packages/_mysql.cpython-35m-darwin.so
506 10 Etienne Pallier
/Users/epallier/Documents/_W_more/PROJECTS/GFT/SOFT/PYROS/pyros/venv_py35_pyros/lib/python3.5/site-packages/_mysql.cpython-35m-darwin.so:
507 3 Etienne Pallier
	/Applications/XAMPP/xamppfiles/lib/libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0)
508 1 Etienne Pallier
...
509 1 Etienne Pallier
510 3 Etienne Pallier
$ ./manage.py inspectdb > models.py
511 44 Etienne Pallier
512 3 Etienne Pallier
=> YES !!!
513 3 Etienne Pallier
</pre>
514 7 Etienne Pallier
515 3 Etienne Pallier
516 48 Etienne Pallier
---
517 7 Etienne Pallier
518 3 Etienne Pallier
h3. Create a Django application pyrosapp
519 3 Etienne Pallier
520 102 Etienne Pallier
From src/ :
521 98 Etienne Pallier
522 102 Etienne Pallier
<pre>
523 1 Etienne Pallier
$ ./manage.py startapp pyrosapp
524 1 Etienne Pallier
</pre>
525 1 Etienne Pallier
526 103 Etienne Pallier
We obtain this structure:
527 1 Etienne Pallier
528 103 Etienne Pallier
<pre>
529 104 Etienne Pallier
530 103 Etienne Pallier
PYROS/
531 172 Etienne Pallier
├── REQUIREMENTS.txt
532 1 Etienne Pallier
├── private/
533 153 Etienne Pallier
│   └── venv_py35_pyros/
534 153 Etienne Pallier
├── public/
535 153 Etienne Pallier
│   └── static/
536 103 Etienne Pallier
├── src/
537 103 Etienne Pallier
│   ├── manage.py
538 153 Etienne Pallier
│   ├── pyros/
539 103 Etienne Pallier
│   │   ├── __init__.py
540 103 Etienne Pallier
│   │   ├── __pycache__
541 103 Etienne Pallier
│   │   ├── settings.py
542 103 Etienne Pallier
│   │   ├── urls.py
543 103 Etienne Pallier
│   │   └── wsgi.py
544 153 Etienne Pallier
│   └── pyrosapp/
545 1 Etienne Pallier
│       ├── __init__.py
546 103 Etienne Pallier
│       ├── admin.py
547 103 Etienne Pallier
│       ├── apps.py
548 103 Etienne Pallier
│       ├── migrations
549 103 Etienne Pallier
│       ├── models.py
550 103 Etienne Pallier
│       ├── tests.py
551 103 Etienne Pallier
│       └── views.py
552 153 Etienne Pallier
553 103 Etienne Pallier
554 7 Etienne Pallier
</pre>
555 1 Etienne Pallier
556 7 Etienne Pallier
---
557 7 Etienne Pallier
558 3 Etienne Pallier
h3. Replace the default pyrosapp models.py with the inspectdb generated one
559 3 Etienne Pallier
560 105 Etienne Pallier
From src/ :
561 1 Etienne Pallier
562 105 Etienne Pallier
<pre>
563 105 Etienne Pallier
$ mv models.py pyrosapp/
564 105 Etienne Pallier
</pre>
565 3 Etienne Pallier
566 139 Paul Carensac
Add pyrosapp to the project's applications :
567 7 Etienne Pallier
568 139 Paul Carensac
Edit src/pyros/settings.py
569 1 Etienne Pallier
570 139 Paul Carensac
<pre>
571 139 Paul Carensac
INSTALLED_APPS = [
572 139 Paul Carensac
    'django.contrib.admin',
573 139 Paul Carensac
    'django.contrib.auth',
574 139 Paul Carensac
    'django.contrib.contenttypes',
575 139 Paul Carensac
    'django.contrib.sessions',
576 139 Paul Carensac
    'django.contrib.messages',
577 139 Paul Carensac
    'django.contrib.staticfiles',
578 139 Paul Carensac
    'pyrosapp',
579 139 Paul Carensac
]
580 139 Paul Carensac
</pre>
581 9 Etienne Pallier
582 47 Etienne Pallier
---
583 3 Etienne Pallier
584 145 Paul Carensac
h3. Fix and improve the pyrosapp models.py file (generated by inspectdb)
585 1 Etienne Pallier
586 145 Paul Carensac
Once models.py file generated, we need to delete the database and create an empty one :
587 145 Paul Carensac
 
588 145 Paul Carensac
<pre>
589 145 Paul Carensac
$ mysql -u root [-p (if password needed)]
590 106 Etienne Pallier
591 145 Paul Carensac
mysql> DROP DATABSE pyros
592 145 Paul Carensac
mysql> CREATE SCHEMA IF NOT EXISTS 'pyros' DEFAULT CHARACTER SET utf8;
593 1 Etienne Pallier
594 145 Paul Carensac
</pre>
595 1 Etienne Pallier
596 145 Paul Carensac
Then edit pyrosapp/models.py :
597 1 Etienne Pallier
598 145 Paul Carensac
 * Change 'managed = False' to 'managed = True' for every model
599 145 Paul Carensac
600 145 Paul Carensac
 * Change classes names to CamelCase (do not change the 'db_table = ...' lines). *Be careful* : it is needed to change all occurences :
601 145 Paul Carensac
602 145 Paul Carensac
    * NrtAlanysis
603 145 Paul Carensac
    * ScheduleHistory
604 145 Paul Carensac
    * ScientificProgram
605 145 Paul Carensac
    * SequenceType
606 145 Paul Carensac
    * SiteWatch
607 145 Paul Carensac
    * SiteWatchHistory
608 145 Paul Carensac
    * StrategyObs
609 154 Paul Carensac
    * UserLevel
610 145 Paul Carensac
    * WeatherWatch
611 145 Paul Carensac
    * WeatherWatchHistory
612 145 Paul Carensac
613 145 Paul Carensac
 * Change the deleting mode from 'models.DO_NOTHING' to 'models.CASCADE' for the following foreign keys :
614 145 Paul Carensac
615 145 Paul Carensac
    * Image.plan
616 145 Paul Carensac
    * Plan.album
617 145 Paul Carensac
    * Album.sequence
618 145 Paul Carensac
    * Sequence.request
619 145 Paul Carensac
620 145 Paul Carensac
 * Change the 'ForeignKey' liaisons to 'OneToOneField' liaisons (just replace ForeignKey by OneToOneField), and change deleting mode to 'models.CASCADE' for the following foreign keys :
621 145 Paul Carensac
622 145 Paul Carensac
    * Alert.request
623 145 Paul Carensac
    * Detector.device
624 145 Paul Carensac
    * Filter.device
625 145 Paul Carensac
    * Telescope.device
626 145 Paul Carensac
627 145 Paul Carensac
 * We need to redefine many to many relationships for the following classes :
628 145 Paul Carensac
629 145 Paul Carensac
    * User - ScientificProgram :
630 145 Paul Carensac
631 145 Paul Carensac
        * add 'users = models.ManyToManyField('User')' in ScientificProgram class
632 145 Paul Carensac
        * delete UserHasScientificProgram class
633 145 Paul Carensac
634 145 Paul Carensac
    * Sequence - ScheduleHistory
635 145 Paul Carensac
636 145 Paul Carensac
        * add 'sequences = models.ManyToManyField('Sequence')' in ScheduleHistory class
637 145 Paul Carensac
        * delete ScheduleHasSequences class
638 145 Paul Carensac
639 145 Paul Carensac
 * Finally apply modifications to the database :
640 145 Paul Carensac
641 145 Paul Carensac
<pre>
642 145 Paul Carensac
$ pwd
643 145 Paul Carensac
.../PYROS/src
644 145 Paul Carensac
$ python manage.py makemigrations pyrosapp
645 145 Paul Carensac
$ python manage.py migrate
646 145 Paul Carensac
</pre>
647 109 Etienne Pallier
648 109 Etienne Pallier
---
649 111 Etienne Pallier
650 156 Paul Carensac
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}IV - CONFIGURATION of the Django Back Office (administration interface)%
651 155 Paul Carensac
652 155 Paul Carensac
---
653 155 Paul Carensac
654 155 Paul Carensac
h3. Back Office setup
655 155 Paul Carensac
656 155 Paul Carensac
 * Prerequisites in src/pyros/settings.py :
657 155 Paul Carensac
658 155 Paul Carensac
    * INSTALLED_APPS must (at least) contain :
659 155 Paul Carensac
660 155 Paul Carensac
        * django.contrib.admin
661 155 Paul Carensac
        * django.contrib.auth
662 155 Paul Carensac
        * django.contrib.contenttypes
663 155 Paul Carensac
        * django.contrib.sessions
664 155 Paul Carensac
665 155 Paul Carensac
    * MIDDLEWARES must (at least) contain :
666 155 Paul Carensac
667 155 Paul Carensac
        * django.contrib.sessions.middleware.SessionMiddleware
668 155 Paul Carensac
        * django.middleware.common.CommonMiddleware
669 155 Paul Carensac
        * django.contrib.auth.middleware.AuthenticationMiddleware
670 155 Paul Carensac
671 155 Paul Carensac
 * At least one 'python manage.py migrate' must have been executed
672 155 Paul Carensac
673 155 Paul Carensac
 * Create a superuser for the administration :
674 155 Paul Carensac
675 155 Paul Carensac
<pre>
676 155 Paul Carensac
$ python manage.py createsuperuser
677 155 Paul Carensac
</pre>
678 155 Paul Carensac
679 156 Paul Carensac
* For each app of the project, fill the admin.py file :
680 155 Paul Carensac
681 155 Paul Carensac
<pre>
682 155 Paul Carensac
from django.contrib import admin
683 155 Paul Carensac
from app.models import Model1, Model2
684 155 Paul Carensac
685 155 Paul Carensac
admin.site.register(Model1)
686 155 Paul Carensac
admin.site.register(Model2)
687 155 Paul Carensac
</pre>
688 155 Paul Carensac
689 155 Paul Carensac
*Reminder* : each application must be registered in the settings.py INSTALLED_APPS variable.
690 157 Paul Carensac
691 168 Paul Carensac
* For each model in models.py, add a '__str__()' method in order to identify the object on the back office. Example :
692 157 Paul Carensac
693 157 Paul Carensac
<pre>
694 157 Paul Carensac
class UserLevel(models.Model):
695 157 Paul Carensac
    name = models.CharField(max_length=45, blank=True, null=True)
696 157 Paul Carensac
    desc = models.TextField(blank=True, null=True)
697 157 Paul Carensac
    priority = models.IntegerField(blank=True, null=True)
698 157 Paul Carensac
    quota = models.FloatField(blank=True, null=True)
699 157 Paul Carensac
700 157 Paul Carensac
    class Meta:
701 157 Paul Carensac
        managed = True
702 157 Paul Carensac
        db_table = 'userlevel'
703 157 Paul Carensac
704 157 Paul Carensac
    def __str__(self):
705 163 Paul Carensac
        return (str(self.name))
706 157 Paul Carensac
</pre>
707 157 Paul Carensac
708 159 Paul Carensac
*Naming convention* : Use self.name when possible, the creation time/date otherwise. Example :
709 159 Paul Carensac
710 159 Paul Carensac
<pre>
711 159 Paul Carensac
class SiteWatch(models.Model):
712 159 Paul Carensac
    updated = models.DateTimeField(blank=True, null=True)
713 159 Paul Carensac
    lights = models.CharField(max_length=45, blank=True, null=True)
714 159 Paul Carensac
    dome = models.CharField(max_length=45, blank=True, null=True)
715 159 Paul Carensac
    doors = models.CharField(max_length=45, blank=True, null=True)
716 159 Paul Carensac
    temperature = models.FloatField(blank=True, null=True)
717 159 Paul Carensac
718 159 Paul Carensac
    class Meta:
719 159 Paul Carensac
        managed = True
720 159 Paul Carensac
        db_table = 'sitewatch'
721 159 Paul Carensac
722 159 Paul Carensac
    def __str__(self):
723 160 Paul Carensac
        return (str(self.updated))
724 159 Paul Carensac
</pre>
725 173 Etienne Pallier
726 176 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}V - INSTALLATION FROM THE BEGINNING (for dev only)%
727 173 Etienne Pallier
728 1 Etienne Pallier
729 176 Etienne Pallier
h3. How the git repository was created
730 176 Etienne Pallier
731 176 Etienne Pallier
*Git global setup:*
732 176 Etienne Pallier
733 176 Etienne Pallier
<pre>
734 176 Etienne Pallier
$ git config --global user.name "Etienne Pallier"
735 176 Etienne Pallier
$ git config --global user.email "etienne.pallier@irap.omp.eu"
736 176 Etienne Pallier
737 176 Etienne Pallier
$ cat ~/.gitconfig 
738 176 Etienne Pallier
[user]
739 176 Etienne Pallier
	name = Etienne Pallier
740 176 Etienne Pallier
	email = epallier@irap.omp.eu
741 176 Etienne Pallier
[http]
742 176 Etienne Pallier
	sslVerify = false
743 176 Etienne Pallier
</pre>
744 176 Etienne Pallier
745 176 Etienne Pallier
746 176 Etienne Pallier
*Create a new repository:*
747 176 Etienne Pallier
748 176 Etienne Pallier
<pre>
749 176 Etienne Pallier
$ cd PYROS/
750 176 Etienne Pallier
751 176 Etienne Pallier
Define files and folders to be ignored:
752 176 Etienne Pallier
$ vi .gitignore
753 176 Etienne Pallier
.DS_Store
754 176 Etienne Pallier
private
755 176 Etienne Pallier
__pycache__
756 176 Etienne Pallier
757 176 Etienne Pallier
$ touch README.md
758 176 Etienne Pallier
759 176 Etienne Pallier
$ git add README.md
760 176 Etienne Pallier
761 176 Etienne Pallier
$ git commit -m "first commit"
762 176 Etienne Pallier
763 176 Etienne Pallier
$ git remote add origin https://gitlab.irap.omp.eu/epallier/pyros.git
764 176 Etienne Pallier
765 176 Etienne Pallier
$ git push -u origin master
766 176 Etienne Pallier
767 176 Etienne Pallier
$ git add .
768 176 Etienne Pallier
769 176 Etienne Pallier
( if you want to be sure to add ALL files: 
770 176 Etienne Pallier
$ git add -A
771 176 Etienne Pallier
)
772 176 Etienne Pallier
773 176 Etienne Pallier
( if you wanted to remove added files, just type:
774 176 Etienne Pallier
$ git reset HEAD
775 176 Etienne Pallier
)
776 176 Etienne Pallier
777 176 Etienne Pallier
$ git commit -m "first full project commit"
778 176 Etienne Pallier
779 176 Etienne Pallier
$ git push -u origin master
780 176 Etienne Pallier
Counting objects: 43, done.
781 176 Etienne Pallier
Delta compression using up to 4 threads.
782 176 Etienne Pallier
Compressing objects: 100% (41/41), done.
783 176 Etienne Pallier
Writing objects: 100% (43/43), 575.13 KiB ö 0 bytes/s, done.
784 176 Etienne Pallier
Total 43 (delta 2), reused 0 (delta 0)
785 176 Etienne Pallier
To https://gitlab.irap.omp.eu/epallier/pyros.git
786 176 Etienne Pallier
   9c7128c..64501c9  master -> master
787 176 Etienne Pallier
Branch master set up to track remote branch master from origin.
788 176 Etienne Pallier
789 176 Etienne Pallier
$ git status
790 176 Etienne Pallier
On branch master
791 176 Etienne Pallier
Your branch is up-to-date with 'origin/master'.
792 176 Etienne Pallier
nothing to commit, working directory clean
793 176 Etienne Pallier
794 182 Etienne Pallier
</pre>
795 176 Etienne Pallier
796 182 Etienne Pallier
797 182 Etienne Pallier
h3. Create database
798 182 Etienne Pallier
799 182 Etienne Pallier
800 182 Etienne Pallier
 * Linux and Mac OS X:
801 182 Etienne Pallier
<pre>
802 182 Etienne Pallier
One liner:
803 182 Etienne Pallier
$ mysql -u root < pyros_create.sql
804 182 Etienne Pallier
805 182 Etienne Pallier
Or :
806 182 Etienne Pallier
$ mysql -u root
807 182 Etienne Pallier
mysql> create database pyros;
808 182 Etienne Pallier
mysql> use pyros;
809 182 Etienne Pallier
mysql> source pyros_create.sql;
810 182 Etienne Pallier
811 182 Etienne Pallier
(
812 182 Etienne Pallier
TODO:
813 182 Etienne Pallier
mysql> grant all on pyros.* to pyros@localhost identified by ‘pyros’;)
814 182 Etienne Pallier
mysql> flush privileges;
815 182 Etienne Pallier
)
816 176 Etienne Pallier
</pre>
817 182 Etienne Pallier
818 182 Etienne Pallier
819 182 Etienne Pallier
 * Windows:
820 182 Etienne Pallier
<pre>
821 182 Etienne Pallier
TODO: Use phpmyadmin ?
822 182 Etienne Pallier
</pre>
823 182 Etienne Pallier
824 182 Etienne Pallier
825 182 Etienne Pallier
---