initial commit
This commit is contained in:
288
frontend/pages/create_page.py
Normal file
288
frontend/pages/create_page.py
Normal file
@@ -0,0 +1,288 @@
|
||||
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)
|
Reference in New Issue
Block a user