import logging
import os
import dash_bootstrap_components as dbc
import tomllib
from dash import Dash, Input, Output, State, dcc, html, page_container, page_registry
from dotenv import load_dotenv
from flask import Response, send_from_directory
load_dotenv()
development = os.getenv("DEVELOPMENT").lower() == "true"
meta_tags = [
{"name": "viewport", "content": "width=device-width, initial-scale=1"},
]
if development:
meta_tags.append({"name": "robots", "content": "noindex"})
app = Dash(
external_stylesheets=[dbc.themes.SIMPLEX],
title="decp.info",
use_pages=True,
compress=True,
meta_tags=meta_tags,
)
# COSMO (belle font, blue),
# UNITED (rouge, ubuntu font),
# LUMEN (gros séparateur, blue clair),
# SIMPLEX (rouge, séparateur)
# robots.txt
@app.server.route("/robots.txt")
def robots():
return send_from_directory("./assets", "robots.txt", mimetype="text/plain")
@app.server.route("/sitemap.xml")
def sitemap():
base_url = "https://decp.info"
pages = [
"/",
"/statistiques",
"/tableau",
"/a-propos",
]
xml = '\n'
xml += '\n'
for page in pages:
xml += " \n"
xml += f" {base_url}{page}\n"
xml += " \n"
xml += ""
return Response(xml, mimetype="text/xml")
logger = logging.getLogger("decp.info")
logging.basicConfig(
format="%(asctime)s %(levelname)-8s %(message)s",
level=logging.INFO,
datefmt="%Y-%m-%d %H:%M:%S",
)
with open("./pyproject.toml", "rb") as f:
pyproject = tomllib.load(f)
version = "v" + pyproject["project"]["version"]
app.index_string = """
{%metas%}
{%title%}
{%favicon%}
{%css%}
{%app_entry%}
"""
navbar = dbc.Navbar(
dbc.Container(
fluid=True,
children=[
dbc.NavItem(
children=[
dcc.Link(html.H1("decp.info"), href="/", className="logo"),
html.P(
[
html.A(
version,
href="https://github.com/ColinMaudry/decp.info/blob/main/CHANGELOG.md",
)
],
className="version",
),
],
style={"minWidth": "230px"},
),
dbc.Nav(
children=[dcc.Markdown(os.getenv("ANNOUNCEMENTS"), id="announcements")],
style={
"maxWidth": "1200px",
"display": "inline-block",
},
navbar=True,
id="announcements-nav",
),
dbc.NavbarToggler(id="navbar-toggler"),
dbc.Collapse(
dbc.Nav(
[
dbc.NavItem(
dbc.NavLink(
page["name"].replace(" ", " "),
href=page["relative_path"],
active="exact",
)
)
for page in page_registry.values()
if page["name"] not in ["Acheteur", "Titulaire", "Marché"]
],
className="ms-auto",
navbar=True,
),
id="navbar-collapse",
navbar=True,
),
],
),
color="light",
dark=False,
className="mb-4",
expand="lg",
)
app.layout = html.Div(
[
navbar,
dbc.Container(
page_container,
fluid=True,
id="page-content-container",
className="mb-4",
),
]
)
@app.callback(
Output("navbar-collapse", "is_open"),
[Input("navbar-toggler", "n_clicks")],
[State("navbar-collapse", "is_open")],
)
def toggle_navbar_collapse(n, is_open):
if n:
return not is_open
return is_open