Pyros install from start

Version 7 (Etienne Pallier, 03/24/2016 04:06 pm)

1 1 Etienne Pallier
h1. PYROS INSTALLATION FROM THE BEGINNING (for dev only, history of the initial project creation)
2 1 Etienne Pallier
3 5 Etienne Pallier
{{>toc}}
4 5 Etienne Pallier
5 5 Etienne Pallier
---
6 1 Etienne Pallier
7 1 Etienne Pallier
h3. Install MySql (only if necessary)
8 1 Etienne Pallier
9 4 Etienne Pallier
See in III-Installation
10 1 Etienne Pallier
https://projects.irap.omp.eu/projects/pyros/wiki/Wiki#III-INSTALLATION
11 1 Etienne Pallier
12 1 Etienne Pallier
13 1 Etienne Pallier
---
14 1 Etienne Pallier
15 1 Etienne Pallier
h3. Create the database (from sql script generated with Mysql Workbench)
16 1 Etienne Pallier
17 3 Paul Carensac
 * All platforms:
18 1 Etienne Pallier
<pre>
19 1 Etienne Pallier
One liner:
20 1 Etienne Pallier
$ mysql -u root < pyros_create.sql
21 1 Etienne Pallier
22 1 Etienne Pallier
Or :
23 1 Etienne Pallier
$ mysql -u root
24 1 Etienne Pallier
mysql> create database pyros;
25 1 Etienne Pallier
mysql> use pyros;
26 1 Etienne Pallier
mysql> source pyros_create.sql;
27 1 Etienne Pallier
28 1 Etienne Pallier
(
29 1 Etienne Pallier
TODO:
30 1 Etienne Pallier
mysql> grant all on pyros.* to pyros@localhost identified by ‘pyros’;)
31 1 Etienne Pallier
mysql> flush privileges;
32 1 Etienne Pallier
)
33 1 Etienne Pallier
</pre>
34 1 Etienne Pallier
35 1 Etienne Pallier
36 1 Etienne Pallier
h3. Install Python3.5 (only if necessary)
37 1 Etienne Pallier
38 4 Etienne Pallier
See in III-Installation
39 1 Etienne Pallier
https://projects.irap.omp.eu/projects/pyros/wiki/Wiki#III-INSTALLATION
40 1 Etienne Pallier
41 1 Etienne Pallier
42 1 Etienne Pallier
h3. Create the project structure
43 1 Etienne Pallier
44 1 Etienne Pallier
<pre>
45 1 Etienne Pallier
$ mkdir PYROS
46 1 Etienne Pallier
</pre>
47 1 Etienne Pallier
48 1 Etienne Pallier
Example of a good organization :
49 1 Etienne Pallier
50 1 Etienne Pallier
1 project = N applis
51 1 Etienne Pallier
1 appli = N models
52 1 Etienne Pallier
A! L’appli est à côté du projet, PAS DEDANS,
53 1 Etienne Pallier
cela facilite la REUTILISATION
54 1 Etienne Pallier
(an appli can be part of many projects => reuse)
55 1 Etienne Pallier
1 appli = 1 Python module, organized for Django, by default = appli web (but not mandatory)
56 1 Etienne Pallier
57 1 Etienne Pallier
<pre>
58 1 Etienne Pallier
59 1 Etienne Pallier
MYPROJECT/
60 1 Etienne Pallier
	REQUIREMENTS.txt
61 1 Etienne Pallier
	src/
62 1 Etienne Pallier
		myproject/
63 1 Etienne Pallier
		appli1/
64 1 Etienne Pallier
		appli2/
65 1 Etienne Pallier
66 1 Etienne Pallier
		appliN/
67 1 Etienne Pallier
68 1 Etienne Pallier
	public/
69 1 Etienne Pallier
		static/
70 1 Etienne Pallier
71 1 Etienne Pallier
	private/
72 1 Etienne Pallier
		venv_py35_pyros/
