Files
tainagustului/UI_V2/admin/orders.py

435 lines
15 KiB
Python

import flet as ft
from dbActions.orders import Orders
from dbActions.users import Users
from dbActions.products import Products
from helpers.default_user import DefaultUser
from helpers.emails import send_gmail
class OrdersPage:
def __init__(self, page: ft.Page):
self.page = page
self.orders = Orders()
self.users = Users()
self.products = Products()
self.selected_user = None
self.selected_order = None
self.selected_order_products = None
self.original_status = None
self.customer_email = None
self.default_user = DefaultUser(self.page)
self.header = ft.Row(
[
ft.Text(
"Comenzi",
weight=ft.FontWeight.BOLD,
size=18
),
],
alignment=ft.MainAxisAlignment.START
)
self.all_orders = self.orders.get_orders()
self.all_orders = self.all_orders[::-1]
self.oll_orders_list = ft.ListView(
controls=self.create_list(self.all_orders, self.on_order_click),
spacing=10,
expand=3,
height=700
)
self.fileters = ft.RadioGroup(
content=ft.Row(
[
ft.Radio(value="on_hold", label="In asteptare"),
ft.Radio(value="new", label="Noua"),
ft.Radio(value="in_progress", label="In lucru"),
ft.Radio(value="completed", label="Complete"),
ft.Radio(value="all", label="Toate")
]
),
on_change=self.on_filter_change
)
self.name = ft.Text()
self.email = ft.Text()
self.phone = ft.Text()
self.address = ft.Text()
self.total_pay = ft.Text(weight=ft.FontWeight.BOLD)
self.products_column = ft.Column([])
self.status = ft.Text()
self.buttons_state = ft.RadioGroup(
content=ft.Row(
[
ft.Radio(value="on_hold", label="In asteptare"),
ft.Radio(value="new", label="Noua"),
ft.Radio(value="in_progress", label="In lucru"),
ft.Radio(value="completed", label="Complete"),
],
),
on_change=self.on_radio_value_change
)
self.total_row = ft.Row(
[
ft.Text(
value="Total platit",
weight=ft.FontWeight.BOLD,
),
self.total_pay
],
alignment=ft.MainAxisAlignment.SPACE_BETWEEN
)
self.order_details = ft.Column(
[
ft.Text(
value="Detalii utilizator",
weight=ft.FontWeight.BOLD,
size=18
),
ft.Row(
[
ft.Text(
value="Nume si prenume",
weight=ft.FontWeight.BOLD,
),
self.name
],
alignment=ft.MainAxisAlignment.SPACE_BETWEEN
),
ft.Row(
[
ft.Text(
value="E-mail",
weight=ft.FontWeight.BOLD,
),
self.email
],
alignment=ft.MainAxisAlignment.SPACE_BETWEEN
),
ft.Row(
[
ft.Text(
value="Telefon",
weight=ft.FontWeight.BOLD,
),
self.phone
],
alignment=ft.MainAxisAlignment.SPACE_BETWEEN
),
ft.Row(
[
ft.Text(
value="Adresa",
weight=ft.FontWeight.BOLD,
),
self.address
],
alignment=ft.MainAxisAlignment.SPACE_BETWEEN
),
ft.Row(
[
ft.Text(
value="Status",
weight=ft.FontWeight.BOLD,
),
self.status,
],
alignment=ft.MainAxisAlignment.SPACE_BETWEEN
),
self.total_row,
ft.Divider(),
ft.Text(
value="Produse",
weight=ft.FontWeight.BOLD,
size=18
),
self.products_column,
ft.Divider(),
ft.Row(
[
self.buttons_state,
ft.Button("Sterge", icon = ft.Icons.DELETE, on_click=self.on_order_delete_btn_click)
],
alignment=ft.MainAxisAlignment.SPACE_BETWEEN
)
],
expand=True
)
self.order_details_placeholder = ft.Container(
expand=7,
padding=10,
border_radius=10,
)
self.message_field = ft.TextField(
label="Scrie un mesaj clientului",
min_lines=3,
max_lines=5,
multiline=True
)
self.change_state_dialog = ft.AlertDialog(
title=ft.Text("Modifica statusul"),
content=self.message_field,
actions=[
ft.FilledButton(
"Da",
on_click=self.on_change_state_btn_click
),
ft.FilledButton(
"Nu",
on_click=self.on_cancel_state_btn_click,
bgcolor=ft.Colors.GREY
)
]
)
self.delete_order_dialog = ft.AlertDialog(
title=ft.Text("Sertgeti?"),
actions=[
ft.FilledButton(
"Da",
on_click=self.on_confirm_delete_order
),
ft.FilledButton(
"Nu",
on_click=self.on_cancel_delete_order_btn_click,
bgcolor=ft.Colors.GREY
)
]
)
def on_order_delete_btn_click(self, e):
self.page.open(self.delete_order_dialog)
def on_confirm_delete_order(self, e):
self.orders.remove_order(self.selected_order['id'])
self.all_orders = self.orders.get_orders()[::-1]
self.oll_orders_list.controls = self.create_list(self.all_orders, self.on_order_click)
self.oll_orders_list.update()
self.selected_order = None
self.order_details_placeholder.content = None
self.order_details_placeholder.update()
self.page.close(self.delete_order_dialog)
def on_cancel_delete_order_btn_click(self, e):
self.page.close(self.delete_order_dialog)
def on_radio_value_change(self, e):
self.page.open(self.change_state_dialog)
def on_change_state_btn_click(self, e):
self.page.close(self.change_state_dialog)
status = self.buttons_state.value
self.orders.update_order_status(status, self.selected_order['id'])
print(status)
self.all_orders = self.orders.get_orders()
self.all_orders = self.all_orders[::-1]
self.oll_orders_list.controls.clear()
self.oll_orders_list.controls = self.create_list(self.all_orders, self.on_order_click)
self.oll_orders_list.update()
self.order_details_placeholder.content = None
self.order_details_placeholder.update()
message = self.message_field.value
self.message_field.value = ''
self.message_field.update()
print(message)
email = self.customer_email
status_values = {
"on_hold":"in asteptare",
"new": "noua",
"in_progress":"in lucru",
"completed": "la curier",
}
send_gmail(
to_email=email,
subject=f"Comanda cumneavoastra este: {status_values[status]}",
body=message
)
def on_cancel_state_btn_click(self, e):
self.buttons_state.value = self.original_status
self.buttons_state.update()
self.page.close(self.change_state_dialog)
def get_total_pay(self):
sume = 0
print (self.selected_order_products)
if self.selected_order_products:
for product in self.selected_order_products:
sume += (product['price'] - product['price']*product['discount']/100)
print(sume)
return sume
def on_order_click(self, item):
self.products_column.controls.clear()
self.order_details_placeholder.content = None
self.order_details_placeholder.content = self.order_details
self.order_details_placeholder.bgcolor=ft.Colors.BROWN_50
try:
self.order_details_placeholder.update()
except:
print('ERROR Unable to update the Order Details Placeholder')
print("order item", item)
self.selected_user = self.users.get(item['user_id'])
if self.selected_user == None:
self.selected_user = self.default_user.default_user
self.selected_order = item
products = self.orders.get_order_products(item['id'])
self.selected_order_products = []
if products:
for product in products:
prod = self.products.get(product['prdouct_id'])
if prod:
prod['pices'] = product['quantity']
self.selected_order_products.append(prod)
print(prod)
self.name.value = self.selected_user['name'] if '@default.com' not in self.selected_user['email'] else 'Anonim user'
self.name.update()
self.email.value = self.selected_user['email']
self.email.update()
self.customer_email = self.selected_user['email']
self.address.value = self.selected_user['address'] if '@default.com' not in self.selected_user['email'] else 'Anonim user'
self.address.update()
self.phone.value = self.selected_user['phone'] if '@default.com' not in self.selected_user['email'] else 'Anonim user'
self.phone.update()
self.status.value = "Status"
self.status.update()
for product in self.selected_order_products:
name_label = ft.Text(
"Denumire produs",
weight=ft.FontWeight.BOLD
)
name = ft.Text(product['name'])
name_row = ft.Row(
[
name_label,
name
]
)
image = ft.Image(
src=product['image'],
width=120,
height=120,
fit=ft.ImageFit.CONTAIN
)
quantity_label = ft.Text("Cantitate")
quantity = ft.Text(product['quantity'])
pices_label = ft.Text("Numar bucati")
pices = ft.Text(product['pices'])
quantity_row = ft.Column(
[
ft.Row(
[
quantity_label,
quantity
]
),
ft.Row(
[
pices_label,
pices
]
)
]
)
product_row = ft.Row(
[
image,
ft.Column(
[
name_row,
quantity_row
]
)
]
)
self.products_column.controls.append(product_row)
print(self.products_column.controls)
self.total_pay.value = f"{self.get_total_pay()} Lei"
self.total_pay.update()
self.products_column.update()
self.buttons_state.value = item['status']
self.buttons_state.update()
self.original_status = item['status']
def on_filter_change(self, e):
print(e.data)
buffer = []
if e.data == 'all':
self.oll_orders_list.controls = self.create_list(self.all_orders, self.on_order_click)
self.oll_orders_list.update()
else:
for order in self.all_orders:
if order['status'] == e.data:
buffer.append(order)
self.oll_orders_list.controls = self.create_list(buffer, self.on_order_click)
self.oll_orders_list.update()
def get_status(self, status):
STATUS = {
'on_hold': "In asteptare",
'new': "Noua",
'in_progress': "In lucru",
"completed": "Completa"
}
return STATUS[status]
def create_list(self, items, on_click_handler):
return [
ft.Container(
content=ft.Row(
[
ft.Row(
[
ft.Icon(ft.Icons.ARROW_RIGHT, size=20),
ft.Text(value=item['id'])
]
),
ft.Row(
[
ft.Text(
value=self.get_status(item['status'])
)
]
)
],
alignment=ft.MainAxisAlignment.SPACE_BETWEEN,
),
width=300,
bgcolor=ft.Colors.BROWN_50,
padding=10,
border_radius=8,
ink=True,
on_click=lambda e, i=item: on_click_handler(i),
border = ft.border.all(1, ft.Colors.GREY),
)
for item in items
]
def build(self):
return ft.Container(
content=ft.Column(
[
self.header,
ft.Row(
[
ft.Text(value="Filtreaza dupa"),
self.fileters
]
),
ft.Row(
[
self.oll_orders_list,
self.order_details_placeholder
],
vertical_alignment=ft.CrossAxisAlignment.START
)
],
alignment=ft.MainAxisAlignment.START,
expand=True,
#scroll=ft.ScrollMode.ADAPTIVE
),
expand=True,
)