« Previous -
Version 55/177
(diff) -
Next » -
Current version
Etienne Pallier, 03/29/2016 11:08 am
Project Development¶
Project Installation page : Project Installation
HOWTO Format Redmine Wiki : http://www.redmine.org/projects/redmine/wiki/FrRedmineWikiFormatting
- Project Development
- TODO
- LIENS UTILES
- I - DATABASE SCHEMA (v0.2.1)
- II - Get the project (from gitlab)
- III - INSTALLATION
- IV - CONFIGURATION of the Django Back Office (administration interface)
- V - EVOLUTION OF THE PROJECT
- DJANGO SHELL (top cool)
- HOWTO (divers)
- INSTALLATION FROM THE BEGINNING (for dev only, history of the initial project creation)
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
class Tache(models.Model): date_limite = models.DateField(auto_now_add)
(ajoute automatiquement la date du jour)
- 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
- passer la TODO list sur redmine (=> roadmap)
- pyrossu : pyrossu!
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
I - DATABASE SCHEMA (v0.2.1)¶
II - Get the project (from gitlab)¶
Gitlab management interface¶
https://gitlab.irap.omp.eu/epallier/pyros
https://gitlab.irap.omp.eu/epallier/pyros/team
Get the project¶
https://projects.irap.omp.eu/projects/pyros/wiki/Project_Installation#II-Get-the-project-from-gitlab
III - INSTALLATION¶
https://projects.irap.omp.eu/projects/pyros/wiki/Project_Installation#III-INSTALLATION
IV - CONFIGURATION of the Django Back Office (administration interface)¶
Configuration of the Django Back office (admin)
V - EVOLUTION OF THE PROJECT¶
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, ...)
$ python manage.py makemigrations pyrosapp $ python manage.py migrate
Manage static files (for admin but also for each application)¶
./manage.py runserver
if DEBUG=False, we have errors, missing static files :
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 …
=> 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:
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)
STATIC_ROOT must be defined in settings and says where is the root of all static files
Edit settings.py, add:
STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'public', 'static')
./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 »)
DJANGO SHELL (top cool)¶
cf page 60 for the ORM methods
./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>
HOWTO (divers)¶
Many to Many¶
tache <=> user
tache.user
user.tache_set
Pour relier une appli python pure à un projet django :¶
=> Ajouter le src/ dans le pythonpath
Séparer le code métier :¶
=> installer le code métier comme un module via pipCouches :
- présentation
- métier
- modèle
ORM¶
(cf page 60)
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)
Serveur Web¶
Apache : gère tous les fichiers statiques (images, html…), et délègue les fichiers python au serveur django
Moteur web django sera soit du wsgi soit du unicorn
Par défaut, 1 seul worker, mais on peut en configurer plusieurs,
l’idéal étant de faire nb coeurs + 1 (le worker maître qui fait le dispatching aux autres)
Frontend : Apache ou Ngininx
Backend : gunicorn (gère facilement des workers) ou uwsgi
(à la place de manage runserver > A EVITER EN PROD)
pip install gunicorn
gunicorn library.wsgi
ou
gunicorn - - workers 5 library.wsgi
(gunicorn == tomcat, serveur d’appli Python)
1) URL arrive à Apache, qui dispatche (il gère seul les fichiers statiques, et les fichiers python il les transmet à Django)
2) le fichier library/urls.py prend le relai pour tout ce qui est django
On peut ajouter un fichier urls.py pour gérer les urls de l’appli
(on garde le urls.py général du projet pour gérer les grandes urls)