Files
schoolplanner/frontend/pages/create_page.py
2025-01-19 00:10:20 +01:00

289 lines
10 KiB
Python

import flet as ft
import requests
import datetime
def create_page(page: ft.Page):
page.clean()
page.theme_mode = ft.ThemeMode.LIGHT # Set the theme to light
def is_student():
url = 'http://127.0.0.1:8000/check_role'
headers = {
'accept': 'application/json',
'Content-Type': 'application/json'
}
session_id = page.session.get("access_token")
if not session_id:
print("Session ID is missing.")
return None
data = {'session_id': session_id}
try:
response = requests.post(url, json=data, headers=headers)
response.raise_for_status()
role = response.json()
if 'role' in role and 'role' in role['role']:
if role['role']['role'] == "student":
role = "s"
page.go("/login")
return role
elif role['role']['role'] == "teacher":
role = "t"
return role
print("Unexpected response structure:", role)
return None
except requests.exceptions.RequestException as error:
print("Error during role check:", error)
return None
page.title = "Create Room Page"
if is_student == "s":
page.gp("/")
session = page.session.get("access_token")
if not session:
page.go("/login")
# Initialize selected room state (use a simple variable instead of ft.State)
selected_room = ""
selected_date = ""
selected_time = ""
SEARCH_RESULT = ""
date_text = ft.Text(
"", # Initially empty
size=18, # Font size
weight=ft.FontWeight.BOLD, # Make the text bold
color="black", # Text colo
visible=False # Initially hidden
)
# Function to fetch room data
def fetch_rooms():
try:
response = requests.get("http://awesom-o.org:8000/teacher/all_room_information")
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
print("Error fetching room data:", e)
return []
# Fetch rooms initially (don't display them immediately)
room_data = fetch_rooms()
# Function to filter room data
def search_rooms(query):
query = query.lower()
return [
room for room in room_data
if query in room["room_number"].lower()
or query in room["info"].lower()
or query in room["location"].lower()
]
# Search results container
search_results = ft.Column(
visible=False, # Initially hidden
scroll=ft.ScrollMode.AUTO,
expand=True
)
# Update search results
def update_results(query):
if query.strip() == "": # When the search field is empty, show all rooms
search_results.controls.clear()
for room in room_data:
search_results.controls.append(
ft.ListTile(
title=ft.Text(f"Room {room['room_number']}: {room['info']}"),
subtitle=ft.Text(room['location']),
on_click=lambda e, r=room: select_room(r),
)
)
search_results.visible = True
else:
search_results.controls.clear()
filtered_rooms = search_rooms(query)
for room in filtered_rooms:
search_results.controls.append(
ft.ListTile(
title=ft.Text(f"Room {room['room_number']}: {room['info']}"),
subtitle=ft.Text(room['location']),
on_click=lambda e, r=room: select_room(r),
)
)
search_results.visible = True
close_button.visible = search_results.visible # Show close button when results are visible
page.update()
# Select a room
def select_room(room):
nonlocal selected_room
nonlocal SEARCH_RESULT
selected_room = f"Room {room['room_number']}: {room['info']} - {room['location']}"
search_bar.value = selected_room
SEARCH_RESULT = room['number']
search_results.visible = False
close_button.visible = False
page.update()
# Close button to hide search results
def close_search_results(e):
search_results.visible = False
close_button.visible = False
page.update()
def handle_change_date_picker(e):
# Once a date is selected, update the Text and make it visible
nonlocal selected_date
selected_date = e.control.value.strftime('%Y-%m-%d')
if selected_time != "":
date_text.value = f"Your Room will be started on: {selected_date} at {selected_time}"
date_text.visible = True # Make the Text visible after date selection
page.update()
else:
date_text.value = f"Your Room will be started on: {selected_date}"
date_text.visible = True # Make the Text visible after date selection
page.update() # Update the page to reflect the changes
def handle_change_dropdown(e):
nonlocal selected_time
selected_time1 = e.control.value
selected_time = selected_time1.replace("Start time: ", "")
if selected_date != "":
date_text.value = f"Your Room will be started on: {selected_date} at {selected_time}"
date_text.visible = True # Make the Text visible after date selection
page.update()
else:
date_text.value = f"Your Room will be started at {selected_time}"
date_text.visible = True # Make the Text visible after date selection
page.update() # Update the page to reflect the changes
def go_to_main(e):
page.go("/") # Replace with the appropriate route for your register page
def create(e):
page.update()
search_results = SEARCH_RESULT.strip()
max_students = max_students_field.value.strip()
selected_date
selected_time
# Validate input
if not search_results or not max_students or not selected_date or not selected_time:
info_label.value = "Please enter Room Number, Max Students, Lesson Date and Lesson Time."
info_label.color = "red"
page.update()
return
try:
max_students = int(max_students)
except ValueError:
info_label.value = "Max Students must be a number."
info_label.color = "red"
page.update()
return
if max_students < 1:
info_label.value = "Please don't enter a negative or zero value for Max Students."
info_label.color = "red"
page.update()
return
try:
url = 'http://127.0.0.1:8000/teacher/create_room'
headers = {
'accept': 'application/json',
'Content-Type': 'application/json'
}
data = {
'room_number': search_results,
'max_students': max_students,
'session_id': page.session.get("access_token"),
'lesson_time': selected_time,
'lesson_date': selected_date
}
response = requests.post(url, headers=headers, json=data)
if response.status_code == 200:
success_message = "The Room was created Successfully!"
info_label.value = success_message
info_label.color = "green"
else:
error_message = "Something went wrong..."
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()
# Search bar
search_bar = ft.TextField(
label="Search for a room",
on_focus=lambda e: update_results(""), # Show all rooms when search bar is focused
on_change=lambda e: update_results(e.control.value),
expand=True # Make the search bar take up available space
)
# Close button
close_button = ft.IconButton(
icon=ft.icons.CLOSE,
on_click=close_search_results,
visible=False # Initially hidden
)
max_students_field = ft.TextField(label="Max Students")
info_label = ft.Text("", theme_style=ft.TextThemeStyle.TITLE_SMALL)
# Add components to the page
page.add(
ft.Row([search_bar, close_button]), # Add search bar and close button in a row
search_results,
max_students_field,
ft.Row([
ft.OutlinedButton(
"Pick the date when your lesson begins",
icon=ft.icons.CALENDAR_MONTH,
height=40,
on_click=lambda e: page.open(
ft.DatePicker(
first_date=datetime.datetime(year=2024, month=11, day=20),
on_change=handle_change_date_picker,
)
),
),
date_text, # Add the styled Text below the button
], spacing=20),
ft.Dropdown(
hint_text="Choose the Start of your Lesson",
options=[
ft.dropdown.Option("Start time: 8:00"),
ft.dropdown.Option("Start time: 9:20"),
ft.dropdown.Option("Start time: 10:40"),
ft.dropdown.Option("Start time: 11:50"),
ft.dropdown.Option("Start time: 12:50"),
ft.dropdown.Option("Start time: 13:55"),
ft.dropdown.Option("Start time: 15:00"),
],on_change=handle_change_dropdown,
label_style=ft.TextStyle(size=16), # Correct way to set font size for Dropdown
),
ft.ElevatedButton("Submit", on_click=create),
info_label,
ft.Row([
ft.TextButton("Enough? Click here to go to the Main Page", on_click=go_to_main),
]),
)
# Example usage
if __name__ == "__main__":
ft.app(target=create_page, view=ft.AppView.WEB_BROWSER)