73 1 Etienne Pallier
74 1 Etienne Pallier
</pre>
75 1 Etienne Pallier
76 1 Etienne Pallier
77 1 Etienne Pallier
Set needed folders:
78 1 Etienne Pallier
<pre>
79 1 Etienne Pallier
$ cd PYROS/
80 1 Etienne Pallier
$ mkdir private public
81 1 Etienne Pallier
$ mkdir public/static
82 1 Etienne Pallier
</pre>
83 1 Etienne Pallier
84 1 Etienne Pallier
85 1 Etienne Pallier
86 1 Etienne Pallier
---
87 1 Etienne Pallier
88 1 Etienne Pallier
h3. Create a Python3 virtual environment dedicated to the project (inside the project folder)
89 1 Etienne Pallier
90 4 Etienne Pallier
See in III-Installation
91 1 Etienne Pallier
https://projects.irap.omp.eu/projects/pyros/wiki/Wiki#III-INSTALLATION
92 1 Etienne Pallier
93 1 Etienne Pallier
h3. Activate the Python virtual environment (from inside the project)
94 1 Etienne Pallier
95 4 Etienne Pallier
See in III-Installation
96 1 Etienne Pallier
https://projects.irap.omp.eu/projects/pyros/wiki/Wiki#III-INSTALLATION
97 1 Etienne Pallier
98 1 Etienne Pallier
h3. Install the needed Python packages (from within the virtual environment)
99 1 Etienne Pallier
100 4 Etienne Pallier
See in III-Installation
101 1 Etienne Pallier
https://projects.irap.omp.eu/projects/pyros/wiki/Wiki#Install-the-needed-Python-packages-from-within-the-virtual-environment
102 1 Etienne Pallier
(cf manual installation)
103 1 Etienne Pallier
104 7 Etienne Pallier
---
105 7 Etienne Pallier
106 7 Etienne Pallier
h3. Set Requirements
107 7 Etienne Pallier
108 7 Etienne Pallier
<pre>
109 7 Etienne Pallier
$ pip freeze > REQUIREMENTS.txt
110 7 Etienne Pallier
</pre>
111 7 Etienne Pallier
112 7 Etienne Pallier
113 7 Etienne Pallier
114 7 Etienne Pallier
115 1 Etienne Pallier
h3. Create a Django project named PYROS
116 1 Etienne Pallier
117 1 Etienne Pallier
<pre>
118 1 Etienne Pallier
119 1 Etienne Pallier
From inside the project:
120 1 Etienne Pallier
$ pwd
121 1 Etienne Pallier
.../PYROS/
122 1 Etienne Pallier
123 1 Etienne Pallier
$ django-admin startproject pyros
124 1 Etienne Pallier
125 1 Etienne Pallier
Rename the project folder "pyros/" as "src/"
126 1 Etienne Pallier
127 1 Etienne Pallier
$ mv pyros src
128 1 Etienne Pallier
129 1 Etienne Pallier
We have then this architecture:
130 1 Etienne Pallier
131 1 Etienne Pallier
PYROS
132 1 Etienne Pallier
├── REQUIREMENTS.txt
133 1 Etienne Pallier
├── private
134 1 Etienne Pallier
│   └── venv_py35_pyros
135 1 Etienne Pallier
├── public
136 1 Etienne Pallier
│   └── static
137 1 Etienne Pallier
├── src
138 1 Etienne Pallier
│   ├── manage.py
139 1 Etienne Pallier
│   ├── pyros
140 1 Etienne Pallier
│   │   ├── __init__.py
141 1 Etienne Pallier
│   │   ├── settings.py
142 1 Etienne Pallier
│   │   ├── urls.py
143 1 Etienne Pallier
│   │   └── wsgi.py
144 1 Etienne Pallier
145 1 Etienne Pallier
</pre>
146 1 Etienne Pallier
147 1 Etienne Pallier
148 1 Etienne Pallier
149 1 Etienne Pallier
150 1 Etienne Pallier
---
151 1 Etienne Pallier
152 1 Etienne Pallier
h3. Test the project
153 1 Etienne Pallier
154 4 Etienne Pallier
See in III-Installation
155 1 Etienne Pallier
https://projects.irap.omp.eu/projects/pyros/wiki/Wiki#III-INSTALLATION
156 1 Etienne Pallier
157 1 Etienne Pallier
h3. The Web server
158 1 Etienne Pallier
159 1 Etienne Pallier
160 1 Etienne Pallier
Apache : gère tous les fichiers statiques (images, html…), et délègue les fichiers python au serveur django (par défaut)
161 1 Etienne Pallier
162 1 Etienne Pallier
Le fichier pyros/urls.py prend le relai pour tout ce qui est django
163 1 Etienne Pallier
164 1 Etienne Pallier
Le moteur web django sera soit du wsgi soit du unicorn
165 1 Etienne Pallier
166 1 Etienne Pallier
Par défaut, 1 seul worker, mais on peut en configurer plusieurs, l’idéal étant de faire "nb coeurs + 1" 
167 1 Etienne Pallier
(le worker maître qui fait le dispatching aux autres)
168 1 Etienne Pallier
169 1 Etienne Pallier
Frontend : Apache ou Ngininx
170 1 Etienne Pallier
171 1 Etienne Pallier
Backend : gunicorn (gère facilement des workers) ou uwsgi
172 1 Etienne Pallier
173 1 Etienne Pallier
<pre>
174 1 Etienne Pallier
$ gunicorn pyros.wsgi
175 1 Etienne Pallier
(à la place de manage runserver => A EVITER EN PROD)
176 1 Etienne Pallier
177 1 Etienne Pallier
Ou encore:
178 1 Etienne Pallier
179 1 Etienne Pallier
$ gunicorn --workers 5 library.wsgi
180 1 Etienne Pallier
</pre>
181 1 Etienne Pallier
182 1 Etienne Pallier
---
183 1 Etienne Pallier
184 1 Etienne Pallier
h3. Set the database engine as MySql
185 1 Etienne Pallier
186 1 Etienne Pallier
Edit src/pyros/settings.py
187 1 Etienne Pallier
188 1 Etienne Pallier
<pre>
189 1 Etienne Pallier
DATABASES = {
190 1 Etienne Pallier
    'default': {
191 1 Etienne Pallier
        'ENGINE': 'django.db.backends.mysql',
192 1 Etienne Pallier
        'NAME': 'pyros',
193 1 Etienne Pallier
        'USER': 'root',
194 1 Etienne Pallier
        'PASSWORD': ''
195 1 Etienne Pallier
    }
196 1 Etienne Pallier
}
197 1 Etienne Pallier
</pre>
198 1 Etienne Pallier
199 1 Etienne Pallier
---
200 1 Etienne Pallier
201 1 Etienne Pallier
h3. Import the database into Django (with inspectdb)
202 1 Etienne Pallier
203 1 Etienne Pallier
From src/ :
204 1 Etienne Pallier
205 1 Etienne Pallier
<pre>
206 1 Etienne Pallier
$ ./manage.py inspectdb > models.py
207 1 Etienne Pallier
</pre>
208 1 Etienne Pallier
209 1 Etienne Pallier
Issue on Mac OS X:
210 1 Etienne Pallier
<pre>
211 1 Etienne Pallier
Traceback (most recent call last):
212 1 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>
213 1 Etienne Pallier
    import MySQLdb as Database
