205 lines
6.8 KiB
Python
205 lines
6.8 KiB
Python
from typing import List
|
|
import streamlit as st
|
|
from utils.translations import _
|
|
import networkx as nx
|
|
|
|
def get_produits_personnalises(
|
|
G: nx.DiGraph
|
|
) -> List[str]:
|
|
"""
|
|
Récupère la liste des produits personnalisés du niveau 0.
|
|
|
|
Args:
|
|
G (Any): Le graphe NetworkX contenant les données des produits.
|
|
|
|
Returns:
|
|
List[str]: Liste triée des noms de produits.
|
|
"""
|
|
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: nx.DiGraph,
|
|
prod: str
|
|
) -> nx.DiGraph:
|
|
"""
|
|
Supprime un produit du graphe et affiche le message de succès.
|
|
|
|
Args:
|
|
G (Any): Le graphe NetworkX sur lequel supprimer le produit.
|
|
prod (str): Le nom du produit à supprimer.
|
|
"""
|
|
G.remove_node(prod)
|
|
st.success(f"{prod} {str(_('pages.personnalisation.deleted'))}")
|
|
st.session_state.pop("prod_sel", None)
|
|
return G
|
|
|
|
def get_operations_disponibles(
|
|
G: nx.DiGraph
|
|
) -> List[str]:
|
|
"""
|
|
Récupère la liste des opérations d'assemblage disponibles.
|
|
|
|
Args:
|
|
G (Any): Le graphe NetworkX contenant les données des produits et des opérations.
|
|
|
|
Returns:
|
|
List[str]: Liste triée des noms des opérations.
|
|
"""
|
|
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: nx.DiGraph,
|
|
prod: str
|
|
) -> List[str]:
|
|
"""
|
|
Récupère les opérations actuellement liées au produit.
|
|
|
|
Args:
|
|
G (nx.DiGraph): Le graphe NetworkX contenant les données des produits et des opérations.
|
|
prod (str): Le nom du produit dont récupérer les opérations.
|
|
|
|
Returns:
|
|
List[str]: Liste des noms des opérations actuelles.
|
|
"""
|
|
return [succ for succ in G.successors(prod) if G.nodes[succ].get("niveau") == "10"]
|
|
|
|
def get_composants_niveau1(
|
|
G: nx.DiGraph
|
|
) -> List[str]:
|
|
"""
|
|
Récupère la liste des composants de niveau 1.
|
|
|
|
Args:
|
|
G (nx.DiGraph): Le graphe NetworkX contenant les données des produits et des composants.
|
|
|
|
Returns:
|
|
List[str]: Liste triée des noms des composants.
|
|
"""
|
|
return sorted([n for n, d in G.nodes(data=True) if d.get("niveau") == "1"])
|
|
|
|
def get_composants_lies(
|
|
G: nx.DiGraph,
|
|
prod: str
|
|
) -> List[str]:
|
|
"""
|
|
Récupère les composants actuellement liés au produit.
|
|
|
|
Args:
|
|
G (nx.DiGraph): Le graphe NetworkX contenant les données des produits et des composants.
|
|
prod (str): Le nom du produit dont récupérer les composants.
|
|
|
|
Returns:
|
|
List[str]: Liste des noms des composants liés.
|
|
"""
|
|
return [succ for succ in G.successors(prod) if G.nodes[succ].get("niveau") == "1"]
|
|
|
|
def mettre_a_jour_operations(
|
|
G: nx.DiGraph,
|
|
prod: str,
|
|
curr_ops: List[str],
|
|
sel_op: str
|
|
) -> nx.DiGraph:
|
|
"""
|
|
Met à jour les opérations liées au produit.
|
|
|
|
Args:
|
|
G (Any): Le graphe NetworkX contenant les données des produits et des opérations.
|
|
prod (str): Le nom du produit dont mettre à jour les opérations.
|
|
curr_ops (List[str]): Liste actuelle des opérations liées.
|
|
sel_op (str): L'opération sélectionnée pour mise à jour.
|
|
|
|
Notes:
|
|
Cette fonction crée ou supprime les liens entre le produit et les opérations
|
|
selon la sélection effectuée par l'utilisateur.
|
|
"""
|
|
|
|
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: nx.DiGraph,
|
|
prod: str,
|
|
linked: List[str],
|
|
nouveaux: List[str]
|
|
) -> nx.DiGraph:
|
|
"""
|
|
Met à jour les composants liés au produit.
|
|
|
|
Args:
|
|
G (nx.DiGraph): Le graphe NetworkX contenant les données des produits et des composants.
|
|
prod (str): Le nom du produit dont mettre à jour les composants.
|
|
linked (List[str]): Liste actuelle des composants liés.
|
|
nouveaux (List[str]): Nouvelle liste de composants à lier.
|
|
|
|
Notes:
|
|
Cette fonction crée ou supprime les liens entre le produit et les composants
|
|
selon la sélection effectuée par l'utilisateur.
|
|
"""
|
|
"""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: nx.DiGraph
|
|
) -> nx.DiGraph:
|
|
"""
|
|
Méthode de personnalisation qui permet à l'utilisateur d'ajuster un produit.
|
|
|
|
Args:
|
|
G (Any): Le graphe NetworkX sur lequel modifier les produits et leurs composants.
|
|
Contient des données concernant la personalisation des produits,
|
|
leur niveau, et les opérations liées.
|
|
|
|
Notes:
|
|
Cette fonction fournit une interface utilisateur pour sélectionner
|
|
un produit à personnaliser, gérer ses composants, et définir ses opérations
|
|
d'assemblage. Elle implémente la logique de mise à jour des connexions entre
|
|
les différents éléments du graphe.
|
|
"""
|
|
st.markdown(f"## {str(_('pages.personnalisation.modify_product'))}")
|
|
|
|
# Sélection du produit à modifier
|
|
produits0 = get_produits_personnalises(G)
|
|
sel_display = st.multiselect(str(_("pages.personnalisation.products_to_modify")), 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'))} {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")), [str(_("pages.personnalisation.none"))] + 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'))} {prod}", options=niveau1, default=linked)
|
|
|
|
# Mise à jour des liens si demandé
|
|
if st.button(f"{str(_('pages.personnalisation.update'))} {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'))}")
|
|
|
|
return G
|