289 lines
10 KiB
Python
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)
|