181 lines
6.6 KiB
Python
181 lines
6.6 KiB
Python
|
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()
|
||
|
|