Le mirroring des dépôts vers Github est maintenant natif dans Gitlab (et donc Framagit). Merci de passer à la fonction native pour que nous puissions couper notre solution maison. Détails sur https://docs.gitlab.com/ee/workflow/repository_mirroring.html#pushing-to-a-remote-repository (pensez à supprimer le webhook de notre solution maison).

Commit bc3efdc7 by Grégory DAVID

Ajout de la documentation du SI

Les diagrammes UML sont générés en SVG par compilation des fichiers de description PlantUML. La construction de la version PDF est assurée par Inkscape.
parent 420b01e4
Pipeline #57538 failed with stage
in 9 minutes 26 seconds
......@@ -15,3 +15,14 @@ test:
- make migrations
- make migrate
- make test
docs:
image: aergus/latex
before_script:
- apt-get update -qy
- apt-get install -y latexmk plantuml graphviz inkscape
script:
- make docs
artifacts:
paths:
- docs/*.pdf
......@@ -62,3 +62,9 @@ requirements: venv
@pip3 install -r requirements.txt
venv-clean:
-rm -rf venv/
.PHONY: docs
docs:
$(MAKE) -C docs
clean-docs:
$(MAKE) -C docs clean
$pdflatex = 'pdflatex --shell-escape %O %S';
$recorder = 1;
$hash_calc_ignore_pattern{'pdf'} = '.*';
add_cus_dep('glo', 'gls', 0, 'makeglo2gls');
sub makeglo2gls {
system("makeindex -s '$_[0]'.ist -t '$_[0]'.glg -o '$_[0]'.gls '$_[0]'.glo");
}
add_cus_dep('acn', 'acr', 0, 'makeacn2acr');
sub makeacn2acr {
system("makeindex -s '$_[0]'.ist -t '$_[0]'.alg -o '$_[0]'.acr '$_[0]'.acn");
}
add_cus_dep('puml', 'pdf', 0, 'plantuml');
sub plantuml {
system("plantuml -tsvg '$_[0]'.puml && inkscape --without-gui --export-pdf='$_[0]'.pdf --file='$_[0]'.svg");
}
LATEX_SRC = cahier-des-charges.tex
UML_SRC = $(wildcard *.puml)
UML_SVG = $(patsubst %.puml,%.svg,$(UML_SRC))
UML_PDF = $(patsubst %.svg,%.pdf,$(UML_SVG))
PLANTUML_BIN = $(shell which plantuml)
INKSCAPE_BIN = $(shell which inkscape)
.PHONY: all docs doc-uml doc-CDC clean clean-docs clean-uml clean-CDC
all: docs
%.svg: %.puml
$(info Construit le diagramme $*)
$(PLANTUML_BIN) -tsvg $<
%.pdf: %.svg
$(info Converti en PDF le diagramme $*)
$(INKSCAPE_BIN) --without-gui --export-pdf=$@ --file=$<
doc-uml: $(UML_PDF)
clean-uml:
-rm -f $(UML_SVG) $(UML_PDF)
doc-CDC: $(LATEX_SRC)
latexmk -recorder -pdf $^
doc-CDC-continue:
latexmk -recorder -pdf $^
clean-CDC: $(LATEX_SRC)
@latexmk -recorder -pdf -C $^
docs: doc-uml doc-CDC
clean: clean-docs
clean-docs: clean-CDC clean-uml
\documentclass[french,a4paper,titlepage]{book}
\input{preambule}
\begin{document}
\pagenumbering{gobble}
\thispagestyle{empty}
\maketitle
\frontmatter
\pagenumbering{roman}
\input{copyright}
\thispagestyle{empty}
\pagenumbering{gobble}
\tableofcontents{}
\mainmatter
\pagenumbering{arabic}
\part{Modélisation du système d'information}
\label{part:modelisation}
\chapter{Diagramme des classes\index{classe}}
\label{chap:diagramme.classes}
\begin{figure}[tbph]
\centering
\includegraphics[angle=90,width=.7\textwidth]{uml-class.pdf}
\caption{Diagramme UML des classes}
\label{fig:diagramme.classes}
\end{figure}
\chapter{Diagramme des cas d'utilisation}
\label{chap:diagramme.usecase}
\begin{figure}[tbph]
\centering
\includegraphics[width=\textwidth]{uml-use_case.pdf}
\caption{Diagramme UML des cas d'utilisation}
\label{fig:diagramme.usecase}
\end{figure}
%\chapter{Diagrammes de séquence}
%\label{chap:diagramme.sequence}
% \part{Fonctions attendues}
% \label{part:fonctions}
% \section{Concernant l'utilisateur}
% \label{sec:utilisateur}
% \subsection{Ajout d'un utilisateur}
% \label{sec:utilisateur.ajout}
% \subsection{Suppression d'un utilisateur}
% \label{sec:utilisateur.suppression}
% \subsection{Modification d'un utilisateur}
% \label{sec:utilisateur.modification}
% \section{Concernant un diffusable}
% \label{sec:diffusable}
% \subsection{Ajout d'un diffusable}
% \label{sec:diffusable.ajout}
% \subsection{Suppression d'un diffusable}
% \label{sec:diffusable.suppression}
% \subsection{Modification d'un diffusable}
% \label{sec:diffusable.modification}
\backmatter
\appendix
\pagenumbering{roman}
\addcontentsline{toc}{chapter}{Index}
\printindex
\bibliographystyle{style}
\bibliography{fichierbib}
\listoftables{}
\listoffigures{}
\end{document}
\usepackage[margin=2.5cm]{geometry}
\usepackage[french]{babel}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\usepackage[
pdftex,%
pdftitle={Cahier des charges},%
pdfauthor={Gregory DAVID, Vincent LE TEXIER},%
]{hyperref}
\usepackage{varioref}
\usepackage{imakeidx}
\makeindex
\title{\Huge Cahier des charges \\ \huge Système d'information de la
radio en milieu scolaire \\ \small Lycée André \textsc{Malraux},
72700 Allonnes}%
\author{Grégory DAVID \and Vincent LE TEXIER}%
\date{\today}%
%%% Local Variables:
%%% mode: latex
%%% TeX-master: "cahier-des-charges"
%%% End:
@startuml
package django.contrib.auth.models {
class User
class Group
}
package gestion_de_la_diffusion.models {
class Licence {
acronyme : models.CharField
nom : models.CharField
url : models.URLField
texte : models.TextField
__
__str__()
.. Meta ..
ordering : ['acronyme']
}
class Editeur {
nom : models.CharField
url : models.URLField
__
__str__()
.. Meta ..
verbose_name : "éditeur"
}
class ObjetSonore {
objet_sonore_id : models.AutoField
fichier : fields.SoundField
actions : {'conformer': true, 'convertir': true}
__
fichier_disponible()
save()
delete()
}
class Diffusable {
titre : models.CharField
date_publication : models.DateField
licence : Licence
editeur : Editeur
- _duree : models.DurationField
__
__str__()
save()
duree()
duree(value)
nature()
-- Property --
duree
nature
.. Meta ..
ordering : ['titre']
}
class Playlist {
description : models.TextField
liste : Diffusable[]
__
validate_unique(exclude=None)
update_duree()
save()
.. Meta ..
verbose_name : 'liste de lecture'
verbose_name_plural : 'listes de lecture'
}
class Ordonner {
playlist : Playlist
diffusable : Diffusable
position : models.PositiveIntegerField
__
__str__()
clean()
save()
.. Meta ..
verbose_name : 'contenu'
unique_together : ("playlist", "position")
}
class Frequence {
nom : models.CharField
delta : models.DurationField
__
__str__()
}
class ProgrammationManager <<models.Manager>> {
occurrences_set(debut=None, \nfin=None, \npk_exclude=None)
}
class Programmation {
debut : models.DateTimeField
fin : models.DateTimeField
frequence : Frequence
diffusable : Diffusable
programmeur : models.User
date_creation : models.DateTimeField
date_modification : models.DateTimeField
objects : ProgrammationManager()
__
__str__()
get_occurrences()
clean()
save()
}
}
package gestion_de_la_diffusion.fields {
class SoundFieldFile {
delete()
}
class SoundField {
attr_class : SoundFieldFile
descriptor_class : FileDescriptor
description : "Sound"
available_formats : str[]
default_error_messages : dict
__init__()
formfield()
}
}
package gestion_des_emissions.models {
class SourceExterne {
titre : models.CharField
auteur : models.CharField
date_publication : models.DateField
editeur : models.CharField
url : models.URLField
__
__str__()
.. Meta ..
verbose_name : 'source externe'
verbose_name_plural : 'sources externes'
}
class Emission {
nom : models.CharField
annee_scolaire : models.IntegerField
__
__str__()
validate_unique()
save()
.. Meta ..
verbose_name : 'émission'
}
class Episode {
emission : Emission
source_externe : SourceExterne
__
validate_unique()
save()
.. Meta ..
verbose_name : "épisode"
}
class Intervenant {
__
__str__()
.. Meta ..
verbose_name : 'intervenant'
}
class Role {
.. Meta ..
verbose_name : 'rôle'
}
class Intervention {
episode : Episode
intervenant : Intervenant
role : Role
__
__str__()
.. Meta ..
unique_together : ('episode', 'intervenant', 'role')
}
}
package gestion_des_musiques.models {
class Genre {
nom : models.CharField
__
__str__()
-- Property --
nombre_de_pistes
.. Meta ..
ordering : ['nom']
}
class Artiste {
nom : models.CharField
__
__str__()
}
class Album {
nom : models.CharField
__
__str__()
}
class Piste {
position : models.PositiveIntegerField
artiste : Artiste
album : Album
genre : Genre
provenir : Provenir
__
save()
delete()
.. Meta ..
unique_together : ("album", "position")
ordering : ['album', 'position']
}
}
package gestion_des_musiques.forms {
class PisteForm {
position : forms.IntegerField(min_value=1, max_value=99)
.. Meta ..
model : Piste
fields : ('fichier', 'titre', 'date_publication', 'licence', 'editeur', \n\t'position', 'artiste', 'album', 'genre', 'provenir')
}
}
'Héritages
Diffusable <|-- Playlist
Diffusable <|-- Episode
ObjetSonore <|-- Episode
User <|-- Intervenant
Group <|-- Role
Diffusable <|-- Piste
ObjetSonore <|-- Piste
'Associations
SoundField --* SoundFieldFile
ObjetSonore --* SoundField
Diffusable --* Licence
Diffusable --* Editeur
Playlist "1..*" -- "1..*" Diffusable
(Playlist, Diffusable) .. Ordonner
Programmation -- ProgrammationManager : objects
Programmation --* Frequence
Programmation --* Diffusable
Programmation --* User : programmeur
Episode --* Emission
Episode --* SourceExterne
Intervention --* Role
Intervention --* Intervenant
Intervention --* Episode
Piste --* Album
Piste --* Artiste
Piste --* Genre
Piste --* Provenir
PisteForm ..> Piste : model
@enduml
@startuml
left to right direction
'Cas d'utilisation
usecase (écouter le flux direct) as ecouterFlux
usecase (consulter la grille des programmes) as grilleProgrammes
usecase (consulter l'Historique de lecture) as historique
usecase (télécharger un Diffusable) as downloadDiffusable
usecase (consulter le catalogue des Diffusables) as consultationCatalogue
usecase (Créer Playlist) as crPlaylist
usecase (Modifier/Supprimer Playlist) as udPlaylist
usecase (Créer Licence) as crLicence
usecase (Modifier/Supprimer Licence) as udLicence
usecase (Créer Editeur) as crEditeur
usecase (Modifier/Supprimer Editeur) as udEditeur
usecase (Créer Emission) as crEmission
usecase (Modifier/Supprimer Emission) as udEmission
usecase (Créer Episode) as crEpisode
usecase (Modifier/Supprimer Episode) as udEpisode
usecase (Créer Album) as crAlbum
usecase (Modifier/Supprimer Album) as udAlbum
usecase (Créer Artiste) as crArtiste
usecase (Modifier/Supprimer Artiste) as udArtiste
usecase (Créer Piste) as crPiste
usecase (Modifier/Supprimer Piste) as udPiste
usecase (Créer Intervenant) as crIntervenant
usecase (Modifier/Supprimer Intervenant) as udIntervenant
usecase (Créer Role) as crRole
usecase (Modifier/Supprimer Role) as udRole
usecase (Créer Intervention) as crIntervention
usecase (Modifier/Supprimer Intervention) as udIntervention
usecase (Créer Programmation) as crProgrammation
usecase (Modifier/Supprimer Programmation) as udProgrammation
usecase (Créer Frequence) as crFrequence
usecase (Modifier/Supprimer Frequence) as udFrequence
usecase (Créer un Group) as crGroup
usecase (Modifier/Supprimer un Group) as udGroup
'Audition'
actor :Auditeur: as auditeur
ecouterFlux -- auditeur
grilleProgrammes -- auditeur
historique -- auditeur
downloadDiffusable -- auditeur
consultationCatalogue -- auditeur
'Production'
actor :Producteur: as producteur
crIntervention -- producteur
producteur -- udIntervention
crEmission -- producteur
crEpisode -- producteur
producteur -- udEpisode
producteur -- udEmission
'Gestion musicale'
actor :Gestionnaire musical: as gestionnaireMusical
crEditeur -- gestionnaireMusical
gestionnaireMusical -- udEditeur
crAlbum -- gestionnaireMusical
gestionnaireMusical -- udAlbum
crArtiste -- gestionnaireMusical
gestionnaireMusical -- udArtiste
crPiste -- gestionnaireMusical
gestionnaireMusical -- udPiste
crPlaylist -- gestionnaireMusical
gestionnaireMusical -- udPlaylist
'Administration'
actor :Administrateur: as admin
crLicence -- admin
admin -- udLicence
crRole -- admin
admin -- udRole
crIntervenant -- admin
admin -- udIntervenant
crGroup -- admin
admin -- udGroup
'Programmation'
actor :Programmateur: as programmateur
crPlaylist -- programmateur
crProgrammation -- programmateur
crFrequence -- programmateur
programmateur -- udPlaylist
programmateur -- udFrequence
programmateur -- udProgrammation
'Héritage des cas d'utilisation
programmateur <|- admin
gestionnaireMusical <|- admin
producteur <|- admin
'Notes'
note as noteRestrictionUD
Modification et Suppression
sur ses propres objets
end note
udPlaylist .. noteRestrictionUD
udArtiste .. noteRestrictionUD
udPiste .. noteRestrictionUD
udEditeur .. noteRestrictionUD
udAlbum .. noteRestrictionUD
udEpisode .. noteRestrictionUD
udEmission .. noteRestrictionUD
udProgrammation .. noteRestrictionUD
udFrequence .. noteRestrictionUD
udIntervention .. noteRestrictionUD
note as noteObjetSonoreD
La suppression d'un ObjetSonore entraîne
la suppression du fichier associé sur
le système de fichiers
end note
noteObjetSonoreD .. udEpisode
noteObjetSonoreD .. udPiste
note as noteIntervenantCRU
Les Intervenants doivent être
créés/mis à jour en début d'année
scolaire à partir de la base élèves.
Des ajouts peuvent être fait en cours
d'année pour intégrer des nouveaux.
end note
noteIntervenantCRU .. crIntervenant
note as noteProducteurNoEditeur
C'est un personnel de l'établissement
scolaire. Dans ce cas l'Editeur
ne peut pas être changé puisqu'il
est figé à l'établissement.
end note
producteur .up. noteProducteurNoEditeur
crEditeur .. noteProducteurNoEditeur
noteProducteurNoEditeur .. udEditeur
@enduml
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