88 lines
3.7 KiB
Python
88 lines
3.7 KiB
Python
import streamlit as st
|
|
from utils.translations import _
|
|
|
|
def get_produits_personnalises(G):
|
|
"""Récupère la liste des produits personnalisés du niveau 0."""
|
|
return sorted([n for n, d in G.nodes(data=True) if d.get("niveau") == "0" and d.get("personnalisation") == "oui"])
|
|
|
|
def supprimer_produit(G, prod):
|
|
"""Supprime un produit du graphe."""
|
|
G.remove_node(prod)
|
|
st.success(f"{prod} {str(_('pages.personnalisation.deleted', 'supprimé'))}")
|
|
st.session_state.pop("prod_sel", None)
|
|
return G
|
|
|
|
def get_operations_disponibles(G):
|
|
"""Récupère la liste des opérations d'assemblage disponibles."""
|
|
return sorted([
|
|
n for n, d in G.nodes(data=True)
|
|
if d.get("niveau") == "10"
|
|
and any(G.has_edge(p, n) and G.nodes[p].get("niveau") == "0" for p in G.predecessors(n))
|
|
])
|
|
|
|
def get_operations_actuelles(G, prod):
|
|
"""Récupère les opérations actuellement liées au produit."""
|
|
return [succ for succ in G.successors(prod) if G.nodes[succ].get("niveau") == "10"]
|
|
|
|
def get_composants_niveau1(G):
|
|
"""Récupère la liste des composants de niveau 1."""
|
|
return sorted([n for n, d in G.nodes(data=True) if d.get("niveau") == "1"])
|
|
|
|
def get_composants_lies(G, prod):
|
|
"""Récupère les composants actuellement liés au produit."""
|
|
return [succ for succ in G.successors(prod) if G.nodes[succ].get("niveau") == "1"]
|
|
|
|
def mettre_a_jour_operations(G, prod, curr_ops, sel_op):
|
|
"""Met à jour les opérations liées au produit."""
|
|
none_option = str(_("pages.personnalisation.none", "-- Aucune --"))
|
|
for op in curr_ops:
|
|
if sel_op == none_option or op != sel_op:
|
|
G.remove_edge(prod, op)
|
|
if sel_op != none_option and (not curr_ops or sel_op not in curr_ops):
|
|
G.add_edge(prod, sel_op)
|
|
return G
|
|
|
|
def mettre_a_jour_composants(G, prod, linked, nouveaux):
|
|
"""Met à jour les composants liés au produit."""
|
|
for comp in set(linked) - set(nouveaux):
|
|
G.remove_edge(prod, comp)
|
|
for comp in set(nouveaux) - set(linked):
|
|
G.add_edge(prod, comp)
|
|
return G
|
|
|
|
def modifier_produit(G):
|
|
st.markdown(f"## {str(_('pages.personnalisation.modify_product', 'Modifier un produit final ajouté'))}")
|
|
|
|
# Sélection du produit à modifier
|
|
produits0 = get_produits_personnalises(G)
|
|
sel_display = st.multiselect(str(_("pages.personnalisation.products_to_modify", "Produits à modifier")), options=produits0)
|
|
|
|
if not sel_display:
|
|
return G
|
|
|
|
# Obtention du produit sélectionné
|
|
prod = sel_display[0]
|
|
|
|
# Suppression du produit si demandé
|
|
if st.button(f"{str(_('pages.personnalisation.delete', 'Supprimer'))} {prod}"):
|
|
return supprimer_produit(G, prod)
|
|
|
|
# Gestion des opérations d'assemblage
|
|
ops_dispo = get_operations_disponibles(G)
|
|
curr_ops = get_operations_actuelles(G, prod)
|
|
default_idx = ops_dispo.index(curr_ops[0]) + 1 if curr_ops and curr_ops[0] in ops_dispo else 0
|
|
sel_op = st.selectbox(str(_("pages.personnalisation.linked_assembly_operation", "Opération d'assemblage liée")), [str(_("pages.personnalisation.none", "-- Aucune --"))] + ops_dispo, index=default_idx)
|
|
|
|
# Gestion des composants
|
|
niveau1 = get_composants_niveau1(G)
|
|
linked = get_composants_lies(G, prod)
|
|
nouveaux = st.multiselect(f"{str(_('pages.personnalisation.components_linked_to', 'Composants liés à'))} {prod}", options=niveau1, default=linked)
|
|
|
|
# Mise à jour des liens si demandé
|
|
if st.button(f"{str(_('pages.personnalisation.update', 'Mettre à jour'))} {prod}"):
|
|
G = mettre_a_jour_operations(G, prod, curr_ops, sel_op)
|
|
G = mettre_a_jour_composants(G, prod, linked, nouveaux)
|
|
st.success(f"{prod} {str(_('pages.personnalisation.updated', 'mis à jour'))}")
|
|
|
|
return G
|