Project Development
Version 51 (Etienne Pallier, 03/25/2016 11:48 pm) → Version 52/177 (Etienne Pallier, 03/25/2016 11:53 pm)
h1. Project Development
Project Installation page : [[Project Installation]]
HOWTO Format Redmine Wiki : http://www.redmine.org/projects/redmine/wiki/FrRedmineWikiFormatting
{{>toc}}
---
h2. %{margin-left:0px; font-weight:bold; font-size:25px; display:block; color:red;}TODO%
* Interface admin (http://localhost:8000/admin):
* Impossible d'ajouter un pays dans Country depuis admin (erreur sur pyrosuser.name)
* Impossible d'ajouter un telescope (erreur sur device.name)
* champs booleans: représenter en case à cocher (cf requests.is_alert) : is_alert = models.BooleanField()
* Fix plurals:
* Country : plural "countries" and not "countrys"
* NrtAnalysiss
* Historys
* ...
* Models: bien définir les valeurs par défaut
* ex: request.is_alert = False par défaut
* Preload some data for some tables:
* country => France, Mexico, ...
* sequencetype => 0=routine, 1=alert, ...
* userlevel => 0=normal, 1=expert, 2=admin, ...
* ...
* updated et created : champs automatiques Django
* readonly admin interface : https://gist.github.com/aaugustin/1388243
* Ecrire quelques premiers petits tests
* Tester install eclipse from scratch (vérifier qu'on n'a plus besoin de faire "set as pydev" et "set as django" et set DJANGO_MANAGE_LOCATION et set DJANGO_SETTINGS_MODULE)
* Séparation des BD Django et Pyros
* Intégration des modules Django déjà développés
* Intégration continue avec Jenkins (+ run des tests sur une VM Windows)
* Planifier la suite...
* Doc pour le meeting de mai
* pyrossu : pyrossu!
---
h2. %{margin-left:0px; font-weight:bold; font-size:25px; display:block; color:red;}LIENS UTILES%
* Liens vers web local :
* homepage: http://localhost:8000
* admin: http://localhost:8000/admin
* Eclipse:
* Shift-Ctrl-f (ou Shift-Cmd-f) : reformatage du fichier selon PEP8
* Shift-Ctrl-1 : make doc string ...
* Django:
* Coding style: https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/coding-style
* Doc : https://docs.djangoproject.com/en/1.9
* (FR) http://docs.djangoproject.com/fr
* http://stackoverflow.com/questions/tagged/django
* www.django-fr.org/planete
* https://www.djangopackages.com/
* http://forum.django-fr.org
* La mailing list : django@lists.afpy.org
* Git docs:
* Permissions gitlab: https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/permissions/permissions.md
* https://git-scm.com/docs
* https://git-scm.com/book/fr/v1/Les-bases-de-Git-Travailler-avec-des-d%C3%A9p%C3%B4ts-distants
* les workflows: https://aresu.dsi.cnrs.fr/spip.php?article219
* Git for Eclipse users : http://wiki.eclipse.org/EGit/Git_For_Eclipse_Users
* Git sur sourcesup (avec jenkins) : https://services.renater.fr/sourcesup/formation/chap04#gestion_d_un_projet_avec_git_jenkins_sonar_et_nexus
* CADOR web interface: http://cador.obs-hp.fr/ros/manual/cador_actions.html
* pylint (analyse de code) : https://www.pylint.org
* pyreverse (uml diagrams generation, inclus dans pylint) : https://www.logilab.org/blogentry/6883
* tox (a generic virtualenv management and test command line tool) : https://testrun.org/tox/latest/index.html
---
---
h2. %{margin-left:0px; font-weight:bold; font-size:25px; display:block; color:red;}I - DATABASE SCHEMA (v0.2.1)%
{{thumbnail(PYROS_PDM_v021.png, size=300, title=Pyros data model)}}
---
h2. %{margin-left:0px; font-weight:bold; font-size:25px; display:block; color:red;}II - Get the project (from gitlab)%
h3. Gitlab management interface
https://gitlab.irap.omp.eu/epallier/pyros
https://gitlab.irap.omp.eu/epallier/pyros/team
h3. Get the project
https://projects.irap.omp.eu/projects/pyros/wiki/Project_Installation#II-Get-the-project-from-gitlab
---
h2. %{margin-left:0px; font-weight:bold; font-size:25px; display:block; color:red;}III - INSTALLATION%
https://projects.irap.omp.eu/projects/pyros/wiki/Project_Installation#III-INSTALLATION
---
h2. %{margin-left:0px; font-weight:bold; font-size:25px; display:block; color:red;}IV - CONFIGURATION of the Django Back Office (administration interface)%
[[django_backoffice_config|Configuration of the Django Back office (admin)]]
---
h2. %{margin-left:0px; font-weight:bold; font-size:25px; display:block; color:red;}V - EVOLUTION OF THE PROJECT%
h3. Linking the User model to the django's one
* Modifications in models.py :
* Rename User model to PyrosUser
* Rename user table name to pyros_user
* Change all occurences (User -> PyrosUser, users -> pyros_users, ...)
* from django.contrib.auth.models import User <== add at the beginning of the file
* user = models.OneToOneField(User, on_delete=models.CASCADE) <== add this field in PyrosUser declaration
* delete fields in PyrosUser : name, firstname, email, login, pass
* Modifications in admin.py :
* Change all occurences (User* -> PyrosUser*, users -> pyros_users, ...)
<pre>
$ python manage.py makemigrations pyrosapp
$ python manage.py migrate
</pre>
---
h3. Manage static files (for admin but also for each application)
./manage.py runserver
if DEBUG=False, we have errors, missing static files :
<pre>
Not Found: /static/admin/css/base.css
Not Found: /static/admin/css/login.css
Not Found: /admin/login
Not Found: /static/admin/css/base.css
Not Found: /static/admin/css/login.css
Not Found: /static/admin/css/base.css
Not Found: /static/admin/css/login.css
Not Found: /static/admin/css/base.css
Not Found: /static/admin/css/dashboard.css
Not Found: /static/admin/css/base.css
Not Found: /static/admin/css/base.css
…
</pre>
=> We have to activate the static files management
(see https://docs.djangoproject.com/en/1.9/howto/static-files)
In pyros/urls.py, add this:
<pre>
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
url(r'^admin/', admin.site.urls),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
</pre>
STATIC_ROOT must be defined in settings and says where is the root of all static files
Edit settings.py, add:
<pre>
STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'public', 'static')
</pre>
./manage.py collectstatic
=> 56 static files copied to '.../PYROS/public/static'
(in fact it is in public/static/admin/)
Cette commande copie tous les fichiers statiques de toutes les applis
dans public/static
Apache viendra lire ce dossier unique
A chq changement d’un fichier statique d’une appli, exécuter « collectstatic » pour mettre à jour le dossier final public/static (auquel on ne doit pas toucher manuellement, c’est un dossier « final »)
---
h2. %{margin-left:0px; font-weight:bold; font-size:25px; display:block; color:red;}DJANGO SHELL (top cool)%
cf page 60 for the ORM methods
<pre>
./manage.py shell
Python 3.5.1 (default, Mar 2 2016, 03:38:02)
(InteractiveConsole)
>>> import django
>>> from pyrosapp.models import *
>>> country = Country(name='mexico', quota=1)
>>> country.save()
(ajout si pas d’id, modif si id)
>>> country = Country(name='france')
>>> country.save()
>>> country.pk
>>> 2
>>> countries = Country.objects.all()
>>> countries.count
>>> <bound method QuerySet.count of <Country: mexico>, <Country: france>>
>>> countries.count()
>>> 2
>>> print(countries)
>>> <Country: mexico>, <Country: france>
>>> print(countries.query)
>>> SELECT country.id, country.name, country.desc, country.quota FROM country
>>> cs = countries.filter(name__icontains='fran')
>>> print(cs)
>>> <Country: france>
>>> cs = countries.filter(name__startswith='me')
>>> print(cs)
>>> <Country: mexico>
</pre>
---
h2. %{margin-left:0px; font-weight:bold; font-size:25px; display:block; color:red;}HOWTO (divers)%
h3. Many to Many
tache <=> user
tache.user
user.tache_set
h3. Pour relier une appli python pure à un projet django :
=> Ajouter le src/ dans le pythonpath
h3. Séparer le code métier :
=> installer le code métier comme un module via pip
Couches :
* présentation
* métier
* modèle
h3. ORM
(cf page 60)
*(TODO: tester avec Django Shell)*
b = Book(…)
b.save() :
ajout si pas d’id, modif si id
Book.objects.all()
Book.objects.filter(
release__gte=date(2013, 01, 01)
).exclude(
borrowed=True
)
A! La requete est exécutée le plus tard possible, seulement quand django a vraiment besoin de l’exécuter
books = Book.objects.exclude(borrowed=True).order_by('title')
print (books.author)
Book.objects.get(pk=12)
author = Author.objects.get(pk=25)
author.books.filter(borrowed=False)
(books est le related name déclaré dans la relation manytomany)
---
h2. %{margin-left:0px; font-weight:bold; font-size:25px; display:block; color:red;}INSTALLATION FROM THE BEGINNING (for dev only, history of the initial project creation)%
[[pyros_install_from_start|Pyros installation from the beginning]]
Project Installation page : [[Project Installation]]
HOWTO Format Redmine Wiki : http://www.redmine.org/projects/redmine/wiki/FrRedmineWikiFormatting
{{>toc}}
---
h2. %{margin-left:0px; font-weight:bold; font-size:25px; display:block; color:red;}TODO%
* Interface admin (http://localhost:8000/admin):
* Impossible d'ajouter un pays dans Country depuis admin (erreur sur pyrosuser.name)
* Impossible d'ajouter un telescope (erreur sur device.name)
* champs booleans: représenter en case à cocher (cf requests.is_alert) : is_alert = models.BooleanField()
* Fix plurals:
* Country : plural "countries" and not "countrys"
* NrtAnalysiss
* Historys
* ...
* Models: bien définir les valeurs par défaut
* ex: request.is_alert = False par défaut
* Preload some data for some tables:
* country => France, Mexico, ...
* sequencetype => 0=routine, 1=alert, ...
* userlevel => 0=normal, 1=expert, 2=admin, ...
* ...
* updated et created : champs automatiques Django
* readonly admin interface : https://gist.github.com/aaugustin/1388243
* Ecrire quelques premiers petits tests
* Tester install eclipse from scratch (vérifier qu'on n'a plus besoin de faire "set as pydev" et "set as django" et set DJANGO_MANAGE_LOCATION et set DJANGO_SETTINGS_MODULE)
* Séparation des BD Django et Pyros
* Intégration des modules Django déjà développés
* Intégration continue avec Jenkins (+ run des tests sur une VM Windows)
* Planifier la suite...
* Doc pour le meeting de mai
* pyrossu : pyrossu!
---
h2. %{margin-left:0px; font-weight:bold; font-size:25px; display:block; color:red;}LIENS UTILES%
* Liens vers web local :
* homepage: http://localhost:8000
* admin: http://localhost:8000/admin
* Eclipse:
* Shift-Ctrl-f (ou Shift-Cmd-f) : reformatage du fichier selon PEP8
* Shift-Ctrl-1 : make doc string ...
* Django:
* Coding style: https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/coding-style
* Doc : https://docs.djangoproject.com/en/1.9
* (FR) http://docs.djangoproject.com/fr
* http://stackoverflow.com/questions/tagged/django
* www.django-fr.org/planete
* https://www.djangopackages.com/
* http://forum.django-fr.org
* La mailing list : django@lists.afpy.org
* Git docs:
* Permissions gitlab: https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/permissions/permissions.md
* https://git-scm.com/docs
* https://git-scm.com/book/fr/v1/Les-bases-de-Git-Travailler-avec-des-d%C3%A9p%C3%B4ts-distants
* les workflows: https://aresu.dsi.cnrs.fr/spip.php?article219
* Git for Eclipse users : http://wiki.eclipse.org/EGit/Git_For_Eclipse_Users
* Git sur sourcesup (avec jenkins) : https://services.renater.fr/sourcesup/formation/chap04#gestion_d_un_projet_avec_git_jenkins_sonar_et_nexus
* CADOR web interface: http://cador.obs-hp.fr/ros/manual/cador_actions.html
* pylint (analyse de code) : https://www.pylint.org
* pyreverse (uml diagrams generation, inclus dans pylint) : https://www.logilab.org/blogentry/6883
* tox (a generic virtualenv management and test command line tool) : https://testrun.org/tox/latest/index.html
---
---
h2. %{margin-left:0px; font-weight:bold; font-size:25px; display:block; color:red;}I - DATABASE SCHEMA (v0.2.1)%
{{thumbnail(PYROS_PDM_v021.png, size=300, title=Pyros data model)}}
---
h2. %{margin-left:0px; font-weight:bold; font-size:25px; display:block; color:red;}II - Get the project (from gitlab)%
h3. Gitlab management interface
https://gitlab.irap.omp.eu/epallier/pyros
https://gitlab.irap.omp.eu/epallier/pyros/team
h3. Get the project
https://projects.irap.omp.eu/projects/pyros/wiki/Project_Installation#II-Get-the-project-from-gitlab
---
h2. %{margin-left:0px; font-weight:bold; font-size:25px; display:block; color:red;}III - INSTALLATION%
https://projects.irap.omp.eu/projects/pyros/wiki/Project_Installation#III-INSTALLATION
---
h2. %{margin-left:0px; font-weight:bold; font-size:25px; display:block; color:red;}IV - CONFIGURATION of the Django Back Office (administration interface)%
[[django_backoffice_config|Configuration of the Django Back office (admin)]]
---
h2. %{margin-left:0px; font-weight:bold; font-size:25px; display:block; color:red;}V - EVOLUTION OF THE PROJECT%
h3. Linking the User model to the django's one
* Modifications in models.py :
* Rename User model to PyrosUser
* Rename user table name to pyros_user
* Change all occurences (User -> PyrosUser, users -> pyros_users, ...)
* from django.contrib.auth.models import User <== add at the beginning of the file
* user = models.OneToOneField(User, on_delete=models.CASCADE) <== add this field in PyrosUser declaration
* delete fields in PyrosUser : name, firstname, email, login, pass
* Modifications in admin.py :
* Change all occurences (User* -> PyrosUser*, users -> pyros_users, ...)
<pre>
$ python manage.py makemigrations pyrosapp
$ python manage.py migrate
</pre>
---
h3. Manage static files (for admin but also for each application)
./manage.py runserver
if DEBUG=False, we have errors, missing static files :
<pre>
Not Found: /static/admin/css/base.css
Not Found: /static/admin/css/login.css
Not Found: /admin/login
Not Found: /static/admin/css/base.css
Not Found: /static/admin/css/login.css
Not Found: /static/admin/css/base.css
Not Found: /static/admin/css/login.css
Not Found: /static/admin/css/base.css
Not Found: /static/admin/css/dashboard.css
Not Found: /static/admin/css/base.css
Not Found: /static/admin/css/base.css
…
</pre>
=> We have to activate the static files management
(see https://docs.djangoproject.com/en/1.9/howto/static-files)
In pyros/urls.py, add this:
<pre>
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
url(r'^admin/', admin.site.urls),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
</pre>
STATIC_ROOT must be defined in settings and says where is the root of all static files
Edit settings.py, add:
<pre>
STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'public', 'static')
</pre>
./manage.py collectstatic
=> 56 static files copied to '.../PYROS/public/static'
(in fact it is in public/static/admin/)
Cette commande copie tous les fichiers statiques de toutes les applis
dans public/static
Apache viendra lire ce dossier unique
A chq changement d’un fichier statique d’une appli, exécuter « collectstatic » pour mettre à jour le dossier final public/static (auquel on ne doit pas toucher manuellement, c’est un dossier « final »)
---
h2. %{margin-left:0px; font-weight:bold; font-size:25px; display:block; color:red;}DJANGO SHELL (top cool)%
cf page 60 for the ORM methods
<pre>
./manage.py shell
Python 3.5.1 (default, Mar 2 2016, 03:38:02)
(InteractiveConsole)
>>> import django
>>> from pyrosapp.models import *
>>> country = Country(name='mexico', quota=1)
>>> country.save()
(ajout si pas d’id, modif si id)
>>> country = Country(name='france')
>>> country.save()
>>> country.pk
>>> 2
>>> countries = Country.objects.all()
>>> countries.count
>>> <bound method QuerySet.count of <Country: mexico>, <Country: france>>
>>> countries.count()
>>> 2
>>> print(countries)
>>> <Country: mexico>, <Country: france>
>>> print(countries.query)
>>> SELECT country.id, country.name, country.desc, country.quota FROM country
>>> cs = countries.filter(name__icontains='fran')
>>> print(cs)
>>> <Country: france>
>>> cs = countries.filter(name__startswith='me')
>>> print(cs)
>>> <Country: mexico>
</pre>
---
h2. %{margin-left:0px; font-weight:bold; font-size:25px; display:block; color:red;}HOWTO (divers)%
h3. Many to Many
tache <=> user
tache.user
user.tache_set
h3. Pour relier une appli python pure à un projet django :
=> Ajouter le src/ dans le pythonpath
h3. Séparer le code métier :
=> installer le code métier comme un module via pip
Couches :
* présentation
* métier
* modèle
h3. ORM
(cf page 60)
*(TODO: tester avec Django Shell)*
b = Book(…)
b.save() :
ajout si pas d’id, modif si id
Book.objects.all()
Book.objects.filter(
release__gte=date(2013, 01, 01)
).exclude(
borrowed=True
)
A! La requete est exécutée le plus tard possible, seulement quand django a vraiment besoin de l’exécuter
books = Book.objects.exclude(borrowed=True).order_by('title')
print (books.author)
Book.objects.get(pk=12)
author = Author.objects.get(pk=25)
author.books.filter(borrowed=False)
(books est le related name déclaré dans la relation manytomany)
---
h2. %{margin-left:0px; font-weight:bold; font-size:25px; display:block; color:red;}INSTALLATION FROM THE BEGINNING (for dev only, history of the initial project creation)%
[[pyros_install_from_start|Pyros installation from the beginning]]