214 1 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>
215 1 Etienne Pallier
    import _mysql
216 1 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
217 1 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
218 1 Etienne Pallier
  Reason: image not found
219 1 Etienne Pallier
220 1 Etienne Pallier
=> BOUH !!!
221 1 Etienne Pallier
222 1 Etienne Pallier
LA SOLUTION EST ICI : http://stackoverflow.com/questions/6383310/python-mysqldb-library-not-loaded-libmysqlclient-18-dylib
223 1 Etienne Pallier
224 1 Etienne Pallier
Il suffit de faire ceci:
225 1 Etienne Pallier
226 1 Etienne Pallier
$ sudo mkdir -p /usr/local/lib   
227 1 Etienne Pallier
$ sudo ln -s /Applications/XAMPP/xamppfiles/lib/libmysql* /usr/local/lib/
228 1 Etienne Pallier
229 1 Etienne Pallier
Mais on peut aussi faire ceci:
230 1 Etienne Pallier
231 1 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
232 1 Etienne Pallier
233 1 Etienne Pallier
Next, figure out where _mysql.so thinks it should find libmysqlclient.18.dylib:
234 1 Etienne Pallier
235 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
236 1 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:
237 1 Etienne Pallier
	libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0)
238 1 Etienne Pallier
...
239 1 Etienne Pallier
240 1 Etienne Pallier
So, it's looking for libmysqlclient.18.dylib with no path information, let's fix that:
241 1 Etienne Pallier
242 1 Etienne Pallier
$ locate libmysqlclient.18.dylib
243 1 Etienne Pallier
/Applications/XAMPP/xamppfiles/lib/libmysqlclient.18.dylib
244 1 Etienne Pallier
/Library/SystemMigration/History/Migration-68137DFB-CB6A-4FBB-81E2-11BDB5D01E48/QuarantineRoot/usr/lib/libmysqlclient.18.dylib
245 1 Etienne Pallier
246 1 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
247 1 Etienne Pallier
248 1 Etienne Pallier
Now _mysql.so knows the full path to the library and everything works, regardless of environment variables.
249 1 Etienne Pallier
250 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
251 1 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:
252 1 Etienne Pallier
	/Applications/XAMPP/xamppfiles/lib/libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0)
