Commit 1eb312ab authored by Bonnegent Sebastien's avatar Bonnegent Sebastien
Browse files

WIP sur cours #2

parent 386f9fb9
......@@ -7,10 +7,11 @@ par séance.
Installation sur une fedora 27
==============================
dnf install pandoc pandoc-pdf texlive-latex-bin-bin texlive-beamer
~~~
$ dnf install pandoc pandoc-pdf texlive-latex-bin-bin texlive-beamer \
texlive-wasysym texlive-collection-langfrench impressive texlive-wasy
git clone git@gitlab.insa-rouen.fr:bonnegent/cours_django.git
$ git clone git@gitlab.insa-rouen.fr:bonnegent/cours_django.git
~~~
Le répertoire pdf/ contient les présentations et les répertoires cours_XX
......
......@@ -310,10 +310,11 @@ class Garage(models.Model):
~~~{.py .numberLines}
>>> grg, flag = Garage.objects\
.get_or_create(nom="L'autre fils")
>>> Garage.objects.filter(nom__contains="Autre")
>>> Garage.objects.filter(nom__icontains="Autre")
>>> Garage.objects.filter(mail__endswith=".fr")\
.filter(adresse__contains="Rouen")
>>> filtre = Garage.objects.filter
>>> filtre(nom__contains="Autre")
>>> filtre(nom__icontains="Autre")
>>> filtre(mail__endswith=".fr")\
.filtre(adresse__contains="Rouen")
~~~
. . .
......
......@@ -22,7 +22,6 @@ System check identified no issues (0 silenced).
September 28, 2017 - 13:29:48
Django version 1.11, using settings 'monsite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
~~~
## Consultation
......@@ -40,7 +39,8 @@ $ pipenv run ./manage.py createsuperuser
### garage/admin.py
~~~python
from .models import Garage, Vehicule, AFaire, Entretien
from .models import Garage, Vehicule, AFaire, \
Entretien
admin.site.register(Garage)
admin.site.register(Vehicule)
......@@ -67,270 +67,84 @@ admin.site.register(Entretien, EntretienAdmin)
# MVC
## Rappel de l'arborescence
\center\includegraphics[height=3.5cm]{images/tree-webui.png}
## Modèle Vue Contrôleur
### Modèle
- webui/models.py
- garage/models.py
- logique métier
- intelligence
. . .
### Vue
- webui/views.py
- templates
- conf/urls.py
- webui/urls.py
- garage/templates
. . .
### Contrôleur
- Django
- garage/views.py
# Factorisation
## Constat
### Plusieurs classes avec un attribut nom
- Adresse
- Groupe
- Service
- Modele
- Parefeu
## Création d'une classe abstraite
### webui/models.py
~~~{.py .numberLines}
class AvecNom(models.Model):
"""Classe abstraite pour les objets ayant un nom"""
nom = models.CharField(default="", max_length=25)
class Meta(object):
abstract = True
ordering = ("nom", )
## Définition
def __str__(self):
return "%s" % self.nom
class Service(AvecNom):
### Wikipedia
~~~
# Interface d'admin
## Version simple
### webui/admin.py
~~~{.py .numberLines}
from django.contrib import admin
from .models import Port
admin.site.register(Port)
https://fr.wikipedia.org/wiki/Modèle-vue-contrôleur
~~~
. . .
### Pour y accéder
~~~
$ ./manage.py runserver
$ # ouvrir la page http://localhost:8000/admin
~~~
\center\includegraphics[height=2.5cm]{images/admin-port-default.png}
## Version personnalisée
### webui/admin.py
~~~{.py .numberLines}
class PortAdmin(admin.ModelAdmin):
list_display = ('debut', 'fin',
'protocole')
## Routage d'URLs
### conf/urls.py
~~~python
from django.contrib import admin
from django.urls import path
admin.site.register(Port, PortAdmin)
urlpatterns = [
path('admin/', admin.site.urls),
~~~
\center\includegraphics[height=2.5cm]{images/admin-port.png}
## Service #1
### Service
- nom: chaine de caractères (25)
- ports: une liste de ports
. . .
### webui/models.py
~~~{.py .numberLines}
class Service(AvecNom):
ports = models.ManyToManyField(Port)
~~~
## Ajouter des données
### /admin/
- ajouter les ports suivants:
- 22/tcp
- 25/tcp
- 80/tcp
- 123/tcp
- 123/udp
- 389/tcp
- 443/tcp
- ajouter les services:
- ssh: 22/tcp
- ldap: 389/tcp
- web: 80/tcp, 443/tcp
- ntp: 123/udp, 123/tcp
## Service #2
### Pour la suite
~~~{.py .numberLines}
>>> web = Service.objects.get(nom="web")
>>> p22 = Port.objects.get(debut=22)
>>> p80 = Port.objects.get(debut=80)
>>> p443 = Port.objects.get(debut=443)
~~~
## Service #3
### Utilisation 1/2
~~~{.py .numberLines}
>>> web.ports.add(p80, p443)
>>> web.ports.all()
<QuerySet [<Port: 80(tcp)>, <Port: 443(tcp)>]>
>>> # pas d'élèments en double
>>> web.ports.add(p22)
>>> web.ports.all()
<QuerySet [<Port: 22(tcp)>, <Port: 80(tcp)>,
<Port: 443(tcp)>]>
>>> web.ports.remove(p22)
>>> web.ports.all()
<QuerySet [<Port: 80(tcp)>, <Port: 443(tcp)>]>
~~~
## Service #4
### Filtrage
~~~{.py .numberLines}
>>> filtre = Service.objects.filter
>>> # recherche dans les élèments M2M
>>> filtre(ports__debut__gt=80)
<QuerySet [<Service: web>]>
>>> filtre(ports__debut__gt=22)
<QuerySet [<Service: web>, <Service: web>]>
>>> filtre(ports__debut__gt=22).distinct()
<QuerySet [<Service: web>]>
~~~
## Ajouter des informations
### webui/admin.py
~~~{.py .numberLines}
from .models import Service
class ServiceAdmin(admin.ModelAdmin):
list_display = ('nom', 'liste_des_ports')
admin.site.register(Service, ServiceAdmin)
~~~python
path('', include('garage.urls')),
]
~~~
. . .
## Routage d'URLs #2
### garage/urls.py
~~~python
from django.urls import path
from . import views
### webui/models.py
~~~{.py .numberLines}
def liste_des_ports(self):
return ", ".join([str(p)
for p in self.ports.all()])
urlpatterns = [
path('', views.home, name='home'),
]
~~~
# Règles
## La classe Règle
- priorite: un entier positif
- groupe: un groupe d'adresse
- services: une liste de Service
- interface: une chaine de caractères (25)
- actif: un booléen
- sens: un élément de la liste Input, Forward, Output
## Contrôle
### garage/views.py
~~~python
from django.http import HttpResponse
. . .
### webui/models.py
~~~{.py .numberLines}
SENS = (('i', 'Input'),
('f', 'Forward'),
('o', 'Output'))
def home(request):
"""Page d'accueil"""
return HttpResponse('ça marche !')
~~~
## Implémentation
### webui/models.py
~~~{.py .numberLines}
class Regle(models.Model):
priorite = models.PositiveIntegerField(default=0)
groupe = models.ForeignKey(Groupe,
blank=True,
null=True)
services = models.ManyToManyField(Service)
interface = models.CharField(default="",
max_length=25,
blank=True)
actif = models.BooleanField(default=True)
sens = models.CharField(max_length=1,
choices=SENS,
default="i")
~~~
## Vue
## Factorisation
### TODO
- bootstrap
- template par défaut
Les classes Modele et Parefeu partagent:
- nom: une chaine de caractères (25)
- regles: une liste de règles
- modification: DateTime de la dernière modification
## Classe abstraite
~~~python
from django.shortcuts import render
### webui/models.py
~~~{.py .numberLines}
class AvecRegles(AvecNom):
modification = models.DateTimeField(auto_now=True)
regles = models.ManyToManyField(Regle, blank=True)
from .models import Question
class Meta(object):
abstract = True
def nombre_de_regles(self):
return self.regles.count()
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
context = {'latest_question_list': latest_question_list}
return render(request, 'polls/index.html', context)
~~~
## À faire
### https://docs.djangoproject.com/fr/
- Parefeu
- nom
- regles
- modification
- modele: un Modele
- admin: un User
- Modele
- nom
- regles
- modification
- description: chaine de caractères (125)
- compléter webui/admin.py
No preview for this file type
......@@ -15,6 +15,8 @@
* outils et frontend
- administration, runserver, urls, logs et messages / templates ?
> urls comment est fait la résolution ?
## En attente
* premières vues
......
Supports Markdown
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