Wiki

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