diff --git a/fr/404.html b/fr/404.html index 82ec6dc0..2eef1349 100644 --- a/fr/404.html +++ b/fr/404.html @@ -4,7 +4,7 @@ Page introuvable | TiBillet - + diff --git a/fr/assets/js/c0af11f0.78baf066.js b/fr/assets/js/c0af11f0.78baf066.js deleted file mode 100644 index 9a2d7318..00000000 --- a/fr/assets/js/c0af11f0.78baf066.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocumentation_v_2=self.webpackChunkdocumentation_v_2||[]).push([[639],{7549:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>o,contentTitle:()=>t,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var r=n(4848),d=n(8453);const i={sidebar_position:1,slug:"development",title:"D\xe9veloppement",keywords:["contribuer","b\xe9n\xe9volat","open source","git","pull request","issue","soutien","code","d\xe9veloppement","programmation","python","django","docker","poetry","tests","tdd"],tags:["contribuer","open source","git","soutien","tdd","python","django","docker","poetry"],authors:"kaya, guillaume"},t="D\xe9veloppement",l={id:"contribute/dev",title:"D\xe9veloppement",description:"Vous voulez aider au d\xe9veloppement de TiBillet? Merci! C'est gr\xe2ce aux gens comme vous que l'open-source fonctionne \ud83d\ude4f",source:"@site/i18n/fr/docusaurus-plugin-content-docs/current/contribute/dev.md",sourceDirName:"contribute",slug:"/contribute/development",permalink:"/fr/docs/contribute/development",draft:!1,unlisted:!1,editUrl:"https://github.com/TiBillet/documentation/tree/main/tibillet/docs/contribute/dev.md",tags:[{inline:!0,label:"contribuer",permalink:"/fr/docs/tags/contribuer"},{inline:!0,label:"open source",permalink:"/fr/docs/tags/open-source"},{inline:!0,label:"git",permalink:"/fr/docs/tags/git"},{inline:!0,label:"soutien",permalink:"/fr/docs/tags/soutien"},{inline:!0,label:"tdd",permalink:"/fr/docs/tags/tdd"},{inline:!0,label:"python",permalink:"/fr/docs/tags/python"},{inline:!0,label:"django",permalink:"/fr/docs/tags/django"},{inline:!0,label:"docker",permalink:"/fr/docs/tags/docker"},{inline:!0,label:"poetry",permalink:"/fr/docs/tags/poetry"}],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1,slug:"development",title:"D\xe9veloppement",keywords:["contribuer","b\xe9n\xe9volat","open source","git","pull request","issue","soutien","code","d\xe9veloppement","programmation","python","django","docker","poetry","tests","tdd"],tags:["contribuer","open source","git","soutien","tdd","python","django","docker","poetry"],authors:"kaya, guillaume"},sidebar:"tutorialSidebar",previous:{title:"Contributing",permalink:"/fr/docs/category/contributing"},next:{title:"Research",permalink:"/fr/docs/category/research"}},o={},c=[{value:"M\xe9thodes de travail",id:"m\xe9thodes-de-travail",level:2},{value:"Outils et langages utilis\xe9s",id:"outils-et-langages-utilis\xe9s",level:2},{value:"Installation locale",id:"installation-locale",level:2},{value:"Traefik",id:"traefik",level:3},{value:"G\xe9n\xe9ration des cl\xe9s",id:"g\xe9n\xe9ration-des-cl\xe9s",level:3},{value:"Fedow, Lespass, LaBoutik",id:"fedow-lespass-laboutik",level:3},{value:"Environnement Fedow",id:"environnement-fedow",level:4},{value:"Environnement Lespass",id:"environnement-lespass",level:4},{value:"Environnement LaBoutik",id:"environnement-laboutik",level:4},{value:"Mise en place des tests",id:"mise-en-place-des-tests",level:3},{value:"D\xe9marrage des moteurs",id:"d\xe9marrage-des-moteurs",level:3},{value:"\xc7a tourne ?",id:"\xe7a-tourne-",level:3},{value:"Cycle de vie",id:"cycle-de-vie",level:2},{value:"Mises \xe0 jour",id:"mises-\xe0-jour",level:3},{value:"Tests",id:"tests",level:3},{value:"Sauvegardes",id:"sauvegardes",level:3}];function a(e){const s={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,d.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"d\xe9veloppement",children:"D\xe9veloppement"})}),"\n",(0,r.jsx)(s.p,{children:"Vous voulez aider au d\xe9veloppement de TiBillet? Merci! C'est gr\xe2ce aux gens comme vous que l'open-source fonctionne \ud83d\ude4f"}),"\n",(0,r.jsxs)(s.p,{children:["Premi\xe8rement, si vous n'avez pas une t\xe2che pr\xe9cise en t\xeate, allez voir les tickets ouverts sur les ",(0,r.jsx)(s.a,{href:"https://github.com/orgs/TiBillet/projects?query=is%3Aopen",children:"d\xe9p\xf4ts Github"})," officiels."]}),"\n",(0,r.jsx)(s.p,{children:"C'est le moyen le plus simple de comprendre quels sont les probl\xe8mes \xe0 r\xe9soudre et quelles fonctionnalit\xe9s sont demand\xe9es."}),"\n",(0,r.jsxs)(s.admonition,{title:"Les d\xe9p\xf4ts",type:"note",children:[(0,r.jsx)(s.p,{children:'Les d\xe9p\xf4ts \xe9pingl\xe9s ("Pinned") sur la page de l\'organisation devraient suffire. Si vous avez des doutes sur les r\xf4les respectifs de Fedow, LaBoutik ou Lespass, r\xe9visez les bases sur les trois moteurs de TiBillet.'}),(0,r.jsxs)(s.p,{children:[(0,r.jsx)("mark",{children:"TODO: lien doc vers les moteurs et leur r\xf4le"})," (une page dans pr\xe9sentation probablement)"]})]}),"\n",(0,r.jsx)(s.h2,{id:"m\xe9thodes-de-travail",children:"M\xe9thodes de travail"}),"\n",(0,r.jsxs)(s.p,{children:["Quand on travaille avec des ",(0,r.jsx)(s.em,{children:"forges Git"})," comme Github, il y a des fa\xe7ons d'aider qui rendent votre contribution plus facile \xe0 prendre en compte :"]}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["Si vous ne faites pas partie de l'organisation (avec les acc\xe8s au d\xe9p\xf4t), faites un ",(0,r.jsx)(s.em,{children:"fork"})," (d\xe9doublement) du d\xe9p\xf4t qui vous int\xe9resse, travaillez \xe0 partir de celui-ci et soumettez vous modifications par le biais d'une ",(0,r.jsx)(s.em,{children:"pull request"})," (demande de fusion)."]}),"\n",(0,r.jsx)(s.li,{children:"Si vous avez un ticket sur lequel vous souhaitez travailler, v\xe9rifiez s'il n'existe pas d\xe9j\xe0. Si c'est le cas, rejoignez la discussion plut\xf4t que de faire la m\xeame chose en parall\xe8le!"}),"\n",(0,r.jsxs)(s.li,{children:["Quand vous d\xe9marrez le travail sur un ticket, ",(0,r.jsx)(s.strong,{children:"assignez-vous"})," dessus pour informer les autres qu'un chantier est en cours."]}),"\n",(0,r.jsxs)(s.li,{children:["Enfin, un point important: ",(0,r.jsx)(s.strong,{children:"ne cr\xe9ez pas de demandes de fusion sans avoir fait tourner les tests"})," ! \xc7a arrive aux meilleur\u22c5es d'entre nous. Id\xe9alement, vous devriez les faire tourner avant chaque ",(0,r.jsx)(s.em,{children:"commit"}),", avec l'aide d'un ",(0,r.jsx)(s.em,{children:"git hook"})," (d\xe9clencheur automatique) par exemple."]}),"\n"]}),"\n",(0,r.jsx)(s.admonition,{title:"Trouver de l'aide",type:"note",children:(0,r.jsxs)(s.p,{children:["Si vous avez des questions sur Git, Github, ou un aspect du d\xe9veloppement, rejoignez-nous sur le serveur ",(0,r.jsx)(s.a,{href:"https://discord.gg/7FJvtYx",children:"Discord"})," ou ",(0,r.jsx)(s.a,{href:"https://matrix.to/#/#tibillet:tiers-lieux.org",children:"Matrix"}),". Nous ferons de notre mieux pour aider !"]})}),"\n",(0,r.jsx)(s.h2,{id:"outils-et-langages-utilis\xe9s",children:"Outils et langages utilis\xe9s"}),"\n",(0,r.jsx)(s.p,{children:"TiBillet, c'est :"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["une suite d'applications ",(0,r.jsx)(s.a,{href:"https://www.python.org/",children:"Python"}),","]}),"\n",(0,r.jsxs)(s.li,{children:["d\xe9velopp\xe9es avec l'aide du framework ",(0,r.jsx)(s.a,{href:"https://www.djangoproject.com/",children:"Django"}),","]}),"\n",(0,r.jsxs)(s.li,{children:["ses d\xe9pendances sont g\xe9r\xe9es avec ",(0,r.jsx)(s.a,{href:"https://python-poetry.org/",children:"Poetry"}),","]}),"\n",(0,r.jsxs)(s.li,{children:["le tout tournant dans des conteneurs ",(0,r.jsx)(s.a,{href:"https://www.docker.com/",children:"Docker"})," en production comme en d\xe9veloppement."]}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:"Si vous ne vous sentez pas \xe0 l'aise avec la pile logicielle, la meilleure chose \xe0 faire est d'aller chercher des tutoriels. Avec un peu de chance on compilera notre propre liste de ressources ici un de ces jours \ud83d\ude05"}),"\n",(0,r.jsx)(s.admonition,{title:"Attention",type:"warning",children:(0,r.jsx)(s.p,{children:"En particulier, des connaissances de bases avec Git feront une diff\xe9rence. C'est assez facile de semer le chaos dans un d\xe9p\xf4t quand on ne comprend pas comment le versionnage marche. Il y a des s\xe9curit\xe9s en place, mais vous pourriez avoir beaucoup plus de difficult\xe9s que n\xe9cessaire! Je dis \xe7a par exp\xe9rience \ud83d\ude11"})}),"\n",(0,r.jsx)(s.h2,{id:"installation-locale",children:"Installation locale"}),"\n",(0,r.jsx)(s.p,{children:"Pour coder et tester votre code, vous allez avoir besoin d'une instance (\xe0 peu pr\xe8s) fonctionnelle de TiBillet sur votre ordinateur."}),"\n",(0,r.jsx)(s.p,{children:"V\xe9rifions que vous avez l'outillage requis sous la main. Vous avez besoin de :"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["Docker CLI et l'extension ",(0,r.jsx)(s.code,{children:"docker-compose"}),","]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.code,{children:"git"}),","]}),"\n",(0,r.jsx)(s.li,{children:"un compte Github avec une cl\xe9 SSH enregistr\xe9e (pour un acc\xe8s authentifi\xe9 \xe0 la forge),"}),"\n",(0,r.jsx)(s.li,{children:"un IDE (environnement de d\xe9veloppement). Des coupons pour PyCharm sot disponibles sur demande, mais un IDE g\xe9n\xe9raliste comme VSCodium fonctionne assez bien - c'est ce que j'utilise \ud83d\ude09."}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:"On va commencer en cr\xe9ant un dossier qui contiendra les diff\xe9rents d\xe9p\xf4ts requis \xe0 sa racine, dans votre dossier de travail par exemple. \xc7a ressemblera \xe0 :"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"tibillet-dev\n\u251c\u2500\u2500 Fedow\n\u251c\u2500\u2500 LaBoutik\n\u251c\u2500\u2500 Lespass\n\u251c\u2500\u2500 Test-Driven-Development\n\u2514\u2500\u2500 Traefik\n"})}),"\n",(0,r.jsx)(s.h3,{id:"traefik",children:"Traefik"}),"\n",(0,r.jsxs)(s.p,{children:["On va avoir besoin d'un ",(0,r.jsx)(s.em,{children:"proxy d'application"})," (un outil qui va aider \xe0 rediriger le trafic des conteneurs vers des adresses locales). TiBillet fournit une configuration de base pour un conteneur Trafik + LetsEncrypt (certificats SSL), partons donc l\xe0-dessus :"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",metastring:'title="tibillet-dev$"',children:"git clone git@github.com:TiBillet/Traefik-reverse-proxy.git Traefik\n"})}),"\n",(0,r.jsx)(s.p,{children:"Pour le d\xe9marrer :"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",metastring:'title="tibillet-dev$"',children:"cd Traefik\ndocker compose up -d\n"})}),"\n",(0,r.jsxs)(s.p,{children:["Consulter le navigateur \xe0 l'adresse ",(0,r.jsx)(s.a,{href:"https://localhost",children:(0,r.jsx)(s.code,{children:"https://localhost"})})," devrait vous donner un avertissement de s\xe9curit\xe9 sur les certificats auto-sign\xe9s (pas un probl\xe8me dans ce cas pr\xe9cis) et une ",(0,r.jsx)(s.code,{children:"404 page not found"}),". Parfait !"]}),"\n",(0,r.jsx)(s.admonition,{type:"note",children:(0,r.jsxs)(s.p,{children:["Rappelez-vous de ",(0,r.jsx)(s.code,{children:"compose up"})," Traefik chaque fois que vous d\xe9marrez une session de travail sur TiBillet."]})}),"\n",(0,r.jsx)(s.h3,{id:"g\xe9n\xe9ration-des-cl\xe9s",children:"G\xe9n\xe9ration des cl\xe9s"}),"\n",(0,r.jsx)("mark",{children:"TODO: \xe0 simplifier ? lourd et compliqu\xe9 pour aucune raison valable"}),"\n",(0,r.jsxs)(s.p,{children:["Pour g\xe9n\xe9rer les cl\xe9s n\xe9cessaires \xe0 la configuration des moteurs, \xe0 l'heure actuelle, on ",(0,r.jsx)(s.em,{children:"pull"})," l'image Docker de la version production de Fedow, puis on lance quelques commandes dans l'environnement de Poetry."]}),"\n",(0,r.jsx)(s.p,{children:"Pour chaque moteur, on aura besoin :"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["d'une ou deux cl\xe9s Fernet (pour le champ ",(0,r.jsx)(s.code,{children:"FERNET_KEY"})," et possiblement des mots de passe),"]}),"\n",(0,r.jsxs)(s.li,{children:["d'une cl\xe9 secr\xe8te Django (pour le champ ",(0,r.jsx)(s.code,{children:"SECRET_KEY"}),")."]}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:"Vous pouvez g\xe9n\xe9rer 30 cl\xe9s uniques de chaque type en lan\xe7ant les commandes :"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"docker run --rm tibillet/fedow poetry run python3 -c \"from cryptography.fernet import Fernet; print('\\n'.join([Fernet.generate_key().decode('utf-8') for i in range(0,30)]))\"\ndocker run --rm tibillet/fedow poetry run python3 -c \"from django.core.management.utils import get_random_secret_key; print('\\n'.join([get_random_secret_key() for i in range(0,30)]))\"\n"})}),"\n",(0,r.jsx)(s.p,{children:"La premi\xe8re commande prendra quelques minutes, vu qu'elle t\xe9l\xe9charge une image Docker. Gardez les cl\xe9s quelque part, on s'en servira au moment de la mise en place des moteurs."}),"\n",(0,r.jsxs)(s.p,{children:["On aura \xe9galement besoin d'une cl\xe9 de test Stripe pour le champ ",(0,r.jsx)(s.code,{children:"STRIPE_KEY_TEST"}),". Stripe est actuellement la solution de paiement qui se charge de la conversion cash en cashless. Une cl\xe9 de test peut \xeatre obtenue en se cr\xe9ant un compte gratuit, puis and allant dans le Mode test -> Cl\xe9 API de test. Alternativement, demandez \xe0 l'\xe9quipe."]}),"\n",(0,r.jsx)(s.h3,{id:"fedow-lespass-laboutik",children:"Fedow, Lespass, LaBoutik"}),"\n",(0,r.jsx)(s.p,{children:"D\xe9marrons en clonant les d\xe9p\xf4ts des diff\xe9rents moteurs :"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",metastring:'title="tibillet-dev$"',children:"git clone git@github.com:TiBillet/Fedow.git\ngit clone git@github.com:TiBillet/Lespass.git\ngit clone git@github.com:TiBillet/LaBoutik.git\n"})}),"\n",(0,r.jsx)(s.p,{children:"\xc0 partir de l\xe0, on a besoin d'\xe9crire un peu de configuration. \xc7a sera plus simple \xe0 l'avenir, prenez patience \ud83d\ude0b"}),"\n",(0,r.jsxs)(s.p,{children:["Chaque moteur a besoin de son propre fichier ",(0,r.jsx)(s.code,{children:".env"}),", que vous pouvez baser sur les fichiers ",(0,r.jsx)(s.code,{children:"env_example"})," qu'on vient de cloner."]}),"\n",(0,r.jsx)(s.admonition,{title:"Attention",type:"warning",children:(0,r.jsxs)(s.p,{children:["Toute variable d'environnement, doit \xeatre trouvable dans le fichier ",(0,r.jsx)(s.code,{children:".env"}),". Pas de suppression de variable ! Elle peut par contre suivant les cas rester vide (nullable)."]})}),"\n",(0,r.jsx)(s.h4,{id:"environnement-fedow",children:"Environnement Fedow"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",metastring:'title="tibillet-dev$"',children:"cp Fedow/env_example Fedow/.env\n"})}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Nom"}),(0,r.jsx)(s.th,{children:"Environnement cible"}),(0,r.jsx)(s.th,{children:"Nullable"}),(0,r.jsx)(s.th,{children:"Valeur par d\xe9faut"}),(0,r.jsx)(s.th,{children:"Notes"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"SECRET_KEY"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Une des cl\xe9s secr\xe8tes Django g\xe9n\xe9r\xe9es pr\xe9c\xe9demment"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"FERNET_KEY"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Une des cl\xe9s Fernet g\xe9n\xe9r\xe9es pr\xe9c\xe9demment"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"STRIPE_KEY"})}),(0,r.jsx)(s.td,{children:"Production"}),(0,r.jsx)(s.td,{children:"Oui"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Cl\xe9 API de votre compte Stripe"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"DOMAIN"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"fedow.tibillet.localhost"})}),(0,r.jsx)(s.td,{children:"\xc0 adapter \xe0 votre nom de domaine et sous-domaine en production"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"STRIPE_KEY_TEST"})}),(0,r.jsx)(s.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(s.td,{children:"Oui"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Cl\xe9 API de test de votre compte Stripe"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"STRIPE_TEST"})}),(0,r.jsx)(s.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsxs)(s.td,{children:["Passer \xe0 1 si ",(0,r.jsx)(s.code,{children:"STRIPE_KEY_TEST"})," est rempli"]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"STRIPE_ENDPOINT_SECRET_TEST"})}),(0,r.jsx)(s.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(s.td,{children:"Oui"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Aucune id\xe9e"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"DEBUG"})}),(0,r.jsx)(s.td,{children:"D\xe9veloppement"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"Passer \xe0 1 pour le d\xe9veloppement"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"TEST"})}),(0,r.jsx)(s.td,{children:"Tests"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"Passer \xe0 1 pour les tests"})]})]})]}),"\n",(0,r.jsx)(s.h4,{id:"environnement-lespass",children:"Environnement Lespass"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",metastring:'title="tibillet-dev$"',children:"cp Lespass/env_example Lespass/.env\n"})}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Nom"}),(0,r.jsx)(s.th,{children:"Environnement cible"}),(0,r.jsx)(s.th,{children:"Nullable"}),(0,r.jsx)(s.th,{children:"Valeur par d\xe9faut"}),(0,r.jsx)(s.th,{children:"Notes"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"SECRET_KEY"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Une des cl\xe9s secr\xe8tes Django g\xe9n\xe9r\xe9es pr\xe9c\xe9demment"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"FERNET_KEY"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Une des cl\xe9s Fernet g\xe9n\xe9r\xe9es pr\xe9c\xe9demment"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"STRIPE_KEY"})}),(0,r.jsx)(s.td,{children:"Production"}),(0,r.jsx)(s.td,{children:"Oui"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Cl\xe9 API de votre compte Stripe"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"DOMAIN"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"tibillet.localhost"})}),(0,r.jsx)(s.td,{children:"\xc0 adapter \xe0 votre nom de domaine en production"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"SUB"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"lespass"})}),(0,r.jsx)(s.td,{children:"Sous-domaine de l'instance, \xe0 adapter en production"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"META"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"agenda"})}),(0,r.jsx)(s.td,{children:"Sous-domaine de l'agenda f\xe9d\xe9r\xe9, \xe0 adapter en production"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"FEDOW_DOMAIN"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"fedow.tibillet.localhost"})}),(0,r.jsx)(s.td,{children:"Domaine et sous-domaine du moteur Fedow"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"PUBLIC"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"TiBillet Coop."}),(0,r.jsx)(s.td,{children:"Nom de l'instance principale"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"TIME_ZONE"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"Europe/Paris"}),(0,r.jsx)(s.td,{children:"Plage horaire TZ de l'instance"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"ADMIN_EMAIL"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Email administrateur (pour le\u22c5a premier\u22c5e admin)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"POSTGRES_DB"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"lespass"}),(0,r.jsx)(s.td,{children:"\xc0 changer en production si n\xe9cessaire"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"POSTGRES_USER"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"lespass_postgres"}),(0,r.jsx)(s.td,{children:"\xc0 changer en production"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"POSTGRES_PASSWORD"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Mot de passe fort (une des cl\xe9s Fernets par exemple)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.code,{children:"EMAIL_HOST"}),", ",(0,r.jsx)(s.code,{children:"EMAIL_PORT"}),", ",(0,r.jsx)(s.code,{children:"EMAIL_HOST_USER"}),", ",(0,r.jsx)(s.code,{children:"EMAIL_HOST_PASSWORD"})]}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Oui"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Serveur d'email, requis pour confirmer des abonn\xe9\u22c5es par exemple"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"STRIPE_KEY_TEST"})}),(0,r.jsx)(s.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(s.td,{children:"Oui"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Cl\xe9 API de test de votre compte Stripe"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"STRIPE_TEST"})}),(0,r.jsx)(s.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsxs)(s.td,{children:["Passer \xe0 1 si ",(0,r.jsx)(s.code,{children:"STRIPE_KEY_TEST"})," est rempli"]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"DEBUG"})}),(0,r.jsx)(s.td,{children:"D\xe9veloppement"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"Passer \xe0 1 pour le d\xe9veloppement"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"TEST"})}),(0,r.jsx)(s.td,{children:"Tests"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"Passer \xe0 1 pour les tests"})]})]})]}),"\n",(0,r.jsx)(s.h4,{id:"environnement-laboutik",children:"Environnement LaBoutik"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",metastring:'title="tibillet-dev$"',children:"cp LaBoutik/env_example LaBoutik/.env\n"})}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Nom"}),(0,r.jsx)(s.th,{children:"Environnement cible"}),(0,r.jsx)(s.th,{children:"Nullable"}),(0,r.jsx)(s.th,{children:"Valeur par d\xe9faut"}),(0,r.jsx)(s.th,{children:"Notes"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"SECRET_KEY"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Une des cl\xe9s secr\xe8tes Django g\xe9n\xe9r\xe9es pr\xe9c\xe9demment"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"FERNET_KEY"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Une des cl\xe9s Fernet g\xe9n\xe9r\xe9es pr\xe9c\xe9demment"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"DOMAIN"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"laboutik.tibillet.localhost"})}),(0,r.jsx)(s.td,{children:"\xc0 adapter \xe0 votre nom de domaine et sous-domaine en production"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"FEDOW_URL"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"https://fedow.tibillet.localhost/",children:"https://fedow.tibillet.localhost/"})}),(0,r.jsx)(s.td,{children:"URL du moteur Fedow"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"LESPASS_TENANT_URL"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"https://lespass.tibillet.localhost/",children:"https://lespass.tibillet.localhost/"})}),(0,r.jsx)(s.td,{children:"URL de l'instance Lespass"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"TIME_ZONE"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"Europe/Paris"}),(0,r.jsx)(s.td,{children:"Plage horaire TZ de l'instance"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"ADMIN_EMAIL"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Email administrateur (pour le\u22c5a premier\u22c5e admin)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"MAIN_ASSET_NAME"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Le nom de votre unit\xe9 de valeur cashless (Pi\xe9cette, CoeurDor\u2026 comme vous voulez)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"POSTGRES_DB"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"laboutik"}),(0,r.jsx)(s.td,{children:"\xc0 changer en production si n\xe9cessaire"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"POSTGRES_USER"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"laboutik_user"}),(0,r.jsx)(s.td,{children:"\xc0 changer en production"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"POSTGRES_PASSWORD"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Mot de passe fort (une des cl\xe9s Fernets par exemple)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.code,{children:"EMAIL_HOST"}),", ",(0,r.jsx)(s.code,{children:"EMAIL_PORT"}),", ",(0,r.jsx)(s.code,{children:"EMAIL_HOST_USER"}),", ",(0,r.jsx)(s.code,{children:"EMAIL_HOST_PASSWORD"})]}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Oui"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Serveur d'email, requis pour confirmer des abonn\xe9\u22c5es par exemple"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"BORG_PASSPHRASE"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Oui"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Mot de passe utilis\xe9 pour la sauvegarde des donn\xe9es"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"DEBUG"})}),(0,r.jsx)(s.td,{children:"D\xe9veloppement"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"Passer \xe0 1 pour le d\xe9veloppement"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"TEST"})}),(0,r.jsx)(s.td,{children:"Tests"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"Passer \xe0 1 pour les tests"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"DEMO"})}),(0,r.jsx)(s.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"Passer \xe0 1 pour une simulation de terminal de caisse"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"SENTRY_DNS"})}),(0,r.jsx)(s.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(s.td,{children:"Oui"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Sentry Debug pour le back-end"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.code,{children:"SENTRY_FRONT_DNS"}),", ",(0,r.jsx)(s.code,{children:"SENTRY_FRONT_ASSET"})]}),(0,r.jsx)(s.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(s.td,{children:"Oui"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Sentry Debug pour le front-end"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.code,{children:"DEMO_TAGID_CM"}),", ",(0,r.jsx)(s.code,{children:"DEMO_TAGID_CLIENT1"}),", ",(0,r.jsx)(s.code,{children:"DEMO_TAGID_CLIENT2"})]}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Oui"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Aucune id\xe9e"})]})]})]}),"\n",(0,r.jsx)(s.p,{children:"La configuration devrait \xeatre maintenant compl\xe8te pour les trois moteurs."}),"\n",(0,r.jsx)(s.h3,{id:"mise-en-place-des-tests",children:"Mise en place des tests"}),"\n",(0,r.jsx)(s.p,{children:"Pour une raison\u2026 une raison, l'image Docker de dev est assembl\xe9e \xe0 partir des tests. L'installation est similaire au moteurs :"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",metastring:'title="tibillet-dev$"',children:"git clone git@github.com:TiBillet/Test-Driven-Development.git\ncp Test-Driven-Development/env_example Test-Driven-Development/.env\n"})}),"\n",(0,r.jsx)(s.p,{children:"C'est fait \u263a\ufe0f On peut maintenant conteneuriser l'application enti\xe8re depuis le dossier des tests :"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",metastring:'title="Test-Driven-Development$"',children:"docker compose up -d\n"})}),"\n",(0,r.jsx)(s.p,{children:"Vous pouvez acc\xe9der en prime aux logs avec la commande :"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",metastring:'title="Test-Driven-Development$"',children:"docker compose logs -f\n"})}),"\n",(0,r.jsx)(s.admonition,{title:"Attention",type:"warning",children:(0,r.jsxs)(s.p,{children:["Ce ",(0,r.jsx)(s.code,{children:"docker-compose.yml"})," en particulier s'appuie sur la structure d\xe9crite au d\xe9but de l'installation, donc sur la structure du dossier ",(0,r.jsx)(s.em,{children:"parent"})," aux tests, appel\xe9 pour l'exemple ",(0,r.jsx)(s.code,{children:"tibillet-dev"}),". Contre-intuitif, mais maintenant vous savez \ud83d\ude09"]})}),"\n",(0,r.jsx)(s.h3,{id:"d\xe9marrage-des-moteurs",children:"D\xe9marrage des moteurs"}),"\n",(0,r.jsxs)(s.p,{children:["La principale diff\xe9rence entre les conteneurs de dev et de prod, c'est qu'en dev la commande ",(0,r.jsx)(s.code,{children:"docker compose"})," ne d\xe9marre pas les applications Django individuelles. C'est un niveau de contr\xf4le fin qui est utile pour le d\xe9veloppement, mais \xe7a veut dire que vous avez besoin de les lancer manuellement."]}),"\n",(0,r.jsx)(s.p,{children:"On va les lancer de pr\xe9f\xe9rence dans l'ordre :"}),"\n",(0,r.jsxs)(s.ol,{children:["\n",(0,r.jsx)(s.li,{children:"Fedow"}),"\n",(0,r.jsx)(s.li,{children:"Lespass"}),"\n",(0,r.jsx)(s.li,{children:"LaBoutik (qui a besoin des deux autres pour fonctionner)"}),"\n"]}),"\n",(0,r.jsxs)(s.p,{children:["Les outils dont on a besoin sont dans les conteneurs, nomm\xe9s d'apr\xe8s leur moteur : ",(0,r.jsx)(s.code,{children:"fedow_django"}),", ",(0,r.jsx)(s.code,{children:"lespass_django"})," et enfin ",(0,r.jsx)(s.code,{children:"laboutik_django"}),". Pour rentrer dans un conteneur (exemple avec Fedow) :"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"# on d\xe9marre un environnement bash dans le conteneur fedow_django\ndocker exec -ti fedow_django bash\n"})}),"\n",(0,r.jsx)(s.p,{children:"\xc0 partir de l\xe0, on a quelques options."}),"\n",(0,r.jsxs)(s.p,{children:["La premi\xe8re, c'est le script ",(0,r.jsx)(s.code,{children:"flush.sh"}),". Il initialise les donn\xe9es de test et d\xe9marre Django dans la foul\xe9e. C'est cette commande qu'on va utiliser au ",(0,r.jsx)(s.strong,{children:"premier d\xe9marrage"})," de notre application :"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",metastring:'title="fedow_django$"',children:"./flush.sh\n"})}),"\n",(0,r.jsxs)(s.p,{children:["On l'utilisera aussi quand on veut ",(0,r.jsx)(s.strong,{children:"r\xe9initialiser"})," les donn\xe9es, par exemple avant de lancer les tests automatis\xe9s qui ont besoin de ces donn\xe9es pr\xe9visibles."]}),"\n",(0,r.jsx)(s.p,{children:"Pour le reste des manipulation dans le conteneur, on a besoin de rentrer dans l'environnement de Poetry, car on va lancer du Python."}),"\n",(0,r.jsx)(s.p,{children:"Pour lancer l'environnement virtuel de Poetry depuis le conteneur :"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",metastring:'title="fedow_django$"',children:" # on d\xe9marre l'environnement virtuel qui prend en charge les d\xe9pendances python\npoetry shell\n"})}),"\n",(0,r.jsxs)(s.p,{children:["Django se g\xe8re avec un script appel\xe9 ",(0,r.jsx)(s.code,{children:"manage.py"}),". Deux commandes nous int\xe9ressent \xe0 l'heure actuelle :"]}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.code,{children:"rsp"})," (alias de ",(0,r.jsx)(s.code,{children:"./manage.py runserver 0.0.0.0:8000"}),") d\xe9marre Django sans r\xe9initialiser les donn\xe9es. \xc7a nous servira quand on veut garder des donn\xe9es entre deux d\xe9marrages. G\xe9n\xe9ralement, si on a pas besoin de lancer les tests, c'est cette commande qu'on utilise plut\xf4t que ",(0,r.jsx)(s.code,{children:"flush"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsxs)(s.p,{children:["Optionnellement, si on a des bugs graphiques, on peut tenter ",(0,r.jsx)(s.code,{children:"./manage.py collectstatic"}),". Parfois, les ressources graphiques ne sont pas correctement copi\xe9es au premier d\xe9marrage, et \xe7a peut r\xe9gler le probl\xe8me."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:"Plus qu'\xe0 d\xe9marrer les trois moteurs de TiBillet dans l'ordre indiqu\xe9 pr\xe9c\xe9demment : Fedow, Lespass, puis LaBoutik !"}),"\n",(0,r.jsxs)(s.admonition,{title:"Cr\xe9ation d'alias",type:"tip",children:[(0,r.jsx)(s.p,{children:"La commande Docker devient vite r\xe9p\xe9titive. Pourquoi ne pas cr\xe9er un alias, ou m\xeame une petite fonction bash pour gagner du temps et soulager son canal carpien par la m\xeame occasion ? Voil\xe0 ma fonction :"}),(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",metastring:'title="~/.bashrc"',children:"function dockex {\n docker exec -ti $1 bash\n}\n"})}),(0,r.jsx)(s.p,{children:"Il suffit d'ouvrir un nouveau terminal pour que la fonction s'ajoute \xe0 l'environnement. Il y a m\xeame sans doule moyen d'ajouter poetry \xe0 tout \xe7a si vous cherchez un peu !"})]}),"\n",(0,r.jsx)(s.h3,{id:"\xe7a-tourne-",children:"\xc7a tourne ?"}),"\n",(0,r.jsx)(s.p,{children:"Si vous avez utilis\xe9 la configuration des sous-domaines par d\xe9faut, vous avez maintenant acc\xe8s :"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["au moteur de f\xe9d\xe9ration Fedow sur ",(0,r.jsx)(s.a,{href:"https://fedow.tibillet.localhost",children:"fedow.tibillet.localhost"}),","]}),"\n",(0,r.jsxs)(s.li,{children:["\xe0 une instance du moteur de billetterie Lespass sur ",(0,r.jsx)(s.a,{href:"https://lespass.tibillet.localhost",children:"lespass.tibillet.localhost"}),","]}),"\n",(0,r.jsxs)(s.li,{children:["au serveur de caisse LaBoutik sur ",(0,r.jsx)(s.a,{href:"https://laboutik.tibillet.localhost",children:"laboutik.tibillet.localhost"})]}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:"Si tout marche comme pr\xe9vu, f\xe9licitations : vous \xeates pr\xeat\u22c5es \xe0 vous lancer \ud83d\udd27"}),"\n",(0,r.jsx)(s.p,{children:"Sinon, venez nous en parler, on est l\xe0 pour aider !"}),"\n",(0,r.jsxs)(s.admonition,{title:"Pour conclure",type:"note",children:[(0,r.jsxs)(s.p,{children:["N'oubliez pas de ",(0,r.jsx)(s.code,{children:"docker compose down"})," \xe0 la fois dans les tests et dans Trafik quand vous avez fini votre session de travail. Votre ordinateur aussi a besoin de faire des pauses !"]}),(0,r.jsxs)(s.p,{children:["Si vous avez peur de ne pas vous en souvenir, enlevez l'option ",(0,r.jsx)(s.code,{children:"-d"})," \xe0 ",(0,r.jsx)(s.code,{children:"compose up"})," et la commande se lancera directement dans le terminal, pas en t\xe2che de fond. C'est pas grave, vous aurez juste besoin de plus d'onglets \ud83d\ude0b"]})]}),"\n",(0,r.jsx)(s.h2,{id:"cycle-de-vie",children:"Cycle de vie"}),"\n",(0,r.jsx)(s.h3,{id:"mises-\xe0-jour",children:"Mises \xe0 jour"}),"\n",(0,r.jsx)(s.p,{children:"Pour rester \xe0 jour durant le d\xe9veloppement, t\xe9l\xe9charger l'image la plus r\xe9cente :"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",metastring:'title="Test-Driven-Development$"',children:"docker compose pull\ndocker compose up -d # d\xe9marrer ou red\xe9marrer les conteneurs\n"})}),"\n",(0,r.jsx)(s.h3,{id:"tests",children:"Tests"}),"\n",(0,r.jsx)(s.p,{children:"Vous pouvez lancer les tests Python de la m\xeame fa\xe7on que pour un d\xe9marrage manuel. Commencez par r\xe9initialiser les trois app Django pour obtenir les donn\xe9es testables, puis lancez cette commande depuis votre conteneur Django LaBoutik :"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",metastring:'title="laboutik_django> poetry shell$"',children:"./manage.py test\n"})}),"\n",(0,r.jsx)("mark",{children:"TODO: docs des tests end-to-end (ils existent !)"}),"\n",(0,r.jsx)(s.h3,{id:"sauvegardes",children:"Sauvegardes"}),"\n",(0,r.jsxs)(s.p,{children:["Avant de vous attaquer \xe0 un changement majeur, sauvegardez toute donn\xe9e qui a de la valeur pour votre d\xe9veloppement. Sur votre instance Fedow, par exemple, il suffit de sauvegarder le dossier ",(0,r.jsx)(s.code,{children:"database"})," r\xe9guli\xe8rement. Les autres moteurs peuvent \xeatre sauvegard\xe9s par l'utilitaire Borgbackup, des t\xe2ches cron et des dump de bases de donn\xe9es. Plus sur ce sujet \xe0 l'avenir."]}),"\n",(0,r.jsx)("mark",{children:"TODO: explications d\xe9taill\xe9es"})]})}function u(e={}){const{wrapper:s}={...(0,d.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>t,x:()=>l});var r=n(6540);const d={},i=r.createContext(d);function t(e){const s=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:t(e.components),r.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/fr/assets/js/c0af11f0.96a0b54b.js b/fr/assets/js/c0af11f0.96a0b54b.js new file mode 100644 index 00000000..c076c220 --- /dev/null +++ b/fr/assets/js/c0af11f0.96a0b54b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocumentation_v_2=self.webpackChunkdocumentation_v_2||[]).push([[639],{7549:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>o,contentTitle:()=>t,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var r=n(4848),d=n(8453);const i={sidebar_position:1,slug:"development",title:"D\xe9veloppement",keywords:["contribuer","b\xe9n\xe9volat","open source","git","pull request","issue","soutien","code","d\xe9veloppement","programmation","python","django","docker","poetry","tests","tdd"],tags:["contribuer","open source","git","soutien","tdd","python","django","docker","poetry"],authors:"kaya, guillaume"},t="D\xe9veloppement",l={id:"contribute/dev",title:"D\xe9veloppement",description:"Vous voulez aider au d\xe9veloppement de TiBillet? Merci! C'est gr\xe2ce aux gens comme vous que l'open-source fonctionne \ud83d\ude4f",source:"@site/i18n/fr/docusaurus-plugin-content-docs/current/contribute/dev.md",sourceDirName:"contribute",slug:"/contribute/development",permalink:"/fr/docs/contribute/development",draft:!1,unlisted:!1,editUrl:"https://github.com/TiBillet/documentation/tree/main/tibillet/docs/contribute/dev.md",tags:[{inline:!0,label:"contribuer",permalink:"/fr/docs/tags/contribuer"},{inline:!0,label:"open source",permalink:"/fr/docs/tags/open-source"},{inline:!0,label:"git",permalink:"/fr/docs/tags/git"},{inline:!0,label:"soutien",permalink:"/fr/docs/tags/soutien"},{inline:!0,label:"tdd",permalink:"/fr/docs/tags/tdd"},{inline:!0,label:"python",permalink:"/fr/docs/tags/python"},{inline:!0,label:"django",permalink:"/fr/docs/tags/django"},{inline:!0,label:"docker",permalink:"/fr/docs/tags/docker"},{inline:!0,label:"poetry",permalink:"/fr/docs/tags/poetry"}],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1,slug:"development",title:"D\xe9veloppement",keywords:["contribuer","b\xe9n\xe9volat","open source","git","pull request","issue","soutien","code","d\xe9veloppement","programmation","python","django","docker","poetry","tests","tdd"],tags:["contribuer","open source","git","soutien","tdd","python","django","docker","poetry"],authors:"kaya, guillaume"},sidebar:"tutorialSidebar",previous:{title:"Contributing",permalink:"/fr/docs/category/contributing"},next:{title:"Research",permalink:"/fr/docs/category/research"}},o={},c=[{value:"M\xe9thodes de travail",id:"m\xe9thodes-de-travail",level:2},{value:"Outils et langages utilis\xe9s",id:"outils-et-langages-utilis\xe9s",level:2},{value:"Installation locale",id:"installation-locale",level:2},{value:"Je veux comprendre !",id:"je-veux-comprendre-",level:2},{value:"Traefik",id:"traefik",level:3},{value:"G\xe9n\xe9ration des cl\xe9s",id:"g\xe9n\xe9ration-des-cl\xe9s",level:3},{value:"Fedow, Lespass, LaBoutik",id:"fedow-lespass-laboutik",level:3},{value:"Environnement Fedow",id:"environnement-fedow",level:4},{value:"Environnement Lespass",id:"environnement-lespass",level:4},{value:"Environnement LaBoutik",id:"environnement-laboutik",level:4},{value:"Mise en place des tests",id:"mise-en-place-des-tests",level:3},{value:"D\xe9marrage des moteurs",id:"d\xe9marrage-des-moteurs",level:2},{value:"\xc7a tourne ?",id:"\xe7a-tourne-",level:3},{value:"Cycle de vie",id:"cycle-de-vie",level:2},{value:"Mises \xe0 jour",id:"mises-\xe0-jour",level:3},{value:"Tests",id:"tests",level:3},{value:"Sauvegardes",id:"sauvegardes",level:3}];function a(e){const s={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,d.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"d\xe9veloppement",children:"D\xe9veloppement"})}),"\n",(0,r.jsx)(s.p,{children:"Vous voulez aider au d\xe9veloppement de TiBillet? Merci! C'est gr\xe2ce aux gens comme vous que l'open-source fonctionne \ud83d\ude4f"}),"\n",(0,r.jsxs)(s.p,{children:["Premi\xe8rement, si vous n'avez pas une t\xe2che pr\xe9cise en t\xeate, allez voir les tickets ouverts sur les ",(0,r.jsx)(s.a,{href:"https://github.com/orgs/TiBillet/projects?query=is%3Aopen",children:"d\xe9p\xf4ts Github"})," officiels."]}),"\n",(0,r.jsx)(s.p,{children:"C'est le moyen le plus simple de comprendre quels sont les probl\xe8mes \xe0 r\xe9soudre et quelles fonctionnalit\xe9s sont demand\xe9es."}),"\n",(0,r.jsxs)(s.admonition,{title:"Les d\xe9p\xf4ts",type:"note",children:[(0,r.jsx)(s.p,{children:'Les d\xe9p\xf4ts \xe9pingl\xe9s ("Pinned") sur la page de l\'organisation devraient suffire. Si vous avez des doutes sur les r\xf4les respectifs de Fedow, LaBoutik ou Lespass, r\xe9visez les bases sur les trois moteurs de TiBillet.'}),(0,r.jsxs)(s.p,{children:[(0,r.jsx)("mark",{children:"TODO: lien doc vers les moteurs et leur r\xf4le"})," (une page dans pr\xe9sentation probablement)"]})]}),"\n",(0,r.jsx)(s.h2,{id:"m\xe9thodes-de-travail",children:"M\xe9thodes de travail"}),"\n",(0,r.jsxs)(s.p,{children:["Quand on travaille avec des ",(0,r.jsx)(s.em,{children:"forges Git"})," comme Github, il y a des fa\xe7ons d'aider qui rendent votre contribution plus facile \xe0 prendre en compte :"]}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["Si vous ne faites pas partie de l'organisation (avec les acc\xe8s au d\xe9p\xf4t), faites un ",(0,r.jsx)(s.em,{children:"fork"})," (d\xe9doublement) du d\xe9p\xf4t qui vous int\xe9resse, travaillez \xe0 partir de celui-ci et soumettez vous modifications par le biais d'une ",(0,r.jsx)(s.em,{children:"pull request"})," (demande de fusion)."]}),"\n",(0,r.jsx)(s.li,{children:"Si vous avez un ticket sur lequel vous souhaitez travailler, v\xe9rifiez s'il n'existe pas d\xe9j\xe0. Si c'est le cas, rejoignez la discussion plut\xf4t que de faire la m\xeame chose en parall\xe8le!"}),"\n",(0,r.jsxs)(s.li,{children:["Quand vous d\xe9marrez le travail sur un ticket, ",(0,r.jsx)(s.strong,{children:"assignez-vous"})," dessus pour informer les autres qu'un chantier est en cours."]}),"\n",(0,r.jsxs)(s.li,{children:["Enfin, un point important: ",(0,r.jsx)(s.strong,{children:"ne cr\xe9ez pas de demandes de fusion sans avoir fait tourner les tests"})," ! \xc7a arrive aux meilleur\u22c5es d'entre nous. Id\xe9alement, vous devriez les faire tourner avant chaque ",(0,r.jsx)(s.em,{children:"commit"}),", avec l'aide d'un ",(0,r.jsx)(s.em,{children:"git hook"})," (d\xe9clencheur automatique) par exemple."]}),"\n"]}),"\n",(0,r.jsx)(s.admonition,{title:"Trouver de l'aide",type:"note",children:(0,r.jsxs)(s.p,{children:["Si vous avez des questions sur Git, Github, ou un aspect du d\xe9veloppement, rejoignez-nous sur le serveur ",(0,r.jsx)(s.a,{href:"https://discord.gg/7FJvtYx",children:"Discord"})," ou ",(0,r.jsx)(s.a,{href:"https://matrix.to/#/#tibillet:tiers-lieux.org",children:"Matrix"}),". Nous ferons de notre mieux pour aider !"]})}),"\n",(0,r.jsx)(s.h2,{id:"outils-et-langages-utilis\xe9s",children:"Outils et langages utilis\xe9s"}),"\n",(0,r.jsx)(s.p,{children:"TiBillet, c'est :"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["une suite d'applications ",(0,r.jsx)(s.a,{href:"https://www.python.org/",children:"Python"}),","]}),"\n",(0,r.jsxs)(s.li,{children:["d\xe9velopp\xe9es avec l'aide du framework ",(0,r.jsx)(s.a,{href:"https://www.djangoproject.com/",children:"Django"}),","]}),"\n",(0,r.jsxs)(s.li,{children:["ses d\xe9pendances sont g\xe9r\xe9es avec ",(0,r.jsx)(s.a,{href:"https://python-poetry.org/",children:"Poetry"}),","]}),"\n",(0,r.jsxs)(s.li,{children:["le tout tournant dans des conteneurs ",(0,r.jsx)(s.a,{href:"https://www.docker.com/",children:"Docker"})," en production comme en d\xe9veloppement."]}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:"Si vous ne vous sentez pas \xe0 l'aise avec la pile logicielle, la meilleure chose \xe0 faire est d'aller chercher des tutoriels. Avec un peu de chance on compilera notre propre liste de ressources ici un de ces jours \ud83d\ude05"}),"\n",(0,r.jsx)(s.admonition,{title:"Attention",type:"warning",children:(0,r.jsx)(s.p,{children:"En particulier, des connaissances de bases avec Git feront une diff\xe9rence. C'est assez facile de semer le chaos dans un d\xe9p\xf4t quand on ne comprend pas comment le versionnage marche. Il y a des s\xe9curit\xe9s en place, mais vous pourriez avoir beaucoup plus de difficult\xe9s que n\xe9cessaire! Je dis \xe7a par exp\xe9rience \ud83d\ude11"})}),"\n",(0,r.jsx)(s.h2,{id:"installation-locale",children:"Installation locale"}),"\n",(0,r.jsx)(s.p,{children:"Pour coder et tester votre code, vous allez avoir besoin d'une instance (\xe0 peu pr\xe8s) fonctionnelle de TiBillet sur votre ordinateur."}),"\n",(0,r.jsx)(s.p,{children:"V\xe9rifions que vous avez l'outillage requis sous la main. Vous avez besoin de :"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["Docker CLI et l'extension ",(0,r.jsx)(s.code,{children:"docker-compose"}),". S'installe super facilement ",(0,r.jsx)(s.a,{href:"https://docs.docker.com/engine/install/ubuntu/#install-using-the-convenience-script",children:"ici"})]}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.code,{children:"git"})}),"\n",(0,r.jsx)(s.li,{children:"un compte Github avec une cl\xe9 SSH enregistr\xe9e (pour un acc\xe8s authentifi\xe9 \xe0 la forge),"}),"\n",(0,r.jsx)(s.li,{children:"un IDE (environnement de d\xe9veloppement). Des coupons pour PyCharm sot disponibles sur demande, mais un IDE g\xe9n\xe9raliste comme VSCodium fonctionne assez bien - c'est ce que j'utilise \ud83d\ude09."}),"\n"]}),"\n",(0,r.jsxs)(s.admonition,{type:"info",children:[(0,r.jsx)(s.p,{children:"A partir de la, vous avez le choix entre deux chemins :"}),(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["Le chemin ",(0,r.jsx)(s.strong,{children:"Trop facile !"})," : ",(0,r.jsx)(s.a,{href:"https://nuage.tierslieux.re/s/rprGfbDDDrazJ9d",children:"je t\xe9l\xe9charge une archive"})," dans laquelle tout est d\xe9ja install\xe9 et je peux passer directement au ",(0,r.jsx)(s.a,{href:"#d%C3%A9marrage-des-moteurs",children:"d\xe9marrage des moteurs"}),"."]}),"\n",(0,r.jsxs)(s.li,{children:["Le chemin ",(0,r.jsx)(s.strong,{children:"Je veux comprendre !"})," : Chaque \xe9tape pour cr\xe9er son environnement est d\xe9taill\xe9e dans le ",(0,r.jsx)(s.a,{href:"#je-veux-comprendre-",children:"tuto ci dessous"}),"."]}),"\n"]}),(0,r.jsx)(s.p,{children:"Vous pouvez m\xeame faire les deux, pour un effet maximal !"})]}),"\n",(0,r.jsx)(s.h2,{id:"je-veux-comprendre-",children:"Je veux comprendre !"}),"\n",(0,r.jsx)(s.p,{children:"On va commencer en cr\xe9ant un dossier qui contiendra les diff\xe9rents d\xe9p\xf4ts requis \xe0 sa racine, dans votre dossier de travail par exemple. \xc7a ressemblera \xe0 :"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"tibillet-dev\n\u251c\u2500\u2500 Fedow\n\u251c\u2500\u2500 LaBoutik\n\u251c\u2500\u2500 Lespass\n\u251c\u2500\u2500 Test-Driven-Development\n\u2514\u2500\u2500 Traefik\n"})}),"\n",(0,r.jsx)(s.h3,{id:"traefik",children:"Traefik"}),"\n",(0,r.jsxs)(s.p,{children:["On va avoir besoin d'un ",(0,r.jsx)(s.em,{children:"proxy d'application"})," (un outil qui va aider \xe0 rediriger le trafic des conteneurs vers des adresses locales). TiBillet fournit une configuration de base pour un conteneur Trafik + LetsEncrypt (certificats SSL), partons donc l\xe0-dessus :"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",metastring:'title="tibillet-dev$"',children:"git clone git@github.com:TiBillet/Traefik-reverse-proxy.git Traefik\n"})}),"\n",(0,r.jsx)(s.p,{children:"Pour le d\xe9marrer :"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",metastring:'title="tibillet-dev$"',children:"cd Traefik\ndocker compose up -d\n"})}),"\n",(0,r.jsxs)(s.p,{children:["Consulter le navigateur \xe0 l'adresse ",(0,r.jsx)(s.a,{href:"https://localhost",children:(0,r.jsx)(s.code,{children:"https://localhost"})})," devrait vous donner un avertissement de s\xe9curit\xe9 sur les certificats auto-sign\xe9s (pas un probl\xe8me dans ce cas pr\xe9cis) et une ",(0,r.jsx)(s.code,{children:"404 page not found"}),". Parfait !"]}),"\n",(0,r.jsx)(s.admonition,{type:"note",children:(0,r.jsxs)(s.p,{children:["Rappelez-vous de ",(0,r.jsx)(s.code,{children:"compose up"})," Traefik chaque fois que vous d\xe9marrez une session de travail sur TiBillet."]})}),"\n",(0,r.jsx)(s.h3,{id:"g\xe9n\xe9ration-des-cl\xe9s",children:"G\xe9n\xe9ration des cl\xe9s"}),"\n",(0,r.jsx)("mark",{children:"TODO: \xe0 simplifier ? lourd et compliqu\xe9 pour aucune raison valable"}),"\n",(0,r.jsxs)(s.p,{children:["Pour g\xe9n\xe9rer les cl\xe9s n\xe9cessaires \xe0 la configuration des moteurs, \xe0 l'heure actuelle, on ",(0,r.jsx)(s.em,{children:"pull"})," l'image Docker de la version production de Fedow, puis on lance quelques commandes dans l'environnement de Poetry."]}),"\n",(0,r.jsx)(s.p,{children:"Pour chaque moteur, on aura besoin :"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["d'une ou deux cl\xe9s Fernet (pour le champ ",(0,r.jsx)(s.code,{children:"FERNET_KEY"})," et possiblement des mots de passe),"]}),"\n",(0,r.jsxs)(s.li,{children:["d'une cl\xe9 secr\xe8te Django (pour le champ ",(0,r.jsx)(s.code,{children:"SECRET_KEY"}),")."]}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:"Vous pouvez g\xe9n\xe9rer 30 cl\xe9s uniques de chaque type en lan\xe7ant les commandes :"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"docker run --rm tibillet/fedow poetry run python3 -c \"from cryptography.fernet import Fernet; print('\\n'.join([Fernet.generate_key().decode('utf-8') for i in range(0,30)]))\"\ndocker run --rm tibillet/fedow poetry run python3 -c \"from django.core.management.utils import get_random_secret_key; print('\\n'.join([get_random_secret_key() for i in range(0,30)]))\"\n"})}),"\n",(0,r.jsx)(s.p,{children:"La premi\xe8re commande prendra quelques minutes, vu qu'elle t\xe9l\xe9charge une image Docker. Gardez les cl\xe9s quelque part, on s'en servira au moment de la mise en place des moteurs."}),"\n",(0,r.jsxs)(s.p,{children:["On aura \xe9galement besoin d'une cl\xe9 de test Stripe pour le champ ",(0,r.jsx)(s.code,{children:"STRIPE_KEY_TEST"}),". Stripe est actuellement la solution de paiement qui se charge de la conversion cash en cashless. Une cl\xe9 de test peut \xeatre obtenue en se cr\xe9ant un compte gratuit, puis and allant dans le Mode test -> Cl\xe9 API de test. Alternativement, demandez \xe0 l'\xe9quipe."]}),"\n",(0,r.jsx)(s.h3,{id:"fedow-lespass-laboutik",children:"Fedow, Lespass, LaBoutik"}),"\n",(0,r.jsx)(s.p,{children:"D\xe9marrons en clonant les d\xe9p\xf4ts des diff\xe9rents moteurs :"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",metastring:'title="tibillet-dev$"',children:"git clone git@github.com:TiBillet/Fedow.git\ngit clone git@github.com:TiBillet/Lespass.git\ngit clone git@github.com:TiBillet/LaBoutik.git\n"})}),"\n",(0,r.jsx)(s.p,{children:"\xc0 partir de l\xe0, on a besoin d'\xe9crire un peu de configuration. \xc7a sera plus simple \xe0 l'avenir, prenez patience \ud83d\ude0b"}),"\n",(0,r.jsxs)(s.p,{children:["Chaque moteur a besoin de son propre fichier ",(0,r.jsx)(s.code,{children:".env"}),", que vous pouvez baser sur les fichiers ",(0,r.jsx)(s.code,{children:"env_example"})," qu'on vient de cloner."]}),"\n",(0,r.jsx)(s.admonition,{title:"Attention",type:"warning",children:(0,r.jsxs)(s.p,{children:["Toute variable d'environnement, doit \xeatre trouvable dans le fichier ",(0,r.jsx)(s.code,{children:".env"}),". Pas de suppression de variable ! Elle peut par contre suivant les cas rester vide (nullable)."]})}),"\n",(0,r.jsx)(s.h4,{id:"environnement-fedow",children:"Environnement Fedow"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",metastring:'title="tibillet-dev$"',children:"cp Fedow/env_example Fedow/.env\n"})}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Nom"}),(0,r.jsx)(s.th,{children:"Environnement cible"}),(0,r.jsx)(s.th,{children:"Nullable"}),(0,r.jsx)(s.th,{children:"Valeur par d\xe9faut"}),(0,r.jsx)(s.th,{children:"Notes"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"SECRET_KEY"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Une des cl\xe9s secr\xe8tes Django g\xe9n\xe9r\xe9es pr\xe9c\xe9demment"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"FERNET_KEY"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Une des cl\xe9s Fernet g\xe9n\xe9r\xe9es pr\xe9c\xe9demment"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"STRIPE_KEY"})}),(0,r.jsx)(s.td,{children:"Production"}),(0,r.jsx)(s.td,{children:"Oui"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Cl\xe9 API de votre compte Stripe"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"DOMAIN"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"fedow.tibillet.localhost"})}),(0,r.jsx)(s.td,{children:"\xc0 adapter \xe0 votre nom de domaine et sous-domaine en production"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"STRIPE_KEY_TEST"})}),(0,r.jsx)(s.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(s.td,{children:"Oui"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Cl\xe9 API de test de votre compte Stripe"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"STRIPE_TEST"})}),(0,r.jsx)(s.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsxs)(s.td,{children:["Passer \xe0 1 si ",(0,r.jsx)(s.code,{children:"STRIPE_KEY_TEST"})," est rempli"]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"STRIPE_ENDPOINT_SECRET_TEST"})}),(0,r.jsx)(s.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(s.td,{children:"Oui"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Aucune id\xe9e"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"DEBUG"})}),(0,r.jsx)(s.td,{children:"D\xe9veloppement"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"Passer \xe0 1 pour le d\xe9veloppement"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"TEST"})}),(0,r.jsx)(s.td,{children:"Tests"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"Passer \xe0 1 pour les tests"})]})]})]}),"\n",(0,r.jsx)(s.h4,{id:"environnement-lespass",children:"Environnement Lespass"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",metastring:'title="tibillet-dev$"',children:"cp Lespass/env_example Lespass/.env\n"})}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Nom"}),(0,r.jsx)(s.th,{children:"Environnement cible"}),(0,r.jsx)(s.th,{children:"Nullable"}),(0,r.jsx)(s.th,{children:"Valeur par d\xe9faut"}),(0,r.jsx)(s.th,{children:"Notes"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"SECRET_KEY"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Une des cl\xe9s secr\xe8tes Django g\xe9n\xe9r\xe9es pr\xe9c\xe9demment"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"FERNET_KEY"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Une des cl\xe9s Fernet g\xe9n\xe9r\xe9es pr\xe9c\xe9demment"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"STRIPE_KEY"})}),(0,r.jsx)(s.td,{children:"Production"}),(0,r.jsx)(s.td,{children:"Oui"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Cl\xe9 API de votre compte Stripe"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"DOMAIN"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"tibillet.localhost"})}),(0,r.jsx)(s.td,{children:"\xc0 adapter \xe0 votre nom de domaine en production"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"SUB"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"lespass"})}),(0,r.jsx)(s.td,{children:"Sous-domaine de l'instance, \xe0 adapter en production"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"META"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"agenda"})}),(0,r.jsx)(s.td,{children:"Sous-domaine de l'agenda f\xe9d\xe9r\xe9, \xe0 adapter en production"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"FEDOW_DOMAIN"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"fedow.tibillet.localhost"})}),(0,r.jsx)(s.td,{children:"Domaine et sous-domaine du moteur Fedow"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"PUBLIC"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"TiBillet Coop."}),(0,r.jsx)(s.td,{children:"Nom de l'instance principale"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"TIME_ZONE"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"Europe/Paris"}),(0,r.jsx)(s.td,{children:"Plage horaire TZ de l'instance"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"ADMIN_EMAIL"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Email administrateur (pour le\u22c5a premier\u22c5e admin)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"POSTGRES_DB"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"lespass"}),(0,r.jsx)(s.td,{children:"\xc0 changer en production si n\xe9cessaire"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"POSTGRES_USER"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"lespass_postgres"}),(0,r.jsx)(s.td,{children:"\xc0 changer en production"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"POSTGRES_PASSWORD"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Mot de passe fort (une des cl\xe9s Fernets par exemple)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.code,{children:"EMAIL_HOST"}),", ",(0,r.jsx)(s.code,{children:"EMAIL_PORT"}),", ",(0,r.jsx)(s.code,{children:"EMAIL_HOST_USER"}),", ",(0,r.jsx)(s.code,{children:"EMAIL_HOST_PASSWORD"})]}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Oui"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Serveur d'email, requis pour confirmer des abonn\xe9\u22c5es par exemple"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"STRIPE_KEY_TEST"})}),(0,r.jsx)(s.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(s.td,{children:"Oui"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Cl\xe9 API de test de votre compte Stripe"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"STRIPE_TEST"})}),(0,r.jsx)(s.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsxs)(s.td,{children:["Passer \xe0 1 si ",(0,r.jsx)(s.code,{children:"STRIPE_KEY_TEST"})," est rempli"]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"DEBUG"})}),(0,r.jsx)(s.td,{children:"D\xe9veloppement"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"Passer \xe0 1 pour le d\xe9veloppement"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"TEST"})}),(0,r.jsx)(s.td,{children:"Tests"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"Passer \xe0 1 pour les tests"})]})]})]}),"\n",(0,r.jsx)(s.h4,{id:"environnement-laboutik",children:"Environnement LaBoutik"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",metastring:'title="tibillet-dev$"',children:"cp LaBoutik/env_example LaBoutik/.env\n"})}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Nom"}),(0,r.jsx)(s.th,{children:"Environnement cible"}),(0,r.jsx)(s.th,{children:"Nullable"}),(0,r.jsx)(s.th,{children:"Valeur par d\xe9faut"}),(0,r.jsx)(s.th,{children:"Notes"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"SECRET_KEY"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Une des cl\xe9s secr\xe8tes Django g\xe9n\xe9r\xe9es pr\xe9c\xe9demment"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"FERNET_KEY"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Une des cl\xe9s Fernet g\xe9n\xe9r\xe9es pr\xe9c\xe9demment"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"DOMAIN"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"laboutik.tibillet.localhost"})}),(0,r.jsx)(s.td,{children:"\xc0 adapter \xe0 votre nom de domaine et sous-domaine en production"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"FEDOW_URL"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"https://fedow.tibillet.localhost/",children:"https://fedow.tibillet.localhost/"})}),(0,r.jsx)(s.td,{children:"URL du moteur Fedow"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"LESPASS_TENANT_URL"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"https://lespass.tibillet.localhost/",children:"https://lespass.tibillet.localhost/"})}),(0,r.jsx)(s.td,{children:"URL de l'instance Lespass"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"TIME_ZONE"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"Europe/Paris"}),(0,r.jsx)(s.td,{children:"Plage horaire TZ de l'instance"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"ADMIN_EMAIL"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Email administrateur (pour le\u22c5a premier\u22c5e admin)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"MAIN_ASSET_NAME"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Le nom de votre unit\xe9 de valeur cashless (Pi\xe9cette, CoeurDor\u2026 comme vous voulez)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"POSTGRES_DB"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"laboutik"}),(0,r.jsx)(s.td,{children:"\xc0 changer en production si n\xe9cessaire"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"POSTGRES_USER"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"laboutik_user"}),(0,r.jsx)(s.td,{children:"\xc0 changer en production"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"POSTGRES_PASSWORD"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Mot de passe fort (une des cl\xe9s Fernets par exemple)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.code,{children:"EMAIL_HOST"}),", ",(0,r.jsx)(s.code,{children:"EMAIL_PORT"}),", ",(0,r.jsx)(s.code,{children:"EMAIL_HOST_USER"}),", ",(0,r.jsx)(s.code,{children:"EMAIL_HOST_PASSWORD"})]}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Oui"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Serveur d'email, requis pour confirmer des abonn\xe9\u22c5es par exemple"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"BORG_PASSPHRASE"})}),(0,r.jsx)(s.td,{children:"Tous"}),(0,r.jsx)(s.td,{children:"Oui"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Mot de passe utilis\xe9 pour la sauvegarde des donn\xe9es"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"DEBUG"})}),(0,r.jsx)(s.td,{children:"D\xe9veloppement"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"Passer \xe0 1 pour le d\xe9veloppement"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"TEST"})}),(0,r.jsx)(s.td,{children:"Tests"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"Passer \xe0 1 pour les tests"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"DEMO"})}),(0,r.jsx)(s.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(s.td,{children:"Non"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"Passer \xe0 1 pour une simulation de terminal de caisse"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"SENTRY_DNS"})}),(0,r.jsx)(s.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(s.td,{children:"Oui"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Sentry Debug pour le back-end"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.code,{children:"SENTRY_FRONT_DNS"}),", ",(0,r.jsx)(s.code,{children:"SENTRY_FRONT_ASSET"})]}),(0,r.jsx)(s.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(s.td,{children:"Oui"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Sentry Debug pour le front-end"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.code,{children:"DEMO_TAGID_CM"}),", ",(0,r.jsx)(s.code,{children:"DEMO_TAGID_CLIENT1"}),", ",(0,r.jsx)(s.code,{children:"DEMO_TAGID_CLIENT2"})]}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Oui"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Aucune id\xe9e"})]})]})]}),"\n",(0,r.jsx)(s.p,{children:"La configuration devrait \xeatre maintenant compl\xe8te pour les trois moteurs."}),"\n",(0,r.jsx)(s.h3,{id:"mise-en-place-des-tests",children:"Mise en place des tests"}),"\n",(0,r.jsx)(s.p,{children:"Pour une raison de coh\xe9rence d'environnement, l'image Docker de dev est assembl\xe9e \xe0 partir des tests. L'installation est similaire au moteurs :"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",metastring:'title="tibillet-dev$"',children:"git clone git@github.com:TiBillet/Test-Driven-Development.git\ncp Test-Driven-Development/env_example Test-Driven-Development/.env\n"})}),"\n",(0,r.jsx)(s.p,{children:"C'est fait \u263a\ufe0f On peut maintenant conteneuriser l'application enti\xe8re depuis le dossier des tests :"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",metastring:'title="Test-Driven-Development$"',children:"docker compose up -d\n"})}),"\n",(0,r.jsx)(s.p,{children:"Vous pouvez acc\xe9der en prime aux logs avec la commande :"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",metastring:'title="Test-Driven-Development$"',children:"docker compose logs -f\n"})}),"\n",(0,r.jsx)(s.admonition,{title:"Attention",type:"warning",children:(0,r.jsxs)(s.p,{children:["Ce ",(0,r.jsx)(s.code,{children:"docker-compose.yml"})," en particulier s'appuie sur la structure d\xe9crite au d\xe9but de l'installation, donc sur la structure du dossier ",(0,r.jsx)(s.em,{children:"parent"})," aux tests, appel\xe9 pour l'exemple ",(0,r.jsx)(s.code,{children:"tibillet-dev"}),". Contre-intuitif, mais maintenant vous savez \ud83d\ude09"]})}),"\n",(0,r.jsx)(s.h2,{id:"d\xe9marrage-des-moteurs",children:"D\xe9marrage des moteurs"}),"\n",(0,r.jsxs)(s.p,{children:["La principale diff\xe9rence entre les conteneurs de dev et de prod, c'est qu'en dev la commande ",(0,r.jsx)(s.code,{children:"docker compose up"})," ne d\xe9marre pas les applications Django individuelles. C'est un niveau de contr\xf4le fin qui est utile pour le d\xe9veloppement, mais \xe7a veut dire que vous avez besoin de les lancer manuellement."]}),"\n",(0,r.jsx)(s.p,{children:"On va les lancer de pr\xe9f\xe9rence dans l'ordre :"}),"\n",(0,r.jsxs)(s.ol,{children:["\n",(0,r.jsx)(s.li,{children:"Fedow"}),"\n",(0,r.jsx)(s.li,{children:"Lespass"}),"\n",(0,r.jsx)(s.li,{children:"LaBoutik (qui a besoin des deux autres pour fonctionner)"}),"\n"]}),"\n",(0,r.jsxs)(s.p,{children:["Les outils dont on a besoin sont dans les conteneurs, nomm\xe9s d'apr\xe8s leur moteur : ",(0,r.jsx)(s.code,{children:"fedow_django"}),", ",(0,r.jsx)(s.code,{children:"lespass_django"})," et enfin ",(0,r.jsx)(s.code,{children:"laboutik_django"}),". Pour rentrer dans un conteneur (exemple avec Fedow) :"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"# on d\xe9marre un environnement bash dans le conteneur fedow_django\ndocker exec -ti fedow_django bash\n"})}),"\n",(0,r.jsx)(s.p,{children:"\xc0 partir de l\xe0, on a quelques options."}),"\n",(0,r.jsxs)(s.p,{children:["La premi\xe8re, c'est le script ",(0,r.jsx)(s.code,{children:"flush.sh"}),". Il initialise les donn\xe9es de test et d\xe9marre Django dans la foul\xe9e. C'est cette commande qu'on va utiliser au ",(0,r.jsx)(s.strong,{children:"premier d\xe9marrage"})," de notre application :"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",metastring:'title="fedow_django$"',children:"./flush.sh\n"})}),"\n",(0,r.jsxs)(s.p,{children:["On l'utilisera aussi quand on veut ",(0,r.jsx)(s.strong,{children:"r\xe9initialiser"})," les donn\xe9es, par exemple avant de lancer les tests automatis\xe9s qui ont besoin de ces donn\xe9es pr\xe9visibles."]}),"\n",(0,r.jsx)(s.p,{children:"Pour le reste des manipulation dans le conteneur, on a besoin de rentrer dans l'environnement de Poetry, car on va lancer du Python."}),"\n",(0,r.jsx)(s.p,{children:"Pour lancer l'environnement virtuel de Poetry depuis le conteneur :"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",metastring:'title="fedow_django$"',children:" # on d\xe9marre l'environnement virtuel qui prend en charge les d\xe9pendances python\npoetry shell\n"})}),"\n",(0,r.jsxs)(s.p,{children:["Django se g\xe8re avec un script appel\xe9 ",(0,r.jsx)(s.code,{children:"manage.py"}),". Deux commandes nous int\xe9ressent \xe0 l'heure actuelle :"]}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.code,{children:"rsp"})," (alias de ",(0,r.jsx)(s.code,{children:"./manage.py runserver 0.0.0.0:8000"}),") d\xe9marre Django sans r\xe9initialiser les donn\xe9es. \xc7a nous servira quand on veut garder des donn\xe9es entre deux d\xe9marrages. G\xe9n\xe9ralement, si on a pas besoin de lancer les tests, c'est cette commande qu'on utilise plut\xf4t que ",(0,r.jsx)(s.code,{children:"flush"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsxs)(s.p,{children:["Optionnellement, si on a des bugs graphiques, on peut tenter ",(0,r.jsx)(s.code,{children:"./manage.py collectstatic"}),". Parfois, les ressources graphiques ne sont pas correctement copi\xe9es au premier d\xe9marrage, et \xe7a peut r\xe9gler le probl\xe8me."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:"Plus qu'\xe0 d\xe9marrer les trois moteurs de TiBillet dans l'ordre indiqu\xe9 pr\xe9c\xe9demment : Fedow, Lespass, puis LaBoutik !"}),"\n",(0,r.jsxs)(s.admonition,{title:"Cr\xe9ation d'alias",type:"tip",children:[(0,r.jsx)(s.p,{children:"La commande Docker devient vite r\xe9p\xe9titive. Pourquoi ne pas cr\xe9er un alias, ou m\xeame une petite fonction bash pour gagner du temps et soulager son canal carpien par la m\xeame occasion ? Voil\xe0 ma fonction :"}),(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",metastring:'title="~/.bashrc"',children:"function dockex {\n docker exec -ti $1 bash\n}\n"})}),(0,r.jsx)(s.p,{children:"Il suffit d'ouvrir un nouveau terminal pour que la fonction s'ajoute \xe0 l'environnement. Il y a m\xeame sans doule moyen d'ajouter poetry \xe0 tout \xe7a si vous cherchez un peu !"})]}),"\n",(0,r.jsx)(s.h3,{id:"\xe7a-tourne-",children:"\xc7a tourne ?"}),"\n",(0,r.jsx)(s.p,{children:"Si vous avez utilis\xe9 la configuration des sous-domaines par d\xe9faut, vous avez maintenant acc\xe8s :"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["au moteur de f\xe9d\xe9ration Fedow sur ",(0,r.jsx)(s.a,{href:"https://fedow.tibillet.localhost",children:"fedow.tibillet.localhost"}),","]}),"\n",(0,r.jsxs)(s.li,{children:["\xe0 une instance du moteur de billetterie Lespass sur ",(0,r.jsx)(s.a,{href:"https://lespass.tibillet.localhost",children:"lespass.tibillet.localhost"}),","]}),"\n",(0,r.jsxs)(s.li,{children:["au serveur de caisse LaBoutik sur ",(0,r.jsx)(s.a,{href:"https://laboutik.tibillet.localhost",children:"laboutik.tibillet.localhost"})," pour l'admin. Cliquez sur \"voir le site\" pour lancer la simulation d'un terminal."]}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:"Si tout marche comme pr\xe9vu, f\xe9licitations : vous \xeates pr\xeat\u22c5es \xe0 vous lancer \ud83d\udd27"}),"\n",(0,r.jsx)(s.p,{children:"Sinon, venez nous en parler, on est l\xe0 pour aider !"}),"\n",(0,r.jsxs)(s.admonition,{title:"Pour conclure",type:"note",children:[(0,r.jsxs)(s.p,{children:["N'oubliez pas de ",(0,r.jsx)(s.code,{children:"docker compose down"})," \xe0 la fois dans les tests et dans Trafik quand vous avez fini votre session de travail. Votre ordinateur aussi a besoin de faire des pauses !"]}),(0,r.jsxs)(s.p,{children:["Si vous avez peur de ne pas vous en souvenir, enlevez l'option ",(0,r.jsx)(s.code,{children:"-d"})," \xe0 ",(0,r.jsx)(s.code,{children:"compose up"})," et la commande se lancera directement dans le terminal, pas en t\xe2che de fond. C'est pas grave, vous aurez juste besoin de plus d'onglets \ud83d\ude0b"]})]}),"\n",(0,r.jsx)(s.h2,{id:"cycle-de-vie",children:"Cycle de vie"}),"\n",(0,r.jsx)(s.h3,{id:"mises-\xe0-jour",children:"Mises \xe0 jour"}),"\n",(0,r.jsx)(s.p,{children:"Pour rester \xe0 jour durant le d\xe9veloppement, pensez \xe0 t\xe9l\xe9charger les images les plus r\xe9cente et/ou \xe0 builder les images django :"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",metastring:'title="Test-Driven-Development$"',children:"docker compose pull\ndocker compose up -d --build # d\xe9marrer ou red\xe9marrer les conteneurs\n"})}),"\n",(0,r.jsx)(s.h3,{id:"tests",children:"Tests"}),"\n",(0,r.jsx)(s.p,{children:"Vous pouvez lancer les tests Python de la m\xeame fa\xe7on que pour un d\xe9marrage manuel. Commencez par r\xe9initialiser les trois app Django pour obtenir les donn\xe9es testables, puis lancez cette commande depuis votre conteneur Django LaBoutik :"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",metastring:'title="laboutik_django> poetry shell$"',children:"./manage.py test\n"})}),"\n",(0,r.jsx)("mark",{children:"TODO: docs des tests end-to-end (ils existent !)"}),"\n",(0,r.jsx)(s.h3,{id:"sauvegardes",children:"Sauvegardes"}),"\n",(0,r.jsxs)(s.p,{children:["Avant de vous attaquer \xe0 un changement majeur, sauvegardez toute donn\xe9e qui a de la valeur pour votre d\xe9veloppement. Sur votre instance Fedow, par exemple, il suffit de sauvegarder le dossier ",(0,r.jsx)(s.code,{children:"database"})," r\xe9guli\xe8rement. Les autres moteurs peuvent \xeatre sauvegard\xe9s par l'utilitaire Borgbackup, des t\xe2ches cron et des dump de bases de donn\xe9es. Plus sur ce sujet \xe0 l'avenir."]}),"\n",(0,r.jsx)("mark",{children:"TODO: explications d\xe9taill\xe9es"})]})}function u(e={}){const{wrapper:s}={...(0,d.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>t,x:()=>l});var r=n(6540);const d={},i=r.createContext(d);function t(e){const s=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:t(e.components),r.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/fr/assets/js/runtime~main.d44541ac.js b/fr/assets/js/runtime~main.2ea7ddb4.js similarity index 99% rename from fr/assets/js/runtime~main.d44541ac.js rename to fr/assets/js/runtime~main.2ea7ddb4.js index 92a604bd..b75c6177 100644 --- a/fr/assets/js/runtime~main.d44541ac.js +++ b/fr/assets/js/runtime~main.2ea7ddb4.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,c,d,f,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var c=t[e]={id:e,loaded:!1,exports:{}};return b[e].call(c.exports,c,c.exports,r),c.loaded=!0,c.exports}r.m=b,r.c=t,e=[],r.O=(a,c,d,f)=>{if(!c){var b=1/0;for(i=0;i=f)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,f0&&e[i-1][2]>f;i--)e[i]=e[i-1];e[i]=[c,d,f]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var f=Object.create(null);r.r(f);var b={};a=a||[null,c({}),c([]),c(c)];for(var t=2&d&&e;"object"==typeof t&&!~a.indexOf(t);t=c(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(f,b),f},r.d=(e,a)=>{for(var c in a)r.o(a,c)&&!r.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,c)=>(r.f[c](e,a),a)),[])),r.u=e=>"assets/js/"+({114:"745e39fd",273:"deed564a",311:"6478c5d7",544:"a42a12d2",632:"67ac314b",639:"c0af11f0",1108:"6929ad17",1146:"6f8e40e7",1178:"270a7541",1235:"a7456010",1339:"72c1897c",1394:"61ad30b6",1488:"03ad00ba",1579:"449f1965",1595:"cb04bd8e",1655:"00a627ec",1776:"df8088d9",1905:"3bb6e70a",2047:"583c92f6",2109:"65b5bc03",2145:"07d9d8ff",2216:"b85a8061",2340:"b24fcd7a",2387:"0c7e5857",2469:"1ed72f18",2527:"48065261",2598:"00afd901",2644:"68e5a7f1",2798:"91c19f46",2924:"44b2fabb",2977:"3da3203d",3064:"55afe7bb",3111:"32a423af",3480:"474b1dc0",3628:"696d41fa",3808:"9292e017",4144:"027644ee",4279:"df203c0f",4300:"acef3f09",4359:"a10a0aa5",4411:"14c235f6",4479:"1f772c55",4484:"7b1d6ae7",4663:"9941358c",4721:"22ad831a",4726:"2487d3c6",4787:"3720c009",4806:"8f0ce7bf",4831:"a4a43940",4859:"0f181b88",4878:"4b4b4e17",4967:"2ba7bea0",5053:"e462b8cb",5172:"02434433",5415:"bb6a9c94",5456:"5295d439",5478:"623e3017",5481:"8370a1d2",5525:"64a6eaa0",5605:"258bd27d",5612:"19463738",5649:"748e24c1",5742:"aba21aa0",5767:"0974cb83",5804:"9644ce77",5870:"1a90fa4c",6061:"1f391b9e",6108:"24f5caf0",6199:"6d1db5a5",6224:"43b68251",6244:"e9e8755a",6316:"07630c8f",6364:"21f279ec",6577:"ff3ce73e",6715:"b3d07ec0",6969:"14eb3368",7091:"6b9c5894",7098:"a7bd4aaa",7368:"5b40ecf4",7403:"df2a2fef",7569:"34d64ec5",7583:"d9efc8e6",7672:"12acde98",7761:"9830a4d3",7843:"1796c5bc",7904:"39b17a97",7928:"7dc6d5c9",8017:"031b3c77",8034:"9c2754a0",8310:"ba3701a6",8343:"63aafed8",8345:"070ddeb6",8383:"f268abb1",8401:"17896441",8555:"c8adef9d",8561:"a65a45c1",8678:"4b1f9395",8697:"a691281d",8707:"a4153707",8789:"d1dd28fc",9048:"a94703ab",9131:"6bc29cb1",9503:"637d76cf",9579:"a727ba59",9625:"fae28bbd",9647:"5e95c892",9751:"98ece4e3"}[e]||e)+"."+{114:"21c8d929",273:"ea2000a8",311:"89a547ac",544:"7cf877c8",632:"b84b83d5",639:"78baf066",1108:"55fff404",1146:"1355eb31",1178:"6290ca18",1235:"64267856",1339:"6c32ef5e",1394:"2e3becde",1488:"ad911fe5",1579:"75e69521",1595:"27d079b4",1655:"e1638269",1776:"c43f2adc",1905:"4bb25979",2047:"b6c4ebad",2109:"e96332c7",2145:"293c9955",2216:"60e820fe",2237:"c97ebfc9",2340:"88b7fab5",2387:"2b9d3746",2469:"02f4f93d",2527:"3dc08754",2598:"2c73005f",2644:"6b49aa9e",2798:"1a2d6e72",2924:"b294681e",2977:"93be5747",3064:"1c71c877",3111:"e85425eb",3480:"ed8cdf3c",3628:"7d7436d9",3808:"c1a676d2",4144:"36fc7bd1",4279:"d60d8633",4300:"7f64b45a",4359:"614cfe7e",4411:"c1a7f582",4479:"ad436572",4484:"c5fb8f56",4663:"8a102884",4721:"bde37189",4726:"b31d6cf3",4787:"d1287299",4806:"228f947a",4831:"ebb147c9",4859:"f5b0bc37",4878:"c0e70402",4967:"6e7cf57e",5053:"a81665a1",5172:"e6bc2ac6",5415:"035f574f",5456:"14778b33",5478:"ece3754f",5481:"30c47c04",5525:"af552e88",5605:"9795e91d",5612:"a6d30b94",5649:"37a9ecdf",5742:"eaf0e070",5767:"cb57b4aa",5804:"0b38849c",5870:"bec11dca",6061:"ce7ffbdd",6108:"2d6fc62c",6199:"a59f2d4e",6224:"c3856063",6244:"d02b69a8",6255:"74f97532",6316:"bd3bfa6e",6364:"6f39d809",6577:"d70ba2c9",6715:"0326e80d",6969:"ffd61a1f",7091:"d83bdb14",7098:"0c0e467a",7368:"04ee0ee5",7403:"515a798b",7569:"ab69487d",7583:"09a3504b",7672:"6d04bf31",7761:"926a4b2a",7843:"c0e22ac7",7904:"e4793117",7928:"c6c2ccce",8017:"a7a64bd3",8034:"a845a606",8310:"577bb476",8343:"fd27a7ea",8345:"e56da54e",8383:"51f2d259",8401:"cf7f7f7c",8555:"28ef7b66",8561:"a4c53ec2",8678:"8901b80b",8697:"9a6757b1",8707:"a2a54788",8789:"b3691f92",9048:"312334be",9131:"08e8f930",9503:"5b0b53c4",9579:"297f9516",9625:"112d6f0c",9647:"674f41d0",9751:"9229bd21"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},f="documentation-v-2:",r.l=(e,a,c,b)=>{if(d[e])d[e].push(a);else{var t,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var f=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),f&&f.forEach((e=>e(c))),a)return a(c)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/fr/",r.gca=function(e){return e={17896441:"8401",19463738:"5612",48065261:"2527","745e39fd":"114",deed564a:"273","6478c5d7":"311",a42a12d2:"544","67ac314b":"632",c0af11f0:"639","6929ad17":"1108","6f8e40e7":"1146","270a7541":"1178",a7456010:"1235","72c1897c":"1339","61ad30b6":"1394","03ad00ba":"1488","449f1965":"1579",cb04bd8e:"1595","00a627ec":"1655",df8088d9:"1776","3bb6e70a":"1905","583c92f6":"2047","65b5bc03":"2109","07d9d8ff":"2145",b85a8061:"2216",b24fcd7a:"2340","0c7e5857":"2387","1ed72f18":"2469","00afd901":"2598","68e5a7f1":"2644","91c19f46":"2798","44b2fabb":"2924","3da3203d":"2977","55afe7bb":"3064","32a423af":"3111","474b1dc0":"3480","696d41fa":"3628","9292e017":"3808","027644ee":"4144",df203c0f:"4279",acef3f09:"4300",a10a0aa5:"4359","14c235f6":"4411","1f772c55":"4479","7b1d6ae7":"4484","9941358c":"4663","22ad831a":"4721","2487d3c6":"4726","3720c009":"4787","8f0ce7bf":"4806",a4a43940:"4831","0f181b88":"4859","4b4b4e17":"4878","2ba7bea0":"4967",e462b8cb:"5053","02434433":"5172",bb6a9c94:"5415","5295d439":"5456","623e3017":"5478","8370a1d2":"5481","64a6eaa0":"5525","258bd27d":"5605","748e24c1":"5649",aba21aa0:"5742","0974cb83":"5767","9644ce77":"5804","1a90fa4c":"5870","1f391b9e":"6061","24f5caf0":"6108","6d1db5a5":"6199","43b68251":"6224",e9e8755a:"6244","07630c8f":"6316","21f279ec":"6364",ff3ce73e:"6577",b3d07ec0:"6715","14eb3368":"6969","6b9c5894":"7091",a7bd4aaa:"7098","5b40ecf4":"7368",df2a2fef:"7403","34d64ec5":"7569",d9efc8e6:"7583","12acde98":"7672","9830a4d3":"7761","1796c5bc":"7843","39b17a97":"7904","7dc6d5c9":"7928","031b3c77":"8017","9c2754a0":"8034",ba3701a6:"8310","63aafed8":"8343","070ddeb6":"8345",f268abb1:"8383",c8adef9d:"8555",a65a45c1:"8561","4b1f9395":"8678",a691281d:"8697",a4153707:"8707",d1dd28fc:"8789",a94703ab:"9048","6bc29cb1":"9131","637d76cf":"9503",a727ba59:"9579",fae28bbd:"9625","5e95c892":"9647","98ece4e3":"9751"}[e]||e,r.p+r.u(e)},(()=>{var e={5354:0,1869:0};r.f.j=(a,c)=>{var d=r.o(e,a)?e[a]:void 0;if(0!==d)if(d)c.push(d[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var f=new Promise(((c,f)=>d=e[a]=[c,f]));c.push(d[2]=f);var b=r.p+r.u(a),t=new Error;r.l(b,(c=>{if(r.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var f=c&&("load"===c.type?"missing":c.type),b=c&&c.target&&c.target.src;t.message="Loading chunk "+a+" failed.\n("+f+": "+b+")",t.name="ChunkLoadError",t.type=f,t.request=b,d[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,c)=>{var d,f,b=c[0],t=c[1],o=c[2],n=0;if(b.some((a=>0!==e[a]))){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(a&&a(c);n{"use strict";var e,a,c,d,f,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var c=t[e]={id:e,loaded:!1,exports:{}};return b[e].call(c.exports,c,c.exports,r),c.loaded=!0,c.exports}r.m=b,r.c=t,e=[],r.O=(a,c,d,f)=>{if(!c){var b=1/0;for(i=0;i=f)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,f0&&e[i-1][2]>f;i--)e[i]=e[i-1];e[i]=[c,d,f]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var f=Object.create(null);r.r(f);var b={};a=a||[null,c({}),c([]),c(c)];for(var t=2&d&&e;"object"==typeof t&&!~a.indexOf(t);t=c(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(f,b),f},r.d=(e,a)=>{for(var c in a)r.o(a,c)&&!r.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,c)=>(r.f[c](e,a),a)),[])),r.u=e=>"assets/js/"+({114:"745e39fd",273:"deed564a",311:"6478c5d7",544:"a42a12d2",632:"67ac314b",639:"c0af11f0",1108:"6929ad17",1146:"6f8e40e7",1178:"270a7541",1235:"a7456010",1339:"72c1897c",1394:"61ad30b6",1488:"03ad00ba",1579:"449f1965",1595:"cb04bd8e",1655:"00a627ec",1776:"df8088d9",1905:"3bb6e70a",2047:"583c92f6",2109:"65b5bc03",2145:"07d9d8ff",2216:"b85a8061",2340:"b24fcd7a",2387:"0c7e5857",2469:"1ed72f18",2527:"48065261",2598:"00afd901",2644:"68e5a7f1",2798:"91c19f46",2924:"44b2fabb",2977:"3da3203d",3064:"55afe7bb",3111:"32a423af",3480:"474b1dc0",3628:"696d41fa",3808:"9292e017",4144:"027644ee",4279:"df203c0f",4300:"acef3f09",4359:"a10a0aa5",4411:"14c235f6",4479:"1f772c55",4484:"7b1d6ae7",4663:"9941358c",4721:"22ad831a",4726:"2487d3c6",4787:"3720c009",4806:"8f0ce7bf",4831:"a4a43940",4859:"0f181b88",4878:"4b4b4e17",4967:"2ba7bea0",5053:"e462b8cb",5172:"02434433",5415:"bb6a9c94",5456:"5295d439",5478:"623e3017",5481:"8370a1d2",5525:"64a6eaa0",5605:"258bd27d",5612:"19463738",5649:"748e24c1",5742:"aba21aa0",5767:"0974cb83",5804:"9644ce77",5870:"1a90fa4c",6061:"1f391b9e",6108:"24f5caf0",6199:"6d1db5a5",6224:"43b68251",6244:"e9e8755a",6316:"07630c8f",6364:"21f279ec",6577:"ff3ce73e",6715:"b3d07ec0",6969:"14eb3368",7091:"6b9c5894",7098:"a7bd4aaa",7368:"5b40ecf4",7403:"df2a2fef",7569:"34d64ec5",7583:"d9efc8e6",7672:"12acde98",7761:"9830a4d3",7843:"1796c5bc",7904:"39b17a97",7928:"7dc6d5c9",8017:"031b3c77",8034:"9c2754a0",8310:"ba3701a6",8343:"63aafed8",8345:"070ddeb6",8383:"f268abb1",8401:"17896441",8555:"c8adef9d",8561:"a65a45c1",8678:"4b1f9395",8697:"a691281d",8707:"a4153707",8789:"d1dd28fc",9048:"a94703ab",9131:"6bc29cb1",9503:"637d76cf",9579:"a727ba59",9625:"fae28bbd",9647:"5e95c892",9751:"98ece4e3"}[e]||e)+"."+{114:"21c8d929",273:"ea2000a8",311:"89a547ac",544:"7cf877c8",632:"b84b83d5",639:"96a0b54b",1108:"55fff404",1146:"1355eb31",1178:"6290ca18",1235:"64267856",1339:"6c32ef5e",1394:"2e3becde",1488:"ad911fe5",1579:"75e69521",1595:"27d079b4",1655:"e1638269",1776:"c43f2adc",1905:"4bb25979",2047:"b6c4ebad",2109:"e96332c7",2145:"293c9955",2216:"60e820fe",2237:"c97ebfc9",2340:"88b7fab5",2387:"2b9d3746",2469:"02f4f93d",2527:"3dc08754",2598:"2c73005f",2644:"6b49aa9e",2798:"1a2d6e72",2924:"b294681e",2977:"93be5747",3064:"1c71c877",3111:"e85425eb",3480:"ed8cdf3c",3628:"7d7436d9",3808:"c1a676d2",4144:"36fc7bd1",4279:"d60d8633",4300:"7f64b45a",4359:"614cfe7e",4411:"c1a7f582",4479:"ad436572",4484:"c5fb8f56",4663:"8a102884",4721:"bde37189",4726:"b31d6cf3",4787:"d1287299",4806:"228f947a",4831:"ebb147c9",4859:"f5b0bc37",4878:"c0e70402",4967:"6e7cf57e",5053:"a81665a1",5172:"e6bc2ac6",5415:"035f574f",5456:"14778b33",5478:"ece3754f",5481:"30c47c04",5525:"af552e88",5605:"9795e91d",5612:"a6d30b94",5649:"37a9ecdf",5742:"eaf0e070",5767:"cb57b4aa",5804:"0b38849c",5870:"bec11dca",6061:"ce7ffbdd",6108:"2d6fc62c",6199:"a59f2d4e",6224:"c3856063",6244:"d02b69a8",6255:"74f97532",6316:"bd3bfa6e",6364:"6f39d809",6577:"d70ba2c9",6715:"0326e80d",6969:"ffd61a1f",7091:"d83bdb14",7098:"0c0e467a",7368:"04ee0ee5",7403:"515a798b",7569:"ab69487d",7583:"09a3504b",7672:"6d04bf31",7761:"926a4b2a",7843:"c0e22ac7",7904:"e4793117",7928:"c6c2ccce",8017:"a7a64bd3",8034:"a845a606",8310:"577bb476",8343:"fd27a7ea",8345:"e56da54e",8383:"51f2d259",8401:"cf7f7f7c",8555:"28ef7b66",8561:"a4c53ec2",8678:"8901b80b",8697:"9a6757b1",8707:"a2a54788",8789:"b3691f92",9048:"312334be",9131:"08e8f930",9503:"5b0b53c4",9579:"297f9516",9625:"112d6f0c",9647:"674f41d0",9751:"9229bd21"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},f="documentation-v-2:",r.l=(e,a,c,b)=>{if(d[e])d[e].push(a);else{var t,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var f=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),f&&f.forEach((e=>e(c))),a)return a(c)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/fr/",r.gca=function(e){return e={17896441:"8401",19463738:"5612",48065261:"2527","745e39fd":"114",deed564a:"273","6478c5d7":"311",a42a12d2:"544","67ac314b":"632",c0af11f0:"639","6929ad17":"1108","6f8e40e7":"1146","270a7541":"1178",a7456010:"1235","72c1897c":"1339","61ad30b6":"1394","03ad00ba":"1488","449f1965":"1579",cb04bd8e:"1595","00a627ec":"1655",df8088d9:"1776","3bb6e70a":"1905","583c92f6":"2047","65b5bc03":"2109","07d9d8ff":"2145",b85a8061:"2216",b24fcd7a:"2340","0c7e5857":"2387","1ed72f18":"2469","00afd901":"2598","68e5a7f1":"2644","91c19f46":"2798","44b2fabb":"2924","3da3203d":"2977","55afe7bb":"3064","32a423af":"3111","474b1dc0":"3480","696d41fa":"3628","9292e017":"3808","027644ee":"4144",df203c0f:"4279",acef3f09:"4300",a10a0aa5:"4359","14c235f6":"4411","1f772c55":"4479","7b1d6ae7":"4484","9941358c":"4663","22ad831a":"4721","2487d3c6":"4726","3720c009":"4787","8f0ce7bf":"4806",a4a43940:"4831","0f181b88":"4859","4b4b4e17":"4878","2ba7bea0":"4967",e462b8cb:"5053","02434433":"5172",bb6a9c94:"5415","5295d439":"5456","623e3017":"5478","8370a1d2":"5481","64a6eaa0":"5525","258bd27d":"5605","748e24c1":"5649",aba21aa0:"5742","0974cb83":"5767","9644ce77":"5804","1a90fa4c":"5870","1f391b9e":"6061","24f5caf0":"6108","6d1db5a5":"6199","43b68251":"6224",e9e8755a:"6244","07630c8f":"6316","21f279ec":"6364",ff3ce73e:"6577",b3d07ec0:"6715","14eb3368":"6969","6b9c5894":"7091",a7bd4aaa:"7098","5b40ecf4":"7368",df2a2fef:"7403","34d64ec5":"7569",d9efc8e6:"7583","12acde98":"7672","9830a4d3":"7761","1796c5bc":"7843","39b17a97":"7904","7dc6d5c9":"7928","031b3c77":"8017","9c2754a0":"8034",ba3701a6:"8310","63aafed8":"8343","070ddeb6":"8345",f268abb1:"8383",c8adef9d:"8555",a65a45c1:"8561","4b1f9395":"8678",a691281d:"8697",a4153707:"8707",d1dd28fc:"8789",a94703ab:"9048","6bc29cb1":"9131","637d76cf":"9503",a727ba59:"9579",fae28bbd:"9625","5e95c892":"9647","98ece4e3":"9751"}[e]||e,r.p+r.u(e)},(()=>{var e={5354:0,1869:0};r.f.j=(a,c)=>{var d=r.o(e,a)?e[a]:void 0;if(0!==d)if(d)c.push(d[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var f=new Promise(((c,f)=>d=e[a]=[c,f]));c.push(d[2]=f);var b=r.p+r.u(a),t=new Error;r.l(b,(c=>{if(r.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var f=c&&("load"===c.type?"missing":c.type),b=c&&c.target&&c.target.src;t.message="Loading chunk "+a+" failed.\n("+f+": "+b+")",t.name="ChunkLoadError",t.type=f,t.request=b,d[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,c)=>{var d,f,b=c[0],t=c[1],o=c[2],n=0;if(b.some((a=>0!==e[a]))){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(a&&a(c);n Conditions générales de vente et d'utilisation | TiBillet - + diff --git a/fr/docs/Tips/facebook/index.html b/fr/docs/Tips/facebook/index.html index e2f11e07..a0eeeb6f 100644 --- a/fr/docs/Tips/facebook/index.html +++ b/fr/docs/Tips/facebook/index.html @@ -4,7 +4,7 @@ Publication sur les réseaux sociaux | TiBillet - + diff --git a/fr/docs/Utilisateur/Billetterie/admin_add_new_event/index.html b/fr/docs/Utilisateur/Billetterie/admin_add_new_event/index.html index d48ba938..71e21f11 100644 --- a/fr/docs/Utilisateur/Billetterie/admin_add_new_event/index.html +++ b/fr/docs/Utilisateur/Billetterie/admin_add_new_event/index.html @@ -4,7 +4,7 @@ Créer un nouvel évènement de A à Z | TiBillet - + diff --git a/fr/docs/Utilisateur/Billetterie/admin_add_new_free_event/index.html b/fr/docs/Utilisateur/Billetterie/admin_add_new_free_event/index.html index c0876580..0ffa2ef5 100644 --- a/fr/docs/Utilisateur/Billetterie/admin_add_new_free_event/index.html +++ b/fr/docs/Utilisateur/Billetterie/admin_add_new_free_event/index.html @@ -4,7 +4,7 @@ Créer un évènement gratuit | TiBillet - + diff --git a/fr/docs/Utilisateur/Billetterie/iframe/index.html b/fr/docs/Utilisateur/Billetterie/iframe/index.html index 5edfd8b3..99895616 100644 --- a/fr/docs/Utilisateur/Billetterie/iframe/index.html +++ b/fr/docs/Utilisateur/Billetterie/iframe/index.html @@ -4,7 +4,7 @@ Intégration | TiBillet - + diff --git a/fr/docs/Utilisateur/Billetterie/rss/index.html b/fr/docs/Utilisateur/Billetterie/rss/index.html index a323958d..09b5439a 100644 --- a/fr/docs/Utilisateur/Billetterie/rss/index.html +++ b/fr/docs/Utilisateur/Billetterie/rss/index.html @@ -4,7 +4,7 @@ Flux RSS | TiBillet - + diff --git a/fr/docs/Utilisateur/Billetterie/webhook/index.html b/fr/docs/Utilisateur/Billetterie/webhook/index.html index 01eb96dc..9a5d850b 100644 --- a/fr/docs/Utilisateur/Billetterie/webhook/index.html +++ b/fr/docs/Utilisateur/Billetterie/webhook/index.html @@ -4,7 +4,7 @@ Webhook | TiBillet - + diff --git a/fr/docs/Utilisateur/Cashless/admin_add_article/index.html b/fr/docs/Utilisateur/Cashless/admin_add_article/index.html index b35e75c5..57c5dd96 100644 --- a/fr/docs/Utilisateur/Cashless/admin_add_article/index.html +++ b/fr/docs/Utilisateur/Cashless/admin_add_article/index.html @@ -4,7 +4,7 @@ Articles | TiBillet - + diff --git a/fr/docs/Utilisateur/Cashless/admin_add_categorie/index.html b/fr/docs/Utilisateur/Cashless/admin_add_categorie/index.html index 67163b76..1c16e83f 100644 --- a/fr/docs/Utilisateur/Cashless/admin_add_categorie/index.html +++ b/fr/docs/Utilisateur/Cashless/admin_add_categorie/index.html @@ -4,7 +4,7 @@ Catégories d'articles | TiBillet - + diff --git a/fr/docs/Utilisateur/Cashless/admin_add_pos/index.html b/fr/docs/Utilisateur/Cashless/admin_add_pos/index.html index de2cd2d1..fe588861 100644 --- a/fr/docs/Utilisateur/Cashless/admin_add_pos/index.html +++ b/fr/docs/Utilisateur/Cashless/admin_add_pos/index.html @@ -4,7 +4,7 @@ Points de vente | TiBillet - + diff --git a/fr/docs/Utilisateur/Cashless/admin_add_primary/index.html b/fr/docs/Utilisateur/Cashless/admin_add_primary/index.html index d4ae1cd7..38db9289 100644 --- a/fr/docs/Utilisateur/Cashless/admin_add_primary/index.html +++ b/fr/docs/Utilisateur/Cashless/admin_add_primary/index.html @@ -4,7 +4,7 @@ Cartes Primaires | TiBillet - + diff --git a/fr/docs/Utilisateur/Cashless/admin_supp/index.html b/fr/docs/Utilisateur/Cashless/admin_supp/index.html index 0ed94f9b..ec2555ad 100644 --- a/fr/docs/Utilisateur/Cashless/admin_supp/index.html +++ b/fr/docs/Utilisateur/Cashless/admin_supp/index.html @@ -4,7 +4,7 @@ Suppression des commandes | TiBillet - + diff --git a/fr/docs/Utilisateur/Cashless/android/index.html b/fr/docs/Utilisateur/Cashless/android/index.html index f2cadfff..0efb1802 100644 --- a/fr/docs/Utilisateur/Cashless/android/index.html +++ b/fr/docs/Utilisateur/Cashless/android/index.html @@ -4,7 +4,7 @@ Application Android | TiBillet - + diff --git a/fr/docs/Utilisateur/Cashless/badge/index.html b/fr/docs/Utilisateur/Cashless/badge/index.html index 0d5d70e8..bc585e3e 100644 --- a/fr/docs/Utilisateur/Cashless/badge/index.html +++ b/fr/docs/Utilisateur/Cashless/badge/index.html @@ -4,7 +4,7 @@ Badgeuse | TiBillet - + diff --git a/fr/docs/Utilisateur/Cashless/cashback/index.html b/fr/docs/Utilisateur/Cashless/cashback/index.html index 6e2e465d..63c3ecd7 100644 --- a/fr/docs/Utilisateur/Cashless/cashback/index.html +++ b/fr/docs/Utilisateur/Cashless/cashback/index.html @@ -4,7 +4,7 @@ Cashback | TiBillet - + diff --git a/fr/docs/Utilisateur/Cashless/fedelity/index.html b/fr/docs/Utilisateur/Cashless/fedelity/index.html index 54ce8459..c4b1edec 100644 --- a/fr/docs/Utilisateur/Cashless/fedelity/index.html +++ b/fr/docs/Utilisateur/Cashless/fedelity/index.html @@ -4,7 +4,7 @@ Points de fidélités | TiBillet - + diff --git a/fr/docs/Utilisateur/Cashless/impression_preparation/index.html b/fr/docs/Utilisateur/Cashless/impression_preparation/index.html index 35c45a8b..42ef3b96 100644 --- a/fr/docs/Utilisateur/Cashless/impression_preparation/index.html +++ b/fr/docs/Utilisateur/Cashless/impression_preparation/index.html @@ -4,7 +4,7 @@ Impression des commandes | TiBillet - + diff --git a/fr/docs/api/apikey/index.html b/fr/docs/api/apikey/index.html index af163990..6c5173b2 100644 --- a/fr/docs/api/apikey/index.html +++ b/fr/docs/api/apikey/index.html @@ -4,7 +4,7 @@ API Keys | TiBillet - + diff --git a/fr/docs/api/events/index.html b/fr/docs/api/events/index.html index ad7a6e5e..2fbaaea5 100644 --- a/fr/docs/api/events/index.html +++ b/fr/docs/api/events/index.html @@ -4,7 +4,7 @@ Évènements | TiBillet - + diff --git a/fr/docs/api/intro/index.html b/fr/docs/api/intro/index.html index 717169c8..9b0c79f0 100644 --- a/fr/docs/api/intro/index.html +++ b/fr/docs/api/intro/index.html @@ -4,7 +4,7 @@ Introduction | TiBillet - + diff --git a/fr/docs/api/products/index.html b/fr/docs/api/products/index.html index f02f9eb0..f14e5540 100644 --- a/fr/docs/api/products/index.html +++ b/fr/docs/api/products/index.html @@ -4,7 +4,7 @@ Produits | TiBillet - + diff --git a/fr/docs/api/reservations/index.html b/fr/docs/api/reservations/index.html index e87709ca..75e9dc25 100644 --- a/fr/docs/api/reservations/index.html +++ b/fr/docs/api/reservations/index.html @@ -4,7 +4,7 @@ Réservations et billets | TiBillet - + diff --git a/fr/docs/api/tenants/index.html b/fr/docs/api/tenants/index.html index 3183124d..0b017185 100644 --- a/fr/docs/api/tenants/index.html +++ b/fr/docs/api/tenants/index.html @@ -4,7 +4,7 @@ Tenants | TiBillet - + diff --git a/fr/docs/category/api/index.html b/fr/docs/category/api/index.html index e1d09d88..e0e841aa 100644 --- a/fr/docs/category/api/index.html +++ b/fr/docs/category/api/index.html @@ -4,7 +4,7 @@ API | TiBillet - + diff --git a/fr/docs/category/billetterie/index.html b/fr/docs/category/billetterie/index.html index 9cca948a..644dc2ee 100644 --- a/fr/docs/category/billetterie/index.html +++ b/fr/docs/category/billetterie/index.html @@ -4,7 +4,7 @@ Billetterie | TiBillet - + diff --git a/fr/docs/category/cashless/index.html b/fr/docs/category/cashless/index.html index e70ee174..69715b01 100644 --- a/fr/docs/category/cashless/index.html +++ b/fr/docs/category/cashless/index.html @@ -4,7 +4,7 @@ Cashless | TiBillet - + diff --git a/fr/docs/category/contributing/index.html b/fr/docs/category/contributing/index.html index 673a6ee9..1bd8a993 100644 --- a/fr/docs/category/contributing/index.html +++ b/fr/docs/category/contributing/index.html @@ -4,7 +4,7 @@ Contributing | TiBillet - + diff --git a/fr/docs/category/diy/index.html b/fr/docs/category/diy/index.html index 968baabf..02a2dbf6 100644 --- a/fr/docs/category/diy/index.html +++ b/fr/docs/category/diy/index.html @@ -4,7 +4,7 @@ DIY | TiBillet - + diff --git a/fr/docs/category/documentation-utilisateur/index.html b/fr/docs/category/documentation-utilisateur/index.html index dcb317d1..6a4ac410 100644 --- a/fr/docs/category/documentation-utilisateur/index.html +++ b/fr/docs/category/documentation-utilisateur/index.html @@ -4,7 +4,7 @@ Documentation utilisateur | TiBillet - + diff --git "a/fr/docs/category/pr\303\251sentation/index.html" "b/fr/docs/category/pr\303\251sentation/index.html" index 33b956a2..21b69496 100644 --- "a/fr/docs/category/pr\303\251sentation/index.html" +++ "b/fr/docs/category/pr\303\251sentation/index.html" @@ -4,7 +4,7 @@ Présentation | TiBillet - + diff --git a/fr/docs/category/research/index.html b/fr/docs/category/research/index.html index e6cadedc..cf18e356 100644 --- a/fr/docs/category/research/index.html +++ b/fr/docs/category/research/index.html @@ -4,7 +4,7 @@ Research | TiBillet - + diff --git a/fr/docs/category/trucs-et-astuces/index.html b/fr/docs/category/trucs-et-astuces/index.html index 8e5fe03f..c34dd02a 100644 --- a/fr/docs/category/trucs-et-astuces/index.html +++ b/fr/docs/category/trucs-et-astuces/index.html @@ -4,7 +4,7 @@ Trucs et astuces | TiBillet - + diff --git a/fr/docs/contribute/development/index.html b/fr/docs/contribute/development/index.html index 90526a8e..5e049f3c 100644 --- a/fr/docs/contribute/development/index.html +++ b/fr/docs/contribute/development/index.html @@ -4,7 +4,7 @@ Développement | TiBillet - + @@ -36,11 +36,16 @@

Installa

Pour coder et tester votre code, vous allez avoir besoin d'une instance (à peu près) fonctionnelle de TiBillet sur votre ordinateur.

Vérifions que vous avez l'outillage requis sous la main. Vous avez besoin de :

    -
  • Docker CLI et l'extension docker-compose,
  • -
  • git,
  • +
  • Docker CLI et l'extension docker-compose. S'installe super facilement ici
  • +
  • git
  • un compte Github avec une clé SSH enregistrée (pour un accès authentifié à la forge),
  • un IDE (environnement de développement). Des coupons pour PyCharm sot disponibles sur demande, mais un IDE généraliste comme VSCodium fonctionne assez bien - c'est ce que j'utilise 😉.
+
info

A partir de la, vous avez le choix entre deux chemins :

Vous pouvez même faire les deux, pour un effet maximal !

+

Je veux comprendre !

On va commencer en créant un dossier qui contiendra les différents dépôts requis à sa racine, dans votre dossier de travail par exemple. Ça ressemblera à :

tibillet-dev
├── Fedow
├── LaBoutik
├── Lespass
├── Test-Driven-Development
└── Traefik

Traefik

@@ -79,15 +84,15 @@

Envir
NomEnvironnement cibleNullableValeur par défautNotes
SECRET_KEYTousNonUne des clés secrètes Django générées précédemment
FERNET_KEYTousNonUne des clés Fernet générées précédemment
DOMAINTousNonlaboutik.tibillet.localhostÀ adapter à votre nom de domaine et sous-domaine en production
FEDOW_URLTousNonhttps://fedow.tibillet.localhost/URL du moteur Fedow
LESPASS_TENANT_URLTousNonhttps://lespass.tibillet.localhost/URL de l'instance Lespass
TIME_ZONETousNonEurope/ParisPlage horaire TZ de l'instance
ADMIN_EMAILTousNonEmail administrateur (pour le⋅a premier⋅e admin)
MAIN_ASSET_NAMETousNonLe nom de votre unité de valeur cashless (Piécette, CoeurDor… comme vous voulez)
POSTGRES_DBTousNonlaboutikÀ changer en production si nécessaire
POSTGRES_USERTousNonlaboutik_userÀ changer en production
POSTGRES_PASSWORDTousNonMot de passe fort (une des clés Fernets par exemple)
EMAIL_HOST, EMAIL_PORT, EMAIL_HOST_USER, EMAIL_HOST_PASSWORDTousOuiServeur d'email, requis pour confirmer des abonné⋅es par exemple
BORG_PASSPHRASETousOuiMot de passe utilisé pour la sauvegarde des données
DEBUGDéveloppementNon0Passer à 1 pour le développement
TESTTestsNon0Passer à 1 pour les tests
DEMODéveloppement, TestsNon0Passer à 1 pour une simulation de terminal de caisse
SENTRY_DNSDéveloppement, TestsOuiSentry Debug pour le back-end
SENTRY_FRONT_DNS, SENTRY_FRONT_ASSETDéveloppement, TestsOuiSentry Debug pour le front-end
DEMO_TAGID_CM, DEMO_TAGID_CLIENT1, DEMO_TAGID_CLIENT2OuiAucune idée

La configuration devrait être maintenant complète pour les trois moteurs.

Mise en place des tests

-

Pour une raison… une raison, l'image Docker de dev est assemblée à partir des tests. L'installation est similaire au moteurs :

+

Pour une raison de cohérence d'environnement, l'image Docker de dev est assemblée à partir des tests. L'installation est similaire au moteurs :

tibillet-dev$
git clone git@github.com:TiBillet/Test-Driven-Development.git
cp Test-Driven-Development/env_example Test-Driven-Development/.env

C'est fait ☺️ On peut maintenant conteneuriser l'application entière depuis le dossier des tests :

Test-Driven-Development$
docker compose up -d

Vous pouvez accéder en prime aux logs avec la commande :

Test-Driven-Development$
docker compose logs -f
Attention

Ce docker-compose.yml en particulier s'appuie sur la structure décrite au début de l'installation, donc sur la structure du dossier parent aux tests, appelé pour l'exemple tibillet-dev. Contre-intuitif, mais maintenant vous savez 😉

-

Démarrage des moteurs

-

La principale différence entre les conteneurs de dev et de prod, c'est qu'en dev la commande docker compose ne démarre pas les applications Django individuelles. C'est un niveau de contrôle fin qui est utile pour le développement, mais ça veut dire que vous avez besoin de les lancer manuellement.

+

Démarrage des moteurs

+

La principale différence entre les conteneurs de dev et de prod, c'est qu'en dev la commande docker compose up ne démarre pas les applications Django individuelles. C'est un niveau de contrôle fin qui est utile pour le développement, mais ça veut dire que vous avez besoin de les lancer manuellement.

On va les lancer de préférence dans l'ordre :

  1. Fedow
  2. @@ -119,21 +124,21 @@

    Ça tourne ?
  3. au moteur de fédération Fedow sur fedow.tibillet.localhost,
  4. à une instance du moteur de billetterie Lespass sur lespass.tibillet.localhost,
  5. -
  6. au serveur de caisse LaBoutik sur laboutik.tibillet.localhost
  7. +
  8. au serveur de caisse LaBoutik sur laboutik.tibillet.localhost pour l'admin. Cliquez sur "voir le site" pour lancer la simulation d'un terminal.
  9. Si tout marche comme prévu, félicitations : vous êtes prêt⋅es à vous lancer 🔧

    Sinon, venez nous en parler, on est là pour aider !

    Pour conclure

    N'oubliez pas de docker compose down à la fois dans les tests et dans Trafik quand vous avez fini votre session de travail. Votre ordinateur aussi a besoin de faire des pauses !

    Si vous avez peur de ne pas vous en souvenir, enlevez l'option -d à compose up et la commande se lancera directement dans le terminal, pas en tâche de fond. C'est pas grave, vous aurez juste besoin de plus d'onglets 😋

    Cycle de vie

    Mises à jour

    -

    Pour rester à jour durant le développement, télécharger l'image la plus récente :

    -
    Test-Driven-Development$
    docker compose pull
    docker compose up -d # démarrer ou redémarrer les conteneurs
    +

    Pour rester à jour durant le développement, pensez à télécharger les images les plus récente et/ou à builder les images django :

    +
    Test-Driven-Development$
    docker compose pull
    docker compose up -d --build # démarrer ou redémarrer les conteneurs

    Tests

    Vous pouvez lancer les tests Python de la même façon que pour un démarrage manuel. Commencez par réinitialiser les trois app Django pour obtenir les données testables, puis lancez cette commande depuis votre conteneur Django LaBoutik :

    laboutik_django> poetry shell$
    ./manage.py test
    TODO: docs des tests end-to-end (ils existent !)

    Sauvegardes

    Avant de vous attaquer à un changement majeur, sauvegardez toute donnée qui a de la valeur pour votre développement. Sur votre instance Fedow, par exemple, il suffit de sauvegarder le dossier database régulièrement. Les autres moteurs peuvent être sauvegardés par l'utilitaire Borgbackup, des tâches cron et des dump de bases de données. Plus sur ce sujet à l'avenir.

    -TODO: explications détaillées +TODO: explications détaillées \ No newline at end of file diff --git a/fr/docs/install/docker_install/index.html b/fr/docs/install/docker_install/index.html index 8b58d84e..6b160c1c 100644 --- a/fr/docs/install/docker_install/index.html +++ b/fr/docs/install/docker_install/index.html @@ -4,7 +4,7 @@ Self hosted TiBillet instances | TiBillet - + diff --git a/fr/docs/install/raspberry/index.html b/fr/docs/install/raspberry/index.html index 3584735b..220397d7 100644 --- a/fr/docs/install/raspberry/index.html +++ b/fr/docs/install/raspberry/index.html @@ -4,7 +4,7 @@ Raspberry Box - Hardware | TiBillet - + diff --git a/fr/docs/install/raspberry_soft/index.html b/fr/docs/install/raspberry_soft/index.html index 70a9a868..031b4341 100644 --- a/fr/docs/install/raspberry_soft/index.html +++ b/fr/docs/install/raspberry_soft/index.html @@ -4,7 +4,7 @@ Raspberry Box - Software | TiBillet - + diff --git a/fr/docs/presentation/demonstration/index.html b/fr/docs/presentation/demonstration/index.html index ec72ad95..5add0b79 100644 --- a/fr/docs/presentation/demonstration/index.html +++ b/fr/docs/presentation/demonstration/index.html @@ -4,7 +4,7 @@ Démonstration | TiBillet - + diff --git a/fr/docs/presentation/introduction/index.html b/fr/docs/presentation/introduction/index.html index ff92e9e3..c97bc863 100644 --- a/fr/docs/presentation/introduction/index.html +++ b/fr/docs/presentation/introduction/index.html @@ -4,7 +4,7 @@ Introduction | TiBillet - + diff --git a/fr/docs/presentation/logos/index.html b/fr/docs/presentation/logos/index.html index 477a3e58..89bf8d93 100644 --- a/fr/docs/presentation/logos/index.html +++ b/fr/docs/presentation/logos/index.html @@ -4,7 +4,7 @@ Logos | TiBillet - + diff --git a/fr/docs/presentation/philosophie/index.html b/fr/docs/presentation/philosophie/index.html index 635fc154..cd77649d 100644 --- a/fr/docs/presentation/philosophie/index.html +++ b/fr/docs/presentation/philosophie/index.html @@ -4,7 +4,7 @@ Philosophie | TiBillet - + diff --git a/fr/docs/presentation/tarifs/index.html b/fr/docs/presentation/tarifs/index.html index ba2cf395..081e5306 100644 --- a/fr/docs/presentation/tarifs/index.html +++ b/fr/docs/presentation/tarifs/index.html @@ -4,7 +4,7 @@ Tarifs, conditions et licences | TiBillet - + diff --git a/fr/docs/presentation/usages/index.html b/fr/docs/presentation/usages/index.html index 78f4f143..8059d681 100644 --- a/fr/docs/presentation/usages/index.html +++ b/fr/docs/presentation/usages/index.html @@ -4,7 +4,7 @@ Usages | TiBillet - + diff --git a/fr/docs/tags/access-card/index.html b/fr/docs/tags/access-card/index.html index 5cd187f9..eb3006e9 100644 --- a/fr/docs/tags/access-card/index.html +++ b/fr/docs/tags/access-card/index.html @@ -4,7 +4,7 @@ 2 documents tagués avec "access card" | TiBillet - + diff --git a/fr/docs/tags/admin/index.html b/fr/docs/tags/admin/index.html index 093be291..a99b2d64 100644 --- a/fr/docs/tags/admin/index.html +++ b/fr/docs/tags/admin/index.html @@ -4,7 +4,7 @@ Un document tagué avec "admin" | TiBillet - + diff --git a/fr/docs/tags/arts/index.html b/fr/docs/tags/arts/index.html index 278e2136..29dd1bb5 100644 --- a/fr/docs/tags/arts/index.html +++ b/fr/docs/tags/arts/index.html @@ -4,7 +4,7 @@ Un document tagué avec "arts" | TiBillet - + diff --git a/fr/docs/tags/badge-inter-lieux/index.html b/fr/docs/tags/badge-inter-lieux/index.html index 885d1a32..99375860 100644 --- a/fr/docs/tags/badge-inter-lieux/index.html +++ b/fr/docs/tags/badge-inter-lieux/index.html @@ -4,7 +4,7 @@ 2 documents tagués avec "badge inter-lieux" | TiBillet - + diff --git a/fr/docs/tags/badge/index.html b/fr/docs/tags/badge/index.html index 69229139..38d8062d 100644 --- a/fr/docs/tags/badge/index.html +++ b/fr/docs/tags/badge/index.html @@ -4,7 +4,7 @@ Un document tagué avec "badge" | TiBillet - + diff --git a/fr/docs/tags/badgeuse/index.html b/fr/docs/tags/badgeuse/index.html index 8640430d..924949ea 100644 --- a/fr/docs/tags/badgeuse/index.html +++ b/fr/docs/tags/badgeuse/index.html @@ -4,7 +4,7 @@ Un document tagué avec "badgeuse" | TiBillet - + diff --git a/fr/docs/tags/bar/index.html b/fr/docs/tags/bar/index.html index e0834c83..5319f8f3 100644 --- a/fr/docs/tags/bar/index.html +++ b/fr/docs/tags/bar/index.html @@ -4,7 +4,7 @@ Un document tagué avec "bar" | TiBillet - + diff --git a/fr/docs/tags/billetterie/index.html b/fr/docs/tags/billetterie/index.html index ffc7c4f7..f12113f9 100644 --- a/fr/docs/tags/billetterie/index.html +++ b/fr/docs/tags/billetterie/index.html @@ -4,7 +4,7 @@ 5 documents tagués avec "billetterie" | TiBillet - + diff --git a/fr/docs/tags/caisse-enregistreuse/index.html b/fr/docs/tags/caisse-enregistreuse/index.html index 891e0587..f30e686c 100644 --- a/fr/docs/tags/caisse-enregistreuse/index.html +++ b/fr/docs/tags/caisse-enregistreuse/index.html @@ -4,7 +4,7 @@ 2 documents tagués avec "caisse enregistreuse" | TiBillet - + diff --git a/fr/docs/tags/cashback/index.html b/fr/docs/tags/cashback/index.html index ee7253d5..53caec4e 100644 --- a/fr/docs/tags/cashback/index.html +++ b/fr/docs/tags/cashback/index.html @@ -4,7 +4,7 @@ 2 documents tagués avec "cashback" | TiBillet - + diff --git a/fr/docs/tags/cashless/index.html b/fr/docs/tags/cashless/index.html index 5cc211ff..270b5292 100644 --- a/fr/docs/tags/cashless/index.html +++ b/fr/docs/tags/cashless/index.html @@ -4,7 +4,7 @@ 5 documents tagués avec "cashless" | TiBillet - + diff --git a/fr/docs/tags/colors/index.html b/fr/docs/tags/colors/index.html index 31eb261d..661a0aad 100644 --- a/fr/docs/tags/colors/index.html +++ b/fr/docs/tags/colors/index.html @@ -4,7 +4,7 @@ Un document tagué avec "colors" | TiBillet - + diff --git a/fr/docs/tags/contribuer/index.html b/fr/docs/tags/contribuer/index.html index 441c7911..76e9a798 100644 --- a/fr/docs/tags/contribuer/index.html +++ b/fr/docs/tags/contribuer/index.html @@ -4,7 +4,7 @@ Un document tagué avec "contribuer" | TiBillet - + diff --git a/fr/docs/tags/cooperative/index.html b/fr/docs/tags/cooperative/index.html index eabf0566..a26a0887 100644 --- a/fr/docs/tags/cooperative/index.html +++ b/fr/docs/tags/cooperative/index.html @@ -4,7 +4,7 @@ Un document tagué avec "coopérative" | TiBillet - + diff --git a/fr/docs/tags/culture/index.html b/fr/docs/tags/culture/index.html index 895c1c04..2dd35dfa 100644 --- a/fr/docs/tags/culture/index.html +++ b/fr/docs/tags/culture/index.html @@ -4,7 +4,7 @@ Un document tagué avec "culture" | TiBillet - + diff --git a/fr/docs/tags/customer/index.html b/fr/docs/tags/customer/index.html index 0dcadf9f..1450bc69 100644 --- a/fr/docs/tags/customer/index.html +++ b/fr/docs/tags/customer/index.html @@ -4,7 +4,7 @@ Un document tagué avec "customer" | TiBillet - + diff --git a/fr/docs/tags/demonstration/index.html b/fr/docs/tags/demonstration/index.html index cbedf5ff..8b97c8b9 100644 --- a/fr/docs/tags/demonstration/index.html +++ b/fr/docs/tags/demonstration/index.html @@ -4,7 +4,7 @@ Un document tagué avec "démonstration" | TiBillet - + diff --git a/fr/docs/tags/design/index.html b/fr/docs/tags/design/index.html index b01b85a6..a0c41671 100644 --- a/fr/docs/tags/design/index.html +++ b/fr/docs/tags/design/index.html @@ -4,7 +4,7 @@ Un document tagué avec "design" | TiBillet - + diff --git a/fr/docs/tags/django/index.html b/fr/docs/tags/django/index.html index c6d23e75..e907ab84 100644 --- a/fr/docs/tags/django/index.html +++ b/fr/docs/tags/django/index.html @@ -4,7 +4,7 @@ Un document tagué avec "django" | TiBillet - + diff --git a/fr/docs/tags/docker/index.html b/fr/docs/tags/docker/index.html index c9911b9b..66063474 100644 --- a/fr/docs/tags/docker/index.html +++ b/fr/docs/tags/docker/index.html @@ -4,7 +4,7 @@ Un document tagué avec "docker" | TiBillet - + diff --git a/fr/docs/tags/dokos/index.html b/fr/docs/tags/dokos/index.html index 0c95cfe8..79871679 100644 --- a/fr/docs/tags/dokos/index.html +++ b/fr/docs/tags/dokos/index.html @@ -4,7 +4,7 @@ 2 documents tagués avec "dokos" | TiBillet - + diff --git a/fr/docs/tags/events/index.html b/fr/docs/tags/events/index.html index 4c11255d..167ca2a1 100644 --- a/fr/docs/tags/events/index.html +++ b/fr/docs/tags/events/index.html @@ -4,7 +4,7 @@ Un document tagué avec "events" | TiBillet - + diff --git a/fr/docs/tags/exhibits/index.html b/fr/docs/tags/exhibits/index.html index ff2bf631..0edc0b7e 100644 --- a/fr/docs/tags/exhibits/index.html +++ b/fr/docs/tags/exhibits/index.html @@ -4,7 +4,7 @@ Un document tagué avec "exhibits" | TiBillet - + diff --git a/fr/docs/tags/festival/index.html b/fr/docs/tags/festival/index.html index 7e079b49..d389c704 100644 --- a/fr/docs/tags/festival/index.html +++ b/fr/docs/tags/festival/index.html @@ -4,7 +4,7 @@ 2 documents tagués avec "festival" | TiBillet - + diff --git a/fr/docs/tags/fidelite/index.html b/fr/docs/tags/fidelite/index.html index fe57ccca..681ece61 100644 --- a/fr/docs/tags/fidelite/index.html +++ b/fr/docs/tags/fidelite/index.html @@ -4,7 +4,7 @@ Un document tagué avec "fidélité" | TiBillet - + diff --git a/fr/docs/tags/fidelity/index.html b/fr/docs/tags/fidelity/index.html index c06e3bb2..8bf00f39 100644 --- a/fr/docs/tags/fidelity/index.html +++ b/fr/docs/tags/fidelity/index.html @@ -4,7 +4,7 @@ Un document tagué avec "fidelity" | TiBillet - + diff --git a/fr/docs/tags/git/index.html b/fr/docs/tags/git/index.html index 1efca0c1..b8d8e43a 100644 --- a/fr/docs/tags/git/index.html +++ b/fr/docs/tags/git/index.html @@ -4,7 +4,7 @@ Un document tagué avec "git" | TiBillet - + diff --git a/fr/docs/tags/index.html b/fr/docs/tags/index.html index 1ecec54f..e343a7b1 100644 --- a/fr/docs/tags/index.html +++ b/fr/docs/tags/index.html @@ -4,7 +4,7 @@ Tags | TiBillet - + diff --git a/fr/docs/tags/inspiration/index.html b/fr/docs/tags/inspiration/index.html index da6e7275..98059610 100644 --- a/fr/docs/tags/inspiration/index.html +++ b/fr/docs/tags/inspiration/index.html @@ -4,7 +4,7 @@ Un document tagué avec "inspiration" | TiBillet - + diff --git a/fr/docs/tags/island/index.html b/fr/docs/tags/island/index.html index 9403ec4b..22fbd4ce 100644 --- a/fr/docs/tags/island/index.html +++ b/fr/docs/tags/island/index.html @@ -4,7 +4,7 @@ Un document tagué avec "island" | TiBillet - + diff --git a/fr/docs/tags/logiciel-libre/index.html b/fr/docs/tags/logiciel-libre/index.html index 1e415ee3..aa7883fb 100644 --- a/fr/docs/tags/logiciel-libre/index.html +++ b/fr/docs/tags/logiciel-libre/index.html @@ -4,7 +4,7 @@ Un document tagué avec "logiciel libre" | TiBillet - + diff --git a/fr/docs/tags/modern/index.html b/fr/docs/tags/modern/index.html index 169e68c8..29d6848f 100644 --- a/fr/docs/tags/modern/index.html +++ b/fr/docs/tags/modern/index.html @@ -4,7 +4,7 @@ Un document tagué avec "modern" | TiBillet - + diff --git a/fr/docs/tags/monnaie-locale/index.html b/fr/docs/tags/monnaie-locale/index.html index 1189af33..630af6d4 100644 --- a/fr/docs/tags/monnaie-locale/index.html +++ b/fr/docs/tags/monnaie-locale/index.html @@ -4,7 +4,7 @@ Un document tagué avec "monnaie locale" | TiBillet - + diff --git a/fr/docs/tags/monnaies-locales/index.html b/fr/docs/tags/monnaies-locales/index.html index 13083e9c..949ada84 100644 --- a/fr/docs/tags/monnaies-locales/index.html +++ b/fr/docs/tags/monnaies-locales/index.html @@ -4,7 +4,7 @@ Un document tagué avec "monnaies locales" | TiBillet - + diff --git a/fr/docs/tags/monnaies-temps/index.html b/fr/docs/tags/monnaies-temps/index.html index e0ba50e0..15894f4e 100644 --- a/fr/docs/tags/monnaies-temps/index.html +++ b/fr/docs/tags/monnaies-temps/index.html @@ -4,7 +4,7 @@ Un document tagué avec "monnaies temps" | TiBillet - + diff --git a/fr/docs/tags/open-source/index.html b/fr/docs/tags/open-source/index.html index ae474005..df6105ee 100644 --- a/fr/docs/tags/open-source/index.html +++ b/fr/docs/tags/open-source/index.html @@ -4,7 +4,7 @@ 2 documents tagués avec "open source" | TiBillet - + diff --git a/fr/docs/tags/organizer/index.html b/fr/docs/tags/organizer/index.html index 9cd5a399..e037170d 100644 --- a/fr/docs/tags/organizer/index.html +++ b/fr/docs/tags/organizer/index.html @@ -4,7 +4,7 @@ Un document tagué avec "organizer" | TiBillet - + diff --git a/fr/docs/tags/paiement-dematerialise/index.html b/fr/docs/tags/paiement-dematerialise/index.html index 8c57a4bf..173bf76c 100644 --- a/fr/docs/tags/paiement-dematerialise/index.html +++ b/fr/docs/tags/paiement-dematerialise/index.html @@ -4,7 +4,7 @@ Un document tagué avec "paiement dématérialisé" | TiBillet - + diff --git a/fr/docs/tags/plays/index.html b/fr/docs/tags/plays/index.html index 82925dfe..4025f176 100644 --- a/fr/docs/tags/plays/index.html +++ b/fr/docs/tags/plays/index.html @@ -4,7 +4,7 @@ Un document tagué avec "plays" | TiBillet - + diff --git a/fr/docs/tags/poetry/index.html b/fr/docs/tags/poetry/index.html index 671c0ac1..d25cd2bd 100644 --- a/fr/docs/tags/poetry/index.html +++ b/fr/docs/tags/poetry/index.html @@ -4,7 +4,7 @@ Un document tagué avec "poetry" | TiBillet - + diff --git a/fr/docs/tags/prise-de-commandes/index.html b/fr/docs/tags/prise-de-commandes/index.html index 1213c7e5..6530d1f6 100644 --- a/fr/docs/tags/prise-de-commandes/index.html +++ b/fr/docs/tags/prise-de-commandes/index.html @@ -4,7 +4,7 @@ Un document tagué avec "prise de commandes" | TiBillet - + diff --git a/fr/docs/tags/python/index.html b/fr/docs/tags/python/index.html index 41e0177c..3a0f139d 100644 --- a/fr/docs/tags/python/index.html +++ b/fr/docs/tags/python/index.html @@ -4,7 +4,7 @@ Un document tagué avec "python" | TiBillet - + diff --git a/fr/docs/tags/retro/index.html b/fr/docs/tags/retro/index.html index 99a27d7c..cbf72134 100644 --- a/fr/docs/tags/retro/index.html +++ b/fr/docs/tags/retro/index.html @@ -4,7 +4,7 @@ Un document tagué avec "retro" | TiBillet - + diff --git a/fr/docs/tags/soutien/index.html b/fr/docs/tags/soutien/index.html index e81e5b92..415ffafa 100644 --- a/fr/docs/tags/soutien/index.html +++ b/fr/docs/tags/soutien/index.html @@ -4,7 +4,7 @@ Un document tagué avec "soutien" | TiBillet - + diff --git a/fr/docs/tags/stripe/index.html b/fr/docs/tags/stripe/index.html index 906492d4..04cda392 100644 --- a/fr/docs/tags/stripe/index.html +++ b/fr/docs/tags/stripe/index.html @@ -4,7 +4,7 @@ 2 documents tagués avec "stripe" | TiBillet - + diff --git a/fr/docs/tags/tdd/index.html b/fr/docs/tags/tdd/index.html index 76e0b0ba..ace3e399 100644 --- a/fr/docs/tags/tdd/index.html +++ b/fr/docs/tags/tdd/index.html @@ -4,7 +4,7 @@ Un document tagué avec "tdd" | TiBillet - + diff --git a/fr/docs/tags/third-places/index.html b/fr/docs/tags/third-places/index.html index dbb67406..c8d9ffc4 100644 --- a/fr/docs/tags/third-places/index.html +++ b/fr/docs/tags/third-places/index.html @@ -4,7 +4,7 @@ Un document tagué avec "third places" | TiBillet - + diff --git a/fr/docs/tags/ticketing/index.html b/fr/docs/tags/ticketing/index.html index c61e2fc9..91cc826d 100644 --- a/fr/docs/tags/ticketing/index.html +++ b/fr/docs/tags/ticketing/index.html @@ -4,7 +4,7 @@ 5 documents tagués avec "ticketing" | TiBillet - + diff --git a/fr/docs/tags/tiers-lieux/index.html b/fr/docs/tags/tiers-lieux/index.html index c8907bc3..193a132f 100644 --- a/fr/docs/tags/tiers-lieux/index.html +++ b/fr/docs/tags/tiers-lieux/index.html @@ -4,7 +4,7 @@ Un document tagué avec "tiers-lieux" | TiBillet - + diff --git a/fr/docs/tags/volunteer/index.html b/fr/docs/tags/volunteer/index.html index 7951759f..8424c0b3 100644 --- a/fr/docs/tags/volunteer/index.html +++ b/fr/docs/tags/volunteer/index.html @@ -4,7 +4,7 @@ Un document tagué avec "volunteer" | TiBillet - + diff --git a/fr/docs/work-doc/design/index.html b/fr/docs/work-doc/design/index.html index 59dd55a1..4f7f47f4 100644 --- a/fr/docs/work-doc/design/index.html +++ b/fr/docs/work-doc/design/index.html @@ -4,7 +4,7 @@ Graphic design | TiBillet - + diff --git a/fr/docs/work-doc/user-stories/index.html b/fr/docs/work-doc/user-stories/index.html index 2c64215e..6d4ddf8d 100644 --- a/fr/docs/work-doc/user-stories/index.html +++ b/fr/docs/work-doc/user-stories/index.html @@ -4,7 +4,7 @@ User stories | TiBillet - + diff --git a/fr/index.html b/fr/index.html index b4e04afc..80a90389 100644 --- a/fr/index.html +++ b/fr/index.html @@ -4,7 +4,7 @@ TiBillet | TiBillet - + diff --git a/fr/roadmap/index.html b/fr/roadmap/index.html index b57181bb..13890612 100644 --- a/fr/roadmap/index.html +++ b/fr/roadmap/index.html @@ -4,7 +4,7 @@ Fonctionnalités | TiBillet - +