import flet as ft import requests def register_teacher_page(page: ft.Page): page.clean() page.title = "Register Page" page.theme_mode = ft.ThemeMode.LIGHT subjects_list = [] row = ft.Row() # UI components username_field = ft.TextField(label="Benutzername") first_name_field = ft.TextField(label="Vorname") last_name_field = ft.TextField(label="Nachname") password_field0 = ft.TextField(label="Passwort", password=True, can_reveal_password=True) password_field1 = ft.TextField(label="Passwort bestätigen", password=True, can_reveal_password=True) secret_teacher_password_field = ft.TextField(label="Secret Teacher Password", password=True, can_reveal_password=True) info_label = ft.Text("", theme_style=ft.TextThemeStyle.TITLE_SMALL) def delete_subject(dropdown, delete_button): if dropdown.value in subjects_list: subjects_list.remove(dropdown.value) row.controls.remove(dropdown) row.controls.remove(delete_button) page.update() refresh_dropdowns() def append_subject(e=None, dropdown=None, plus_button=None): if not dropdown.value or dropdown.value in subjects_list or dropdown.value == "Wähle deine Fächer aus": dropdown.value = "" # Reset if empty or duplicate page.update() return subjects_list.append(dropdown.value) # Disable current dropdown and button after selection dropdown.disabled = True plus_button.visible = False # Add new dropdown to the same row add_new_dropdown() page.update() def on_dropdown_change(e, dropdown, plus_button): if dropdown.value and dropdown.value not in subjects_list and dropdown.value != "Wähle deine Fächer aus": subjects_list.append(dropdown.value) dropdown.disabled = True plus_button.visible = False add_new_dropdown() page.update() def refresh_dropdowns(): for control in row.controls: if isinstance(control, ft.Dropdown) and not control.disabled: available_subjects = get_available_subjects() control.options = [ ft.dropdown.Option("Wähle deine Fächer aus", disabled=True) ] + [ ft.dropdown.Option(subj) for subj in available_subjects ] page.update() def get_available_subjects(): available_subjects = [ "De", "En", "Fr", "Gs", "Ma", "NW", "Re", "Sn", "Sp", "Wn" ] return [subj for subj in available_subjects if subj not in subjects_list] def add_new_dropdown(): options = [ ft.dropdown.Option("Wähle deine Fächer aus", disabled=True) ] + [ ft.dropdown.Option(subj) for subj in get_available_subjects() ] dropdown = ft.Dropdown( width=250, options=options, value="Wähle deine Fächer aus", on_change=lambda e: on_dropdown_change(e, dropdown, plus_button) ) plus_button = ft.IconButton( icon=ft.icons.ADD, visible=False # Initially hidden ) delete_button = ft.IconButton( icon=ft.icons.CLOSE_OUTLINED, on_click=lambda e: delete_subject(dropdown, delete_button) ) plus_button.on_click = lambda e: append_subject(e, dropdown, plus_button) # Add dropdown and buttons to the row row.controls.append(dropdown) row.controls.append(plus_button) row.controls.append(delete_button) page.update() def register(e): print(subjects_list) username = username_field.value.strip() password0 = password_field0.value.strip() password1 = password_field1.value.strip() secret_teacher_password = secret_teacher_password_field.value.strip() last_name = last_name_field.value.strip() first_name = first_name_field.value.strip() subjects_string = ", ".join(subjects_list) if not username or not password0 or not secret_teacher_password or not password1 or not last_name or not first_name or not subjects_string: info_label.value = "Bitte fülle alle Felder aus" info_label.color = "red" page.update() #page.clean() #register_teacher_page(page=page) return if not password0 == password1: info_label.value = "Passwörter stimmen nicht überein" info_label.color = "red" page.update() return try: url = 'http://awesom-o.org:8000/teacher/register' headers = { 'accept': 'application/json', 'Content-Type': 'application/json' } data = { 'username': username, 'password': password0, 'teacher_secret_password': secret_teacher_password, 'first_name': first_name, 'last_name': last_name, 'subjects': subjects_string } response = requests.post(url, headers=headers, json=data) if response.status_code == 200: session_id = response.json().get("session_id") username = response.json().get("username") page.session.set("access_token", session_id) page.session.set("username", username) page.go("/") else: error_message = response.json().get("detail", "Registrierung fehlgeschlagen") info_label.value = error_message info_label.color = "red" except requests.exceptions.RequestException as e: info_label.value = f"An error occurred: {str(e)}" info_label.color = "red" page.update() page.add( ft.Text("Daltonraum-Buchungssystem der IGS Garbsen", size=30), ft.Text("Registrieren", size=23, weight=ft.FontWeight.BOLD), username_field, ft.Row([ first_name_field, last_name_field ]), row, password_field0, password_field1, secret_teacher_password_field, ft.ElevatedButton("Registrieren", on_click=register), info_label, ft.TextButton("Kein Lehrer? Klicke hier!", on_click=lambda _: page.go("/register_student")) ) add_new_dropdown()