Le chargement de jeux de données (fixtures)
Zeste de Savoir étant un projet très complet il est nécessaire de pouvoir charger un ensemble de jeux de données de manière automatique pour créer une nouvelle instance à des fins de test ou pour forker le site.
Pour faciliter la tâche, des outils sont mis à disposition des développeurs, testeurs et utilisateurs.
Chargement du jeu de données standard
En l’absence d’exigences particulières, le moyen le plus simple de charger un jeu de données est d’utiliser la commande suivante :
make generate-fixtures
ou si vous souhaitez purger les données existantes au préalable :
make new-db
Ces commandes chargent :
un jeu de données simples ;
quelques données plus complexes ;
un jeu de données modérément massif.
Ces trois opérations correspondent à des appels aux outils décrits ci-après. Les paramètres exacts sont disponibles dans le fichier Makefile à la racine de l’environnement de développement.
Les données sérialisables pour une base fonctionnelle
Un premier ensemble de données simples est accessible par la commande intégrée à django python manage.py loaddata
.
Cette commande s’attend à une liste de fichiers au format yaml et supporte les wildcards. Nous possédons un ensemble de données sérialisées dans le dossier fixtures :
categories.yaml
: contient le chargement de 3 catégories de tutoriels, 2 sous-catégories de tutoriels rangées dans les bonnes catégories parentes ;forums.yaml
: contient le chargement de 4 catégories de forum et de 10 forums dans ces catégories ;licences.yaml
: contient le chargement des licences, identiques à celles utilisées en production ;mps.yaml
: nécessite le chargement des users, contient la création d’un MP d’un membre à un admin ;topics.yaml
: nécessite le chargement des users, contient la création de plusieurs topics dans les forums dont un résolu ;users.yaml
: Crée 6 utilisateurs :admin/admin avec les droits d’administration
staff/staff faisant partie du groupe staff
user/user un utilisateur normal et sans problème
ïtrema/ïtrema un utilisateur normal, sans problème mais qui aime l’utf8
Anonymous/anonymous : le compte d’anonymisation
External/external: le compte pour accueillir les cours externes des auteurs ne voulant pas devenir membre ou quittant le site
decal/decal: le compte qui possède un identifiant
Profile
différent de l’identifiantuser
pour permettre de tester des cas ou ces id sont différents
oauth_applications.yaml
: crée une application de test pour l’API:client_id
:w14aIFqE7z90ti1rXE8hCRMRUOPBP4rXpfLZIKmT
;client_secret
:0q4ee800NWs8cSHa0FIbkTLwEncMqYHOCAxNkt9zRmd10bRk1J18TkbviO5QHy2b66ggzyLADm79tJw5BQf2XfApPnk0nogcFaYhtNO33uNlzzT8sXfxu3zzBFu5Wejv
.
group.yaml
: crée les descriptions de deux groupes de la page d’accueil (staff et groupe technique).
Les données complexes voire les scénarios
Certaines données, pour exister, ont besoin de ressources supplémentaires qui ne sont pas forcément sérialisables. Par exemple un tutoriel a besoin d’un dépôt git, une option d’aide (ZEP 03) a besoin d’une icône qui sera accessible depuis le web…
Ces données ont besoin d’être traitées par une routine avant d’être créées. Ces routines existent déjà dans les objets
appelés Factory qui sont dans chacun des fichiers factories.py
de tous les modules.
Pour utiliser ces fabriques d’objet, vous aurez une nouvelle fois recours au format yaml afin de décrire les fabriques que vous désirez utiliser ainsi que les paramètres à envoyer auxdites fabriques.
Le format du fichier est celui-ci:
- factory: zds.module.factories.YourFactory
fields:
champ_string: "valeur1"
champ_int: 0
- factory: zds.utils.factories.YourFactory
fields:
champ_string: "valeur2"
champ_int: 1
Les fichiers de factory déjà existants sont rangés dans le dossier fixtures/advanced
.
Pour utiliser un fichier yaml de factory, il vous suffit de lancer la commande python manage.py load_factory_data chemin_vers_vos_fichier.yaml
.
Cette méthode est compatible avec les wildcards.
Pour utiliser les factories, il vous faudra vous référer à la documentation de ces dernières puisque les champs associés peuvent être de deux types :
les champs de base qui sont aussi présents avec la même orthographe dans le modèle de données
les champs personnalisés qui sont faits pour indiquer des comportements complémentaires à la commande par exemple, avec la zds.utils.HelpWrittingFactory, utiliser
fixture_image_path
vous permettra de renseigner le chemin relatif de l’image dans le dossierfixtures
plutôt que le chemin absolu.
Bien que ce module soit optionnel, si vous désirez qu’il soit possible de demander de l’aide sur les tutoriels et articles,
il vous faudra utiliser python manage.py load_factory_data fixtures/advanced/aide_tuto_media.yaml
.
Tester sur un jeu de données massif
Attention
L’utilisation de la commande qui suit peut prendre du temps
Afin de tester avec un jeu de données qui se rapproche le plus possible de ce qui peut se trouver en exploitation, et aussi trouver une variété suffisante pour être confiant en vos tests, nous avons développé une commande qui génère une immense quantité de données.
Pour l’utiliser il suffit de lancer python manage.py load_fixtures --size=SIZE --all
.
Note
Vous pouvez ajouter --racine
qui permet de changer la base pour le nommage des utilisateurs (« user » par défaut).
Vous pouvez ne créer les éléments que d’un module précis (ou de quelques-uns) via des options telles que --forum
.
Ces options ne sont pas utilisables quand --all
est ajouté.
Les types à charger sont en fait les modèles de données qui seront créés.
Chaque modèle de données aura son propre coefficient de création c’est à dire le nombre d’éléments qui seront créés de base. Ce coefficient sera à multiplier par le coefficient de taille dirrigé par :
size=low : coefficient de taille = 1
size=medium: coefficient de taille = 2
size=high: coefficient de taille = 3
Type |
Modèles créés |
coefficient de création |
---|---|---|
member |
Profile (simple membres) |
10 |
staff |
Profile (avec droit de staff) |
3 |
gallery |
Gallery/UserGallery (au hasard) |
1 (par user) |
Image |
3 (par gallery) |
|
category_forum |
forum.Category |
4 |
category_content |
utils.Category |
5 |
utils.SubCategory |
10 |
|
forum |
utils.Forum |
8 |
tag |
Tag |
30 |
topic |
Topic (dont sticky et locked) |
10 |
post |
Post |
20 (par topic) [2] |
comment |
ContentReaction |
20 (par contenu) [2] |
tutorial et article |
PublishableContent [1] |
10 |