Add CIQ 4G Generator with LNBTS/LNCEL sheet generation, implement site parsing from CIQ brut Excel with eNodeB/cell name extraction, band detection from cell names, sector ID mapping, DL/UL EARFCN conversion, MIMO mode assignment per band, and multi-band block configuration builder with TAC/PCI/RSI parameters and Excel export
1c0596c
| import streamlit as st | |
| # Authentication function | |
| def check_password(): | |
| """Returns `True` if the user had the correct password.""" | |
| # st.write(st.secrets) | |
| def password_entered(): | |
| """Checks whether a password entered by the user is correct.""" | |
| if ( | |
| str(st.session_state.get("username", "")).strip() | |
| == str(st.secrets.get("username", "")).strip() | |
| and str(st.session_state.get("password", "")).strip() | |
| == str(st.secrets.get("password", "")).strip() | |
| ): | |
| st.session_state["password_correct"] = True | |
| del st.session_state["password"] # don't store password | |
| del st.session_state["username"] # don't store username | |
| else: | |
| st.session_state["password_correct"] = False | |
| # Create a visually appealing login form | |
| if ( | |
| "password_correct" not in st.session_state | |
| or not st.session_state["password_correct"] | |
| ): | |
| # Add custom CSS for styling | |
| st.markdown( | |
| """ | |
| <style> | |
| .login-container { | |
| background-color: #f0f2f6; | |
| padding: 30px; | |
| border-radius: 10px; | |
| box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); | |
| margin-bottom: 20px; | |
| text-align: center; | |
| } | |
| .login-title { | |
| font-size: 24px; | |
| font-weight: bold; | |
| margin-bottom: 20px; | |
| color: #0f52ba; | |
| } | |
| .login-subtitle { | |
| font-size: 16px; | |
| margin-bottom: 30px; | |
| color: #555; | |
| } | |
| .stButton button { | |
| background-color: #0f52ba; | |
| color: white; | |
| font-weight: bold; | |
| border-radius: 5px; | |
| padding: 10px 20px; | |
| } | |
| </style> | |
| """, | |
| unsafe_allow_html=True, | |
| ) | |
| # Create a centered layout | |
| col1, col2, col3 = st.columns([1, 2, 1]) | |
| with col2: | |
| # Login container with title and subtitle | |
| st.markdown( | |
| """ | |
| <div class="login-container"> | |
| <div class="login-title">NPO DB Query</div> | |
| <div class="login-subtitle">Please log in to continue</div> | |
| </div> | |
| """, | |
| unsafe_allow_html=True, | |
| ) | |
| # Show error message if login failed | |
| if ( | |
| "password_correct" in st.session_state | |
| and not st.session_state["password_correct"] | |
| ): | |
| st.error("😕 User not known or password incorrect") | |
| # Login form with improved input fields | |
| st.text_input("Username", key="username", placeholder="Enter your username") | |
| st.text_input( | |
| "Password", | |
| type="password", | |
| key="password", | |
| placeholder="Enter your password", | |
| ) | |
| # Full-width login button | |
| st.button("Login", on_click=password_entered, use_container_width=True) | |
| return False | |
| else: | |
| # Password correct | |
| return True | |
| # Only show the app if authentication is successful | |
| if check_password(): | |
| st.set_page_config( | |
| page_title="NPO DB Query", | |
| page_icon="💻", | |
| layout="wide", | |
| initial_sidebar_state="expanded", | |
| menu_items={ | |
| "About": "**📡 NPO DB Query v0.2.12**", | |
| }, | |
| ) | |
| pages = { | |
| "Apps": [ | |
| st.Page("apps/database_page.py", title="🏡Generate Databases"), | |
| st.Page( | |
| "apps/parameters_distribution.py", title="📊Parameters distribution" | |
| ), | |
| st.Page("apps/ciq_2g_generator.py", title="🧾 CIQ 2G Generator"), | |
| st.Page("apps/ciq_3g_generator.py", title="🧾 CIQ 3G Generator"), | |
| st.Page("apps/ciq_4g_generator.py", title="🧾 CIQ 4G Generator"), | |
| st.Page("apps/core_dump_page.py", title="📠Parse dump core"), | |
| st.Page("apps/gps_converter.py", title="🧭GPS Converter"), | |
| st.Page("apps/distance.py", title="🛰Distance Calculator"), | |
| st.Page( | |
| "apps/multi_points_distance_calculator.py", | |
| title=" 🗺 Multi Points Distance Calculator", | |
| ), | |
| st.Page( | |
| "apps/sector_kml_generator.py", | |
| title="📡 Sector KML Generator", | |
| ), | |
| st.Page( | |
| "apps/clustering.py", | |
| title="📡 Automatic Site Clustering", | |
| ), | |
| st.Page("apps/fnb_parser.py", title="📄 F4NB Extractor"), | |
| st.Page("apps/dump_compare.py", title="📊 Dump Compare"), | |
| st.Page( | |
| "apps/import_physical_db.py", title="🌏Physical Database Verification" | |
| ), | |
| ], | |
| "Capacity Analysis": [ | |
| st.Page( | |
| "apps/kpi_analysis/gsm_capacity.py", | |
| title=" 📊 GSM Capacity Analysis", | |
| ), | |
| st.Page( | |
| "apps/kpi_analysis/wbts_capacty.py", | |
| title=" 📊 WBTS Capacity BB and CE Analysis", | |
| ), | |
| st.Page( | |
| "apps/kpi_analysis/wcel_capacity.py", | |
| title=" 📊 WCEL Capacity Analysis", | |
| ), | |
| st.Page( | |
| "apps/kpi_analysis/lcg_analysis.py", | |
| title=" 📊 LCG Capacity Analysis", | |
| ), | |
| st.Page( | |
| "apps/kpi_analysis/lte_capacity.py", | |
| title=" 📊 LTE Capacity Analysis", | |
| ), | |
| ], | |
| "Paging Analysis": [ | |
| st.Page( | |
| "apps/kpi_analysis/gsm_lac_load.py", | |
| title=" 📊 GSM LAC Load Analysis", | |
| ), | |
| ], | |
| "KPI Analysis": [ | |
| st.Page( | |
| "apps/kpi_analysis/lte_drop_trafic.py", | |
| title=" 📊 LTE Drop Traffic Analysis", | |
| ), | |
| st.Page( | |
| "apps/kpi_analysis/anomalie.py", | |
| title=" 📊 KPIs Anomaly Detection", | |
| ), | |
| st.Page( | |
| "apps/kpi_analysis/trafic_analysis.py", | |
| title=" 📊 Trafic Analysis", | |
| ), | |
| ], | |
| "Documentations": [ | |
| st.Page( | |
| "documentations/database_doc.py", title="📚Databases Documentation" | |
| ), | |
| st.Page( | |
| "documentations/core_dump_doc.py", title="📗Dump core Documentation" | |
| ), | |
| st.Page( | |
| "documentations/gsm_capacity_docs.py", | |
| title="📘GSM Capacity Documentation", | |
| ), | |
| st.Page( | |
| "documentations/lte_capacity_docs.py", | |
| title="📘LTE Capacity Documentation", | |
| ), | |
| st.Page( | |
| "documentations/trafic_analysis_doc.py", | |
| title="📘Trafic Analysis Documentation", | |
| ), | |
| st.Page( | |
| "documentations/anomaly_detection_doc.py", | |
| title="📘Anomaly Detection Documentation", | |
| ), | |
| ], | |
| } | |
| pg = st.navigation(pages, position="top") | |
| pg.run() | |