253 1 Etienne Pallier
...
254 1 Etienne Pallier
255 1 Etienne Pallier
$ ./manage.py inspectdb > models.py
256 1 Etienne Pallier
257 1 Etienne Pallier
=> YES !!!
258 1 Etienne Pallier
</pre>
259 1 Etienne Pallier
260 1 Etienne Pallier
261 1 Etienne Pallier
---
262 1 Etienne Pallier
263 1 Etienne Pallier
h3. Create a Django application named "pyrosapp"
264 1 Etienne Pallier
265 1 Etienne Pallier
From src/ :
266 1 Etienne Pallier
267 1 Etienne Pallier
<pre>
268 1 Etienne Pallier
$ ./manage.py startapp pyrosapp
269 1 Etienne Pallier
</pre>
270 1 Etienne Pallier
271 1 Etienne Pallier
We obtain this structure:
272 1 Etienne Pallier
273 1 Etienne Pallier
<pre>
274 1 Etienne Pallier
275 1 Etienne Pallier
PYROS/
276 1 Etienne Pallier
├── REQUIREMENTS.txt
277 1 Etienne Pallier
├── private/
278 1 Etienne Pallier
│   └── venv_py35_pyros/
279 1 Etienne Pallier
├── public/
280 1 Etienne Pallier
│   └── static/
281 1 Etienne Pallier
├── src/
282 1 Etienne Pallier
│   ├── manage.py
283 1 Etienne Pallier
│   ├── pyros/
284 1 Etienne Pallier
│   │   ├── __init__.py
285 1 Etienne Pallier
│   │   ├── __pycache__
286 1 Etienne Pallier
│   │   ├── settings.py
287 1 Etienne Pallier
│   │   ├── urls.py
288 1 Etienne Pallier
│   │   └── wsgi.py
289 1 Etienne Pallier
│   └── pyrosapp/
290 1 Etienne Pallier
│       ├── __init__.py
291 1 Etienne Pallier
│       ├── admin.py
292 1 Etienne Pallier
│       ├── apps.py
293 1 Etienne Pallier
│       ├── migrations
294 1 Etienne Pallier
│       ├── models.py
295 1 Etienne Pallier
│       ├── tests.py
296 1 Etienne Pallier
│       └── views.py
297 1 Etienne Pallier
298 1 Etienne Pallier
299 1 Etienne Pallier
</pre>
300 1 Etienne Pallier
301 1 Etienne Pallier
---
302 1 Etienne Pallier
303 1 Etienne Pallier
h3. Replace the default pyrosapp models.py with the inspectdb generated one
304 1 Etienne Pallier
305 1 Etienne Pallier
From src/ :
306 1 Etienne Pallier
307 1 Etienne Pallier
<pre>
308 1 Etienne Pallier
$ mv models.py pyrosapp/
309 1 Etienne Pallier
</pre>
310 1 Etienne Pallier
311 1 Etienne Pallier
Add pyrosapp to the project's applications :
312 1 Etienne Pallier
313 1 Etienne Pallier
Edit src/pyros/settings.py
314 1 Etienne Pallier
315 1 Etienne Pallier
<pre>
316 1 Etienne Pallier
INSTALLED_APPS = [
317 1 Etienne Pallier
    'django.contrib.admin',
318 1 Etienne Pallier
    'django.contrib.auth',
319 1 Etienne Pallier
    'django.contrib.contenttypes',
320 1 Etienne Pallier
    'django.contrib.sessions',
321 1 Etienne Pallier
    'django.contrib.messages',
322 1 Etienne Pallier
    'django.contrib.staticfiles',
323 1 Etienne Pallier
    'pyrosapp',
324 1 Etienne Pallier
]
325 1 Etienne Pallier
</pre>
326 1 Etienne Pallier
327 1 Etienne Pallier
---
328 1 Etienne Pallier
329 1 Etienne Pallier
h3. Fix and improve the pyrosapp models.py file (generated by inspectdb)
330 1 Etienne Pallier
331 1 Etienne Pallier
h3. Initialize the git repository
332 1 Etienne Pallier
333 1 Etienne Pallier
*Git global setup:*
334 1 Etienne Pallier
335 1 Etienne Pallier
<pre>
336 1 Etienne Pallier
$ git config --global user.name "Etienne Pallier"
337 1 Etienne Pallier
$ git config --global user.email "etienne.pallier@irap.omp.eu"
338 1 Etienne Pallier
339 1 Etienne Pallier
$ cat ~/.gitconfig 
340 1 Etienne Pallier
[user]
341 1 Etienne Pallier
	name = Etienne Pallier
