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’identifiant user 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 dossier fixtures 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