| from pathlib import Path |
|
|
| import pandas as pd |
| import streamlit as st |
|
|
| from queries.process_ciq_4g import generate_ciq_4g_excel |
| from utils.ciq_band_profiles import ( |
| parse_band_profile_definitions, |
| read_site_profile_mapping, |
| ) |
| from utils.ciq_excel import get_ciq_sheet_selection_details |
|
|
|
|
| st.title(":material/description: CIQ 4G Generator") |
| st.markdown( |
| """ |
| Genere les exports CIQ 4G a partir du CIQ brut. |
| - **CIQ brut 4G** : obligatoire (format Excel) |
| """ |
| ) |
|
|
| samples_dir = Path(__file__).resolve().parents[1] / "samples" |
| sample_ciq_4g = samples_dir / "CIQ_LTE.xlsx" |
| sample_profile_mapping = samples_dir / "CIQ_BAND_PROFILE_MAPPING.csv" |
|
|
| if sample_ciq_4g.exists() or sample_profile_mapping.exists(): |
| sample_col1, sample_col2 = st.columns(2) |
| with sample_col1: |
| if sample_ciq_4g.exists(): |
| st.download_button( |
| label="Download CIQ 4G sample", |
| data=sample_ciq_4g.read_bytes(), |
| file_name=sample_ciq_4g.name, |
| mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", |
| ) |
| with sample_col2: |
| if sample_profile_mapping.exists(): |
| st.download_button( |
| label="Download band profile mapping sample", |
| data=sample_profile_mapping.read_bytes(), |
| file_name=sample_profile_mapping.name, |
| mime="text/csv", |
| key="ciq4g_profile_mapping_sample", |
| ) |
|
|
| ciq_file = st.file_uploader( |
| "Upload CIQ brut 4G (Excel)", type=["xlsx", "xls"], key="ciq4g_ciq" |
| ) |
|
|
| ciq_sheet_name = None |
| if ciq_file is not None: |
| try: |
| auto_sheet, sheet_names = get_ciq_sheet_selection_details(ciq_file, "4g") |
| ciq_sheet_name = st.selectbox( |
| "Sheet CIQ 4G", |
| options=sheet_names, |
| index=sheet_names.index(auto_sheet), |
| key="ciq4g_sheet_name", |
| ) |
| if len(sheet_names) == 1: |
| st.info(f"Classeur a une seule feuille: utilisation de `{ciq_sheet_name}`.") |
| elif ciq_sheet_name == auto_sheet: |
| st.info(f"Feuille detectee pour la 4G: `{ciq_sheet_name}`.") |
| else: |
| st.info( |
| f"Feuille 4G choisie manuellement: `{ciq_sheet_name}` (auto: `{auto_sheet}`)." |
| ) |
| except Exception as exc: |
| st.warning(f"Detection de feuille 4G impossible: {exc}") |
|
|
| col1, col2 = st.columns(2) |
| with col1: |
| year_suffix = st.text_input("Year suffix", value="26", key="ciq4g_year") |
| with col2: |
| bands_mode = st.selectbox( |
| "Bands mode", |
| options=["Single", "Profiles"], |
| key="ciq4g_bands_mode", |
| ) |
|
|
| default_bands_value = "G9G18U9U21L8L18L26" |
| profile_definitions = None |
| site_profile_mapping = None |
|
|
| if bands_mode == "Single": |
| bands = st.text_input( |
| "Bands string", |
| value=default_bands_value, |
| key="ciq4g_bands", |
| ) |
| else: |
| bands = st.text_input( |
| "Default bands string", |
| value=default_bands_value, |
| key="ciq4g_default_bands", |
| ) |
| profile_text = st.text_area( |
| "Band profiles", |
| value=( |
| "densif = G9G18U9U21L7L8L18L26\n" |
| "rural = G9U9L7L8" |
| ), |
| key="ciq4g_band_profiles", |
| height=120, |
| ) |
| site_profile_file = st.file_uploader( |
| "Upload site profile mapping CSV (site_code,profile)", |
| type=["csv"], |
| key="ciq4g_site_profile_map", |
| ) |
| st.caption("Example mapping: `site_code,profile` then `0273,densif` or `0660,rural`.") |
|
|
| col3, col4 = st.columns(2) |
| with col3: |
| mcc = st.number_input("MCC", value=610, step=1, min_value=0, key="ciq4g_mcc") |
| with col4: |
| mnc = st.number_input("MNC", value=2, step=1, min_value=0, key="ciq4g_mnc") |
|
|
| if ciq_file is None: |
| st.info("Upload CIQ brut 4G Excel to generate CIQ 4G export.") |
| st.stop() |
|
|
| if st.button("Generate", type="primary"): |
| try: |
| if bands_mode == "Profiles": |
| profile_definitions = parse_band_profile_definitions(profile_text) |
| site_profile_mapping = read_site_profile_mapping(site_profile_file) |
|
|
| with st.spinner("Generating CIQ 4G..."): |
| sheets, excel_bytes = generate_ciq_4g_excel( |
| ciq_file, |
| year_suffix=year_suffix.strip(), |
| bands=bands.strip(), |
| mcc=int(mcc), |
| mnc=int(mnc), |
| ciq_sheet_name=ciq_sheet_name, |
| profile_definitions=profile_definitions, |
| site_profile_mapping=site_profile_mapping, |
| ) |
| st.session_state["ciq4g_sheets"] = sheets |
| st.session_state["ciq4g_excel_bytes"] = excel_bytes |
| st.success("CIQ 4G generated") |
| except Exception as e: |
| st.error(f"Error: {e}") |
|
|
| sheets = st.session_state.get("ciq4g_sheets") |
| excel_bytes = st.session_state.get("ciq4g_excel_bytes") |
|
|
| if sheets: |
| tab_names = list(sheets.keys()) |
| tabs = st.tabs(tab_names) |
| for t, name in zip(tabs, tab_names): |
| with t: |
| df: pd.DataFrame = sheets[name] |
| st.dataframe(df, use_container_width=True) |
|
|
| if excel_bytes: |
| st.download_button( |
| label="Download CIQ 4G Excel", |
| data=excel_bytes, |
| file_name="CIQ_4G.xlsx", |
| mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", |
| type="primary", |
| ) |
|
|