Commit 5b1803f6 authored by Bonnegent Sebastien's avatar Bonnegent Sebastien
Browse files

cours 7 ok

parent 51d9f1f7
% Django par la pratique #07
% Sébastien Bonnegent
% https://framagit.org/bonnegent/cours\_django
% version 2018
# Gabarits avancés
## Pour la séance
### Objectifs
# Prérequis
## Base de départ
### Virtual Env
* source /opt/venv/django/bin/activate
* pipenv shell
* pipenv install djangorestframework
* inclusion de gabarit avec paramètre
* édition des règles d'un parefeu
# À faire
## La classe Regle
### webui/models.py
* set\_actif(self):
* change 'self.actif'
* save() pour la date de dernière modif
* set\_priorite(self, nb):
* affecte une priorité
* test si c'est un nombre entier
* et qu'il est strictement positif
## Formulaires
### webui/forms.py
* écrire RegleForm
* champs: priorite, groupe, services, interface, sens
## Les vues
### webui/views.py
### Sources
~~~
$ #!! settings.py et db.sqlite3 dans le dépôt !!
$ git clone \
https://gitlab.insa-rouen.fr/bonnegent/vehicules.git
$ cd vehicules
$ git checkout cours_7_debut
~~~
* def regle\_create(request, parefeu\_id)
* création d'une nouvelle règle
* redirect vers la page du parefeu
* def regle\_activable(request, pk)
* état actif / inactif
* def regle\_priorite(request, pk, remove, nombre)
* pk: clé d'une règle
* remove: booléen (True on soustrait)
* nombre: le nombre a enlevé/ajouté
* def regle\_delete(request, pk)
* suppression d'une règle inactive
* redirect vers la page du parefeu
## Configuration
### conf/settings.py
~~~python
INSTALLED_APPS = (
...
'rest_framework',
)
REST_FRAMEWORK = {
# Use Django's standard `django.contrib.auth`
# permissions, or allow read-only access for
# unauthenticated users.
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.'\
'DjangoModelPermissionsOrAnonReadOnly'
]
}
~~~
# Accès aux utilisateurs
## Routage
### garage/api.py (supports_cours_07/api_v1.py)
~~~python
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ('url', 'username', 'email', 'is_staff')
router = routers.DefaultRouter()
router.register('user', UserViewSet)
~~~
## Liens URI / views
### webui/urls.py
## URLs
### conf/urls.py
~~~python
from garage.api import router
* rendre disponible les fonctions créées précédemment
urlpatterns = [
path('api/', include(router.urls)),
]
~~~
## Gabarits #1: afficher les régles d'un parefeu
## Utilisation
~~~
$ curl -H 'Accept: application/json; indent=4' \
-u admin:admin http://127.0.0.1:8000/api/user/
~~~
### webui/templates/webui/regle\_list.html
. . .
* créer un tableau
* affiche les règles se trouvant dans la liste regle\_list
* utiliser regle\_list.html dans parefeu\_detail.html
~~~
$ curl -H 'Accept: application/json; indent=4' \
http://127.0.0.1:8000/api/user/1/
~~~
. . .
### webui/templates/webui/parefeu\_detail.html
~~~
{% include "webui/regle_list.html" with
regle_list=parefeu.modele.regle_set.all only %}
{% include "webui/regle_list.html" with
regle_list=parefeu.regle_set.all %}
$ curl -X POST -d username=new -d email=new@example.com \
-d is_staff=false -H 'Accept: application/json; indent=4' \
-u admin:admin http://127.0.0.1:8000/api/user/
~~~
## Gabarits #2: mode édition
. . .
* interface web: http://127.0.0.1:8000/api/ :)
### webui/templates/webui/regle\_list.html
## À faire
* Vehicule
* Garage
* prise en compte de la variable can\_edit
* mode édition
* ajout d'une nouvelle règle
# Limitation des droits
## Vehicule
### garage/api.py
~~~python
from rest_framework import ..., permissions
# Fin
## FireWall Manager
class IsOwnerOrReadOnly(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
# Read permissions are allowed to any request
if request.method in permissions.SAFE_METHODS:
return True
https://framagit.org/bonnegent/fwm
# Write permissions are only allowed to the owner
return obj.proprietaire == request.user
~~~
## Vehicule
### garage/api.py
~~~python
class VehiculeViewSet(...
permission_classes = (
permissions.IsAuthenticatedOrReadOnly,
IsOwnerOrReadOnly,)
~~~
No preview for this file type
"""API Rest"""
from django.contrib.auth.models import User
from rest_framework import serializers, viewsets, routers
# Serializers define the API representation.
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ('url', 'username', 'email', 'is_staff')
# ViewSets define the view behavior.
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
# Routers provide a way of automatically determining the URL conf.
router = routers.DefaultRouter()
router.register('users', UserViewSet)
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment