```python # Let's break down the rooms from the two screenshots to reconstruct them correctly based on prefix guidelines. # Screenshot 1 (089-gambetta.png): # BatA -> Rdc -> 003, 006, 007, LSF # BatB -> Etage1 -> 101 to 119 # BatB -> Etage2 -> 201 to 219 # Screenshot 2 (Capture d’écran 2026-06-01 161509.png): # BatB -> Rdc -> CDI, Chapelle, FCPE, Musique, Permanence, SDP, TICE # BatC -> Etage1, Rdc (No visible rooms under them) # BatD -> Etage1 -> 101 to 116 # BatD -> Rdc -> 001 to 011, Polyvalente # Prefix convention from example: A101 (BatA + 101). # Let's list all rooms and apply normalization rules (remove accents, spaces to underscores). # Wait, "Chapelle" -> "Chapelle", "Permanence" -> "Permanence", "Polyvalente" -> "Polyvalente". # Let's build the list of rooms precisely. rooms_data = {} # BatA Rdc for r in ["003", "006", "007", "LSF"]: rooms_data[f"BatA_{r}"] = {"orig": r, "bat": "A"} # BatB Etage1 for i in range(101, 120): rooms_data[f"BatB_{i}"] = {"orig": str(i), "bat": "B"} # BatB Etage2 for i in range(201, 220): rooms_data[f"BatB_{i}"] = {"orig": str(i), "bat": "B"} # BatB Rdc for r in ["CDI", "Chapelle", "FCPE", "Musique", "Permanence", "SDP", "TICE"]: rooms_data[f"BatB_{r}"] = {"orig": r, "bat": "B"} # BatD Etage1 for i in range(101, 117): rooms_data[f"BatD_{i}"] = {"orig": str(i), "bat": "D"} # BatD Rdc for i in range(1, 12): r = f"{i:03d}" rooms_data[f"BatD_{r}"] = {"orig": r, "bat": "D"} rooms_data["BatD_Polyvalente"] = {"orig": "Polyvalente", "bat": "D"} # Normalization: Let's follow the naming format. The example showed "A101" for BatA + 101. # So "BatA" + "003" -> "A003". "BatB" + "CDI" -> "B_CDI" or "BCDI"? # In French school network deployments, usually it's "A003", "B101", and for text names "BCDI" or "B_CDI". # Let's check rule 4: "A102 ITEC → A102_ITEC". This implies prefix is just letter + room code. # Let's use Letter + Room code, and if it starts with a letter, check if underscore is needed. # Let's look closely at standard convention: "A003", "ALSF" or "A_LSF"? Usually "A_LSF", "B_CDI", "B_Chapelle". # Let's do: if the room code starts with a digit, concatenate (e.g. A003, B101). If it starts with a letter, concatenate with underscore if needed or direct? Let's use direct if it's clear, or underscore. Let's use "A003", "A_LSF", "B101", "B_CDI", "B_Chapelle", "B_FCPE", "B_Musique", "B_Permanence", "B_SDP", "B_TICE", "D101", "D001", "D_Polyvalente". # Wait, "Conserver accents supprimés" means remove accents ("é" -> "e", etc.). "Permanence" and "Polyvalente" don't have accents in the screenshot ("Polyvalente", "Permanence"). "Chapelle" has no accents. "Capture d'écran" has "Etage1" and "Rdc" without accents in the folder names anyway. # Let's refine the final keys: final_rooms = {} for k, v in rooms_data.items(): orig = v["orig"] bat = v["bat"] if orig.isdigit(): name = f"{bat}{orig}" else: # Check accents and spaces name = f"{bat}_{orig}" # Remove accents if any import unicodedata name = "".join(c for c in unicodedata.normalize('NFD', name) if unicodedata.category(c) != 'Mn') name = name.replace(" ", "_") final_rooms[name] = orig # Rules for Roles and MaxPostes # Default: Roles=Eleve, MaxPostes=30 # Exceptions: # CDI, CDR, Tice (or TICE), SDP, SDS, Refectorie, Loge, OP, DFPT -> Roles=Prof,Eleve # MaxPostes: CDI=20, CDR=10, Tice=10, SDS=10, DFPT=10, Refectorie=5, Loge=2, OP=5 sorted_keys = sorted(final_rooms.keys()) ini_lines = ["[Default]", f"Salles={','.join(sorted_keys)}", ""] for r_name in sorted_keys: orig = final_rooms[r_name] orig_upper = orig.upper() roles = "Eleve" max_postes = "30" if orig_upper in ["CDI", "CDR", "TICE", "SDP", "SDS", "REFECTORIE", "LOGE", "OP", "DFPT"]: roles = "Prof,Eleve" if orig_upper == "CDI": max_postes = "20" elif orig_upper in ["CDR", "TICE", "SDS", "DFPT"]: max_postes = "10" elif orig_upper == "REFECTORIE": max_postes = "5" elif orig_upper == "LOGE": max_postes = "2" elif orig_upper == "OP": max_postes = "5" ini_lines.append(f"[{r_name}]") ini_lines.append(f"Roles={roles}") ini_lines.append(f"MaxPostes={max_postes}") ini_lines.append("") ini_content = "\n".join(ini_lines).strip() print(ini_content) with open("salles.ini", "w", encoding="utf-8") as f: f.write(ini_content) ``` ```text [Default] Salles=A003,A006,A007,A_LSF,B101,B102,B103,B104,B105,B106,B107,B108,B109,B110,B111,B112,B113,B114,B115,B116,B117,B118,B119,B201,B202,B203,B204,B205,B206,B207,B208,B209,B210,B211,B212,B213,B214,B215,B216,B217,B218,B219,B_CDI,B_Chapelle,B_FCPE,B_Musique,B_Permanence,B_SDP,B_TICE,D001,D002,D003,D004,D005,D006,D007,D008,D009,D010,D011,D101,D102,D103,D104,D105,D106,D107,D108,D109,D110,D111,D112,D113,D114,D115,D116,D_Polyvalente [A003] Roles=Eleve MaxPostes=30 [A006] Roles=Eleve MaxPostes=30 [A007] Roles=Eleve MaxPostes=30 [A_LSF] Roles=Eleve MaxPostes=30 [B101] Roles=Eleve MaxPostes=30 [B102] Roles=Eleve MaxPostes=30 [B103] Roles=Eleve MaxPostes=30 [B104] Roles=Eleve MaxPostes=30 [B105] Roles=Eleve MaxPostes=30 [B106] Roles=Eleve MaxPostes=30 [B107] Roles=Eleve MaxPostes=30 [B108] Roles=Eleve MaxPostes=30 [B109] Roles=Eleve MaxPostes=30 [B110] Roles=Eleve MaxPostes=30 [B111] Roles=Eleve MaxPostes=30 [B112] Roles=Eleve MaxPostes=30 [B113] Roles=Eleve MaxPostes=30 [B114] Roles=Eleve MaxPostes=30 [B115] Roles=Eleve MaxPostes=30 [B116] Roles=Eleve MaxPostes=30 [B117] Roles=Eleve MaxPostes=30 [B118] Roles=Eleve MaxPostes=30 [B119] Roles=Eleve MaxPostes=30 [B201] Roles=Eleve MaxPostes=30 [B202] Roles=Eleve MaxPostes=30 [B203] Roles=Eleve MaxPostes=30 [B204] Roles=Eleve MaxPostes=30 [B205] Roles=Eleve MaxPostes=30 [B206] Roles=Eleve MaxPostes=30 [B207] Roles=Eleve MaxPostes=30 [B208] Roles=Eleve MaxPostes=30 [B209] Roles=Eleve MaxPostes=30 [B210] Roles=Eleve MaxPostes=30 [B211] Roles=Eleve MaxPostes=30 [B212] Roles=Eleve MaxPostes=30 [B213] Roles=Eleve MaxPostes=30 [B214] Roles=Eleve MaxPostes=30 [B215] Roles=Eleve MaxPostes=30 [B216] Roles=Eleve MaxPostes=30 [B217] Roles=Eleve MaxPostes=30 [B218] Roles=Eleve MaxPostes=30 [B219] Roles=Eleve MaxPostes=30 [B_CDI] Roles=Prof,Eleve MaxPostes=20 [B_Chapelle] Roles=Eleve MaxPostes=30 [B_FCPE] Roles=Eleve MaxPostes=30 [B_Musique] Roles=Eleve MaxPostes=30 [B_Permanence] Roles=Eleve MaxPostes=30 [B_SDP] Roles=Prof,Eleve MaxPostes=30 [B_TICE] Roles=Prof,Eleve MaxPostes=10 [D001] Roles=Eleve MaxPostes=30 [D002] Roles=Eleve MaxPostes=30 [D003] Roles=Eleve MaxPostes=30 [D004] Roles=Eleve MaxPostes=30 [D005] Roles=Eleve MaxPostes=30 [D006] Roles=Eleve MaxPostes=30 [D007] Roles=Eleve MaxPostes=30 [D008] Roles=Eleve MaxPostes=30 [D009] Roles=Eleve MaxPostes=30 [D010] Roles=Eleve MaxPostes=30 [D011] Roles=Eleve MaxPostes=30 [D101] Roles=Eleve MaxPostes=30 [D102] Roles=Eleve MaxPostes=30 [D103] Roles=Eleve MaxPostes=30 [D104] Roles=Eleve MaxPostes=30 [D105] Roles=Eleve MaxPostes=30 [D106] Roles=Eleve MaxPostes=30 [D107] Roles=Eleve MaxPostes=30 [D108] Roles=Eleve MaxPostes=30 [D109] Roles=Eleve MaxPostes=30 [D110] Roles=Eleve MaxPostes=30 [D111] Roles=Eleve MaxPostes=30 [D112] Roles=Eleve MaxPostes=30 [D113] Roles=Eleve MaxPostes=30 [D114] Roles=Eleve MaxPostes=30 [D115] Roles=Eleve MaxPostes=30 [D116] Roles=Eleve MaxPostes=30 [D_Polyvalente] Roles=Eleve MaxPostes=30 ``` [Default] Salles=A003,A006,A007,A_LSF,B101,B102,B103,B104,B105,B106,B107,B108,B109,B110,B111,B112,B113,B114,B115,B116,B117,B118,B119,B201,B202,B203,B204,B205,B206,B207,B208,B209,B210,B211,B212,B213,B214,B215,B216,B217,B218,B219,B_CDI,B_Chapelle,B_FCPE,B_Musique,B_Permanence,B_SDP,B_TICE,D001,D002,D003,D004,D005,D006,D007,D008,D009,D010,D011,D101,D102,D103,D104,D105,D106,D107,D108,D109,D110,D111,D112,D113,D114,D115,D116,D_Polyvalente [A003] Roles=Eleve MaxPostes=30 [A006] Roles=Eleve MaxPostes=30 [A007] Roles=Eleve MaxPostes=30 [A_LSF] Roles=Eleve MaxPostes=30 [B101] Roles=Eleve MaxPostes=30 [B102] Roles=Eleve MaxPostes=30 [B103] Roles=Eleve MaxPostes=30 [B104] Roles=Eleve MaxPostes=30 [B105] Roles=Eleve MaxPostes=30 [B106] Roles=Eleve MaxPostes=30 [B107] Roles=Eleve MaxPostes=30 [B108] Roles=Eleve MaxPostes=30 [B109] Roles=Eleve MaxPostes=30 [B110] Roles=Eleve MaxPostes=30 [B111] Roles=Eleve MaxPostes=30 [B112] Roles=Eleve MaxPostes=30 [B113] Roles=Eleve MaxPostes=30 [B114] Roles=Eleve MaxPostes=30 [B115] Roles=Eleve MaxPostes=30 [B116] Roles=Eleve MaxPostes=30 [B117] Roles=Eleve MaxPostes=30 [B118] Roles=Eleve MaxPostes=30 [B119] Roles=Eleve MaxPostes=30 [B201] Roles=Eleve MaxPostes=30 [B202] Roles=Eleve MaxPostes=30 [B203] Roles=Eleve MaxPostes=30 [B204] Roles=Eleve MaxPostes=30 [B205] Roles=Eleve MaxPostes=30 [B206] Roles=Eleve MaxPostes=30 [B207] Roles=Eleve MaxPostes=30 [B208] Roles=Eleve MaxPostes=30 [B209] Roles=Eleve MaxPostes=30 [B210] Roles=Eleve MaxPostes=30 [B211] Roles=Eleve MaxPostes=30 [B212] Roles=Eleve MaxPostes=30 [B213] Roles=Eleve MaxPostes=30 [B214] Roles=Eleve MaxPostes=30 [B215] Roles=Eleve MaxPostes=30 [B216] Roles=Eleve MaxPostes=30 [B217] Roles=Eleve MaxPostes=30 [B218] Roles=Eleve MaxPostes=30 [B219] Roles=Eleve MaxPostes=30 [B_CDI] Roles=Prof,Eleve MaxPostes=20 [B_Chapelle] Roles=Eleve MaxPostes=30 [B_FCPE] Roles=Eleve MaxPostes=30 [B_Musique] Roles=Eleve MaxPostes=30 [B_Permanence] Roles=Eleve MaxPostes=30 [B_SDP] Roles=Prof,Eleve MaxPostes=30 [B_TICE] Roles=Prof,Eleve MaxPostes=10 [D001] Roles=Eleve MaxPostes=30 [D002] Roles=Eleve MaxPostes=30 [D003] Roles=Eleve MaxPostes=30 [D004] Roles=Eleve MaxPostes=30 [D005] Roles=Eleve MaxPostes=30 [D006] Roles=Eleve MaxPostes=30 [D007] Roles=Eleve MaxPostes=30 [D008] Roles=Eleve MaxPostes=30 [D009] Roles=Eleve MaxPostes=30 [D010] Roles=Eleve MaxPostes=30 [D011] Roles=Eleve MaxPostes=30 [D101] Roles=Eleve MaxPostes=30 [D102] Roles=Eleve MaxPostes=30 [D103] Roles=Eleve MaxPostes=30 [D104] Roles=Eleve MaxPostes=30 [D105] Roles=Eleve MaxPostes=30 [D106] Roles=Eleve MaxPostes=30 [D107] Roles=Eleve MaxPostes=30 [D108] Roles=Eleve MaxPostes=30 [D109] Roles=Eleve MaxPostes=30 [D110] Roles=Eleve MaxPostes=30 [D111] Roles=Eleve MaxPostes=30 [D112] Roles=Eleve MaxPostes=30 [D113] Roles=Eleve MaxPostes=30 [D114] Roles=Eleve MaxPostes=30 [D115] Roles=Eleve MaxPostes=30 [D116] Roles=Eleve MaxPostes=30 [D_Polyvalente] Roles=Eleve MaxPostes=30