diff --git a/404.html b/404.html index d05af390..9b7d370a 100644 --- a/404.html +++ b/404.html @@ -4,7 +4,7 @@ Page Not Found | TiBillet - + diff --git a/assets/js/927f7f94.acb726fd.js b/assets/js/927f7f94.f88a1b8a.js similarity index 99% rename from assets/js/927f7f94.acb726fd.js rename to assets/js/927f7f94.f88a1b8a.js index 2b02a7f6..1d7f0e88 100644 --- a/assets/js/927f7f94.acb726fd.js +++ b/assets/js/927f7f94.f88a1b8a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocumentation_v_2=self.webpackChunkdocumentation_v_2||[]).push([[1329],{9878:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>d,default:()=>a,frontMatter:()=>r,metadata:()=>l,toc:()=>c});var s=t(4848),i=t(8453);const r={sidebar_position:10,slug:"development",title:"Development",keywords:["contribute","volunteer","open source","git","pull request","issue","help","code","development","programming","python","django","docker","poetry","testing","tdd"],tags:["contribute","open source","git","help","tdd","python","django","docker","poetry"],authors:"kaya, guillaume"},d="Development",l={id:"contribute/dev",title:"Development",description:"So, you want to help with the development of TiBillet. Thank you! Open-source thrives thanks to people like you \ud83d\ude4f",source:"@site/docs/contribute/dev.md",sourceDirName:"contribute",slug:"/contribute/development",permalink:"/docs/contribute/development",draft:!1,unlisted:!1,editUrl:"https://github.com/TiBillet/documentation/tree/main/tibillet/docs/contribute/dev.md",tags:[{inline:!0,label:"contribute",permalink:"/docs/tags/contribute"},{inline:!0,label:"open source",permalink:"/docs/tags/open-source"},{inline:!0,label:"git",permalink:"/docs/tags/git"},{inline:!0,label:"help",permalink:"/docs/tags/help"},{inline:!0,label:"tdd",permalink:"/docs/tags/tdd"},{inline:!0,label:"python",permalink:"/docs/tags/python"},{inline:!0,label:"django",permalink:"/docs/tags/django"},{inline:!0,label:"docker",permalink:"/docs/tags/docker"},{inline:!0,label:"poetry",permalink:"/docs/tags/poetry"}],version:"current",sidebarPosition:10,frontMatter:{sidebar_position:10,slug:"development",title:"Development",keywords:["contribute","volunteer","open source","git","pull request","issue","help","code","development","programming","python","django","docker","poetry","testing","tdd"],tags:["contribute","open source","git","help","tdd","python","django","docker","poetry"],authors:"kaya, guillaume"},sidebar:"tutorialSidebar",previous:{title:"Contributing",permalink:"/docs/category/contributing"},next:{title:"Research",permalink:"/docs/category/research"}},o={},c=[{value:"Understanding the workflow",id:"understanding-the-workflow",level:2},{value:"Tools and languages used",id:"tools-and-languages-used",level:2},{value:"Simple local install",id:"simple-local-install",level:2},{value:"Detailed local installation",id:"detailed-local-installation",level:2},{value:"Key generation",id:"key-generation",level:3},{value:"Fedow, Lespass, LaBoutik",id:"fedow-lespass-laboutik",level:3},{value:"Fedow environment",id:"fedow-environment",level:4},{value:"Lespass environment",id:"lespass-environment",level:4},{value:"LaBoutik environment",id:"laboutik-environment",level:4},{value:"Tests setup",id:"tests-setup",level:3},{value:"Manual engine start",id:"manual-engine-start",level:2},{value:"Is it working?",id:"is-it-working",level:3},{value:"Lifecycle",id:"lifecycle",level:2},{value:"Updates",id:"updates",level:3},{value:"Testing",id:"testing",level:3},{value:"Backups",id:"backups",level:3}];function h(e){const n={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,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"development",children:"Development"})}),"\n",(0,s.jsx)(n.p,{children:"So, you want to help with the development of TiBillet. Thank you! Open-source thrives thanks to people like you \ud83d\ude4f"}),"\n",(0,s.jsxs)(n.p,{children:["First, if you don't have a specific task in mind already, check out the open issues on the official ",(0,s.jsx)(n.a,{href:"https://github.com/TiBillet",children:"Github repositories"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"It's the easiest way to figure out what problem needs fixing or what feature is being requested."}),"\n",(0,s.jsxs)(n.admonition,{title:"Repositories",type:"note",children:[(0,s.jsx)(n.p,{children:"What you need is probably in the pinned repositories. If you are unsure of the role of Fedow, LaBoutik or Lespass, check out the basics on the three TiBillet engines."}),(0,s.jsxs)(n.p,{children:[(0,s.jsx)("mark",{children:"TODO: link to engines and their roles in the doc"})," (a very basic page in intro probably)"]})]}),"\n",(0,s.jsx)(n.h2,{id:"understanding-the-workflow",children:"Understanding the workflow"}),"\n",(0,s.jsxs)(n.p,{children:["When you work with ",(0,s.jsx)(n.em,{children:"Git forges"})," like Github, there are ways in which you can make your contributions easier to handle:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["If you're not part of the core team, ",(0,s.jsx)(n.em,{children:"fork"})," the repository that interests you, work from there, and submit your changes through a ",(0,s.jsx)(n.em,{children:"pull request"}),"."]}),"\n",(0,s.jsx)(n.li,{children:"If you have an issue you want to work on, check that it doesn't already exists. If it does, join the discussion instead of doing your own thing!"}),"\n",(0,s.jsxs)(n.li,{children:["When you start working on an issue, ",(0,s.jsx)(n.strong,{children:"assign yourself"})," to let others know you're working on it."]}),"\n",(0,s.jsxs)(n.li,{children:["Last but not least: ",(0,s.jsx)(n.strong,{children:"don't create pull requests without running the tests"}),"! Happens to the best of us. Ideally, you should run them before committing, with the help of a ",(0,s.jsx)(n.em,{children:"git hook"})," for example."]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{title:"Getting help",type:"note",children:(0,s.jsxs)(n.p,{children:["If you have any questions regarding Git, Github, or an aspect of development, join us on ",(0,s.jsx)(n.a,{href:"https://discord.gg/7FJvtYx",children:"Discord"})," or ",(0,s.jsx)(n.a,{href:"https://matrix.to/#/#tibillet:tiers-lieux.org",children:"Matrix"}),". These are mostly French-speaking spaces as the founders are from La Reunion, but we'll do our best to help (with a bit of ",(0,s.jsx)(n.em,{children:"un accent"})," \ud83c\udf77\ud83e\udd56)."]})}),"\n",(0,s.jsx)(n.h2,{id:"tools-and-languages-used",children:"Tools and languages used"}),"\n",(0,s.jsx)(n.p,{children:"TiBillet is:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://www.python.org/",children:"Python"})," software"]}),"\n",(0,s.jsxs)(n.li,{children:["developed with the help of the ",(0,s.jsx)(n.a,{href:"https://www.djangoproject.com/",children:"Django"})," framework"]}),"\n",(0,s.jsxs)(n.li,{children:["its dependencies are handled through ",(0,s.jsx)(n.a,{href:"https://python-poetry.org/",children:"Poetry"})]}),"\n",(0,s.jsxs)(n.li,{children:["it runs in ",(0,s.jsx)(n.a,{href:"https://www.docker.com/",children:"Docker"})," containers for production as well as development"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"If you don't feel at ease with the software stack, the best thing you can do is to go look for tutorials. Hopefully we'll compile a list of our own down here one of these days \ud83d\ude05"}),"\n",(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsx)(n.p,{children:"In particular, basic knowledge of Git can help. It is relatively easy to make a complete mess of a project by not grasping the way versioning works. There are safeguards, but you might struggle a lot more than necessary! I remember how that feels \ud83d\ude11"})}),"\n",(0,s.jsx)(n.h2,{id:"simple-local-install",children:"Simple local install"}),"\n",(0,s.jsx)(n.p,{children:"In order to develop and test things out, you're gonna need a (mostly) functional instance of TiBillet on your computer."}),"\n",(0,s.jsx)(n.p,{children:"Let's make sure you have the required tools at hand. You need:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Docker CLI and the ",(0,s.jsx)(n.code,{children:"docker-compose"})," extension"]}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"git"})}),"\n",(0,s.jsx)(n.li,{children:"a Github account with a registered SSH key for forge access"}),"\n",(0,s.jsx)(n.li,{children:"an IDE (there are open-source gift licenses of PyCharm available on request, but a regular IDE like VSCodium works reasonably well - that's what I'm using \ud83d\ude09)"}),"\n"]}),"\n",(0,s.jsxs)(n.admonition,{type:"info",children:[(0,s.jsx)(n.p,{children:"From here, you can choose between two paths:"}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["The ",(0,s.jsx)(n.strong,{children:"Too easy !"})," path: ",(0,s.jsx)(n.a,{href:"https://nuage.tierslieux.re/s/rprGfbDDDrazJ9d",children:"I download an archive"})," in which everything is already installed and I can go straight to ",(0,s.jsx)(n.a,{href:"#manual-engine-start",children:"engine startup"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["The ",(0,s.jsx)(n.strong,{children:"I want to understand! path"}),": Each step in creating your environment is detailed in the ",(0,s.jsx)(n.a,{href:"#installation-locale-d%C3%A9taill%C3%A9e",children:"tuto below"}),"."]}),"\n"]}),(0,s.jsx)(n.p,{children:"You can even do both, for maximum effect!"})]}),"\n",(0,s.jsx)(n.h2,{id:"detailed-local-installation",children:"Detailed local installation"}),"\n",(0,s.jsx)(n.p,{children:"Translated with DeepL.com (free version)\nWe're gonna start by creating a folder that will hold the different repositories required, in your local repository or work folder if you have one for example. It will look like this:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.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,s.jsx)(n.h3,{id:"key-generation",children:"Key generation"}),"\n",(0,s.jsx)("mark",{children:"TODO: Complicated and heavy for no reason."}),"\n",(0,s.jsx)(n.p,{children:"The legacy way of generating the necessary configuration keys is to pull the production Fedow docker image and run poetry inside of it."}),"\n",(0,s.jsx)(n.p,{children:"For each engine, we will need:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["one or two Fernet keys (for the ",(0,s.jsx)(n.code,{children:"FERNET_KEY"})," field and possibly, passwords)"]}),"\n",(0,s.jsxs)(n.li,{children:["a Django secret key (for the ",(0,s.jsx)(n.code,{children:"SECRET_KEY"})," field)"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"You can generate 30 of each in your terminal by running:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.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,s.jsx)(n.p,{children:"The first line will take some time as it need to pull the entire Docker image. Keep the keys somewhere, we're gonna need them to setup the engines."}),"\n",(0,s.jsxs)(n.p,{children:["We're also going to need a Stripe test key for the ",(0,s.jsx)(n.code,{children:"STRIPE_KEY_TEST"})," field. Stripe is the payment solution that is currently taking care of the cashing in. You can obtain a key by creating a free account, then by going to Test mode -> API test key. Alternatively you can ask the team."]}),"\n",(0,s.jsx)(n.h3,{id:"fedow-lespass-laboutik",children:"Fedow, Lespass, LaBoutik"}),"\n",(0,s.jsx)(n.p,{children:"Start by cloning the repositories:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.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,s.jsx)(n.p,{children:"From here, we need to write a bit of configuration. It will be better streamlined in the future, so bear with us \ud83d\ude0b"}),"\n",(0,s.jsxs)(n.p,{children:["Each engine needs its own ",(0,s.jsx)(n.code,{children:".env"})," file, which you can base on the ",(0,s.jsx)(n.code,{children:"env_example"})," files you cloned."]}),"\n",(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsxs)(n.p,{children:["Each environment variable must be readable from the ",(0,s.jsx)(n.code,{children:".env"})," file. No line deletion! Some of them can however stay empty (nullable)."]})}),"\n",(0,s.jsx)(n.h4,{id:"fedow-environment",children:"Fedow environment"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="tibillet-dev$"',children:"cp Fedow/env_example Fedow/.env\n"})}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Name"}),(0,s.jsx)(n.th,{children:"Target environment"}),(0,s.jsx)(n.th,{children:"Nullable"}),(0,s.jsx)(n.th,{children:"Default value"}),(0,s.jsx)(n.th,{children:"Notes"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"SECRET_KEY"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"One of the previously generated Django secret key"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"FERNET_KEY"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"One of the previously generated Fernet key"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"STRIPE_KEY"})}),(0,s.jsx)(n.td,{children:"Production"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Your Stripe API key"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DOMAIN"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"fedow.tibillet.localhost"})}),(0,s.jsx)(n.td,{children:"Change to you domain and subdomain for production mode"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"STRIPE_KEY_TEST"})}),(0,s.jsx)(n.td,{children:"Development, Testing"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Your Stripe API test key"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"STRIPE_TEST"})}),(0,s.jsx)(n.td,{children:"Development, Testing"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"0"}),(0,s.jsxs)(n.td,{children:["Set to 1 if ",(0,s.jsx)(n.code,{children:"STRIPE_KEY_TEST"})," is filled"]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"STRIPE_ENDPOINT_SECRET_TEST"})}),(0,s.jsx)(n.td,{children:"Development, Testing"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"No idea"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DEBUG"})}),(0,s.jsx)(n.td,{children:"Development"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"0"}),(0,s.jsx)(n.td,{children:"Set to 1 for development"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"TEST"})}),(0,s.jsx)(n.td,{children:"Testing"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"0"}),(0,s.jsx)(n.td,{children:"Set to 1 for testing"})]})]})]}),"\n",(0,s.jsx)(n.h4,{id:"lespass-environment",children:"Lespass environment"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="tibillet-dev$"',children:"cp Lespass/env_example Lespass/.env\n"})}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Name"}),(0,s.jsx)(n.th,{children:"Target environment"}),(0,s.jsx)(n.th,{children:"Nullable"}),(0,s.jsx)(n.th,{children:"Default value"}),(0,s.jsx)(n.th,{children:"Notes"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"SECRET_KEY"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"One of the previously generated Django secret key"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"FERNET_KEY"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"One of the previously generated Fernet key"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"STRIPE_KEY"})}),(0,s.jsx)(n.td,{children:"Production"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Your Stripe API key"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DOMAIN"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"tibillet.localhost"})}),(0,s.jsx)(n.td,{children:"Change to your domain for production mode"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"SUB"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"lespass"})}),(0,s.jsx)(n.td,{children:"Instance subdomain, change for production mode as necessary"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"META"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"agenda"})}),(0,s.jsx)(n.td,{children:"Federated calendar subdomain, change for production mode as necessary"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"FEDOW_DOMAIN"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"fedow.tibillet.localhost"})}),(0,s.jsx)(n.td,{children:"Domain and subdomain of the Fedow engine"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"PUBLIC"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"TiBillet Coop."}),(0,s.jsx)(n.td,{children:"Main instance name"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"TIME_ZONE"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"Europe/Paris"}),(0,s.jsx)(n.td,{children:"TZ time zone of the instance"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"ADMIN_EMAIL"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Admin email (for the first admin)"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"POSTGRES_DB"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"lespass"}),(0,s.jsx)(n.td,{children:"Change for production mode if necessary"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"POSTGRES_USER"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"lespass_postgres"}),(0,s.jsx)(n.td,{children:"Change for production mode"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"POSTGRES_PASSWORD"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Strong password (one of the Fernet keys for example)"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"EMAIL_HOST"}),", ",(0,s.jsx)(n.code,{children:"EMAIL_PORT"}),", ",(0,s.jsx)(n.code,{children:"EMAIL_HOST_USER"}),", ",(0,s.jsx)(n.code,{children:"EMAIL_HOST_PASSWORD"})]}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Email server, required to confirm user registrations for example"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"STRIPE_KEY_TEST"})}),(0,s.jsx)(n.td,{children:"Development, Testing"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Your Stripe API test key"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"STRIPE_TEST"})}),(0,s.jsx)(n.td,{children:"Development, Testing"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"0"}),(0,s.jsxs)(n.td,{children:["Set to 1 if ",(0,s.jsx)(n.code,{children:"STRIPE_KEY_TEST"})," is filled"]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DEBUG"})}),(0,s.jsx)(n.td,{children:"Development"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"0"}),(0,s.jsx)(n.td,{children:"Set to 1 for development"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"TEST"})}),(0,s.jsx)(n.td,{children:"Testing"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"0"}),(0,s.jsx)(n.td,{children:"Set to 1 for testing"})]})]})]}),"\n",(0,s.jsx)(n.h4,{id:"laboutik-environment",children:"LaBoutik environment"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="tibillet-dev$"',children:"cp LaBoutik/env_example LaBoutik/.env\n"})}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Name"}),(0,s.jsx)(n.th,{children:"Target environment"}),(0,s.jsx)(n.th,{children:"Nullable"}),(0,s.jsx)(n.th,{children:"Default value"}),(0,s.jsx)(n.th,{children:"Notes"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"SECRET_KEY"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"One of the previously generated Django secret key"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"FERNET_KEY"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"One of the previously generated Fernet key"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DOMAIN"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"laboutik.tibillet.localhost"})}),(0,s.jsx)(n.td,{children:"Change to you domain and subdomain for production mode"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"FEDOW_URL"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"https://fedow.tibillet.localhost/",children:"https://fedow.tibillet.localhost/"})}),(0,s.jsx)(n.td,{children:"Fedow engine URL"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"LESPASS_TENANT_URL"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"https://lespass.tibillet.localhost/",children:"https://lespass.tibillet.localhost/"})}),(0,s.jsx)(n.td,{children:"Lespass instance URL"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"TIME_ZONE"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"Europe/Paris"}),(0,s.jsx)(n.td,{children:"TZ time zone of the instance"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"ADMIN_EMAIL"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Admin email (for the first admin)"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"MAIN_ASSET_NAME"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Name of your main cashless asset (Centiment, HeartBit\u2026 whatever you like)"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"POSTGRES_DB"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"laboutik"}),(0,s.jsx)(n.td,{children:"Change for production mode if necessary"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"POSTGRES_USER"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"laboutik_user"}),(0,s.jsx)(n.td,{children:"Change for production mode"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"POSTGRES_PASSWORD"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Strong password (one of the Fernet keys for example)"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"EMAIL_HOST"}),", ",(0,s.jsx)(n.code,{children:"EMAIL_PORT"}),", ",(0,s.jsx)(n.code,{children:"EMAIL_HOST_USER"}),", ",(0,s.jsx)(n.code,{children:"EMAIL_HOST_PASSWORD"})]}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Email server, required to confirm user registrations for example"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"BORG_PASSPHRASE"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Password used for data backup"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DEBUG"})}),(0,s.jsx)(n.td,{children:"Development"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"0"}),(0,s.jsx)(n.td,{children:"Set to 1 for development"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"TEST"})}),(0,s.jsx)(n.td,{children:"Testing"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"0"}),(0,s.jsx)(n.td,{children:"Set to 1 for testing"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DEMO"})}),(0,s.jsx)(n.td,{children:"Development, Testing"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"0"}),(0,s.jsx)(n.td,{children:"Set to 1 for a register simulation"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"SENTRY_DNS"})}),(0,s.jsx)(n.td,{children:"Development, Testing"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Sentry Debug pour le back-end"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"SENTRY_FRONT_DNS"}),", ",(0,s.jsx)(n.code,{children:"SENTRY_FRONT_ASSET"})]}),(0,s.jsx)(n.td,{children:"Development, Testing"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Sentry Debug for front-end"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"DEMO_TAGID_CM"}),", ",(0,s.jsx)(n.code,{children:"DEMO_TAGID_CLIENT1"}),", ",(0,s.jsx)(n.code,{children:"DEMO_TAGID_CLIENT2"})]}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"No idea"})]})]})]}),"\n",(0,s.jsx)(n.p,{children:"The configuration should now be complete for the TiBillet engines."}),"\n",(0,s.jsx)(n.h3,{id:"tests-setup",children:"Tests setup"}),"\n",(0,s.jsx)(n.p,{children:"For\u2026 reasons, the entire dev environment is assembled through the tests. The setup of the testing repository might seem familiar:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.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,s.jsx)(n.p,{children:"There! Setup done \u263a\ufe0f Now we can start running the entire project from inside the test folder:"}),"\n",(0,s.jsx)(n.h2,{id:"manual-engine-start",children:"Manual engine start"}),"\n",(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsx)(n.p,{children:"If you've downloaded the ready-to-install folder, remember to perform a git pull in each of the 4 repositories before launching!"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Test-Driven-Development$"',children:"docker network create frontend # only the first time. Traefik need this virtual network.\ndocker compose up -d\n"})}),"\n",(0,s.jsx)(n.p,{children:"You can access the logs with:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Test-Driven-Development$"',children:"docker compose logs -f\n"})}),"\n",(0,s.jsx)(n.p,{children:"To delete the containers :"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Test-Driven-Development$"',children:"docker compose doww -v # -v for the volumes used by database.\n"})}),"\n",(0,s.jsx)(n.admonition,{title:"Careful!",type:"warning",children:(0,s.jsxs)(n.p,{children:["This particular ",(0,s.jsx)(n.code,{children:"docker-compose.yml"})," relies on the folder structure of its ",(0,s.jsx)(n.em,{children:"parent folder"})," shown in the beginning with the example name of ",(0,s.jsx)(n.code,{children:"tibillet-dev"}),". Counterintuitive, but hey: now you know!"]})}),"\n",(0,s.jsxs)(n.p,{children:["The main difference between dev and prod containers is that running the ",(0,s.jsx)(n.code,{children:"docker compose"})," command will not start the individual Django apps. It's a level of granularity that helps with development, but it means you get to start them manually by entering the containers. Lucky you! \ud83c\udf40"]}),"\n",(0,s.jsx)(n.p,{children:"Were're gonna start them in a particular order:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Fedow"}),"\n",(0,s.jsx)(n.li,{children:"Lespass"}),"\n",(0,s.jsx)(n.li,{children:"LaBoutik (needs the other two to start)"}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["The tools we need are in the Django containers, named after the engines: ",(0,s.jsx)(n.code,{children:"fedow_django"}),", ",(0,s.jsx)(n.code,{children:"lespass_django"})," and ",(0,s.jsx)(n.code,{children:"laboutik_django"}),". To enter a container (Fedow example) :"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"# starting bash shell in fedow_django container\ndocker exec -ti fedow_django bash\n"})}),"\n",(0,s.jsx)(n.p,{children:"From there we have a few options."}),"\n",(0,s.jsxs)(n.p,{children:["First is the ",(0,s.jsx)(n.code,{children:"flush.sh"})," script. It initializes testing data and starts the app right after. This is what we're gonna use at ",(0,s.jsx)(n.strong,{children:"first boot"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="fedow_django$"',children:"./flush.sh\n"})}),"\n",(0,s.jsxs)(n.p,{children:["We will also use it when we want to ",(0,s.jsx)(n.strong,{children:"reset"})," data, for example before starting the automated testing with relies on this predictible data."]}),"\n",(0,s.jsx)(n.p,{children:"For the rest of the container manipulations, we're going to need the Poetry shell, because we're gonna use Python commands."}),"\n",(0,s.jsx)(n.p,{children:"To start Poetry's virtual env from the container:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="fedow_django$"',children:" # we start the virtual env that handles the python dependencies\npoetry shell\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Django is handled through a script called ",(0,s.jsx)(n.code,{children:"manage.py"}),". Two commands are of interest to us here:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"rsp"})," (alias of ",(0,s.jsx)(n.code,{children:"./manage.py runserver 0.0.0.0:8000"}),") starts Django but doesn't wipe out the data. This will help keep data between sessions. GThis command is used in most cases, ",(0,s.jsx)(n.code,{children:"flush"})," is only used for testing or when something's gonz wrong."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["As an option, if you're encontering graphical issues (such as assets not loading), you can attempt ",(0,s.jsx)(n.code,{children:"./manage.py collectstatic"}),". Sometimes the graphical assets are not properly collected at first boot, in which case this can help."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Only thing left to do is to start the three engines in the order described earlier : Fedow, Lespass, then LaBoutik !"}),"\n",(0,s.jsxs)(n.admonition,{title:"Aliasing",type:"tip",children:[(0,s.jsx)(n.p,{children:"The docker command gets repetitive after a while. Why not create an alias, or even a little bash function that will shorten your labor and preserve your carpal tunnel? Here's mine:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="~/.bashrc"',children:"function dockex {\n docker exec -ti $1 bash\n}\n"})}),(0,s.jsx)(n.p,{children:"There's probably even a way to add the poetry stuff to it, look it up!"})]}),"\n",(0,s.jsx)(n.h3,{id:"is-it-working",children:"Is it working?"}),"\n",(0,s.jsx)(n.p,{children:"If you have used the default domain configuration, you can now access:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["the federation engine Fedow at ",(0,s.jsx)(n.a,{href:"https://fedow.tibillet.localhost",children:"fedow.tibillet.localhost"})]}),"\n",(0,s.jsxs)(n.li,{children:["an instance of the ticketing engine Lespass at ",(0,s.jsx)(n.a,{href:"https://lespass.tibillet.localhost",children:"lespass.tibillet.localhost"})]}),"\n",(0,s.jsxs)(n.li,{children:["the currency register server LaBoutik at ",(0,s.jsx)(n.a,{href:"https://laboutik.tibillet.localhost",children:"laboutik.tibillet.localhost"})]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"If everything is working as expected, congratulations: you're ready to go \ud83d\udd27"}),"\n",(0,s.jsx)(n.p,{children:"If not, come talk to us, we'd love to help!"}),"\n",(0,s.jsxs)(n.admonition,{title:"Wrapping up",type:"note",children:[(0,s.jsxs)(n.p,{children:["Don't forget to ",(0,s.jsx)(n.code,{children:"docker compose down"})," both here and in Traefik when you're done. You computer needs a break sometimes."]}),(0,s.jsxs)(n.p,{children:["If you think you won't remember, remove the daemon option when you compose up (",(0,s.jsx)(n.code,{children:"-d"}),") and the command will run directly in the terminal, not as a background job. It's fine, you'll just need more tabs \ud83d\ude0b"]})]}),"\n",(0,s.jsx)(n.h2,{id:"lifecycle",children:"Lifecycle"}),"\n",(0,s.jsx)(n.h3,{id:"updates",children:"Updates"}),"\n",(0,s.jsx)(n.p,{children:"To stay up to date during development, pull the latest image:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Test-Driven-Development$"',children:"docker compose pull\ndocker compose up -d # start or restart the updated containers\n"})}),"\n",(0,s.jsx)(n.h3,{id:"testing",children:"Testing"}),"\n",(0,s.jsx)(n.p,{children:"You can run the Python tests through the same shell-ception required to do a manual start. Start by flushing the 3 Django apps to get fresh testing data, then run this inside your LaBoutik Django container:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="laboutik_django> poetry shell$"',children:"./manage.py test\n"})}),"\n",(0,s.jsx)("mark",{children:"TODO: end-to-end tests docs (they exist!)"}),"\n",(0,s.jsx)(n.h3,{id:"backups",children:"Backups"}),"\n",(0,s.jsxs)(n.p,{children:["Before causing any major change, backup any data that has value to your development. On your Fedow instance, you only need to save the ",(0,s.jsx)(n.code,{children:"database"})," folder regularly. The other engines can be backed up through the Borgbackup util, cron tasks and database dumps. More about this in the future."]}),"\n",(0,s.jsx)("mark",{children:"TODO: detailed backup explanation"})]})}function a(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>d,x:()=>l});var s=t(6540);const i={},r=s.createContext(i);function d(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:d(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocumentation_v_2=self.webpackChunkdocumentation_v_2||[]).push([[1329],{9878:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>d,default:()=>a,frontMatter:()=>r,metadata:()=>l,toc:()=>c});var s=t(4848),i=t(8453);const r={sidebar_position:10,slug:"development",title:"Development",keywords:["contribute","volunteer","open source","git","pull request","issue","help","code","development","programming","python","django","docker","poetry","testing","tdd"],tags:["contribute","open source","git","help","tdd","python","django","docker","poetry"],authors:"kaya, guillaume"},d="Development",l={id:"contribute/dev",title:"Development",description:"So, you want to help with the development of TiBillet. Thank you! Open-source thrives thanks to people like you \ud83d\ude4f",source:"@site/docs/contribute/dev.md",sourceDirName:"contribute",slug:"/contribute/development",permalink:"/docs/contribute/development",draft:!1,unlisted:!1,editUrl:"https://github.com/TiBillet/documentation/tree/main/tibillet/docs/contribute/dev.md",tags:[{inline:!0,label:"contribute",permalink:"/docs/tags/contribute"},{inline:!0,label:"open source",permalink:"/docs/tags/open-source"},{inline:!0,label:"git",permalink:"/docs/tags/git"},{inline:!0,label:"help",permalink:"/docs/tags/help"},{inline:!0,label:"tdd",permalink:"/docs/tags/tdd"},{inline:!0,label:"python",permalink:"/docs/tags/python"},{inline:!0,label:"django",permalink:"/docs/tags/django"},{inline:!0,label:"docker",permalink:"/docs/tags/docker"},{inline:!0,label:"poetry",permalink:"/docs/tags/poetry"}],version:"current",sidebarPosition:10,frontMatter:{sidebar_position:10,slug:"development",title:"Development",keywords:["contribute","volunteer","open source","git","pull request","issue","help","code","development","programming","python","django","docker","poetry","testing","tdd"],tags:["contribute","open source","git","help","tdd","python","django","docker","poetry"],authors:"kaya, guillaume"},sidebar:"tutorialSidebar",previous:{title:"Contributing",permalink:"/docs/category/contributing"},next:{title:"Research",permalink:"/docs/category/research"}},o={},c=[{value:"Understanding the workflow",id:"understanding-the-workflow",level:2},{value:"Tools and languages used",id:"tools-and-languages-used",level:2},{value:"Simple local install",id:"simple-local-install",level:2},{value:"Detailed local installation",id:"detailed-local-installation",level:2},{value:"Key generation",id:"key-generation",level:3},{value:"Fedow, Lespass, LaBoutik",id:"fedow-lespass-laboutik",level:3},{value:"Fedow environment",id:"fedow-environment",level:4},{value:"Lespass environment",id:"lespass-environment",level:4},{value:"LaBoutik environment",id:"laboutik-environment",level:4},{value:"Tests setup",id:"tests-setup",level:3},{value:"Manual engine start",id:"manual-engine-start",level:2},{value:"Is it working?",id:"is-it-working",level:3},{value:"Lifecycle",id:"lifecycle",level:2},{value:"Updates",id:"updates",level:3},{value:"Testing",id:"testing",level:3},{value:"Backups",id:"backups",level:3}];function h(e){const n={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,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"development",children:"Development"})}),"\n",(0,s.jsx)(n.p,{children:"So, you want to help with the development of TiBillet. Thank you! Open-source thrives thanks to people like you \ud83d\ude4f"}),"\n",(0,s.jsxs)(n.p,{children:["First, if you don't have a specific task in mind already, check out the open issues on the official ",(0,s.jsx)(n.a,{href:"https://github.com/TiBillet",children:"Github repositories"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"It's the easiest way to figure out what problem needs fixing or what feature is being requested."}),"\n",(0,s.jsxs)(n.admonition,{title:"Repositories",type:"note",children:[(0,s.jsx)(n.p,{children:"What you need is probably in the pinned repositories. If you are unsure of the role of Fedow, LaBoutik or Lespass, check out the basics on the three TiBillet engines."}),(0,s.jsxs)(n.p,{children:[(0,s.jsx)("mark",{children:"TODO: link to engines and their roles in the doc"})," (a very basic page in intro probably)"]})]}),"\n",(0,s.jsx)(n.h2,{id:"understanding-the-workflow",children:"Understanding the workflow"}),"\n",(0,s.jsxs)(n.p,{children:["When you work with ",(0,s.jsx)(n.em,{children:"Git forges"})," like Github, there are ways in which you can make your contributions easier to handle:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["If you're not part of the core team, ",(0,s.jsx)(n.em,{children:"fork"})," the repository that interests you, work from there, and submit your changes through a ",(0,s.jsx)(n.em,{children:"pull request"}),"."]}),"\n",(0,s.jsx)(n.li,{children:"If you have an issue you want to work on, check that it doesn't already exists. If it does, join the discussion instead of doing your own thing!"}),"\n",(0,s.jsxs)(n.li,{children:["When you start working on an issue, ",(0,s.jsx)(n.strong,{children:"assign yourself"})," to let others know you're working on it."]}),"\n",(0,s.jsxs)(n.li,{children:["Last but not least: ",(0,s.jsx)(n.strong,{children:"don't create pull requests without running the tests"}),"! Happens to the best of us. Ideally, you should run them before committing, with the help of a ",(0,s.jsx)(n.em,{children:"git hook"})," for example."]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{title:"Getting help",type:"note",children:(0,s.jsxs)(n.p,{children:["If you have any questions regarding Git, Github, or an aspect of development, join us on ",(0,s.jsx)(n.a,{href:"https://discord.gg/7FJvtYx",children:"Discord"})," or ",(0,s.jsx)(n.a,{href:"https://matrix.to/#/#tibillet:tiers-lieux.org",children:"Matrix"}),". These are mostly French-speaking spaces as the founders are from La Reunion, but we'll do our best to help (with a bit of ",(0,s.jsx)(n.em,{children:"un accent"})," \ud83c\udf77\ud83e\udd56)."]})}),"\n",(0,s.jsx)(n.h2,{id:"tools-and-languages-used",children:"Tools and languages used"}),"\n",(0,s.jsx)(n.p,{children:"TiBillet is:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://www.python.org/",children:"Python"})," software"]}),"\n",(0,s.jsxs)(n.li,{children:["developed with the help of the ",(0,s.jsx)(n.a,{href:"https://www.djangoproject.com/",children:"Django"})," framework"]}),"\n",(0,s.jsxs)(n.li,{children:["its dependencies are handled through ",(0,s.jsx)(n.a,{href:"https://python-poetry.org/",children:"Poetry"})]}),"\n",(0,s.jsxs)(n.li,{children:["it runs in ",(0,s.jsx)(n.a,{href:"https://www.docker.com/",children:"Docker"})," containers for production as well as development"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"If you don't feel at ease with the software stack, the best thing you can do is to go look for tutorials. Hopefully we'll compile a list of our own down here one of these days \ud83d\ude05"}),"\n",(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsx)(n.p,{children:"In particular, basic knowledge of Git can help. It is relatively easy to make a complete mess of a project by not grasping the way versioning works. There are safeguards, but you might struggle a lot more than necessary! I remember how that feels \ud83d\ude11"})}),"\n",(0,s.jsx)(n.h2,{id:"simple-local-install",children:"Simple local install"}),"\n",(0,s.jsx)(n.p,{children:"In order to develop and test things out, you're gonna need a (mostly) functional instance of TiBillet on your computer."}),"\n",(0,s.jsx)(n.p,{children:"Let's make sure you have the required tools at hand. You need:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Docker CLI and the ",(0,s.jsx)(n.code,{children:"docker-compose"})," extension"]}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"git"})}),"\n",(0,s.jsx)(n.li,{children:"a Github account with a registered SSH key for forge access"}),"\n",(0,s.jsx)(n.li,{children:"an IDE (there are open-source gift licenses of PyCharm available on request, but a regular IDE like VSCodium works reasonably well - that's what I'm using \ud83d\ude09)"}),"\n"]}),"\n",(0,s.jsxs)(n.admonition,{type:"info",children:[(0,s.jsx)(n.p,{children:"From here, you can choose between two paths:"}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["The ",(0,s.jsx)(n.strong,{children:"Too easy !"})," path: ",(0,s.jsx)(n.a,{href:"https://nuage.tierslieux.re/s/rprGfbDDDrazJ9d",children:"I download an archive"})," in which everything is already installed and I can go straight to ",(0,s.jsx)(n.a,{href:"#manual-engine-start",children:"engine startup"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["The ",(0,s.jsx)(n.strong,{children:"I want to understand! path"}),": Each step in creating your environment is detailed in the ",(0,s.jsx)(n.a,{href:"#installation-locale-d%C3%A9taill%C3%A9e",children:"tuto below"}),"."]}),"\n"]}),(0,s.jsx)(n.p,{children:"You can even do both, for maximum effect!"})]}),"\n",(0,s.jsx)(n.h2,{id:"detailed-local-installation",children:"Detailed local installation"}),"\n",(0,s.jsx)(n.p,{children:"Translated with DeepL.com (free version)\nWe're gonna start by creating a folder that will hold the different repositories required, in your local repository or work folder if you have one for example. It will look like this:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.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,s.jsx)(n.h3,{id:"key-generation",children:"Key generation"}),"\n",(0,s.jsx)("mark",{children:"TODO: Complicated and heavy for no reason."}),"\n",(0,s.jsx)(n.p,{children:"The legacy way of generating the necessary configuration keys is to pull the production Fedow docker image and run poetry inside of it."}),"\n",(0,s.jsx)(n.p,{children:"For each engine, we will need:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["one or two Fernet keys (for the ",(0,s.jsx)(n.code,{children:"FERNET_KEY"})," field and possibly, passwords)"]}),"\n",(0,s.jsxs)(n.li,{children:["a Django secret key (for the ",(0,s.jsx)(n.code,{children:"SECRET_KEY"})," field)"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"You can generate 30 of each in your terminal by running:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.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,s.jsx)(n.p,{children:"The first line will take some time as it need to pull the entire Docker image. Keep the keys somewhere, we're gonna need them to setup the engines."}),"\n",(0,s.jsxs)(n.p,{children:["We're also going to need a Stripe test key for the ",(0,s.jsx)(n.code,{children:"STRIPE_KEY_TEST"})," field. Stripe is the payment solution that is currently taking care of the cashing in. You can obtain a key by creating a free account, then by going to Test mode -> API test key. Alternatively you can ask the team."]}),"\n",(0,s.jsx)(n.h3,{id:"fedow-lespass-laboutik",children:"Fedow, Lespass, LaBoutik"}),"\n",(0,s.jsx)(n.p,{children:"Start by cloning the repositories:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.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,s.jsx)(n.p,{children:"From here, we need to write a bit of configuration. It will be better streamlined in the future, so bear with us \ud83d\ude0b"}),"\n",(0,s.jsxs)(n.p,{children:["Each engine needs its own ",(0,s.jsx)(n.code,{children:".env"})," file, which you can base on the ",(0,s.jsx)(n.code,{children:"env_example"})," files you cloned."]}),"\n",(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsxs)(n.p,{children:["Each environment variable must be readable from the ",(0,s.jsx)(n.code,{children:".env"})," file. No line deletion! Some of them can however stay empty (nullable)."]})}),"\n",(0,s.jsx)(n.h4,{id:"fedow-environment",children:"Fedow environment"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="tibillet-dev$"',children:"cp Fedow/env_example Fedow/.env\n"})}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Name"}),(0,s.jsx)(n.th,{children:"Target environment"}),(0,s.jsx)(n.th,{children:"Nullable"}),(0,s.jsx)(n.th,{children:"Default value"}),(0,s.jsx)(n.th,{children:"Notes"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"SECRET_KEY"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"One of the previously generated Django secret key"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"FERNET_KEY"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"One of the previously generated Fernet key"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"STRIPE_KEY"})}),(0,s.jsx)(n.td,{children:"Production"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Your Stripe API key"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DOMAIN"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"fedow.tibillet.localhost"})}),(0,s.jsx)(n.td,{children:"Change to you domain and subdomain for production mode"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"STRIPE_KEY_TEST"})}),(0,s.jsx)(n.td,{children:"Development, Testing"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Your Stripe API test key"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"STRIPE_TEST"})}),(0,s.jsx)(n.td,{children:"Development, Testing"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"0"}),(0,s.jsxs)(n.td,{children:["Set to 1 if ",(0,s.jsx)(n.code,{children:"STRIPE_KEY_TEST"})," is filled"]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"STRIPE_ENDPOINT_SECRET_TEST"})}),(0,s.jsx)(n.td,{children:"Development, Testing"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"No idea"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DEBUG"})}),(0,s.jsx)(n.td,{children:"Development"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"0"}),(0,s.jsx)(n.td,{children:"Set to 1 for development"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"TEST"})}),(0,s.jsx)(n.td,{children:"Testing"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"0"}),(0,s.jsx)(n.td,{children:"Set to 1 for testing"})]})]})]}),"\n",(0,s.jsx)(n.h4,{id:"lespass-environment",children:"Lespass environment"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="tibillet-dev$"',children:"cp Lespass/env_example Lespass/.env\n"})}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Name"}),(0,s.jsx)(n.th,{children:"Target environment"}),(0,s.jsx)(n.th,{children:"Nullable"}),(0,s.jsx)(n.th,{children:"Default value"}),(0,s.jsx)(n.th,{children:"Notes"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"SECRET_KEY"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"One of the previously generated Django secret key"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"FERNET_KEY"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"One of the previously generated Fernet key"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"STRIPE_KEY"})}),(0,s.jsx)(n.td,{children:"Production"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Your Stripe API key"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DOMAIN"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"tibillet.localhost"})}),(0,s.jsx)(n.td,{children:"Change to your domain for production mode"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"SUB"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"lespass"})}),(0,s.jsx)(n.td,{children:"Instance subdomain, change for production mode as necessary"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"META"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"agenda"})}),(0,s.jsx)(n.td,{children:"Federated calendar subdomain, change for production mode as necessary"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"FEDOW_DOMAIN"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"fedow.tibillet.localhost"})}),(0,s.jsx)(n.td,{children:"Domain and subdomain of the Fedow engine"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"PUBLIC"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"TiBillet Coop."}),(0,s.jsx)(n.td,{children:"Main instance name"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"TIME_ZONE"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"Europe/Paris"}),(0,s.jsx)(n.td,{children:"TZ time zone of the instance"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"ADMIN_EMAIL"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Admin email (for the first admin)"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"POSTGRES_DB"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"lespass"}),(0,s.jsx)(n.td,{children:"Change for production mode if necessary"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"POSTGRES_USER"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"lespass_postgres"}),(0,s.jsx)(n.td,{children:"Change for production mode"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"POSTGRES_PASSWORD"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Strong password (one of the Fernet keys for example)"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"EMAIL_HOST"}),", ",(0,s.jsx)(n.code,{children:"EMAIL_PORT"}),", ",(0,s.jsx)(n.code,{children:"EMAIL_HOST_USER"}),", ",(0,s.jsx)(n.code,{children:"EMAIL_HOST_PASSWORD"})]}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Email server, required to confirm user registrations for example"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"STRIPE_KEY_TEST"})}),(0,s.jsx)(n.td,{children:"Development, Testing"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Your Stripe API test key"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"STRIPE_TEST"})}),(0,s.jsx)(n.td,{children:"Development, Testing"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"0"}),(0,s.jsxs)(n.td,{children:["Set to 1 if ",(0,s.jsx)(n.code,{children:"STRIPE_KEY_TEST"})," is filled"]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DEBUG"})}),(0,s.jsx)(n.td,{children:"Development"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"0"}),(0,s.jsx)(n.td,{children:"Set to 1 for development"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"TEST"})}),(0,s.jsx)(n.td,{children:"Testing"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"0"}),(0,s.jsx)(n.td,{children:"Set to 1 for testing"})]})]})]}),"\n",(0,s.jsx)(n.h4,{id:"laboutik-environment",children:"LaBoutik environment"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="tibillet-dev$"',children:"cp LaBoutik/env_example LaBoutik/.env\n"})}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Name"}),(0,s.jsx)(n.th,{children:"Target environment"}),(0,s.jsx)(n.th,{children:"Nullable"}),(0,s.jsx)(n.th,{children:"Default value"}),(0,s.jsx)(n.th,{children:"Notes"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"SECRET_KEY"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"One of the previously generated Django secret key"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"FERNET_KEY"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"One of the previously generated Fernet key"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DOMAIN"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"laboutik.tibillet.localhost"})}),(0,s.jsx)(n.td,{children:"Change to you domain and subdomain for production mode"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"FEDOW_URL"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"https://fedow.tibillet.localhost/",children:"https://fedow.tibillet.localhost/"})}),(0,s.jsx)(n.td,{children:"Fedow engine URL"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"LESPASS_TENANT_URL"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"https://lespass.tibillet.localhost/",children:"https://lespass.tibillet.localhost/"})}),(0,s.jsx)(n.td,{children:"Lespass instance URL"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"TIME_ZONE"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"Europe/Paris"}),(0,s.jsx)(n.td,{children:"TZ time zone of the instance"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"ADMIN_EMAIL"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Admin email (for the first admin)"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"MAIN_ASSET_NAME"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Name of your main cashless asset (Centiment, HeartBit\u2026 whatever you like)"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"POSTGRES_DB"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"laboutik"}),(0,s.jsx)(n.td,{children:"Change for production mode if necessary"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"POSTGRES_USER"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"laboutik_user"}),(0,s.jsx)(n.td,{children:"Change for production mode"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"POSTGRES_PASSWORD"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Strong password (one of the Fernet keys for example)"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"EMAIL_HOST"}),", ",(0,s.jsx)(n.code,{children:"EMAIL_PORT"}),", ",(0,s.jsx)(n.code,{children:"EMAIL_HOST_USER"}),", ",(0,s.jsx)(n.code,{children:"EMAIL_HOST_PASSWORD"})]}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Email server, required to confirm user registrations for example"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"BORG_PASSPHRASE"})}),(0,s.jsx)(n.td,{children:"All"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Password used for data backup"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DEBUG"})}),(0,s.jsx)(n.td,{children:"Development"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"0"}),(0,s.jsx)(n.td,{children:"Set to 1 for development"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"TEST"})}),(0,s.jsx)(n.td,{children:"Testing"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"0"}),(0,s.jsx)(n.td,{children:"Set to 1 for testing"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"DEMO"})}),(0,s.jsx)(n.td,{children:"Development, Testing"}),(0,s.jsx)(n.td,{children:"No"}),(0,s.jsx)(n.td,{children:"0"}),(0,s.jsx)(n.td,{children:"Set to 1 for a register simulation"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"SENTRY_DNS"})}),(0,s.jsx)(n.td,{children:"Development, Testing"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Sentry Debug pour le back-end"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"SENTRY_FRONT_DNS"}),", ",(0,s.jsx)(n.code,{children:"SENTRY_FRONT_ASSET"})]}),(0,s.jsx)(n.td,{children:"Development, Testing"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Sentry Debug for front-end"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"DEMO_TAGID_CM"}),", ",(0,s.jsx)(n.code,{children:"DEMO_TAGID_CLIENT1"}),", ",(0,s.jsx)(n.code,{children:"DEMO_TAGID_CLIENT2"})]}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"No idea"})]})]})]}),"\n",(0,s.jsx)(n.p,{children:"The configuration should now be complete for the TiBillet engines."}),"\n",(0,s.jsx)(n.h3,{id:"tests-setup",children:"Tests setup"}),"\n",(0,s.jsx)(n.p,{children:"For\u2026 reasons, the entire dev environment is assembled through the tests. The setup of the testing repository might seem familiar:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.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,s.jsx)(n.p,{children:"There! Setup done \u263a\ufe0f Now we can start running the entire project from inside the test folder:"}),"\n",(0,s.jsx)(n.h2,{id:"manual-engine-start",children:"Manual engine start"}),"\n",(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsx)(n.p,{children:"If you've downloaded the ready-to-install folder, remember to perform a git pull in each of the 4 repositories before launching!"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Test-Driven-Development$"',children:"docker network create frontend # only the first time. Traefik need this virtual network.\ndocker compose up -d\n"})}),"\n",(0,s.jsx)(n.p,{children:"You can access the logs with:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Test-Driven-Development$"',children:"docker compose logs -f\n"})}),"\n",(0,s.jsx)(n.p,{children:"To delete the containers :"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Test-Driven-Development$"',children:"docker compose down -v # -v for the volumes used by database.\n"})}),"\n",(0,s.jsx)(n.admonition,{title:"Careful!",type:"warning",children:(0,s.jsxs)(n.p,{children:["This particular ",(0,s.jsx)(n.code,{children:"docker-compose.yml"})," relies on the folder structure of its ",(0,s.jsx)(n.em,{children:"parent folder"})," shown in the beginning with the example name of ",(0,s.jsx)(n.code,{children:"tibillet-dev"}),". Counterintuitive, but hey: now you know!"]})}),"\n",(0,s.jsxs)(n.p,{children:["The main difference between dev and prod containers is that running the ",(0,s.jsx)(n.code,{children:"docker compose"})," command will not start the individual Django apps. It's a level of granularity that helps with development, but it means you get to start them manually by entering the containers. Lucky you! \ud83c\udf40"]}),"\n",(0,s.jsx)(n.p,{children:"Were're gonna start them in a particular order:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Fedow"}),"\n",(0,s.jsx)(n.li,{children:"Lespass"}),"\n",(0,s.jsx)(n.li,{children:"LaBoutik (needs the other two to start)"}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["The tools we need are in the Django containers, named after the engines: ",(0,s.jsx)(n.code,{children:"fedow_django"}),", ",(0,s.jsx)(n.code,{children:"lespass_django"})," and ",(0,s.jsx)(n.code,{children:"laboutik_django"}),". To enter a container (Fedow example) :"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"# starting bash shell in fedow_django container\ndocker exec -ti fedow_django bash\n"})}),"\n",(0,s.jsx)(n.p,{children:"From there we have a few options."}),"\n",(0,s.jsxs)(n.p,{children:["First is the ",(0,s.jsx)(n.code,{children:"flush.sh"})," script. It initializes testing data and starts the app right after. This is what we're gonna use at ",(0,s.jsx)(n.strong,{children:"first boot"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="fedow_django$"',children:"./flush.sh\n"})}),"\n",(0,s.jsxs)(n.p,{children:["We will also use it when we want to ",(0,s.jsx)(n.strong,{children:"reset"})," data, for example before starting the automated testing with relies on this predictible data."]}),"\n",(0,s.jsx)(n.p,{children:"For the rest of the container manipulations, we're going to need the Poetry shell, because we're gonna use Python commands."}),"\n",(0,s.jsx)(n.p,{children:"To start Poetry's virtual env from the container:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="fedow_django$"',children:" # we start the virtual env that handles the python dependencies\npoetry shell\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Django is handled through a script called ",(0,s.jsx)(n.code,{children:"manage.py"}),". Two commands are of interest to us here:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"rsp"})," (alias of ",(0,s.jsx)(n.code,{children:"./manage.py runserver 0.0.0.0:8000"}),") starts Django but doesn't wipe out the data. This will help keep data between sessions. GThis command is used in most cases, ",(0,s.jsx)(n.code,{children:"flush"})," is only used for testing or when something's gonz wrong."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["As an option, if you're encontering graphical issues (such as assets not loading), you can attempt ",(0,s.jsx)(n.code,{children:"./manage.py collectstatic"}),". Sometimes the graphical assets are not properly collected at first boot, in which case this can help."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Only thing left to do is to start the three engines in the order described earlier : Fedow, Lespass, then LaBoutik !"}),"\n",(0,s.jsxs)(n.admonition,{title:"Aliasing",type:"tip",children:[(0,s.jsx)(n.p,{children:"The docker command gets repetitive after a while. Why not create an alias, or even a little bash function that will shorten your labor and preserve your carpal tunnel? Here's mine:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="~/.bashrc"',children:"function dockex {\n docker exec -ti $1 bash\n}\n"})}),(0,s.jsx)(n.p,{children:"There's probably even a way to add the poetry stuff to it, look it up!"})]}),"\n",(0,s.jsx)(n.h3,{id:"is-it-working",children:"Is it working?"}),"\n",(0,s.jsx)(n.p,{children:"If you have used the default domain configuration, you can now access:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["the federation engine Fedow at ",(0,s.jsx)(n.a,{href:"https://fedow.tibillet.localhost",children:"fedow.tibillet.localhost"})]}),"\n",(0,s.jsxs)(n.li,{children:["an instance of the ticketing engine Lespass at ",(0,s.jsx)(n.a,{href:"https://lespass.tibillet.localhost",children:"lespass.tibillet.localhost"})]}),"\n",(0,s.jsxs)(n.li,{children:["the currency register server LaBoutik at ",(0,s.jsx)(n.a,{href:"https://laboutik.tibillet.localhost",children:"laboutik.tibillet.localhost"})]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"If everything is working as expected, congratulations: you're ready to go \ud83d\udd27"}),"\n",(0,s.jsx)(n.p,{children:"If not, come talk to us, we'd love to help!"}),"\n",(0,s.jsxs)(n.admonition,{title:"Wrapping up",type:"note",children:[(0,s.jsxs)(n.p,{children:["Don't forget to ",(0,s.jsx)(n.code,{children:"docker compose down"})," both here and in Traefik when you're done. You computer needs a break sometimes."]}),(0,s.jsxs)(n.p,{children:["If you think you won't remember, remove the daemon option when you compose up (",(0,s.jsx)(n.code,{children:"-d"}),") and the command will run directly in the terminal, not as a background job. It's fine, you'll just need more tabs \ud83d\ude0b"]})]}),"\n",(0,s.jsx)(n.h2,{id:"lifecycle",children:"Lifecycle"}),"\n",(0,s.jsx)(n.h3,{id:"updates",children:"Updates"}),"\n",(0,s.jsx)(n.p,{children:"To stay up to date during development, pull the latest image:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Test-Driven-Development$"',children:"docker compose pull\ndocker compose up -d # start or restart the updated containers\n"})}),"\n",(0,s.jsx)(n.h3,{id:"testing",children:"Testing"}),"\n",(0,s.jsx)(n.p,{children:"You can run the Python tests through the same shell-ception required to do a manual start. Start by flushing the 3 Django apps to get fresh testing data, then run this inside your LaBoutik Django container:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="laboutik_django> poetry shell$"',children:"./manage.py test\n"})}),"\n",(0,s.jsx)("mark",{children:"TODO: end-to-end tests docs (they exist!)"}),"\n",(0,s.jsx)(n.h3,{id:"backups",children:"Backups"}),"\n",(0,s.jsxs)(n.p,{children:["Before causing any major change, backup any data that has value to your development. On your Fedow instance, you only need to save the ",(0,s.jsx)(n.code,{children:"database"})," folder regularly. The other engines can be backed up through the Borgbackup util, cron tasks and database dumps. More about this in the future."]}),"\n",(0,s.jsx)("mark",{children:"TODO: detailed backup explanation"})]})}function a(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>d,x:()=>l});var s=t(6540);const i={},r=s.createContext(i);function d(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:d(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.562c61db.js b/assets/js/runtime~main.332b519d.js similarity index 99% rename from assets/js/runtime~main.562c61db.js rename to assets/js/runtime~main.332b519d.js index 75edf27f..099999eb 100644 --- a/assets/js/runtime~main.562c61db.js +++ b/assets/js/runtime~main.332b519d.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,c,f,d,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,f,d)=>{if(!c){var b=1/0;for(i=0;i=d)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[c,f,d]},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,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var d=Object.create(null);r.r(d);var b={};a=a||[null,c({}),c([]),c(c)];for(var t=2&f&&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(d,b),d},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/"+({26:"8daeed5c",381:"3e8c9b6f",382:"c02dc41d",418:"bcf52ae3",472:"27da2698",726:"e568d197",795:"3da2692a",853:"2e4a270e",889:"f353014f",966:"baa2bd41",1005:"a78153fe",1127:"ce2cc516",1235:"a7456010",1302:"0392a4a7",1329:"927f7f94",1377:"f45aee62",1722:"9623fc80",1938:"11632215",2045:"726c8938",2074:"7f42cc60",2098:"f64e22e3",2240:"b221afeb",2256:"11b43341",2365:"731a8187",2404:"cbabd45f",2560:"659fa473",2561:"c0ac7b9c",2634:"c4f5d8e4",3189:"54bc6b6f",3347:"9b9953c6",3387:"9cd72b32",3452:"a168b62a",3579:"c7bb5360",3622:"59008b8e",3648:"495e69cb",3659:"a30fd2e3",3800:"b5426a6c",4078:"79300ddd",4171:"9812aca5",4222:"6da2f242",4256:"9f55499f",4279:"df203c0f",4280:"2c5a8c25",4285:"6a4065f0",4384:"2c890d29",4507:"f5245bec",4568:"fa75baf9",4634:"65f38bd9",4713:"7e0acfec",4787:"3720c009",4825:"8c76d684",4859:"101b6b4f",4910:"cc3b42c3",5004:"c046ee4b",5072:"9a4c38d3",5075:"64e6a03e",5120:"c8142407",5418:"1623311b",5606:"d26ec100",5741:"d159361a",5742:"aba21aa0",5808:"527523d7",5875:"0efb64b9",6011:"941310dd",6061:"1f391b9e",6072:"a3b977fd",6142:"3fd7c400",6203:"d527cc20",6317:"fd4196ca",6330:"2c241401",6443:"c45ca271",6557:"512b8e12",6590:"285ac952",6604:"57b2c8d2",6801:"bbe20111",6924:"d9316390",6969:"14eb3368",7077:"ff005427",7098:"a7bd4aaa",7293:"1eec3456",7415:"f306de51",7527:"9b32cf81",7537:"52efbe89",7679:"3dd44a97",7761:"9830a4d3",7967:"7ec4066a",7972:"74b3184d",8019:"3ddc391e",8059:"d083fab2",8180:"0492922a",8194:"c7170f78",8198:"86b2e310",8214:"2f43816e",8255:"0a1333cb",8328:"fc924a68",8401:"17896441",8433:"c1e0fb1f",8438:"441e967c",8440:"da7a2e8a",8503:"2e7de751",8657:"2d9a2f91",8678:"321184fb",8703:"3f20655a",8908:"b4e94af8",9045:"d2d25e00",9048:"a94703ab",9393:"36c171c8",9397:"f293808f",9425:"fc5b8a36",9498:"07b63270",9565:"3c33afe8",9625:"fae28bbd",9647:"5e95c892",9672:"e0d6de2a",9720:"4ee12e50",9846:"737faae9",9863:"02c41862"}[e]||e)+"."+{26:"d164dc3d",381:"8b193b77",382:"ae42172f",418:"1609a766",472:"4913ccd1",726:"8947fce3",795:"a9deb8b0",853:"1a3fec76",889:"800c516c",966:"cd2d661b",1005:"45cf27d0",1127:"2fe6ee20",1235:"64267856",1302:"3554099d",1329:"acb726fd",1377:"dfb850f1",1722:"acc09326",1938:"21b0074c",2045:"51e16626",2074:"52be01be",2098:"ebcc2a25",2237:"c97ebfc9",2240:"f9149ab1",2256:"46cb4155",2365:"6d15a056",2404:"5f45b750",2560:"cd4b34ca",2561:"e5140793",2634:"92060fe1",3189:"ae20eac3",3347:"2bc31e70",3387:"ccfa28a0",3452:"8ce76f45",3579:"497a3a92",3622:"6e087ad2",3648:"f03ea2d5",3659:"7c531bcc",3800:"c34fad49",4078:"fa919a96",4171:"72c5876a",4222:"c428a413",4256:"5c2bd583",4279:"d60d8633",4280:"97c3f97d",4285:"a6b649f3",4384:"c8c76acc",4507:"857dfe7f",4568:"b0b347cf",4634:"b2f9e7e1",4713:"14f7009d",4787:"d1287299",4825:"0061c074",4859:"078fa0fc",4910:"4a18dd5f",5004:"3ef8f170",5072:"9007be4a",5075:"3fc5a53c",5120:"9b18582a",5418:"8f9eefef",5606:"c555ca7f",5741:"239003cb",5742:"eaf0e070",5808:"abe92e3f",5875:"5cbec19d",6011:"cd43fa96",6061:"ce7ffbdd",6072:"d6302565",6142:"52a840f2",6203:"2687e4a0",6255:"74f97532",6317:"65a9a521",6330:"f7fc610b",6443:"067131d3",6557:"86162b49",6590:"b5c30dba",6604:"5b98879e",6801:"00007314",6924:"ab9b4478",6969:"ffd61a1f",7077:"47187b21",7098:"0c0e467a",7293:"e446b78f",7415:"f1897ea3",7527:"c57955f2",7537:"f0c8abce",7679:"b706c4e7",7761:"f75b3f8d",7967:"ef8a3641",7972:"7dc53b8a",8019:"b94301b5",8059:"85d37cd0",8180:"52cc15aa",8194:"b5808156",8198:"f9728614",8214:"8757de2b",8255:"73fecff8",8328:"273adc88",8401:"cf7f7f7c",8433:"c19fac77",8438:"65e6012d",8440:"59d3bf63",8503:"f299c3f9",8657:"1f1666d5",8678:"16344d3d",8703:"0669d5b0",8908:"02e9594a",9045:"2b346e6c",9048:"312334be",9393:"5125478b",9397:"0455253e",9425:"89207e86",9498:"ea700919",9565:"b0153e2e",9625:"c68fe48f",9647:"674f41d0",9672:"f2a1005e",9720:"f2e6c69a",9846:"f2aa40e4",9863:"813c5c2e"}[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),f={},d="documentation-v-2:",r.l=(e,a,c,b)=>{if(f[e])f[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 d=f[e];if(delete f[e],t.parentNode&&t.parentNode.removeChild(t),d&&d.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="/",r.gca=function(e){return e={11632215:"1938",17896441:"8401","8daeed5c":"26","3e8c9b6f":"381",c02dc41d:"382",bcf52ae3:"418","27da2698":"472",e568d197:"726","3da2692a":"795","2e4a270e":"853",f353014f:"889",baa2bd41:"966",a78153fe:"1005",ce2cc516:"1127",a7456010:"1235","0392a4a7":"1302","927f7f94":"1329",f45aee62:"1377","9623fc80":"1722","726c8938":"2045","7f42cc60":"2074",f64e22e3:"2098",b221afeb:"2240","11b43341":"2256","731a8187":"2365",cbabd45f:"2404","659fa473":"2560",c0ac7b9c:"2561",c4f5d8e4:"2634","54bc6b6f":"3189","9b9953c6":"3347","9cd72b32":"3387",a168b62a:"3452",c7bb5360:"3579","59008b8e":"3622","495e69cb":"3648",a30fd2e3:"3659",b5426a6c:"3800","79300ddd":"4078","9812aca5":"4171","6da2f242":"4222","9f55499f":"4256",df203c0f:"4279","2c5a8c25":"4280","6a4065f0":"4285","2c890d29":"4384",f5245bec:"4507",fa75baf9:"4568","65f38bd9":"4634","7e0acfec":"4713","3720c009":"4787","8c76d684":"4825","101b6b4f":"4859",cc3b42c3:"4910",c046ee4b:"5004","9a4c38d3":"5072","64e6a03e":"5075",c8142407:"5120","1623311b":"5418",d26ec100:"5606",d159361a:"5741",aba21aa0:"5742","527523d7":"5808","0efb64b9":"5875","941310dd":"6011","1f391b9e":"6061",a3b977fd:"6072","3fd7c400":"6142",d527cc20:"6203",fd4196ca:"6317","2c241401":"6330",c45ca271:"6443","512b8e12":"6557","285ac952":"6590","57b2c8d2":"6604",bbe20111:"6801",d9316390:"6924","14eb3368":"6969",ff005427:"7077",a7bd4aaa:"7098","1eec3456":"7293",f306de51:"7415","9b32cf81":"7527","52efbe89":"7537","3dd44a97":"7679","9830a4d3":"7761","7ec4066a":"7967","74b3184d":"7972","3ddc391e":"8019",d083fab2:"8059","0492922a":"8180",c7170f78:"8194","86b2e310":"8198","2f43816e":"8214","0a1333cb":"8255",fc924a68:"8328",c1e0fb1f:"8433","441e967c":"8438",da7a2e8a:"8440","2e7de751":"8503","2d9a2f91":"8657","321184fb":"8678","3f20655a":"8703",b4e94af8:"8908",d2d25e00:"9045",a94703ab:"9048","36c171c8":"9393",f293808f:"9397",fc5b8a36:"9425","07b63270":"9498","3c33afe8":"9565",fae28bbd:"9625","5e95c892":"9647",e0d6de2a:"9672","4ee12e50":"9720","737faae9":"9846","02c41862":"9863"}[e]||e,r.p+r.u(e)},(()=>{var e={5354:0,1869:0};r.f.j=(a,c)=>{var f=r.o(e,a)?e[a]:void 0;if(0!==f)if(f)c.push(f[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var d=new Promise(((c,d)=>f=e[a]=[c,d]));c.push(f[2]=d);var b=r.p+r.u(a),t=new Error;r.l(b,(c=>{if(r.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var d=c&&("load"===c.type?"missing":c.type),b=c&&c.target&&c.target.src;t.message="Loading chunk "+a+" failed.\n("+d+": "+b+")",t.name="ChunkLoadError",t.type=d,t.request=b,f[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,c)=>{var f,d,b=c[0],t=c[1],o=c[2],n=0;if(b.some((a=>0!==e[a]))){for(f in t)r.o(t,f)&&(r.m[f]=t[f]);if(o)var i=o(r)}for(a&&a(c);n{"use strict";var e,a,c,f,d,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,f,d)=>{if(!c){var b=1/0;for(i=0;i=d)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[c,f,d]},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,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var d=Object.create(null);r.r(d);var b={};a=a||[null,c({}),c([]),c(c)];for(var t=2&f&&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(d,b),d},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/"+({26:"8daeed5c",381:"3e8c9b6f",382:"c02dc41d",418:"bcf52ae3",472:"27da2698",726:"e568d197",795:"3da2692a",853:"2e4a270e",889:"f353014f",966:"baa2bd41",1005:"a78153fe",1127:"ce2cc516",1235:"a7456010",1302:"0392a4a7",1329:"927f7f94",1377:"f45aee62",1722:"9623fc80",1938:"11632215",2045:"726c8938",2074:"7f42cc60",2098:"f64e22e3",2240:"b221afeb",2256:"11b43341",2365:"731a8187",2404:"cbabd45f",2560:"659fa473",2561:"c0ac7b9c",2634:"c4f5d8e4",3189:"54bc6b6f",3347:"9b9953c6",3387:"9cd72b32",3452:"a168b62a",3579:"c7bb5360",3622:"59008b8e",3648:"495e69cb",3659:"a30fd2e3",3800:"b5426a6c",4078:"79300ddd",4171:"9812aca5",4222:"6da2f242",4256:"9f55499f",4279:"df203c0f",4280:"2c5a8c25",4285:"6a4065f0",4384:"2c890d29",4507:"f5245bec",4568:"fa75baf9",4634:"65f38bd9",4713:"7e0acfec",4787:"3720c009",4825:"8c76d684",4859:"101b6b4f",4910:"cc3b42c3",5004:"c046ee4b",5072:"9a4c38d3",5075:"64e6a03e",5120:"c8142407",5418:"1623311b",5606:"d26ec100",5741:"d159361a",5742:"aba21aa0",5808:"527523d7",5875:"0efb64b9",6011:"941310dd",6061:"1f391b9e",6072:"a3b977fd",6142:"3fd7c400",6203:"d527cc20",6317:"fd4196ca",6330:"2c241401",6443:"c45ca271",6557:"512b8e12",6590:"285ac952",6604:"57b2c8d2",6801:"bbe20111",6924:"d9316390",6969:"14eb3368",7077:"ff005427",7098:"a7bd4aaa",7293:"1eec3456",7415:"f306de51",7527:"9b32cf81",7537:"52efbe89",7679:"3dd44a97",7761:"9830a4d3",7967:"7ec4066a",7972:"74b3184d",8019:"3ddc391e",8059:"d083fab2",8180:"0492922a",8194:"c7170f78",8198:"86b2e310",8214:"2f43816e",8255:"0a1333cb",8328:"fc924a68",8401:"17896441",8433:"c1e0fb1f",8438:"441e967c",8440:"da7a2e8a",8503:"2e7de751",8657:"2d9a2f91",8678:"321184fb",8703:"3f20655a",8908:"b4e94af8",9045:"d2d25e00",9048:"a94703ab",9393:"36c171c8",9397:"f293808f",9425:"fc5b8a36",9498:"07b63270",9565:"3c33afe8",9625:"fae28bbd",9647:"5e95c892",9672:"e0d6de2a",9720:"4ee12e50",9846:"737faae9",9863:"02c41862"}[e]||e)+"."+{26:"d164dc3d",381:"8b193b77",382:"ae42172f",418:"1609a766",472:"4913ccd1",726:"8947fce3",795:"a9deb8b0",853:"1a3fec76",889:"800c516c",966:"cd2d661b",1005:"45cf27d0",1127:"2fe6ee20",1235:"64267856",1302:"3554099d",1329:"f88a1b8a",1377:"dfb850f1",1722:"acc09326",1938:"21b0074c",2045:"51e16626",2074:"52be01be",2098:"ebcc2a25",2237:"c97ebfc9",2240:"f9149ab1",2256:"46cb4155",2365:"6d15a056",2404:"5f45b750",2560:"cd4b34ca",2561:"e5140793",2634:"92060fe1",3189:"ae20eac3",3347:"2bc31e70",3387:"ccfa28a0",3452:"8ce76f45",3579:"497a3a92",3622:"6e087ad2",3648:"f03ea2d5",3659:"7c531bcc",3800:"c34fad49",4078:"fa919a96",4171:"72c5876a",4222:"c428a413",4256:"5c2bd583",4279:"d60d8633",4280:"97c3f97d",4285:"a6b649f3",4384:"c8c76acc",4507:"857dfe7f",4568:"b0b347cf",4634:"b2f9e7e1",4713:"14f7009d",4787:"d1287299",4825:"0061c074",4859:"078fa0fc",4910:"4a18dd5f",5004:"3ef8f170",5072:"9007be4a",5075:"3fc5a53c",5120:"9b18582a",5418:"8f9eefef",5606:"c555ca7f",5741:"239003cb",5742:"eaf0e070",5808:"abe92e3f",5875:"5cbec19d",6011:"cd43fa96",6061:"ce7ffbdd",6072:"d6302565",6142:"52a840f2",6203:"2687e4a0",6255:"74f97532",6317:"65a9a521",6330:"f7fc610b",6443:"067131d3",6557:"86162b49",6590:"b5c30dba",6604:"5b98879e",6801:"00007314",6924:"ab9b4478",6969:"ffd61a1f",7077:"47187b21",7098:"0c0e467a",7293:"e446b78f",7415:"f1897ea3",7527:"c57955f2",7537:"f0c8abce",7679:"b706c4e7",7761:"f75b3f8d",7967:"ef8a3641",7972:"7dc53b8a",8019:"b94301b5",8059:"85d37cd0",8180:"52cc15aa",8194:"b5808156",8198:"f9728614",8214:"8757de2b",8255:"73fecff8",8328:"273adc88",8401:"cf7f7f7c",8433:"c19fac77",8438:"65e6012d",8440:"59d3bf63",8503:"f299c3f9",8657:"1f1666d5",8678:"16344d3d",8703:"0669d5b0",8908:"02e9594a",9045:"2b346e6c",9048:"312334be",9393:"5125478b",9397:"0455253e",9425:"89207e86",9498:"ea700919",9565:"b0153e2e",9625:"c68fe48f",9647:"674f41d0",9672:"f2a1005e",9720:"f2e6c69a",9846:"f2aa40e4",9863:"813c5c2e"}[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),f={},d="documentation-v-2:",r.l=(e,a,c,b)=>{if(f[e])f[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 d=f[e];if(delete f[e],t.parentNode&&t.parentNode.removeChild(t),d&&d.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="/",r.gca=function(e){return e={11632215:"1938",17896441:"8401","8daeed5c":"26","3e8c9b6f":"381",c02dc41d:"382",bcf52ae3:"418","27da2698":"472",e568d197:"726","3da2692a":"795","2e4a270e":"853",f353014f:"889",baa2bd41:"966",a78153fe:"1005",ce2cc516:"1127",a7456010:"1235","0392a4a7":"1302","927f7f94":"1329",f45aee62:"1377","9623fc80":"1722","726c8938":"2045","7f42cc60":"2074",f64e22e3:"2098",b221afeb:"2240","11b43341":"2256","731a8187":"2365",cbabd45f:"2404","659fa473":"2560",c0ac7b9c:"2561",c4f5d8e4:"2634","54bc6b6f":"3189","9b9953c6":"3347","9cd72b32":"3387",a168b62a:"3452",c7bb5360:"3579","59008b8e":"3622","495e69cb":"3648",a30fd2e3:"3659",b5426a6c:"3800","79300ddd":"4078","9812aca5":"4171","6da2f242":"4222","9f55499f":"4256",df203c0f:"4279","2c5a8c25":"4280","6a4065f0":"4285","2c890d29":"4384",f5245bec:"4507",fa75baf9:"4568","65f38bd9":"4634","7e0acfec":"4713","3720c009":"4787","8c76d684":"4825","101b6b4f":"4859",cc3b42c3:"4910",c046ee4b:"5004","9a4c38d3":"5072","64e6a03e":"5075",c8142407:"5120","1623311b":"5418",d26ec100:"5606",d159361a:"5741",aba21aa0:"5742","527523d7":"5808","0efb64b9":"5875","941310dd":"6011","1f391b9e":"6061",a3b977fd:"6072","3fd7c400":"6142",d527cc20:"6203",fd4196ca:"6317","2c241401":"6330",c45ca271:"6443","512b8e12":"6557","285ac952":"6590","57b2c8d2":"6604",bbe20111:"6801",d9316390:"6924","14eb3368":"6969",ff005427:"7077",a7bd4aaa:"7098","1eec3456":"7293",f306de51:"7415","9b32cf81":"7527","52efbe89":"7537","3dd44a97":"7679","9830a4d3":"7761","7ec4066a":"7967","74b3184d":"7972","3ddc391e":"8019",d083fab2:"8059","0492922a":"8180",c7170f78:"8194","86b2e310":"8198","2f43816e":"8214","0a1333cb":"8255",fc924a68:"8328",c1e0fb1f:"8433","441e967c":"8438",da7a2e8a:"8440","2e7de751":"8503","2d9a2f91":"8657","321184fb":"8678","3f20655a":"8703",b4e94af8:"8908",d2d25e00:"9045",a94703ab:"9048","36c171c8":"9393",f293808f:"9397",fc5b8a36:"9425","07b63270":"9498","3c33afe8":"9565",fae28bbd:"9625","5e95c892":"9647",e0d6de2a:"9672","4ee12e50":"9720","737faae9":"9846","02c41862":"9863"}[e]||e,r.p+r.u(e)},(()=>{var e={5354:0,1869:0};r.f.j=(a,c)=>{var f=r.o(e,a)?e[a]:void 0;if(0!==f)if(f)c.push(f[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var d=new Promise(((c,d)=>f=e[a]=[c,d]));c.push(f[2]=d);var b=r.p+r.u(a),t=new Error;r.l(b,(c=>{if(r.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var d=c&&("load"===c.type?"missing":c.type),b=c&&c.target&&c.target.src;t.message="Loading chunk "+a+" failed.\n("+d+": "+b+")",t.name="ChunkLoadError",t.type=d,t.request=b,f[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,c)=>{var f,d,b=c[0],t=c[1],o=c[2],n=0;if(b.some((a=>0!==e[a]))){for(f in t)r.o(t,f)&&(r.m[f]=t[f]);if(o)var i=o(r)}for(a&&a(c);n Conditions générales de vente et d'utilisation | TiBillet - + diff --git a/docs/Tips/facebook/index.html b/docs/Tips/facebook/index.html index 8bd879a0..06b67046 100644 --- a/docs/Tips/facebook/index.html +++ b/docs/Tips/facebook/index.html @@ -4,7 +4,7 @@ Social media posting | TiBillet - + diff --git a/docs/Utilisateur/Billetterie/admin_add_new_event/index.html b/docs/Utilisateur/Billetterie/admin_add_new_event/index.html index 5d022693..35f6646a 100644 --- a/docs/Utilisateur/Billetterie/admin_add_new_event/index.html +++ b/docs/Utilisateur/Billetterie/admin_add_new_event/index.html @@ -4,7 +4,7 @@ Create a new event from A to Z | TiBillet - + diff --git a/docs/Utilisateur/Billetterie/admin_add_new_free_event/index.html b/docs/Utilisateur/Billetterie/admin_add_new_free_event/index.html index d9de2aa1..3b87f7be 100644 --- a/docs/Utilisateur/Billetterie/admin_add_new_free_event/index.html +++ b/docs/Utilisateur/Billetterie/admin_add_new_free_event/index.html @@ -4,7 +4,7 @@ Create a free event | TiBillet - + diff --git a/docs/Utilisateur/Billetterie/iframe/index.html b/docs/Utilisateur/Billetterie/iframe/index.html index 7acb5b97..ae4f5aae 100644 --- a/docs/Utilisateur/Billetterie/iframe/index.html +++ b/docs/Utilisateur/Billetterie/iframe/index.html @@ -4,7 +4,7 @@ Integration | TiBillet - + diff --git a/docs/Utilisateur/Billetterie/rss/index.html b/docs/Utilisateur/Billetterie/rss/index.html index 8453c942..44bb75aa 100644 --- a/docs/Utilisateur/Billetterie/rss/index.html +++ b/docs/Utilisateur/Billetterie/rss/index.html @@ -4,7 +4,7 @@ RSS Feed | TiBillet - + diff --git a/docs/Utilisateur/Billetterie/webhook/index.html b/docs/Utilisateur/Billetterie/webhook/index.html index 9d1b14ab..67c1ce86 100644 --- a/docs/Utilisateur/Billetterie/webhook/index.html +++ b/docs/Utilisateur/Billetterie/webhook/index.html @@ -4,7 +4,7 @@ Webhook | TiBillet - + diff --git a/docs/Utilisateur/Cashless/admin_add_article/index.html b/docs/Utilisateur/Cashless/admin_add_article/index.html index e3433137..10ac5a55 100644 --- a/docs/Utilisateur/Cashless/admin_add_article/index.html +++ b/docs/Utilisateur/Cashless/admin_add_article/index.html @@ -4,7 +4,7 @@ Articles | TiBillet - + diff --git a/docs/Utilisateur/Cashless/admin_add_categorie/index.html b/docs/Utilisateur/Cashless/admin_add_categorie/index.html index b8e9eb68..41a4a470 100644 --- a/docs/Utilisateur/Cashless/admin_add_categorie/index.html +++ b/docs/Utilisateur/Cashless/admin_add_categorie/index.html @@ -4,7 +4,7 @@ Article categories | TiBillet - + diff --git a/docs/Utilisateur/Cashless/admin_add_pos/index.html b/docs/Utilisateur/Cashless/admin_add_pos/index.html index 16b6c5bd..ddd4fabe 100644 --- a/docs/Utilisateur/Cashless/admin_add_pos/index.html +++ b/docs/Utilisateur/Cashless/admin_add_pos/index.html @@ -4,7 +4,7 @@ Points of sale | TiBillet - + diff --git a/docs/Utilisateur/Cashless/admin_add_primary/index.html b/docs/Utilisateur/Cashless/admin_add_primary/index.html index 22c6a7e5..40e97718 100644 --- a/docs/Utilisateur/Cashless/admin_add_primary/index.html +++ b/docs/Utilisateur/Cashless/admin_add_primary/index.html @@ -4,7 +4,7 @@ Primary Cards | TiBillet - + diff --git a/docs/Utilisateur/Cashless/admin_supp/index.html b/docs/Utilisateur/Cashless/admin_supp/index.html index c84956e8..d402d14c 100644 --- a/docs/Utilisateur/Cashless/admin_supp/index.html +++ b/docs/Utilisateur/Cashless/admin_supp/index.html @@ -4,7 +4,7 @@ Removing Orders | TiBillet - + diff --git a/docs/Utilisateur/Cashless/android/index.html b/docs/Utilisateur/Cashless/android/index.html index bc684ca7..92308116 100644 --- a/docs/Utilisateur/Cashless/android/index.html +++ b/docs/Utilisateur/Cashless/android/index.html @@ -4,7 +4,7 @@ Android application | TiBillet - + diff --git a/docs/Utilisateur/Cashless/badge/index.html b/docs/Utilisateur/Cashless/badge/index.html index f8621ed7..51fd49fb 100644 --- a/docs/Utilisateur/Cashless/badge/index.html +++ b/docs/Utilisateur/Cashless/badge/index.html @@ -4,7 +4,7 @@ Time clock machine | TiBillet - + diff --git a/docs/Utilisateur/Cashless/cashback/index.html b/docs/Utilisateur/Cashless/cashback/index.html index 3dbab097..efe1159b 100644 --- a/docs/Utilisateur/Cashless/cashback/index.html +++ b/docs/Utilisateur/Cashless/cashback/index.html @@ -4,7 +4,7 @@ Cashback | TiBillet - + diff --git a/docs/Utilisateur/Cashless/fidelity/index.html b/docs/Utilisateur/Cashless/fidelity/index.html index 64ab16ab..0fc78dfe 100644 --- a/docs/Utilisateur/Cashless/fidelity/index.html +++ b/docs/Utilisateur/Cashless/fidelity/index.html @@ -4,7 +4,7 @@ Loyalty points | TiBillet - + diff --git a/docs/Utilisateur/Cashless/impression_preparation/index.html b/docs/Utilisateur/Cashless/impression_preparation/index.html index a84cbbba..72317f75 100644 --- a/docs/Utilisateur/Cashless/impression_preparation/index.html +++ b/docs/Utilisateur/Cashless/impression_preparation/index.html @@ -4,7 +4,7 @@ Printing orders | TiBillet - + diff --git a/docs/api/apikey/index.html b/docs/api/apikey/index.html index 06719252..524fd8f9 100644 --- a/docs/api/apikey/index.html +++ b/docs/api/apikey/index.html @@ -4,7 +4,7 @@ API Keys | TiBillet - + diff --git a/docs/api/events/index.html b/docs/api/events/index.html index 1299bdce..54653ff4 100644 --- a/docs/api/events/index.html +++ b/docs/api/events/index.html @@ -4,7 +4,7 @@ Évènements | TiBillet - + diff --git a/docs/api/intro/index.html b/docs/api/intro/index.html index c6e997a1..df25574c 100644 --- a/docs/api/intro/index.html +++ b/docs/api/intro/index.html @@ -4,7 +4,7 @@ Introduction | TiBillet - + diff --git a/docs/api/products/index.html b/docs/api/products/index.html index 8b5ac0d6..abb74816 100644 --- a/docs/api/products/index.html +++ b/docs/api/products/index.html @@ -4,7 +4,7 @@ Produits | TiBillet - + diff --git a/docs/api/reservations/index.html b/docs/api/reservations/index.html index 0e745a1f..4145e9a8 100644 --- a/docs/api/reservations/index.html +++ b/docs/api/reservations/index.html @@ -4,7 +4,7 @@ Réservations et billets | TiBillet - + diff --git a/docs/api/tenants/index.html b/docs/api/tenants/index.html index 4bbd150c..5a363cfe 100644 --- a/docs/api/tenants/index.html +++ b/docs/api/tenants/index.html @@ -4,7 +4,7 @@ Tenants | TiBillet - + diff --git a/docs/category/api/index.html b/docs/category/api/index.html index f4e851a7..61bf289f 100644 --- a/docs/category/api/index.html +++ b/docs/category/api/index.html @@ -4,7 +4,7 @@ API | TiBillet - + diff --git a/docs/category/billetterie/index.html b/docs/category/billetterie/index.html index 32dd4a27..fbe4764b 100644 --- a/docs/category/billetterie/index.html +++ b/docs/category/billetterie/index.html @@ -4,7 +4,7 @@ Ticketing | TiBillet - + diff --git a/docs/category/cashless/index.html b/docs/category/cashless/index.html index 1054c380..f0fb2c57 100644 --- a/docs/category/cashless/index.html +++ b/docs/category/cashless/index.html @@ -4,7 +4,7 @@ Cashless | TiBillet - + diff --git a/docs/category/contributing/index.html b/docs/category/contributing/index.html index aa754816..b063a14d 100644 --- a/docs/category/contributing/index.html +++ b/docs/category/contributing/index.html @@ -4,7 +4,7 @@ Contributing | TiBillet - + diff --git a/docs/category/diy/index.html b/docs/category/diy/index.html index dac35ebb..ff42f9db 100644 --- a/docs/category/diy/index.html +++ b/docs/category/diy/index.html @@ -4,7 +4,7 @@ DIY | TiBillet - + diff --git a/docs/category/documentation-utilisateur/index.html b/docs/category/documentation-utilisateur/index.html index f9db9244..e4bec97c 100644 --- a/docs/category/documentation-utilisateur/index.html +++ b/docs/category/documentation-utilisateur/index.html @@ -4,7 +4,7 @@ User documentation | TiBillet - + diff --git "a/docs/category/pr\303\251sentation/index.html" "b/docs/category/pr\303\251sentation/index.html" index 1a8c36e6..24c451a1 100644 --- "a/docs/category/pr\303\251sentation/index.html" +++ "b/docs/category/pr\303\251sentation/index.html" @@ -4,7 +4,7 @@ Presentation | TiBillet - + diff --git a/docs/category/research/index.html b/docs/category/research/index.html index 7a44a3b3..c62d32b2 100644 --- a/docs/category/research/index.html +++ b/docs/category/research/index.html @@ -4,7 +4,7 @@ Research | TiBillet - + diff --git a/docs/category/trucs-et-astuces/index.html b/docs/category/trucs-et-astuces/index.html index e1a7d894..71f32bb6 100644 --- a/docs/category/trucs-et-astuces/index.html +++ b/docs/category/trucs-et-astuces/index.html @@ -4,7 +4,7 @@ Tips and tricks | TiBillet - + diff --git a/docs/contribute/development/index.html b/docs/contribute/development/index.html index 7b8f0196..b90b40ea 100644 --- a/docs/contribute/development/index.html +++ b/docs/contribute/development/index.html @@ -4,7 +4,7 @@ Development | TiBillet - + @@ -87,7 +87,7 @@

Manual e

You can access the logs with:

Test-Driven-Development$
docker compose logs -f

To delete the containers :

-
Test-Driven-Development$
docker compose doww -v # -v for the volumes used by database.
+
Test-Driven-Development$
docker compose down -v # -v for the volumes used by database.
Careful!

This particular docker-compose.yml relies on the folder structure of its parent folder shown in the beginning with the example name of tibillet-dev. Counterintuitive, but hey: now you know!

The main difference between dev and prod containers is that running the docker compose command will not start the individual Django apps. It's a level of granularity that helps with development, but it means you get to start them manually by entering the containers. Lucky you! 🍀

Were're gonna start them in a particular order:

diff --git a/docs/install/docker_install/index.html b/docs/install/docker_install/index.html index 9796ef7f..513710f4 100644 --- a/docs/install/docker_install/index.html +++ b/docs/install/docker_install/index.html @@ -4,7 +4,7 @@ Self hosted TiBillet instances | TiBillet - + diff --git a/docs/install/raspberry/index.html b/docs/install/raspberry/index.html index e3853157..c998cca9 100644 --- a/docs/install/raspberry/index.html +++ b/docs/install/raspberry/index.html @@ -4,7 +4,7 @@ Raspberry Box - Hardware | TiBillet - + diff --git a/docs/install/raspberry_soft/index.html b/docs/install/raspberry_soft/index.html index 092cf60a..c1cdc5a6 100644 --- a/docs/install/raspberry_soft/index.html +++ b/docs/install/raspberry_soft/index.html @@ -4,7 +4,7 @@ Raspberry Box - Software | TiBillet - + diff --git a/docs/presentation/demonstration/index.html b/docs/presentation/demonstration/index.html index 47430c79..fa39cf59 100644 --- a/docs/presentation/demonstration/index.html +++ b/docs/presentation/demonstration/index.html @@ -4,7 +4,7 @@ Demonstration | TiBillet - + diff --git a/docs/presentation/introduction/index.html b/docs/presentation/introduction/index.html index ec005242..edaad8f5 100644 --- a/docs/presentation/introduction/index.html +++ b/docs/presentation/introduction/index.html @@ -4,7 +4,7 @@ Introduction | TiBillet - + diff --git a/docs/presentation/logos/index.html b/docs/presentation/logos/index.html index 48a2f40d..12e69bb6 100644 --- a/docs/presentation/logos/index.html +++ b/docs/presentation/logos/index.html @@ -4,7 +4,7 @@ Logos | TiBillet - + diff --git a/docs/presentation/philosophie/index.html b/docs/presentation/philosophie/index.html index 0636d036..159acc21 100644 --- a/docs/presentation/philosophie/index.html +++ b/docs/presentation/philosophie/index.html @@ -4,7 +4,7 @@ Philosophy | TiBillet - + diff --git a/docs/presentation/tarifs/index.html b/docs/presentation/tarifs/index.html index ceaf3954..9627f447 100644 --- a/docs/presentation/tarifs/index.html +++ b/docs/presentation/tarifs/index.html @@ -4,7 +4,7 @@ Prices, conditions and licenses | TiBillet - + diff --git a/docs/presentation/usages/index.html b/docs/presentation/usages/index.html index c5c13130..3ff1b63c 100644 --- a/docs/presentation/usages/index.html +++ b/docs/presentation/usages/index.html @@ -4,7 +4,7 @@ Uses | TiBillet - + diff --git a/docs/tags/access-card/index.html b/docs/tags/access-card/index.html index e95538ea..20414b2c 100644 --- a/docs/tags/access-card/index.html +++ b/docs/tags/access-card/index.html @@ -4,7 +4,7 @@ One doc tagged with "access card" | TiBillet - + diff --git a/docs/tags/admin/index.html b/docs/tags/admin/index.html index 695dc949..2dc3f123 100644 --- a/docs/tags/admin/index.html +++ b/docs/tags/admin/index.html @@ -4,7 +4,7 @@ One doc tagged with "admin" | TiBillet - + diff --git a/docs/tags/arts/index.html b/docs/tags/arts/index.html index 0938ef1c..2a691902 100644 --- a/docs/tags/arts/index.html +++ b/docs/tags/arts/index.html @@ -4,7 +4,7 @@ One doc tagged with "arts" | TiBillet - + diff --git a/docs/tags/associations/index.html b/docs/tags/associations/index.html index 423ab52e..d73d933f 100644 --- a/docs/tags/associations/index.html +++ b/docs/tags/associations/index.html @@ -4,7 +4,7 @@ One doc tagged with "associations" | TiBillet - + diff --git a/docs/tags/badge-inter-lieux/index.html b/docs/tags/badge-inter-lieux/index.html index a3d63735..9d92c10e 100644 --- a/docs/tags/badge-inter-lieux/index.html +++ b/docs/tags/badge-inter-lieux/index.html @@ -4,7 +4,7 @@ One doc tagged with "badge inter-lieux" | TiBillet - + diff --git a/docs/tags/bar/index.html b/docs/tags/bar/index.html index e2bd729a..a995f3a0 100644 --- a/docs/tags/bar/index.html +++ b/docs/tags/bar/index.html @@ -4,7 +4,7 @@ One doc tagged with "bar" | TiBillet - + diff --git a/docs/tags/billetterie/index.html b/docs/tags/billetterie/index.html index 40266270..ccab93ff 100644 --- a/docs/tags/billetterie/index.html +++ b/docs/tags/billetterie/index.html @@ -4,7 +4,7 @@ 4 docs tagged with "billetterie" | TiBillet - + diff --git a/docs/tags/caisse-enregistreuse/index.html b/docs/tags/caisse-enregistreuse/index.html index 83f73b8d..86269859 100644 --- a/docs/tags/caisse-enregistreuse/index.html +++ b/docs/tags/caisse-enregistreuse/index.html @@ -4,7 +4,7 @@ 2 docs tagged with "caisse enregistreuse" | TiBillet - + diff --git a/docs/tags/card/index.html b/docs/tags/card/index.html index ccecb2a3..c36ce5ba 100644 --- a/docs/tags/card/index.html +++ b/docs/tags/card/index.html @@ -4,7 +4,7 @@ One doc tagged with "card" | TiBillet - + diff --git a/docs/tags/cash-register/index.html b/docs/tags/cash-register/index.html index 9e240fe2..f1a6fc7e 100644 --- a/docs/tags/cash-register/index.html +++ b/docs/tags/cash-register/index.html @@ -4,7 +4,7 @@ One doc tagged with "cash register" | TiBillet - + diff --git a/docs/tags/cashback/index.html b/docs/tags/cashback/index.html index 370167e0..447ffbb2 100644 --- a/docs/tags/cashback/index.html +++ b/docs/tags/cashback/index.html @@ -4,7 +4,7 @@ One doc tagged with "cashback" | TiBillet - + diff --git a/docs/tags/cashless/index.html b/docs/tags/cashless/index.html index d1740132..d4989c1a 100644 --- a/docs/tags/cashless/index.html +++ b/docs/tags/cashless/index.html @@ -4,7 +4,7 @@ 4 docs tagged with "cashless" | TiBillet - + diff --git a/docs/tags/catering/index.html b/docs/tags/catering/index.html index 6cd06f1c..0dad816e 100644 --- a/docs/tags/catering/index.html +++ b/docs/tags/catering/index.html @@ -4,7 +4,7 @@ 2 docs tagged with "catering" | TiBillet - + diff --git a/docs/tags/colors/index.html b/docs/tags/colors/index.html index 6de687da..a6bc353c 100644 --- a/docs/tags/colors/index.html +++ b/docs/tags/colors/index.html @@ -4,7 +4,7 @@ One doc tagged with "colors" | TiBillet - + diff --git a/docs/tags/contribute/index.html b/docs/tags/contribute/index.html index 22b36258..d6c1fdb4 100644 --- a/docs/tags/contribute/index.html +++ b/docs/tags/contribute/index.html @@ -4,7 +4,7 @@ One doc tagged with "contribute" | TiBillet - + diff --git a/docs/tags/cooperative/index.html b/docs/tags/cooperative/index.html index b05a1a96..ea1585a6 100644 --- a/docs/tags/cooperative/index.html +++ b/docs/tags/cooperative/index.html @@ -4,7 +4,7 @@ One doc tagged with "coopérative" | TiBillet - + diff --git a/docs/tags/culture/index.html b/docs/tags/culture/index.html index 13101303..44fbddfc 100644 --- a/docs/tags/culture/index.html +++ b/docs/tags/culture/index.html @@ -4,7 +4,7 @@ One doc tagged with "culture" | TiBillet - + diff --git a/docs/tags/customer/index.html b/docs/tags/customer/index.html index 30d21554..61d83a41 100644 --- a/docs/tags/customer/index.html +++ b/docs/tags/customer/index.html @@ -4,7 +4,7 @@ One doc tagged with "customer" | TiBillet - + diff --git a/docs/tags/dematerialized-payment/index.html b/docs/tags/dematerialized-payment/index.html index 0d478af4..201324e6 100644 --- a/docs/tags/dematerialized-payment/index.html +++ b/docs/tags/dematerialized-payment/index.html @@ -4,7 +4,7 @@ One doc tagged with "dematerialized payment" | TiBillet - + diff --git a/docs/tags/demonstration/index.html b/docs/tags/demonstration/index.html index d075d216..3dd83e93 100644 --- a/docs/tags/demonstration/index.html +++ b/docs/tags/demonstration/index.html @@ -4,7 +4,7 @@ One doc tagged with "démonstration" | TiBillet - + diff --git a/docs/tags/design/index.html b/docs/tags/design/index.html index d7989b4f..170f63ef 100644 --- a/docs/tags/design/index.html +++ b/docs/tags/design/index.html @@ -4,7 +4,7 @@ One doc tagged with "design" | TiBillet - + diff --git a/docs/tags/django/index.html b/docs/tags/django/index.html index 4058ca1e..8cd6d784 100644 --- a/docs/tags/django/index.html +++ b/docs/tags/django/index.html @@ -4,7 +4,7 @@ One doc tagged with "django" | TiBillet - + diff --git a/docs/tags/docker/index.html b/docs/tags/docker/index.html index 62da504d..1a5a8ead 100644 --- a/docs/tags/docker/index.html +++ b/docs/tags/docker/index.html @@ -4,7 +4,7 @@ One doc tagged with "docker" | TiBillet - + diff --git a/docs/tags/dokos/index.html b/docs/tags/dokos/index.html index 70b81f46..ce86e414 100644 --- a/docs/tags/dokos/index.html +++ b/docs/tags/dokos/index.html @@ -4,7 +4,7 @@ One doc tagged with "dokos" | TiBillet - + diff --git a/docs/tags/events/index.html b/docs/tags/events/index.html index 37079d6f..aab3f0bd 100644 --- a/docs/tags/events/index.html +++ b/docs/tags/events/index.html @@ -4,7 +4,7 @@ 2 docs tagged with "events" | TiBillet - + diff --git a/docs/tags/exhibits/index.html b/docs/tags/exhibits/index.html index ed198718..4dc3211a 100644 --- a/docs/tags/exhibits/index.html +++ b/docs/tags/exhibits/index.html @@ -4,7 +4,7 @@ One doc tagged with "exhibits" | TiBillet - + diff --git a/docs/tags/federated/index.html b/docs/tags/federated/index.html index 79600b0c..cfe4f86d 100644 --- a/docs/tags/federated/index.html +++ b/docs/tags/federated/index.html @@ -4,7 +4,7 @@ One doc tagged with "federated" | TiBillet - + diff --git a/docs/tags/festival/index.html b/docs/tags/festival/index.html index 1c8edfdb..02fa9aba 100644 --- a/docs/tags/festival/index.html +++ b/docs/tags/festival/index.html @@ -4,7 +4,7 @@ 2 docs tagged with "festival" | TiBillet - + diff --git a/docs/tags/fidelite/index.html b/docs/tags/fidelite/index.html index 8842284c..53924312 100644 --- a/docs/tags/fidelite/index.html +++ b/docs/tags/fidelite/index.html @@ -4,7 +4,7 @@ One doc tagged with "fidélité" | TiBillet - + diff --git a/docs/tags/fidelity/index.html b/docs/tags/fidelity/index.html index e765f84e..8a6af6f9 100644 --- a/docs/tags/fidelity/index.html +++ b/docs/tags/fidelity/index.html @@ -4,7 +4,7 @@ One doc tagged with "fidelity" | TiBillet - + diff --git a/docs/tags/free-software/index.html b/docs/tags/free-software/index.html index 354555a7..36b98b3b 100644 --- a/docs/tags/free-software/index.html +++ b/docs/tags/free-software/index.html @@ -4,7 +4,7 @@ One doc tagged with "free software" | TiBillet - + diff --git a/docs/tags/git/index.html b/docs/tags/git/index.html index ae6f716c..feb7d5a3 100644 --- a/docs/tags/git/index.html +++ b/docs/tags/git/index.html @@ -4,7 +4,7 @@ One doc tagged with "git" | TiBillet - + diff --git a/docs/tags/help/index.html b/docs/tags/help/index.html index 699b6ce4..b8d0b2c3 100644 --- a/docs/tags/help/index.html +++ b/docs/tags/help/index.html @@ -4,7 +4,7 @@ One doc tagged with "help" | TiBillet - + diff --git a/docs/tags/index.html b/docs/tags/index.html index 10c7e88e..98a46b68 100644 --- a/docs/tags/index.html +++ b/docs/tags/index.html @@ -4,7 +4,7 @@ Tags | TiBillet - + diff --git a/docs/tags/inspiration/index.html b/docs/tags/inspiration/index.html index a497fce3..f062bda1 100644 --- a/docs/tags/inspiration/index.html +++ b/docs/tags/inspiration/index.html @@ -4,7 +4,7 @@ One doc tagged with "inspiration" | TiBillet - + diff --git a/docs/tags/island/index.html b/docs/tags/island/index.html index d9a76e48..bd625b28 100644 --- a/docs/tags/island/index.html +++ b/docs/tags/island/index.html @@ -4,7 +4,7 @@ One doc tagged with "island" | TiBillet - + diff --git a/docs/tags/local-currencies/index.html b/docs/tags/local-currencies/index.html index d244bd91..be5ccbec 100644 --- a/docs/tags/local-currencies/index.html +++ b/docs/tags/local-currencies/index.html @@ -4,7 +4,7 @@ One doc tagged with "local currencies" | TiBillet - + diff --git a/docs/tags/logiciel-libre/index.html b/docs/tags/logiciel-libre/index.html index 77a3b21a..90a23200 100644 --- a/docs/tags/logiciel-libre/index.html +++ b/docs/tags/logiciel-libre/index.html @@ -4,7 +4,7 @@ One doc tagged with "logiciel libre" | TiBillet - + diff --git a/docs/tags/loyalty/index.html b/docs/tags/loyalty/index.html index 9c0b8ec1..d6577329 100644 --- a/docs/tags/loyalty/index.html +++ b/docs/tags/loyalty/index.html @@ -4,7 +4,7 @@ One doc tagged with "loyalty" | TiBillet - + diff --git a/docs/tags/modern/index.html b/docs/tags/modern/index.html index 65c7bd0c..8c377f80 100644 --- a/docs/tags/modern/index.html +++ b/docs/tags/modern/index.html @@ -4,7 +4,7 @@ One doc tagged with "modern" | TiBillet - + diff --git a/docs/tags/monnaie-locale/index.html b/docs/tags/monnaie-locale/index.html index a98037f5..41f6b956 100644 --- a/docs/tags/monnaie-locale/index.html +++ b/docs/tags/monnaie-locale/index.html @@ -4,7 +4,7 @@ One doc tagged with "monnaie locale" | TiBillet - + diff --git a/docs/tags/monnaies-locales/index.html b/docs/tags/monnaies-locales/index.html index 4e307355..c1dcc562 100644 --- a/docs/tags/monnaies-locales/index.html +++ b/docs/tags/monnaies-locales/index.html @@ -4,7 +4,7 @@ One doc tagged with "monnaies locales" | TiBillet - + diff --git a/docs/tags/monnaies-temps/index.html b/docs/tags/monnaies-temps/index.html index 84744834..b6983f4f 100644 --- a/docs/tags/monnaies-temps/index.html +++ b/docs/tags/monnaies-temps/index.html @@ -4,7 +4,7 @@ One doc tagged with "monnaies temps" | TiBillet - + diff --git a/docs/tags/open-source/index.html b/docs/tags/open-source/index.html index ccb59e90..0f5010ae 100644 --- a/docs/tags/open-source/index.html +++ b/docs/tags/open-source/index.html @@ -4,7 +4,7 @@ 2 docs tagged with "open source" | TiBillet - + diff --git a/docs/tags/order-taking/index.html b/docs/tags/order-taking/index.html index b00ba91b..6c168b16 100644 --- a/docs/tags/order-taking/index.html +++ b/docs/tags/order-taking/index.html @@ -4,7 +4,7 @@ One doc tagged with "order taking" | TiBillet - + diff --git a/docs/tags/organizer/index.html b/docs/tags/organizer/index.html index cd7864f1..87f7d11e 100644 --- a/docs/tags/organizer/index.html +++ b/docs/tags/organizer/index.html @@ -4,7 +4,7 @@ One doc tagged with "organizer" | TiBillet - + diff --git a/docs/tags/paiement-dematerialise/index.html b/docs/tags/paiement-dematerialise/index.html index 69e4389a..dc3f4f00 100644 --- a/docs/tags/paiement-dematerialise/index.html +++ b/docs/tags/paiement-dematerialise/index.html @@ -4,7 +4,7 @@ One doc tagged with "paiement dématérialisé" | TiBillet - + diff --git a/docs/tags/plays/index.html b/docs/tags/plays/index.html index 93809d5a..01578c82 100644 --- a/docs/tags/plays/index.html +++ b/docs/tags/plays/index.html @@ -4,7 +4,7 @@ One doc tagged with "plays" | TiBillet - + diff --git a/docs/tags/poetry/index.html b/docs/tags/poetry/index.html index ee135c4f..c4b812bb 100644 --- a/docs/tags/poetry/index.html +++ b/docs/tags/poetry/index.html @@ -4,7 +4,7 @@ One doc tagged with "poetry" | TiBillet - + diff --git a/docs/tags/prise-de-commandes/index.html b/docs/tags/prise-de-commandes/index.html index ca3d8d2a..5095abb0 100644 --- a/docs/tags/prise-de-commandes/index.html +++ b/docs/tags/prise-de-commandes/index.html @@ -4,7 +4,7 @@ One doc tagged with "prise de commandes" | TiBillet - + diff --git a/docs/tags/python/index.html b/docs/tags/python/index.html index 8b2368f7..8868bc60 100644 --- a/docs/tags/python/index.html +++ b/docs/tags/python/index.html @@ -4,7 +4,7 @@ One doc tagged with "python" | TiBillet - + diff --git a/docs/tags/retro/index.html b/docs/tags/retro/index.html index 03b12c6b..3f3f56f2 100644 --- a/docs/tags/retro/index.html +++ b/docs/tags/retro/index.html @@ -4,7 +4,7 @@ One doc tagged with "retro" | TiBillet - + diff --git a/docs/tags/stripe/index.html b/docs/tags/stripe/index.html index 0b1d03d7..dc118533 100644 --- a/docs/tags/stripe/index.html +++ b/docs/tags/stripe/index.html @@ -4,7 +4,7 @@ One doc tagged with "stripe" | TiBillet - + diff --git a/docs/tags/tdd/index.html b/docs/tags/tdd/index.html index ec796c26..5527e8b5 100644 --- a/docs/tags/tdd/index.html +++ b/docs/tags/tdd/index.html @@ -4,7 +4,7 @@ One doc tagged with "tdd" | TiBillet - + diff --git a/docs/tags/third-places/index.html b/docs/tags/third-places/index.html index 161ed691..2f5c79b9 100644 --- a/docs/tags/third-places/index.html +++ b/docs/tags/third-places/index.html @@ -4,7 +4,7 @@ One doc tagged with "third places" | TiBillet - + diff --git a/docs/tags/ticketing/index.html b/docs/tags/ticketing/index.html index ed8fcdcc..4558b525 100644 --- a/docs/tags/ticketing/index.html +++ b/docs/tags/ticketing/index.html @@ -4,7 +4,7 @@ 4 docs tagged with "ticketing" | TiBillet - + diff --git a/docs/tags/tiers-lieux/index.html b/docs/tags/tiers-lieux/index.html index 9544f267..411bd27b 100644 --- a/docs/tags/tiers-lieux/index.html +++ b/docs/tags/tiers-lieux/index.html @@ -4,7 +4,7 @@ One doc tagged with "tiers-lieux" | TiBillet - + diff --git a/docs/tags/time-currencies/index.html b/docs/tags/time-currencies/index.html index 6b0491b3..09bb8209 100644 --- a/docs/tags/time-currencies/index.html +++ b/docs/tags/time-currencies/index.html @@ -4,7 +4,7 @@ One doc tagged with "time currencies" | TiBillet - + diff --git a/docs/tags/venue/index.html b/docs/tags/venue/index.html index a51dc848..a4fdc79f 100644 --- a/docs/tags/venue/index.html +++ b/docs/tags/venue/index.html @@ -4,7 +4,7 @@ 2 docs tagged with "venue" | TiBillet - + diff --git a/docs/tags/volunteer/index.html b/docs/tags/volunteer/index.html index 2cea6c94..e75b2ab9 100644 --- a/docs/tags/volunteer/index.html +++ b/docs/tags/volunteer/index.html @@ -4,7 +4,7 @@ One doc tagged with "volunteer" | TiBillet - + diff --git a/docs/work-doc/design/index.html b/docs/work-doc/design/index.html index 47f7fd90..c764f034 100644 --- a/docs/work-doc/design/index.html +++ b/docs/work-doc/design/index.html @@ -4,7 +4,7 @@ Graphic design | TiBillet - + diff --git a/docs/work-doc/user-stories/index.html b/docs/work-doc/user-stories/index.html index 7172389a..7a00c987 100644 --- a/docs/work-doc/user-stories/index.html +++ b/docs/work-doc/user-stories/index.html @@ -4,7 +4,7 @@ User stories | TiBillet - + diff --git a/fr/404.html b/fr/404.html index cb1adc9b..32b6b8fc 100644 --- a/fr/404.html +++ b/fr/404.html @@ -4,7 +4,7 @@ Page introuvable | TiBillet - + diff --git a/fr/assets/js/c0af11f0.b4e0c954.js b/fr/assets/js/c0af11f0.cd74af4f.js similarity index 99% rename from fr/assets/js/c0af11f0.b4e0c954.js rename to fr/assets/js/c0af11f0.cd74af4f.js index b9caacc8..1b62b416 100644 --- a/fr/assets/js/c0af11f0.b4e0c954.js +++ b/fr/assets/js/c0af11f0.cd74af4f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocumentation_v_2=self.webpackChunkdocumentation_v_2||[]).push([[639],{7549:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>t,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var r=s(4848),d=s(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 simple",id:"installation-locale-simple",level:2},{value:"Installation locale d\xe9taill\xe9e",id:"installation-locale-d\xe9taill\xe9e",level:2},{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:"Le dossier Test Driven Development",id:"le-dossier-test-driven-development",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 n={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)(n.header,{children:(0,r.jsx)(n.h1,{id:"d\xe9veloppement",children:"D\xe9veloppement"})}),"\n",(0,r.jsx)(n.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)(n.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)(n.a,{href:"https://github.com/orgs/TiBillet/projects?query=is%3Aopen",children:"d\xe9p\xf4ts Github"})," officiels."]}),"\n",(0,r.jsx)(n.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)(n.admonition,{title:"Les d\xe9p\xf4ts",type:"note",children:[(0,r.jsx)(n.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)(n.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)(n.h2,{id:"m\xe9thodes-de-travail",children:"M\xe9thodes de travail"}),"\n",(0,r.jsxs)(n.p,{children:["Quand on travaille avec des ",(0,r.jsx)(n.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)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Si vous ne faites pas partie de l'organisation (avec les acc\xe8s au d\xe9p\xf4t), faites un ",(0,r.jsx)(n.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)(n.em,{children:"pull request"})," (demande de fusion)."]}),"\n",(0,r.jsx)(n.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)(n.li,{children:["Quand vous d\xe9marrez le travail sur un ticket, ",(0,r.jsx)(n.strong,{children:"assignez-vous"})," dessus pour informer les autres qu'un chantier est en cours."]}),"\n",(0,r.jsxs)(n.li,{children:["Enfin, un point important: ",(0,r.jsx)(n.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)(n.em,{children:"commit"}),", avec l'aide d'un ",(0,r.jsx)(n.em,{children:"git hook"})," (d\xe9clencheur automatique) par exemple."]}),"\n"]}),"\n",(0,r.jsx)(n.admonition,{title:"Trouver de l'aide",type:"note",children:(0,r.jsxs)(n.p,{children:["Si vous avez des questions sur Git, Github, ou un aspect du d\xe9veloppement, rejoignez-nous sur le serveur ",(0,r.jsx)(n.a,{href:"https://discord.gg/7FJvtYx",children:"Discord"})," ou ",(0,r.jsx)(n.a,{href:"https://matrix.to/#/#tibillet:tiers-lieux.org",children:"Matrix"}),". Nous ferons de notre mieux pour aider !"]})}),"\n",(0,r.jsx)(n.h2,{id:"outils-et-langages-utilis\xe9s",children:"Outils et langages utilis\xe9s"}),"\n",(0,r.jsx)(n.p,{children:"TiBillet, c'est :"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["une suite d'applications ",(0,r.jsx)(n.a,{href:"https://www.python.org/",children:"Python"}),","]}),"\n",(0,r.jsxs)(n.li,{children:["d\xe9velopp\xe9es avec l'aide du framework ",(0,r.jsx)(n.a,{href:"https://www.djangoproject.com/",children:"Django"}),","]}),"\n",(0,r.jsxs)(n.li,{children:["ses d\xe9pendances sont g\xe9r\xe9es avec ",(0,r.jsx)(n.a,{href:"https://python-poetry.org/",children:"Poetry"}),","]}),"\n",(0,r.jsxs)(n.li,{children:["le tout tournant dans des conteneurs ",(0,r.jsx)(n.a,{href:"https://www.docker.com/",children:"Docker"})," en production comme en d\xe9veloppement."]}),"\n"]}),"\n",(0,r.jsx)(n.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)(n.admonition,{title:"Attention",type:"warning",children:(0,r.jsx)(n.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)(n.h2,{id:"installation-locale-simple",children:"Installation locale simple"}),"\n",(0,r.jsx)(n.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)(n.p,{children:"V\xe9rifions que vous avez l'outillage requis sous la main. Vous avez besoin de :"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Docker CLI et l'extension ",(0,r.jsx)(n.code,{children:"docker-compose"}),". S'installe super facilement ",(0,r.jsx)(n.a,{href:"https://docs.docker.com/engine/install/ubuntu/#install-using-the-convenience-script",children:"ici"})]}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"git"})}),"\n",(0,r.jsx)(n.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)(n.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)(n.admonition,{type:"info",children:[(0,r.jsx)(n.p,{children:"A partir de la, vous avez le choix entre deux chemins :"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Le chemin ",(0,r.jsx)(n.strong,{children:"Trop facile !"})," : ",(0,r.jsx)(n.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)(n.a,{href:"#d%C3%A9marrage-des-moteurs",children:"d\xe9marrage des moteurs"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["Le chemin ",(0,r.jsx)(n.strong,{children:"Je veux comprendre !"})," : Chaque \xe9tape pour cr\xe9er son environnement est d\xe9taill\xe9e dans le ",(0,r.jsx)(n.a,{href:"#installation-locale-detaill%C3%A9e",children:"tuto ci dessous"}),"."]}),"\n"]}),(0,r.jsx)(n.p,{children:"Vous pouvez m\xeame faire les deux, pour un effet maximal !"})]}),"\n",(0,r.jsx)(n.h2,{id:"installation-locale-d\xe9taill\xe9e",children:"Installation locale d\xe9taill\xe9e"}),"\n",(0,r.jsx)(n.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)(n.pre,{children:(0,r.jsx)(n.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)(n.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)(n.p,{children:["Pour g\xe9n\xe9rer les cl\xe9s n\xe9cessaires \xe0 la configuration des moteurs, \xe0 l'heure actuelle, on ",(0,r.jsx)(n.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)(n.p,{children:"Pour chaque moteur, on aura besoin :"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["d'une ou deux cl\xe9s Fernet (pour le champ ",(0,r.jsx)(n.code,{children:"FERNET_KEY"})," et possiblement des mots de passe),"]}),"\n",(0,r.jsxs)(n.li,{children:["d'une cl\xe9 secr\xe8te Django (pour le champ ",(0,r.jsx)(n.code,{children:"SECRET_KEY"}),")."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Vous pouvez g\xe9n\xe9rer 30 cl\xe9s uniques de chaque type en lan\xe7ant les commandes :"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.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)(n.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)(n.p,{children:["On aura \xe9galement besoin d'une cl\xe9 de test Stripe pour le champ ",(0,r.jsx)(n.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)(n.h3,{id:"fedow-lespass-laboutik",children:"Fedow, Lespass, LaBoutik"}),"\n",(0,r.jsx)(n.p,{children:"D\xe9marrons en clonant les d\xe9p\xf4ts des diff\xe9rents moteurs :"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.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)(n.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)(n.p,{children:["Chaque moteur a besoin de son propre fichier ",(0,r.jsx)(n.code,{children:".env"}),", que vous pouvez baser sur les fichiers ",(0,r.jsx)(n.code,{children:"env_example"})," qu'on vient de cloner."]}),"\n",(0,r.jsx)(n.admonition,{title:"Attention",type:"warning",children:(0,r.jsxs)(n.p,{children:["Toute variable d'environnement, doit \xeatre trouvable dans le fichier ",(0,r.jsx)(n.code,{children:".env"}),". Pas de suppression de variable ! Elle peut par contre suivant les cas rester vide (nullable)."]})}),"\n",(0,r.jsx)(n.h4,{id:"environnement-fedow",children:"Environnement Fedow"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="tibillet-dev$"',children:"cp Fedow/env_example Fedow/.env\n"})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Nom"}),(0,r.jsx)(n.th,{children:"Environnement cible"}),(0,r.jsx)(n.th,{children:"Nullable"}),(0,r.jsx)(n.th,{children:"Valeur par d\xe9faut"}),(0,r.jsx)(n.th,{children:"Notes"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"SECRET_KEY"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Une des cl\xe9s secr\xe8tes Django g\xe9n\xe9r\xe9es pr\xe9c\xe9demment"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"FERNET_KEY"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Une des cl\xe9s Fernet g\xe9n\xe9r\xe9es pr\xe9c\xe9demment"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"STRIPE_KEY"})}),(0,r.jsx)(n.td,{children:"Production"}),(0,r.jsx)(n.td,{children:"Oui"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Cl\xe9 API de votre compte Stripe"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"DOMAIN"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"fedow.tibillet.localhost"})}),(0,r.jsx)(n.td,{children:"\xc0 adapter \xe0 votre nom de domaine et sous-domaine en production"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"STRIPE_KEY_TEST"})}),(0,r.jsx)(n.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(n.td,{children:"Oui"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Cl\xe9 API de test de votre compte Stripe"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"STRIPE_TEST"})}),(0,r.jsx)(n.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"0"}),(0,r.jsxs)(n.td,{children:["Passer \xe0 1 si ",(0,r.jsx)(n.code,{children:"STRIPE_KEY_TEST"})," est rempli"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"STRIPE_ENDPOINT_SECRET_TEST"})}),(0,r.jsx)(n.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(n.td,{children:"Oui"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Aucune id\xe9e"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"DEBUG"})}),(0,r.jsx)(n.td,{children:"D\xe9veloppement"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"0"}),(0,r.jsx)(n.td,{children:"Passer \xe0 1 pour le d\xe9veloppement"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"TEST"})}),(0,r.jsx)(n.td,{children:"Tests"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"0"}),(0,r.jsx)(n.td,{children:"Passer \xe0 1 pour les tests"})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"environnement-lespass",children:"Environnement Lespass"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="tibillet-dev$"',children:"cp Lespass/env_example Lespass/.env\n"})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Nom"}),(0,r.jsx)(n.th,{children:"Environnement cible"}),(0,r.jsx)(n.th,{children:"Nullable"}),(0,r.jsx)(n.th,{children:"Valeur par d\xe9faut"}),(0,r.jsx)(n.th,{children:"Notes"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"SECRET_KEY"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Une des cl\xe9s secr\xe8tes Django g\xe9n\xe9r\xe9es pr\xe9c\xe9demment"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"FERNET_KEY"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Une des cl\xe9s Fernet g\xe9n\xe9r\xe9es pr\xe9c\xe9demment"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"STRIPE_KEY"})}),(0,r.jsx)(n.td,{children:"Production"}),(0,r.jsx)(n.td,{children:"Oui"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Cl\xe9 API de votre compte Stripe"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"DOMAIN"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"tibillet.localhost"})}),(0,r.jsx)(n.td,{children:"\xc0 adapter \xe0 votre nom de domaine en production"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"SUB"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"lespass"})}),(0,r.jsx)(n.td,{children:"Sous-domaine de l'instance, \xe0 adapter en production"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"META"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"agenda"})}),(0,r.jsx)(n.td,{children:"Sous-domaine de l'agenda f\xe9d\xe9r\xe9, \xe0 adapter en production"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"FEDOW_DOMAIN"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"fedow.tibillet.localhost"})}),(0,r.jsx)(n.td,{children:"Domaine et sous-domaine du moteur Fedow"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"PUBLIC"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"TiBillet Coop."}),(0,r.jsx)(n.td,{children:"Nom de l'instance principale"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"TIME_ZONE"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"Europe/Paris"}),(0,r.jsx)(n.td,{children:"Plage horaire TZ de l'instance"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"ADMIN_EMAIL"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Email administrateur (pour le\u22c5a premier\u22c5e admin)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"POSTGRES_DB"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"lespass"}),(0,r.jsx)(n.td,{children:"\xc0 changer en production si n\xe9cessaire"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"POSTGRES_USER"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"lespass_postgres"}),(0,r.jsx)(n.td,{children:"\xc0 changer en production"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"POSTGRES_PASSWORD"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Mot de passe fort (une des cl\xe9s Fernets par exemple)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"EMAIL_HOST"}),", ",(0,r.jsx)(n.code,{children:"EMAIL_PORT"}),", ",(0,r.jsx)(n.code,{children:"EMAIL_HOST_USER"}),", ",(0,r.jsx)(n.code,{children:"EMAIL_HOST_PASSWORD"})]}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Oui"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Serveur d'email, requis pour confirmer des abonn\xe9\u22c5es par exemple"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"STRIPE_KEY_TEST"})}),(0,r.jsx)(n.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(n.td,{children:"Oui"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Cl\xe9 API de test de votre compte Stripe"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"STRIPE_TEST"})}),(0,r.jsx)(n.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"0"}),(0,r.jsxs)(n.td,{children:["Passer \xe0 1 si ",(0,r.jsx)(n.code,{children:"STRIPE_KEY_TEST"})," est rempli"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"DEBUG"})}),(0,r.jsx)(n.td,{children:"D\xe9veloppement"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"0"}),(0,r.jsx)(n.td,{children:"Passer \xe0 1 pour le d\xe9veloppement"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"TEST"})}),(0,r.jsx)(n.td,{children:"Tests"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"0"}),(0,r.jsx)(n.td,{children:"Passer \xe0 1 pour les tests"})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"environnement-laboutik",children:"Environnement LaBoutik"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="tibillet-dev$"',children:"cp LaBoutik/env_example LaBoutik/.env\n"})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Nom"}),(0,r.jsx)(n.th,{children:"Environnement cible"}),(0,r.jsx)(n.th,{children:"Nullable"}),(0,r.jsx)(n.th,{children:"Valeur par d\xe9faut"}),(0,r.jsx)(n.th,{children:"Notes"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"SECRET_KEY"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Une des cl\xe9s secr\xe8tes Django g\xe9n\xe9r\xe9es pr\xe9c\xe9demment"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"FERNET_KEY"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Une des cl\xe9s Fernet g\xe9n\xe9r\xe9es pr\xe9c\xe9demment"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"DOMAIN"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"laboutik.tibillet.localhost"})}),(0,r.jsx)(n.td,{children:"\xc0 adapter \xe0 votre nom de domaine et sous-domaine en production"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"FEDOW_URL"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://fedow.tibillet.localhost/",children:"https://fedow.tibillet.localhost/"})}),(0,r.jsx)(n.td,{children:"URL du moteur Fedow"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"LESPASS_TENANT_URL"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://lespass.tibillet.localhost/",children:"https://lespass.tibillet.localhost/"})}),(0,r.jsx)(n.td,{children:"URL de l'instance Lespass"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"TIME_ZONE"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"Europe/Paris"}),(0,r.jsx)(n.td,{children:"Plage horaire TZ de l'instance"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"ADMIN_EMAIL"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Email administrateur (pour le\u22c5a premier\u22c5e admin)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"MAIN_ASSET_NAME"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Le nom de votre unit\xe9 de valeur cashless (Pi\xe9cette, CoeurDor\u2026 comme vous voulez)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"POSTGRES_DB"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"laboutik"}),(0,r.jsx)(n.td,{children:"\xc0 changer en production si n\xe9cessaire"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"POSTGRES_USER"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"laboutik_user"}),(0,r.jsx)(n.td,{children:"\xc0 changer en production"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"POSTGRES_PASSWORD"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Mot de passe fort (une des cl\xe9s Fernets par exemple)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"EMAIL_HOST"}),", ",(0,r.jsx)(n.code,{children:"EMAIL_PORT"}),", ",(0,r.jsx)(n.code,{children:"EMAIL_HOST_USER"}),", ",(0,r.jsx)(n.code,{children:"EMAIL_HOST_PASSWORD"})]}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Oui"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Serveur d'email, requis pour confirmer des abonn\xe9\u22c5es par exemple"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"BORG_PASSPHRASE"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Oui"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Mot de passe utilis\xe9 pour la sauvegarde des donn\xe9es"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"DEBUG"})}),(0,r.jsx)(n.td,{children:"D\xe9veloppement"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"0"}),(0,r.jsx)(n.td,{children:"Passer \xe0 1 pour le d\xe9veloppement"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"TEST"})}),(0,r.jsx)(n.td,{children:"Tests"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"0"}),(0,r.jsx)(n.td,{children:"Passer \xe0 1 pour les tests"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"DEMO"})}),(0,r.jsx)(n.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"0"}),(0,r.jsx)(n.td,{children:"Passer \xe0 1 pour une simulation de terminal de caisse"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"SENTRY_DNS"})}),(0,r.jsx)(n.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(n.td,{children:"Oui"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Sentry Debug pour le back-end"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"SENTRY_FRONT_DNS"}),", ",(0,r.jsx)(n.code,{children:"SENTRY_FRONT_ASSET"})]}),(0,r.jsx)(n.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(n.td,{children:"Oui"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Sentry Debug pour le front-end"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"DEMO_TAGID_CM"}),", ",(0,r.jsx)(n.code,{children:"DEMO_TAGID_CLIENT1"}),", ",(0,r.jsx)(n.code,{children:"DEMO_TAGID_CLIENT2"})]}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Oui"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Aucune id\xe9e"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"La configuration devrait \xeatre maintenant compl\xe8te pour les trois moteurs."}),"\n",(0,r.jsx)(n.h3,{id:"le-dossier-test-driven-development",children:"Le dossier Test Driven Development"}),"\n",(0,r.jsx)(n.p,{children:"On peut lancer tout notre environnement depuis le d\xe9pot des tests."}),"\n",(0,r.jsx)(n.p,{children:"L'installation est similaire aux moteurs :"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.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)(n.p,{children:"C'est fait \u263a\ufe0f On peut maintenant conteneuriser l'application enti\xe8re depuis le dossier des tests."}),"\n",(0,r.jsx)(n.p,{children:"Ce dernier contient un conteneur suppl\xe9mentaire : Traefik."}),"\n",(0,r.jsx)(n.p,{children:"C'est un reverse proxy. Il permet permet de router les requetes https en direction des conteneurs."}),"\n",(0,r.jsx)(n.h2,{id:"d\xe9marrage-des-moteurs",children:"D\xe9marrage des moteurs"}),"\n",(0,r.jsx)(n.admonition,{type:"warning",children:(0,r.jsx)(n.p,{children:"Si vous avez t\xe9l\xe9charg\xe9 le dossier pr\xeat \xe0 installer, pensez \xe0 faire un git pull dans chacun des 4 d\xe9pots avant de lancer !"})}),"\n",(0,r.jsx)(n.p,{children:"Lancement des moteurs depuis le d\xe9pot des tests :"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Test-Driven-Development$"',children:"docker network create frontend # uniquement la premi\xe8re fois, c'est un r\xe9seau virtuel utilis\xe9 par Traefik.\ndocker compose up -d # Le premier lancement peut \xeatre long, il t\xe9l\xe9charge et construit toute les images.\n"})}),"\n",(0,r.jsx)(n.p,{children:"Vous pouvez acc\xe9der en prime aux logs avec la commande :"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Test-Driven-Development$"',children:"docker compose logs -f\n"})}),"\n",(0,r.jsx)(n.p,{children:"Pour supprimer les conteneurs :"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Test-Driven-Development$"',children:"docker compose doww -v # -v pour les volumes utilis\xe9s par les bases de donn\xe9es.\n"})}),"\n",(0,r.jsx)(n.admonition,{title:"Attention",type:"warning",children:(0,r.jsxs)(n.p,{children:["Ce ",(0,r.jsx)(n.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)(n.em,{children:"parent"})," aux tests, appel\xe9 pour l'exemple ",(0,r.jsx)(n.code,{children:"tibillet-dev"}),". Contre-intuitif, mais maintenant vous savez \ud83d\ude09"]})}),"\n",(0,r.jsxs)(n.p,{children:["La principale diff\xe9rence entre les conteneurs de dev et de prod, c'est qu'en dev la commande ",(0,r.jsx)(n.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)(n.p,{children:"On va les lancer de pr\xe9f\xe9rence dans l'ordre :"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"Fedow"}),"\n",(0,r.jsx)(n.li,{children:"Lespass"}),"\n",(0,r.jsx)(n.li,{children:"LaBoutik (qui a besoin des deux autres pour fonctionner)"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Les outils dont on a besoin sont dans les conteneurs, nomm\xe9s d'apr\xe8s leur moteur : ",(0,r.jsx)(n.code,{children:"fedow_django"}),", ",(0,r.jsx)(n.code,{children:"lespass_django"})," et enfin ",(0,r.jsx)(n.code,{children:"laboutik_django"}),". Pour rentrer dans un conteneur (exemple avec Fedow) :"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.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)(n.p,{children:"\xc0 partir de l\xe0, on a quelques options."}),"\n",(0,r.jsxs)(n.p,{children:["La premi\xe8re, c'est le script ",(0,r.jsx)(n.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)(n.strong,{children:"premier d\xe9marrage"})," de notre application :"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="fedow_django$"',children:"./flush.sh\n"})}),"\n",(0,r.jsxs)(n.p,{children:["On l'utilisera aussi quand on veut ",(0,r.jsx)(n.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)(n.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)(n.p,{children:"Pour lancer l'environnement virtuel de Poetry depuis le conteneur :"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.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)(n.p,{children:["Django se g\xe8re avec un script appel\xe9 ",(0,r.jsx)(n.code,{children:"manage.py"}),". Deux commandes nous int\xe9ressent \xe0 l'heure actuelle :"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"rsp"})," (alias de ",(0,r.jsx)(n.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)(n.code,{children:"flush"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Optionnellement, si on a des bugs graphiques, on peut tenter ",(0,r.jsx)(n.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)(n.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)(n.admonition,{title:"Cr\xe9ation d'alias",type:"tip",children:[(0,r.jsx)(n.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)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="~/.bashrc"',children:"function dockex {\n docker exec -ti $1 bash\n}\n"})}),(0,r.jsx)(n.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)(n.h3,{id:"\xe7a-tourne-",children:"\xc7a tourne ?"}),"\n",(0,r.jsx)(n.p,{children:"Si vous avez utilis\xe9 la configuration des sous-domaines par d\xe9faut, vous avez maintenant acc\xe8s :"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["au moteur de f\xe9d\xe9ration Fedow sur ",(0,r.jsx)(n.a,{href:"https://fedow.tibillet.localhost",children:"fedow.tibillet.localhost"}),","]}),"\n",(0,r.jsxs)(n.li,{children:["\xe0 une instance du moteur de billetterie Lespass sur ",(0,r.jsx)(n.a,{href:"https://lespass.tibillet.localhost",children:"lespass.tibillet.localhost"}),","]}),"\n",(0,r.jsxs)(n.li,{children:["au serveur de caisse LaBoutik sur ",(0,r.jsx)(n.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)(n.p,{children:"Si tout marche comme pr\xe9vu, f\xe9licitations : vous \xeates pr\xeat\u22c5es \xe0 vous lancer \ud83d\udd27"}),"\n",(0,r.jsx)(n.p,{children:"Sinon, venez nous en parler, on est l\xe0 pour aider !"}),"\n",(0,r.jsxs)(n.admonition,{title:"Pour conclure",type:"note",children:[(0,r.jsxs)(n.p,{children:["N'oubliez pas de ",(0,r.jsx)(n.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)(n.p,{children:["Si vous avez peur de ne pas vous en souvenir, enlevez l'option ",(0,r.jsx)(n.code,{children:"-d"})," \xe0 ",(0,r.jsx)(n.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)(n.h2,{id:"cycle-de-vie",children:"Cycle de vie"}),"\n",(0,r.jsx)(n.h3,{id:"mises-\xe0-jour",children:"Mises \xe0 jour"}),"\n",(0,r.jsx)(n.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)(n.pre,{children:(0,r.jsx)(n.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)(n.h3,{id:"tests",children:"Tests"}),"\n",(0,r.jsx)(n.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)(n.pre,{children:(0,r.jsx)(n.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)(n.h3,{id:"sauvegardes",children:"Sauvegardes"}),"\n",(0,r.jsxs)(n.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)(n.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:n}={...(0,d.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>t,x:()=>l});var r=s(6540);const d={},i=r.createContext(d);function t(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:t(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocumentation_v_2=self.webpackChunkdocumentation_v_2||[]).push([[639],{7549:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>t,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var r=s(4848),d=s(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 simple",id:"installation-locale-simple",level:2},{value:"Installation locale d\xe9taill\xe9e",id:"installation-locale-d\xe9taill\xe9e",level:2},{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:"Le dossier Test Driven Development",id:"le-dossier-test-driven-development",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 n={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)(n.header,{children:(0,r.jsx)(n.h1,{id:"d\xe9veloppement",children:"D\xe9veloppement"})}),"\n",(0,r.jsx)(n.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)(n.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)(n.a,{href:"https://github.com/orgs/TiBillet/projects?query=is%3Aopen",children:"d\xe9p\xf4ts Github"})," officiels."]}),"\n",(0,r.jsx)(n.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)(n.admonition,{title:"Les d\xe9p\xf4ts",type:"note",children:[(0,r.jsx)(n.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)(n.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)(n.h2,{id:"m\xe9thodes-de-travail",children:"M\xe9thodes de travail"}),"\n",(0,r.jsxs)(n.p,{children:["Quand on travaille avec des ",(0,r.jsx)(n.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)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Si vous ne faites pas partie de l'organisation (avec les acc\xe8s au d\xe9p\xf4t), faites un ",(0,r.jsx)(n.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)(n.em,{children:"pull request"})," (demande de fusion)."]}),"\n",(0,r.jsx)(n.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)(n.li,{children:["Quand vous d\xe9marrez le travail sur un ticket, ",(0,r.jsx)(n.strong,{children:"assignez-vous"})," dessus pour informer les autres qu'un chantier est en cours."]}),"\n",(0,r.jsxs)(n.li,{children:["Enfin, un point important: ",(0,r.jsx)(n.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)(n.em,{children:"commit"}),", avec l'aide d'un ",(0,r.jsx)(n.em,{children:"git hook"})," (d\xe9clencheur automatique) par exemple."]}),"\n"]}),"\n",(0,r.jsx)(n.admonition,{title:"Trouver de l'aide",type:"note",children:(0,r.jsxs)(n.p,{children:["Si vous avez des questions sur Git, Github, ou un aspect du d\xe9veloppement, rejoignez-nous sur le serveur ",(0,r.jsx)(n.a,{href:"https://discord.gg/7FJvtYx",children:"Discord"})," ou ",(0,r.jsx)(n.a,{href:"https://matrix.to/#/#tibillet:tiers-lieux.org",children:"Matrix"}),". Nous ferons de notre mieux pour aider !"]})}),"\n",(0,r.jsx)(n.h2,{id:"outils-et-langages-utilis\xe9s",children:"Outils et langages utilis\xe9s"}),"\n",(0,r.jsx)(n.p,{children:"TiBillet, c'est :"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["une suite d'applications ",(0,r.jsx)(n.a,{href:"https://www.python.org/",children:"Python"}),","]}),"\n",(0,r.jsxs)(n.li,{children:["d\xe9velopp\xe9es avec l'aide du framework ",(0,r.jsx)(n.a,{href:"https://www.djangoproject.com/",children:"Django"}),","]}),"\n",(0,r.jsxs)(n.li,{children:["ses d\xe9pendances sont g\xe9r\xe9es avec ",(0,r.jsx)(n.a,{href:"https://python-poetry.org/",children:"Poetry"}),","]}),"\n",(0,r.jsxs)(n.li,{children:["le tout tournant dans des conteneurs ",(0,r.jsx)(n.a,{href:"https://www.docker.com/",children:"Docker"})," en production comme en d\xe9veloppement."]}),"\n"]}),"\n",(0,r.jsx)(n.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)(n.admonition,{title:"Attention",type:"warning",children:(0,r.jsx)(n.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)(n.h2,{id:"installation-locale-simple",children:"Installation locale simple"}),"\n",(0,r.jsx)(n.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)(n.p,{children:"V\xe9rifions que vous avez l'outillage requis sous la main. Vous avez besoin de :"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Docker CLI et l'extension ",(0,r.jsx)(n.code,{children:"docker-compose"}),". S'installe super facilement ",(0,r.jsx)(n.a,{href:"https://docs.docker.com/engine/install/ubuntu/#install-using-the-convenience-script",children:"ici"})]}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"git"})}),"\n",(0,r.jsx)(n.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)(n.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)(n.admonition,{type:"info",children:[(0,r.jsx)(n.p,{children:"A partir de la, vous avez le choix entre deux chemins :"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Le chemin ",(0,r.jsx)(n.strong,{children:"Trop facile !"})," : ",(0,r.jsx)(n.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)(n.a,{href:"#d%C3%A9marrage-des-moteurs",children:"d\xe9marrage des moteurs"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["Le chemin ",(0,r.jsx)(n.strong,{children:"Je veux comprendre !"})," : Chaque \xe9tape pour cr\xe9er son environnement est d\xe9taill\xe9e dans le ",(0,r.jsx)(n.a,{href:"#installation-locale-detaill%C3%A9e",children:"tuto ci dessous"}),"."]}),"\n"]}),(0,r.jsx)(n.p,{children:"Vous pouvez m\xeame faire les deux, pour un effet maximal !"})]}),"\n",(0,r.jsx)(n.h2,{id:"installation-locale-d\xe9taill\xe9e",children:"Installation locale d\xe9taill\xe9e"}),"\n",(0,r.jsx)(n.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)(n.pre,{children:(0,r.jsx)(n.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)(n.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)(n.p,{children:["Pour g\xe9n\xe9rer les cl\xe9s n\xe9cessaires \xe0 la configuration des moteurs, \xe0 l'heure actuelle, on ",(0,r.jsx)(n.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)(n.p,{children:"Pour chaque moteur, on aura besoin :"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["d'une ou deux cl\xe9s Fernet (pour le champ ",(0,r.jsx)(n.code,{children:"FERNET_KEY"})," et possiblement des mots de passe),"]}),"\n",(0,r.jsxs)(n.li,{children:["d'une cl\xe9 secr\xe8te Django (pour le champ ",(0,r.jsx)(n.code,{children:"SECRET_KEY"}),")."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Vous pouvez g\xe9n\xe9rer 30 cl\xe9s uniques de chaque type en lan\xe7ant les commandes :"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.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)(n.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)(n.p,{children:["On aura \xe9galement besoin d'une cl\xe9 de test Stripe pour le champ ",(0,r.jsx)(n.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)(n.h3,{id:"fedow-lespass-laboutik",children:"Fedow, Lespass, LaBoutik"}),"\n",(0,r.jsx)(n.p,{children:"D\xe9marrons en clonant les d\xe9p\xf4ts des diff\xe9rents moteurs :"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.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)(n.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)(n.p,{children:["Chaque moteur a besoin de son propre fichier ",(0,r.jsx)(n.code,{children:".env"}),", que vous pouvez baser sur les fichiers ",(0,r.jsx)(n.code,{children:"env_example"})," qu'on vient de cloner."]}),"\n",(0,r.jsx)(n.admonition,{title:"Attention",type:"warning",children:(0,r.jsxs)(n.p,{children:["Toute variable d'environnement, doit \xeatre trouvable dans le fichier ",(0,r.jsx)(n.code,{children:".env"}),". Pas de suppression de variable ! Elle peut par contre suivant les cas rester vide (nullable)."]})}),"\n",(0,r.jsx)(n.h4,{id:"environnement-fedow",children:"Environnement Fedow"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="tibillet-dev$"',children:"cp Fedow/env_example Fedow/.env\n"})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Nom"}),(0,r.jsx)(n.th,{children:"Environnement cible"}),(0,r.jsx)(n.th,{children:"Nullable"}),(0,r.jsx)(n.th,{children:"Valeur par d\xe9faut"}),(0,r.jsx)(n.th,{children:"Notes"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"SECRET_KEY"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Une des cl\xe9s secr\xe8tes Django g\xe9n\xe9r\xe9es pr\xe9c\xe9demment"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"FERNET_KEY"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Une des cl\xe9s Fernet g\xe9n\xe9r\xe9es pr\xe9c\xe9demment"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"STRIPE_KEY"})}),(0,r.jsx)(n.td,{children:"Production"}),(0,r.jsx)(n.td,{children:"Oui"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Cl\xe9 API de votre compte Stripe"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"DOMAIN"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"fedow.tibillet.localhost"})}),(0,r.jsx)(n.td,{children:"\xc0 adapter \xe0 votre nom de domaine et sous-domaine en production"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"STRIPE_KEY_TEST"})}),(0,r.jsx)(n.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(n.td,{children:"Oui"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Cl\xe9 API de test de votre compte Stripe"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"STRIPE_TEST"})}),(0,r.jsx)(n.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"0"}),(0,r.jsxs)(n.td,{children:["Passer \xe0 1 si ",(0,r.jsx)(n.code,{children:"STRIPE_KEY_TEST"})," est rempli"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"STRIPE_ENDPOINT_SECRET_TEST"})}),(0,r.jsx)(n.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(n.td,{children:"Oui"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Aucune id\xe9e"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"DEBUG"})}),(0,r.jsx)(n.td,{children:"D\xe9veloppement"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"0"}),(0,r.jsx)(n.td,{children:"Passer \xe0 1 pour le d\xe9veloppement"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"TEST"})}),(0,r.jsx)(n.td,{children:"Tests"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"0"}),(0,r.jsx)(n.td,{children:"Passer \xe0 1 pour les tests"})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"environnement-lespass",children:"Environnement Lespass"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="tibillet-dev$"',children:"cp Lespass/env_example Lespass/.env\n"})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Nom"}),(0,r.jsx)(n.th,{children:"Environnement cible"}),(0,r.jsx)(n.th,{children:"Nullable"}),(0,r.jsx)(n.th,{children:"Valeur par d\xe9faut"}),(0,r.jsx)(n.th,{children:"Notes"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"SECRET_KEY"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Une des cl\xe9s secr\xe8tes Django g\xe9n\xe9r\xe9es pr\xe9c\xe9demment"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"FERNET_KEY"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Une des cl\xe9s Fernet g\xe9n\xe9r\xe9es pr\xe9c\xe9demment"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"STRIPE_KEY"})}),(0,r.jsx)(n.td,{children:"Production"}),(0,r.jsx)(n.td,{children:"Oui"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Cl\xe9 API de votre compte Stripe"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"DOMAIN"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"tibillet.localhost"})}),(0,r.jsx)(n.td,{children:"\xc0 adapter \xe0 votre nom de domaine en production"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"SUB"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"lespass"})}),(0,r.jsx)(n.td,{children:"Sous-domaine de l'instance, \xe0 adapter en production"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"META"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"agenda"})}),(0,r.jsx)(n.td,{children:"Sous-domaine de l'agenda f\xe9d\xe9r\xe9, \xe0 adapter en production"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"FEDOW_DOMAIN"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"fedow.tibillet.localhost"})}),(0,r.jsx)(n.td,{children:"Domaine et sous-domaine du moteur Fedow"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"PUBLIC"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"TiBillet Coop."}),(0,r.jsx)(n.td,{children:"Nom de l'instance principale"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"TIME_ZONE"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"Europe/Paris"}),(0,r.jsx)(n.td,{children:"Plage horaire TZ de l'instance"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"ADMIN_EMAIL"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Email administrateur (pour le\u22c5a premier\u22c5e admin)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"POSTGRES_DB"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"lespass"}),(0,r.jsx)(n.td,{children:"\xc0 changer en production si n\xe9cessaire"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"POSTGRES_USER"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"lespass_postgres"}),(0,r.jsx)(n.td,{children:"\xc0 changer en production"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"POSTGRES_PASSWORD"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Mot de passe fort (une des cl\xe9s Fernets par exemple)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"EMAIL_HOST"}),", ",(0,r.jsx)(n.code,{children:"EMAIL_PORT"}),", ",(0,r.jsx)(n.code,{children:"EMAIL_HOST_USER"}),", ",(0,r.jsx)(n.code,{children:"EMAIL_HOST_PASSWORD"})]}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Oui"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Serveur d'email, requis pour confirmer des abonn\xe9\u22c5es par exemple"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"STRIPE_KEY_TEST"})}),(0,r.jsx)(n.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(n.td,{children:"Oui"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Cl\xe9 API de test de votre compte Stripe"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"STRIPE_TEST"})}),(0,r.jsx)(n.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"0"}),(0,r.jsxs)(n.td,{children:["Passer \xe0 1 si ",(0,r.jsx)(n.code,{children:"STRIPE_KEY_TEST"})," est rempli"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"DEBUG"})}),(0,r.jsx)(n.td,{children:"D\xe9veloppement"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"0"}),(0,r.jsx)(n.td,{children:"Passer \xe0 1 pour le d\xe9veloppement"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"TEST"})}),(0,r.jsx)(n.td,{children:"Tests"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"0"}),(0,r.jsx)(n.td,{children:"Passer \xe0 1 pour les tests"})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"environnement-laboutik",children:"Environnement LaBoutik"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="tibillet-dev$"',children:"cp LaBoutik/env_example LaBoutik/.env\n"})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Nom"}),(0,r.jsx)(n.th,{children:"Environnement cible"}),(0,r.jsx)(n.th,{children:"Nullable"}),(0,r.jsx)(n.th,{children:"Valeur par d\xe9faut"}),(0,r.jsx)(n.th,{children:"Notes"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"SECRET_KEY"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Une des cl\xe9s secr\xe8tes Django g\xe9n\xe9r\xe9es pr\xe9c\xe9demment"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"FERNET_KEY"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Une des cl\xe9s Fernet g\xe9n\xe9r\xe9es pr\xe9c\xe9demment"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"DOMAIN"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"laboutik.tibillet.localhost"})}),(0,r.jsx)(n.td,{children:"\xc0 adapter \xe0 votre nom de domaine et sous-domaine en production"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"FEDOW_URL"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://fedow.tibillet.localhost/",children:"https://fedow.tibillet.localhost/"})}),(0,r.jsx)(n.td,{children:"URL du moteur Fedow"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"LESPASS_TENANT_URL"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://lespass.tibillet.localhost/",children:"https://lespass.tibillet.localhost/"})}),(0,r.jsx)(n.td,{children:"URL de l'instance Lespass"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"TIME_ZONE"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"Europe/Paris"}),(0,r.jsx)(n.td,{children:"Plage horaire TZ de l'instance"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"ADMIN_EMAIL"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Email administrateur (pour le\u22c5a premier\u22c5e admin)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"MAIN_ASSET_NAME"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Le nom de votre unit\xe9 de valeur cashless (Pi\xe9cette, CoeurDor\u2026 comme vous voulez)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"POSTGRES_DB"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"laboutik"}),(0,r.jsx)(n.td,{children:"\xc0 changer en production si n\xe9cessaire"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"POSTGRES_USER"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"laboutik_user"}),(0,r.jsx)(n.td,{children:"\xc0 changer en production"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"POSTGRES_PASSWORD"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Mot de passe fort (une des cl\xe9s Fernets par exemple)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"EMAIL_HOST"}),", ",(0,r.jsx)(n.code,{children:"EMAIL_PORT"}),", ",(0,r.jsx)(n.code,{children:"EMAIL_HOST_USER"}),", ",(0,r.jsx)(n.code,{children:"EMAIL_HOST_PASSWORD"})]}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Oui"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Serveur d'email, requis pour confirmer des abonn\xe9\u22c5es par exemple"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"BORG_PASSPHRASE"})}),(0,r.jsx)(n.td,{children:"Tous"}),(0,r.jsx)(n.td,{children:"Oui"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Mot de passe utilis\xe9 pour la sauvegarde des donn\xe9es"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"DEBUG"})}),(0,r.jsx)(n.td,{children:"D\xe9veloppement"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"0"}),(0,r.jsx)(n.td,{children:"Passer \xe0 1 pour le d\xe9veloppement"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"TEST"})}),(0,r.jsx)(n.td,{children:"Tests"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"0"}),(0,r.jsx)(n.td,{children:"Passer \xe0 1 pour les tests"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"DEMO"})}),(0,r.jsx)(n.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(n.td,{children:"Non"}),(0,r.jsx)(n.td,{children:"0"}),(0,r.jsx)(n.td,{children:"Passer \xe0 1 pour une simulation de terminal de caisse"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"SENTRY_DNS"})}),(0,r.jsx)(n.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(n.td,{children:"Oui"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Sentry Debug pour le back-end"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"SENTRY_FRONT_DNS"}),", ",(0,r.jsx)(n.code,{children:"SENTRY_FRONT_ASSET"})]}),(0,r.jsx)(n.td,{children:"D\xe9veloppement, Tests"}),(0,r.jsx)(n.td,{children:"Oui"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Sentry Debug pour le front-end"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"DEMO_TAGID_CM"}),", ",(0,r.jsx)(n.code,{children:"DEMO_TAGID_CLIENT1"}),", ",(0,r.jsx)(n.code,{children:"DEMO_TAGID_CLIENT2"})]}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Oui"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Aucune id\xe9e"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"La configuration devrait \xeatre maintenant compl\xe8te pour les trois moteurs."}),"\n",(0,r.jsx)(n.h3,{id:"le-dossier-test-driven-development",children:"Le dossier Test Driven Development"}),"\n",(0,r.jsx)(n.p,{children:"On peut lancer tout notre environnement depuis le d\xe9pot des tests."}),"\n",(0,r.jsx)(n.p,{children:"L'installation est similaire aux moteurs :"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.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)(n.p,{children:"C'est fait \u263a\ufe0f On peut maintenant conteneuriser l'application enti\xe8re depuis le dossier des tests."}),"\n",(0,r.jsx)(n.p,{children:"Ce dernier contient un conteneur suppl\xe9mentaire : Traefik."}),"\n",(0,r.jsx)(n.p,{children:"C'est un reverse proxy. Il permet permet de router les requetes https en direction des conteneurs."}),"\n",(0,r.jsx)(n.h2,{id:"d\xe9marrage-des-moteurs",children:"D\xe9marrage des moteurs"}),"\n",(0,r.jsx)(n.admonition,{type:"warning",children:(0,r.jsx)(n.p,{children:"Si vous avez t\xe9l\xe9charg\xe9 le dossier pr\xeat \xe0 installer, pensez \xe0 faire un git pull dans chacun des 4 d\xe9pots avant de lancer !"})}),"\n",(0,r.jsx)(n.p,{children:"Lancement des moteurs depuis le d\xe9pot des tests :"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Test-Driven-Development$"',children:"docker network create frontend # uniquement la premi\xe8re fois, c'est un r\xe9seau virtuel utilis\xe9 par Traefik.\ndocker compose up -d # Le premier lancement peut \xeatre long, il t\xe9l\xe9charge et construit toute les images.\n"})}),"\n",(0,r.jsx)(n.p,{children:"Vous pouvez acc\xe9der en prime aux logs avec la commande :"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Test-Driven-Development$"',children:"docker compose logs -f\n"})}),"\n",(0,r.jsx)(n.p,{children:"Pour supprimer les conteneurs :"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Test-Driven-Development$"',children:"docker compose down -v # -v pour les volumes utilis\xe9s par les bases de donn\xe9es.\n"})}),"\n",(0,r.jsx)(n.admonition,{title:"Attention",type:"warning",children:(0,r.jsxs)(n.p,{children:["Ce ",(0,r.jsx)(n.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)(n.em,{children:"parent"})," aux tests, appel\xe9 pour l'exemple ",(0,r.jsx)(n.code,{children:"tibillet-dev"}),". Contre-intuitif, mais maintenant vous savez \ud83d\ude09"]})}),"\n",(0,r.jsxs)(n.p,{children:["La principale diff\xe9rence entre les conteneurs de dev et de prod, c'est qu'en dev la commande ",(0,r.jsx)(n.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)(n.p,{children:"On va les lancer de pr\xe9f\xe9rence dans l'ordre :"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"Fedow"}),"\n",(0,r.jsx)(n.li,{children:"Lespass"}),"\n",(0,r.jsx)(n.li,{children:"LaBoutik (qui a besoin des deux autres pour fonctionner)"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Les outils dont on a besoin sont dans les conteneurs, nomm\xe9s d'apr\xe8s leur moteur : ",(0,r.jsx)(n.code,{children:"fedow_django"}),", ",(0,r.jsx)(n.code,{children:"lespass_django"})," et enfin ",(0,r.jsx)(n.code,{children:"laboutik_django"}),". Pour rentrer dans un conteneur (exemple avec Fedow) :"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.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)(n.p,{children:"\xc0 partir de l\xe0, on a quelques options."}),"\n",(0,r.jsxs)(n.p,{children:["La premi\xe8re, c'est le script ",(0,r.jsx)(n.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)(n.strong,{children:"premier d\xe9marrage"})," de notre application :"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="fedow_django$"',children:"./flush.sh\n"})}),"\n",(0,r.jsxs)(n.p,{children:["On l'utilisera aussi quand on veut ",(0,r.jsx)(n.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)(n.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)(n.p,{children:"Pour lancer l'environnement virtuel de Poetry depuis le conteneur :"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.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)(n.p,{children:["Django se g\xe8re avec un script appel\xe9 ",(0,r.jsx)(n.code,{children:"manage.py"}),". Deux commandes nous int\xe9ressent \xe0 l'heure actuelle :"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"rsp"})," (alias de ",(0,r.jsx)(n.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)(n.code,{children:"flush"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Optionnellement, si on a des bugs graphiques, on peut tenter ",(0,r.jsx)(n.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)(n.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)(n.admonition,{title:"Cr\xe9ation d'alias",type:"tip",children:[(0,r.jsx)(n.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)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="~/.bashrc"',children:"function dockex {\n docker exec -ti $1 bash\n}\n"})}),(0,r.jsx)(n.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)(n.h3,{id:"\xe7a-tourne-",children:"\xc7a tourne ?"}),"\n",(0,r.jsx)(n.p,{children:"Si vous avez utilis\xe9 la configuration des sous-domaines par d\xe9faut, vous avez maintenant acc\xe8s :"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["au moteur de f\xe9d\xe9ration Fedow sur ",(0,r.jsx)(n.a,{href:"https://fedow.tibillet.localhost",children:"fedow.tibillet.localhost"}),","]}),"\n",(0,r.jsxs)(n.li,{children:["\xe0 une instance du moteur de billetterie Lespass sur ",(0,r.jsx)(n.a,{href:"https://lespass.tibillet.localhost",children:"lespass.tibillet.localhost"}),","]}),"\n",(0,r.jsxs)(n.li,{children:["au serveur de caisse LaBoutik sur ",(0,r.jsx)(n.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)(n.p,{children:"Si tout marche comme pr\xe9vu, f\xe9licitations : vous \xeates pr\xeat\u22c5es \xe0 vous lancer \ud83d\udd27"}),"\n",(0,r.jsx)(n.p,{children:"Sinon, venez nous en parler, on est l\xe0 pour aider !"}),"\n",(0,r.jsxs)(n.admonition,{title:"Pour conclure",type:"note",children:[(0,r.jsxs)(n.p,{children:["N'oubliez pas de ",(0,r.jsx)(n.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)(n.p,{children:["Si vous avez peur de ne pas vous en souvenir, enlevez l'option ",(0,r.jsx)(n.code,{children:"-d"})," \xe0 ",(0,r.jsx)(n.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)(n.h2,{id:"cycle-de-vie",children:"Cycle de vie"}),"\n",(0,r.jsx)(n.h3,{id:"mises-\xe0-jour",children:"Mises \xe0 jour"}),"\n",(0,r.jsx)(n.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)(n.pre,{children:(0,r.jsx)(n.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)(n.h3,{id:"tests",children:"Tests"}),"\n",(0,r.jsx)(n.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)(n.pre,{children:(0,r.jsx)(n.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)(n.h3,{id:"sauvegardes",children:"Sauvegardes"}),"\n",(0,r.jsxs)(n.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)(n.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:n}={...(0,d.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>t,x:()=>l});var r=s(6540);const d={},i=r.createContext(d);function t(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:t(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/fr/assets/js/runtime~main.f70de566.js b/fr/assets/js/runtime~main.1317559a.js similarity index 99% rename from fr/assets/js/runtime~main.f70de566.js rename to fr/assets/js/runtime~main.1317559a.js index 1e69793e..0a3cd373 100644 --- a/fr/assets/js/runtime~main.f70de566.js +++ b/fr/assets/js/runtime~main.1317559a.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:"b4e0c954",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:"cd74af4f",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 63a6d3ee..df7be371 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 93718632..b5b5b225 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 28c295b7..26fbd471 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 b636cf19..ee46d16e 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 c3eb06d8..4cc59d53 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 561ec879..8ab685ea 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 70c28054..70dcdc02 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 fe4f4bf7..027125ee 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 c3e175e5..0fbb854f 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 28901891..131e9e66 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 ef58bc05..97ff4a4c 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 82e0ab67..d999d351 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 a2aa1253..cbbe99ca 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 480603fd..956a4461 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 d2a4f075..aa7e64d8 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 17060c92..e590570b 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 5d751835..e12fe209 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 ed2491c3..0e750271 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 87d119e9..2de59b5b 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 950ca681..1ed287ce 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 a38e53ec..ec45394e 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 5ac6574b..3a2b2400 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 cf47b577..dc0553ae 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 2336135a..dab37524 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 e9df78a3..1a9614b0 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 24c8ae8a..62022949 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 612a4600..28ead066 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 fc629d86..b421ddef 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 4c40e4e7..d6a63736 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 890626a4..3a79b087 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 5323a36a..7419de37 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 831635a1..c0e44409 100644 --- a/fr/docs/contribute/development/index.html +++ b/fr/docs/contribute/development/index.html @@ -4,7 +4,7 @@ Développement | TiBillet - + @@ -90,7 +90,7 @@

Déma

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

Test-Driven-Development$
docker compose logs -f

Pour supprimer les conteneurs :

-
Test-Driven-Development$
docker compose doww -v # -v pour les volumes utilisés par les bases de données.
+
Test-Driven-Development$
docker compose down -v # -v pour les volumes utilisés par les bases de données.
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 😉

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 :

diff --git a/fr/docs/install/docker_install/index.html b/fr/docs/install/docker_install/index.html index 15c82315..51598e9c 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 80e95e20..5deda9c5 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 36c9bcff..4680febf 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 347c87ae..315931d5 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 88a8265d..e9cf2e7a 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 c6bc66e0..f161c7f7 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 51774c17..c39e8abf 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 d550e5de..cc3caf79 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 927aca8f..68de637d 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 f7244291..697cdfa9 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 b94e7dd1..07d9f9e2 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 beafeb28..5ed6ac1e 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 622a812e..657eeb4f 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 9b92f816..3c1903bf 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 1de987ba..c82312b1 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 d94685a3..c4331dab 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 a89e8ffb..171b0271 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 56224407..d87b8210 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 4b8dc156..b9ca07b0 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 78af40e9..e4ed9c6e 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 7bdfdfa4..ad226b91 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 060917dd..1e4ac111 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 9b76a24a..fcce6c17 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 177ea6b0..e33c1ce1 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 3b09a292..9ebb98b4 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 05609aed..0105ac04 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 ef20504b..ad0f44ec 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 e5c4a162..184ccaff 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 f73d0efb..37dac7f7 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 6ef6f8b1..15a25b94 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 7dd1a101..5370d487 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 6bae1dbc..3ba79599 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 4f108dc4..df7ab355 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 acedafa6..0f4b5719 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 f18637ef..e6aa541a 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 de133d86..65486b87 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 c1a1070a..e00cd53b 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 5f901d7c..a9fdd58a 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 cb62b30c..759a8740 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 2f210d8e..5c2b745f 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 b928bdb6..e5922ddb 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 900aa91a..9d160912 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 e4efe0b5..41d31e03 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 a9e40eb2..84538b8f 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 9bce9957..ae60396f 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 8e9d1577..863ca688 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 75a86968..0f17e334 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 30e62acc..430d8851 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 54262289..78cf1f8b 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 4c7f2818..c110152a 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 3b98ac95..a713f991 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 cbc97ce6..230a1f2c 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 08d6b7ff..a5eab55e 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 66428e35..5546f621 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 0feb3264..5fe18346 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 0799ba92..ca90b084 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 e26e5fbf..e18bc5d7 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 7cc11484..43dd2538 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 111309a7..91613470 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 ce4b68a9..998a30fb 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 28d0b25d..ed2151ec 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 d64324fb..e6dc4f69 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 59414c4c..e8b56e62 100644 --- a/fr/roadmap/index.html +++ b/fr/roadmap/index.html @@ -4,7 +4,7 @@ Fonctionnalités | TiBillet - + diff --git a/index.html b/index.html index 9e4c0fc0..708472a1 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,7 @@ TiBillet | TiBillet - + diff --git a/roadmap/index.html b/roadmap/index.html index 91f602f9..79ce976c 100644 --- a/roadmap/index.html +++ b/roadmap/index.html @@ -4,7 +4,7 @@ Fonctionnalités | TiBillet - +