Wiki

Version 164 (Etienne Pallier, 03/21/2016 05:07 pm)

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