Code/app/personnalisation/utils/modification.py
2025-06-05 09:28:49 +02:00

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