mirror of
https://github.com/almet/copanier.git
synced 2025-04-28 03:22:37 +02:00
Add a demo mode
This commit is contained in:
parent
ff58fe9d0d
commit
b60a9abb84
8 changed files with 103 additions and 8 deletions
|
@ -77,10 +77,38 @@ class Base:
|
|||
|
||||
@dataclass
|
||||
class PersistedBase(Base):
|
||||
|
||||
@classmethod
|
||||
def get_root(cls):
|
||||
return Path(config.DATA_ROOT) / cls.__root__
|
||||
root = Path(config.DATA_ROOT)
|
||||
if getattr(config, 'DEMO_MODE', False):
|
||||
root = root / "demo"
|
||||
|
||||
return root / cls.__root__
|
||||
|
||||
|
||||
@dataclass
|
||||
class SavedConfiguration(PersistedBase):
|
||||
__lock__ = threading.Lock()
|
||||
demo_mode_enabled: bool = False
|
||||
|
||||
@classmethod
|
||||
def get_path(cls):
|
||||
return Path(config.DATA_ROOT) / "config.yml"
|
||||
|
||||
def persist(self):
|
||||
with self.__lock__:
|
||||
self.get_path().write_text(self.dump())
|
||||
|
||||
@classmethod
|
||||
def load(cls):
|
||||
path = cls.get_path()
|
||||
if path.exists():
|
||||
data = yaml.safe_load(path.read_text())
|
||||
data = {k: v for k, v in data.items() if k in cls.__dataclass_fields__}
|
||||
else:
|
||||
data = {}
|
||||
return cls(**data)
|
||||
|
||||
@dataclass
|
||||
class Person(Base):
|
||||
|
@ -134,6 +162,12 @@ class Groups(PersistedBase):
|
|||
groups = cls(**data)
|
||||
return groups
|
||||
|
||||
@classmethod
|
||||
def is_defined(cls):
|
||||
groups = cls.load()
|
||||
return len(groups.groups) > 0
|
||||
|
||||
|
||||
def persist(self):
|
||||
with self.__lock__:
|
||||
self.get_path().write_text(self.dump())
|
||||
|
@ -385,6 +419,10 @@ class Delivery(PersistedBase):
|
|||
id_ = str(path.relative_to(cls.get_root())).replace(".yml", "")
|
||||
yield Delivery.load(id_)
|
||||
|
||||
@classmethod
|
||||
def is_defined(cls):
|
||||
return len(list(cls.all())) > 0
|
||||
|
||||
@classmethod
|
||||
def incoming(cls):
|
||||
return sorted(
|
||||
|
|
|
@ -720,3 +720,12 @@ ul.actions > li {
|
|||
small {
|
||||
font-size: 70% !important;
|
||||
}
|
||||
|
||||
.demo-mode {
|
||||
background: var(--warning-color);
|
||||
padding: 0em !important;
|
||||
}
|
||||
|
||||
.header {
|
||||
padding-bottom: 2em !important;
|
||||
}
|
|
@ -18,6 +18,13 @@
|
|||
|
||||
</head>
|
||||
<body>
|
||||
{% if config.DEMO_MODE %}
|
||||
<div class="header">
|
||||
<div class="home-menu pure-menu pure-menu-horizontal pure-menu-fixed demo-mode">
|
||||
<p class="pure-menu-heading">Le site est en mode démo. <a href="{{ url_for('desactivate_demo') }}">désactiver</a></p>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div id="layout">
|
||||
<a href="#menu" id="menuLink" class="menu-link">
|
||||
|
|
|
@ -4,7 +4,6 @@
|
|||
<div class="header">
|
||||
<h1>Distributions</h1>
|
||||
</div>
|
||||
|
||||
{% with deliveries=incoming %}
|
||||
{% include "includes/delivery_list.html" %}
|
||||
{% endwith %}
|
||||
|
|
12
copanier/templates/onboarding.html
Normal file
12
copanier/templates/onboarding.html
Normal file
|
@ -0,0 +1,12 @@
|
|||
{% extends "base.html" %}
|
||||
{% block body %}
|
||||
<h1>Bienvenue sur copanier</h1>
|
||||
<p>On dirait que vous venez de lancer ce logiciel pour la première fois, bienvenue ici 😀.</p>
|
||||
<p>Pour commencer, deux options :</p>
|
||||
<ul>
|
||||
<li><a href=" {{ url_for('activate_demo') }}">Activer le mode de démonstration</a>, cela va charger des données de démonstration pour que vous puissiez aller jeter un coup d'oeil au fonctionnement du logiciel ;</li>
|
||||
<li>Ou alors si vous avez envie de commencer à utiliser le logiciel, vous devez commencer par <a href="{{ url_for('groups') }}">rejoindre un groupe</a> et commencer une distribution.</p></li>
|
||||
|
||||
</ul>
|
||||
<p>Bon voyage 🙏 !</p>
|
||||
{% endblock body %}
|
|
@ -5,7 +5,7 @@ from roll import HttpError
|
|||
from debts.solver import order_balance, check_balance, reduce_balance
|
||||
|
||||
from .core import app, staff_only, session, env
|
||||
from ..models import Delivery, Person, Order, ProductOrder
|
||||
from ..models import Delivery, Person, Order, ProductOrder, Groups, SavedConfiguration
|
||||
from .. import utils, reports, emails, config
|
||||
|
||||
|
||||
|
@ -16,8 +16,11 @@ async def on_startup():
|
|||
|
||||
@app.route("/", methods=["GET"])
|
||||
async def home(request, response):
|
||||
if not Delivery.is_defined() and not Groups.is_defined():
|
||||
response.redirect = url_for("onboarding")
|
||||
return
|
||||
if not request["user"].group_id:
|
||||
response.redirect = "/groupes"
|
||||
response.redirect = url_for("groups")
|
||||
return
|
||||
response.html(
|
||||
"delivery/list_deliveries.html",
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
from .core import app, session, env, url
|
||||
|
||||
from ..models import Groups, Person
|
||||
from ..models import Groups, Person, SavedConfiguration
|
||||
from .. import utils, emails, config
|
||||
|
||||
|
||||
|
@ -11,6 +11,13 @@ async def auth_required(request, response):
|
|||
# route as unprotected.
|
||||
if request.path.startswith("/static/"):
|
||||
return
|
||||
|
||||
saved_config = SavedConfiguration.load()
|
||||
if saved_config.demo_mode_enabled:
|
||||
setattr(config, 'DEMO_MODE', True)
|
||||
else:
|
||||
setattr(config, 'DEMO_MODE', False)
|
||||
|
||||
if request.route.payload and not request.route.payload.get("unprotected"):
|
||||
token = request.cookies.get("token")
|
||||
email = None
|
||||
|
@ -83,3 +90,23 @@ async def set_sesame(request, response, token):
|
|||
async def logout(request, response):
|
||||
response.cookies.set(name="token", value="", httponly=True)
|
||||
response.redirect = "/"
|
||||
|
||||
|
||||
@app.route("/premier-lancement", methods=["GET"])
|
||||
async def onboarding(request, response):
|
||||
response.html("onboarding.html")
|
||||
|
||||
@app.route("/premier-lancement/demo", methods=["GET"])
|
||||
async def activate_demo(request, response):
|
||||
saved_config = SavedConfiguration.load()
|
||||
saved_config.demo_mode_enabled = True
|
||||
saved_config.persist()
|
||||
response.redirect = "/"
|
||||
|
||||
@app.route("/premier-lancement/demo/désactiver", methods=["GET"])
|
||||
async def desactivate_demo(request, response):
|
||||
saved_config = SavedConfiguration.load()
|
||||
saved_config.demo_mode_enabled = False
|
||||
saved_config.persist()
|
||||
response.redirect = "/"
|
||||
|
||||
|
|
|
@ -165,9 +165,9 @@ def test_productorder_quantity():
|
|||
|
||||
def test_group_management():
|
||||
ndp = Group(
|
||||
id="nid-de-poules", name="Nid de poules", members=["someone@domain.tld"]
|
||||
id="passage-creuse", name="Nid de poules", members=["someone@domain.tld"]
|
||||
)
|
||||
assert ndp.id == "nid-de-poules"
|
||||
assert ndp.id == "passage-creuse"
|
||||
assert ndp.name == "Nid de poules"
|
||||
assert len(ndp.members) == 1
|
||||
groups = Groups.load()
|
||||
|
@ -177,7 +177,7 @@ def test_group_management():
|
|||
groups.add_user("simon@tld", ndp.id)
|
||||
assert "simon@tld" in groups.groups[ndp.id].members
|
||||
|
||||
ladouce = Group(id="la-douce", name="La douce", members=[])
|
||||
ladouce = Group(id="la-lointaine", name="La douce", members=[])
|
||||
groups.add_group(ladouce)
|
||||
groups.add_user("simon@tld", ladouce.id)
|
||||
assert "simon@tld" in groups.groups[ladouce.id].members
|
||||
|
|
Loading…
Reference in a new issue