342 1 Etienne Pallier
	email = epallier@irap.omp.eu
343 1 Etienne Pallier
[http]
344 1 Etienne Pallier
	sslVerify = false
345 1 Etienne Pallier
</pre>
346 1 Etienne Pallier
347 1 Etienne Pallier
348 1 Etienne Pallier
*Create a new repository:*
349 1 Etienne Pallier
350 1 Etienne Pallier
<pre>
351 1 Etienne Pallier
$ cd PYROS/
352 1 Etienne Pallier
353 1 Etienne Pallier
Define files and folders to be ignored:
354 1 Etienne Pallier
$ vi .gitignore
355 1 Etienne Pallier
.DS_Store
356 1 Etienne Pallier
private
357 1 Etienne Pallier
__pycache__
358 1 Etienne Pallier
359 1 Etienne Pallier
$ touch README.md
360 1 Etienne Pallier
361 1 Etienne Pallier
$ git add README.md
362 1 Etienne Pallier
363 1 Etienne Pallier
$ git commit -m "first commit"
364 1 Etienne Pallier
365 1 Etienne Pallier
$ git remote add origin https://gitlab.irap.omp.eu/epallier/pyros.git
366 1 Etienne Pallier
367 1 Etienne Pallier
$ git push -u origin master
368 1 Etienne Pallier
369 1 Etienne Pallier
$ git add .
370 1 Etienne Pallier
371 1 Etienne Pallier
( if you want to be sure to add ALL files: 
372 1 Etienne Pallier
$ git add -A
373 1 Etienne Pallier
)
374 1 Etienne Pallier
375 1 Etienne Pallier
( if you wanted to remove added files, just type:
376 1 Etienne Pallier
$ git reset HEAD
377 1 Etienne Pallier
)
378 1 Etienne Pallier
379 1 Etienne Pallier
$ git commit -m "first full project commit"
380 1 Etienne Pallier
381 1 Etienne Pallier
$ git push -u origin master
382 1 Etienne Pallier
Counting objects: 43, done.
383 1 Etienne Pallier
Delta compression using up to 4 threads.
384 1 Etienne Pallier
Compressing objects: 100% (41/41), done.
385 1 Etienne Pallier
Writing objects: 100% (43/43), 575.13 KiB ö 0 bytes/s, done.
386 1 Etienne Pallier
Total 43 (delta 2), reused 0 (delta 0)
387 1 Etienne Pallier
To https://gitlab.irap.omp.eu/epallier/pyros.git
388 1 Etienne Pallier
   9c7128c..64501c9  master -> master
389 1 Etienne Pallier
Branch master set up to track remote branch master from origin.
390 1 Etienne Pallier
391 1 Etienne Pallier
$ git status
392 1 Etienne Pallier
On branch master
393 1 Etienne Pallier
Your branch is up-to-date with 'origin/master'.
394 1 Etienne Pallier
nothing to commit, working directory clean
395 1 Etienne Pallier
396 1 Etienne Pallier
</pre>
397 1 Etienne Pallier
398 1 Etienne Pallier
399 1 Etienne Pallier
---
400 1 Etienne Pallier
401 1 Etienne Pallier
h3. Fix and improve the pyrosapp models.py file (generated by inspectdb)
402 1 Etienne Pallier
403 1 Etienne Pallier
Once models.py file generated, we need to delete the database and create an empty one :
404 1 Etienne Pallier
 
405 1 Etienne Pallier
<pre>
406 1 Etienne Pallier
$ mysql -u root [-p (if password needed)]
407 1 Etienne Pallier
408 1 Etienne Pallier
mysql> DROP DATABSE pyros
409 1 Etienne Pallier
mysql> CREATE SCHEMA IF NOT EXISTS 'pyros' DEFAULT CHARACTER SET utf8;
410 1 Etienne Pallier
411 1 Etienne Pallier
</pre>
412 1 Etienne Pallier
413 1 Etienne Pallier
Then edit pyrosapp/models.py :
414 1 Etienne Pallier
415 1 Etienne Pallier
 * Change 'managed = False' to 'managed = True' for every model
416 1 Etienne Pallier
417 1 Etienne Pallier
 * Change classes names to CamelCase (do not change the 'db_table = ...' lines). *Be careful* : it is needed to change all occurences :
418 1 Etienne Pallier
419 1 Etienne Pallier
    * NrtAlanysis
420 1 Etienne Pallier
    * ScheduleHistory
421 1 Etienne Pallier
    * ScientificProgram
422 1 Etienne Pallier
    * SequenceType
423 1 Etienne Pallier
    * SiteWatch
424 1 Etienne Pallier
    * SiteWatchHistory
425 1 Etienne Pallier
    * StrategyObs
426 1 Etienne Pallier
    * UserLevel
427 1 Etienne Pallier
    * WeatherWatch
428 1 Etienne Pallier
    * WeatherWatchHistory
429 1 Etienne Pallier
430 1 Etienne Pallier
 * Change the deleting mode from 'models.DO_NOTHING' to 'models.CASCADE' for the following foreign keys :
431 1 Etienne Pallier
432 1 Etienne Pallier
    * Image.plan
433 1 Etienne Pallier
    * Plan.album
434 1 Etienne Pallier
    * Album.sequence
435 1 Etienne Pallier
    * Sequence.request
436 1 Etienne Pallier
437 1 Etienne Pallier
 * Change the 'ForeignKey' liaisons to 'OneToOneField' liaisons (just replace ForeignKey by OneToOneField), and change deleting mode to 'models.CASCADE' for the following foreign keys :
438 1 Etienne Pallier
439 1 Etienne Pallier
    * Alert.request
440 1 Etienne Pallier
    * Detector.device
441 1 Etienne Pallier
    * Filter.device
442 1 Etienne Pallier
    * Telescope.device
443 1 Etienne Pallier
444 1 Etienne Pallier
 * We need to redefine many to many relationships for the following classes :
445 1 Etienne Pallier
446 1 Etienne Pallier
    * User - ScientificProgram :
447 1 Etienne Pallier
448 1 Etienne Pallier
        * add 'users = models.ManyToManyField('User')' in ScientificProgram class
449 1 Etienne Pallier
        * delete UserHasScientificProgram class
450 1 Etienne Pallier
451 1 Etienne Pallier
    * Sequence - ScheduleHistory
452 1 Etienne Pallier
453 1 Etienne Pallier
        * add 'sequences = models.ManyToManyField('Sequence')' in ScheduleHistory class
454 1 Etienne Pallier
        * delete ScheduleHasSequences class
455 1 Etienne Pallier
456 1 Etienne Pallier
457 1 Etienne Pallier
 * For each ForeignKey and ManyToManyField creation in models.py, add the 'related_name=[...]' named parameter, as in the following examples :
458 1 Etienne Pallier
459 1 Etienne Pallier
<pre>
460 1 Etienne Pallier
class Sequence(models.Model):
461 1 Etienne Pallier
    request = models.ForeignKey(Request, models.CASCADE, related_name="sequences")
462 1 Etienne Pallier
    sequencetype = models.ForeignKey('SequenceType', models.DO_NOTHING, related_name="sequences")
463 1 Etienne Pallier
    schedule = models.ForeignKey(Schedule, models.DO_NOTHING, related_name="sequences")
464 1 Etienne Pallier
    name = models.CharField(max_length=45, blank=True, null=True)
465 1 Etienne Pallier
    desc = models.TextField(blank=True, null=True)
466 1 Etienne Pallier
    ...
467 1 Etienne Pallier
468 1 Etienne Pallier
class ScheduleHistory(models.Model):
469 1 Etienne Pallier
    sequences = models.ManyToManyField('Sequence', related_name='schedulehistorys')
470 1 Etienne Pallier
    created = models.DateTimeField(blank=True, null=True)
471 1 Etienne Pallier
    ...
472 1 Etienne Pallier
473 1 Etienne Pallier
</pre>
474 1 Etienne Pallier
475 1 Etienne Pallier
 * Finally apply modifications to the database :
476 1 Etienne Pallier
477 1 Etienne Pallier
<pre>
478 1 Etienne Pallier
$ pwd
479 1 Etienne Pallier
.../PYROS/src
480 1 Etienne Pallier
$ python manage.py makemigrations pyrosapp
481 1 Etienne Pallier
$ python manage.py migrate
482 1 Etienne Pallier
</pre>
483 1 Etienne Pallier
484 1 Etienne Pallier
---
485 1 Etienne Pallier
486 1 Etienne Pallier
h3. CONFIGURATION of the Django Back Office (administration interface)
487 1 Etienne Pallier
488 1 Etienne Pallier
cf https://projects.irap.omp.eu/projects/pyros/wiki/Wiki#IV-CONFIGURATION-of-the-Django-Back-Office-administration-interface