add V2
This commit is contained in:
BIN
UI_V2/pages/auth/__pycache__/auth.cpython-313.pyc
Normal file
BIN
UI_V2/pages/auth/__pycache__/auth.cpython-313.pyc
Normal file
Binary file not shown.
BIN
UI_V2/pages/auth/__pycache__/forgot_password.cpython-313.pyc
Normal file
BIN
UI_V2/pages/auth/__pycache__/forgot_password.cpython-313.pyc
Normal file
Binary file not shown.
BIN
UI_V2/pages/auth/__pycache__/login.cpython-313.pyc
Normal file
BIN
UI_V2/pages/auth/__pycache__/login.cpython-313.pyc
Normal file
Binary file not shown.
BIN
UI_V2/pages/auth/__pycache__/register.cpython-313.pyc
Normal file
BIN
UI_V2/pages/auth/__pycache__/register.cpython-313.pyc
Normal file
Binary file not shown.
34
UI_V2/pages/auth/auth.py
Normal file
34
UI_V2/pages/auth/auth.py
Normal file
@@ -0,0 +1,34 @@
|
||||
import flet as ft
|
||||
from pages.auth.login import Login
|
||||
from pages.auth.register import Register
|
||||
|
||||
class Auth:
|
||||
def __init__(self, page: ft.Page, go_to = 'login'):
|
||||
self.page = page
|
||||
self.go_to = go_to
|
||||
self.logo = ft.Image("images/tainagustului.png", width=200)
|
||||
self.login = Login(self.page, self)
|
||||
self.register = Register(self.page, self, self.login)
|
||||
|
||||
go_to = 'login' if self.page.session.get('go_to') == None or 'login' else self.page.session.get('go_to')
|
||||
if go_to == 'login':
|
||||
self.placeholder = ft.Container(
|
||||
content=self.login.build(),
|
||||
width=350
|
||||
)
|
||||
if go_to == 'register':
|
||||
self.placeholder = ft.Container(
|
||||
content=self.register.build(),
|
||||
width=350
|
||||
)
|
||||
|
||||
def build(self):
|
||||
return ft.Container(
|
||||
content=ft.Column(
|
||||
[
|
||||
self.logo,
|
||||
self.placeholder,
|
||||
],
|
||||
horizontal_alignment=ft.CrossAxisAlignment.CENTER
|
||||
)
|
||||
)
|
||||
159
UI_V2/pages/auth/forgot_password.py
Normal file
159
UI_V2/pages/auth/forgot_password.py
Normal file
@@ -0,0 +1,159 @@
|
||||
import flet as ft
|
||||
from dbActions.users import Users
|
||||
from helpers.emails import send_gmail
|
||||
import re
|
||||
import string
|
||||
import secrets
|
||||
|
||||
class ForgotPassword:
|
||||
def __init__(self, page: ft.Page, auth, login):
|
||||
self.page = page
|
||||
self.auth = auth
|
||||
self.login = login
|
||||
self.email = ft.TextField(label="E-mail")
|
||||
self.password = ft.TextField(label="Parola", password=True, can_reveal_password=True)
|
||||
self.repeat_password = ft.TextField(label="Repeta Parola", password=True, can_reveal_password=True)
|
||||
self.inserted_code = ft.TextField(label="Inserati codul primit prin e-mail")
|
||||
self.error_message = ft.Text("", color=ft.Colors.RED)
|
||||
self.placeholder = ft.Column([], horizontal_alignment=ft.CrossAxisAlignment.CENTER)
|
||||
self.otp_code = self._generate_numeric_code()
|
||||
self.user_manager = Users()
|
||||
self.trimite_code_placeholder = ft.Column(
|
||||
[
|
||||
self.email,
|
||||
ft.Button("Trimite cod", on_click=self.send_code_on_email, width=150),
|
||||
],
|
||||
alignment=ft.MainAxisAlignment.CENTER,
|
||||
horizontal_alignment=ft.CrossAxisAlignment.CENTER
|
||||
)
|
||||
self.code_placeholder = ft.Column([], horizontal_alignment=ft.CrossAxisAlignment.CENTER)
|
||||
|
||||
def _generate_numeric_code(self) -> str:
|
||||
digits = string.digits
|
||||
return ''.join(secrets.choice(digits) for _ in range(6))
|
||||
|
||||
def send_code_on_email(self, e):
|
||||
if self._is_valid_email(self.email.value):
|
||||
self.trimite_code_placeholder.controls = []
|
||||
self.trimite_code_placeholder.update()
|
||||
self.code_placeholder.controls.clear()
|
||||
self.code_placeholder.controls.append(self.inserted_code)
|
||||
self.code_placeholder.controls.append(ft.Button("Verifica", width=150, on_click=self.verfy_code))
|
||||
self.code_placeholder.update()
|
||||
print(self.otp_code)
|
||||
# send_gmail(
|
||||
# to_email=self.email.value,
|
||||
# subject="Codul de verificare",
|
||||
# body=f"Codul de verificare este: {self.otp_code}"
|
||||
# )
|
||||
|
||||
|
||||
def _are_all_fields_inserted(self, password=None, repeat_password=None):
|
||||
valid = True
|
||||
self.error_message.value = ''
|
||||
if not password:
|
||||
valid = False
|
||||
if not repeat_password:
|
||||
valid = False
|
||||
if not valid:
|
||||
self.error_message.value = "All fields are required!"
|
||||
self.error_message.update()
|
||||
return valid
|
||||
|
||||
def _check_repeat_password(self, password, confirm_password):
|
||||
if password == confirm_password:
|
||||
self.error_message.value = ""
|
||||
self.error_message.update()
|
||||
return True
|
||||
else:
|
||||
self.error_message.value = "The passwords don't match!"
|
||||
self.error_message.update()
|
||||
return False
|
||||
|
||||
def _is_password_strong(self, password):
|
||||
self.error_message.value = ""
|
||||
if len(password) < 8:
|
||||
self.error_message.value = "Password must be at least 8 characters long!"
|
||||
self.error_message.update()
|
||||
return False
|
||||
if not re.search(r"[A-Z]", password):
|
||||
self.error_message.value = "Password must contain at least one uppercase letter!"
|
||||
self.error_message.update()
|
||||
return False
|
||||
if not re.search(r"[a-z]", password):
|
||||
self.error_message.value = "Password must contain at least one lowercase letter!"
|
||||
self.error_message.update()
|
||||
return False
|
||||
if not re.search(r"[0-9]", password):
|
||||
self.error_message.value = "Password must contain at least one digit!"
|
||||
self.error_message.update()
|
||||
return False
|
||||
if not re.search(r"[^a-zA-Z0-9]", password):
|
||||
self.error_message.value = "Password must contain at least one special character!"
|
||||
self.error_message.update()
|
||||
return False
|
||||
self.error_message.update()
|
||||
return True
|
||||
|
||||
def on_save_btn_click(self, e):
|
||||
password = self.password.value
|
||||
repeat_password = self.repeat_password.value
|
||||
if self._are_all_fields_inserted(password, repeat_password):
|
||||
if self._is_password_strong(password):
|
||||
if self._check_repeat_password(password, repeat_password):
|
||||
print(self.email.value)
|
||||
print(password)
|
||||
if self.user_manager.update_password(self.email.value, password):
|
||||
self.error_message.value = "Parola a fost salvata cu success."
|
||||
self.error_message.color = ft.Colors.GREEN
|
||||
self.error_message.update()
|
||||
else:
|
||||
self.error_message.value = "Nu am gasit un cont valid cu aceasta adresa de email."
|
||||
self.error_message.update()
|
||||
|
||||
def verfy_code(self, e):
|
||||
self.code_placeholder.controls = []
|
||||
self.code_placeholder.update()
|
||||
inserted_code = self.inserted_code.value
|
||||
if inserted_code == self.otp_code:
|
||||
self.placeholder.controls.clear()
|
||||
self.placeholder.controls.append(self.password)
|
||||
self.placeholder.controls.append(self.repeat_password)
|
||||
self.placeholder.controls.append(
|
||||
ft.Button("Salveaza", width=150, on_click=self.on_save_btn_click)
|
||||
)
|
||||
self.placeholder.update()
|
||||
|
||||
else:
|
||||
print(inserted_code)
|
||||
print(self.otp_code)
|
||||
|
||||
def on_back_btn_click(self, e):
|
||||
self.auth.placeholder.content.clean()
|
||||
self.auth.placeholder.content = self.login.build()
|
||||
self.auth.placeholder.update()
|
||||
|
||||
def _is_valid_email(self, email: str) -> bool:
|
||||
email_regex = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
|
||||
if re.fullmatch(email_regex, email) is not None:
|
||||
self.error_message.value = ""
|
||||
self.error_message.update()
|
||||
return True
|
||||
else:
|
||||
self.error_message.value = "Va rugam inserati o adresa de e-mail valida!"
|
||||
self.error_message.update()
|
||||
return False
|
||||
|
||||
def build(self):
|
||||
return ft.Container(
|
||||
content=ft.Column(
|
||||
[
|
||||
self.trimite_code_placeholder,
|
||||
self.code_placeholder,
|
||||
self.placeholder,
|
||||
self.error_message,
|
||||
ft.TextButton("Inapoi la Autentificare.", on_click=self.on_back_btn_click)
|
||||
],
|
||||
horizontal_alignment=ft.CrossAxisAlignment.CENTER
|
||||
)
|
||||
)
|
||||
68
UI_V2/pages/auth/login.py
Normal file
68
UI_V2/pages/auth/login.py
Normal file
@@ -0,0 +1,68 @@
|
||||
import flet as ft
|
||||
from pages.auth.register import Register
|
||||
from dbActions.users import Users
|
||||
from pages.auth.forgot_password import ForgotPassword
|
||||
|
||||
class Login:
|
||||
def __init__(self, page: ft.Page, auth):
|
||||
self.page = page
|
||||
self.auth = auth
|
||||
self.user_manager = Users()
|
||||
self.email = ft.TextField(label="E-mail")
|
||||
self.password = ft.TextField(label="Parola", password=True, can_reveal_password=True)
|
||||
self.error_message = ft.Text("", color=ft.Colors.RED)
|
||||
self.register = Register(self.page, self.auth, self)
|
||||
|
||||
def on_login_btn_click(self, e):
|
||||
email = self.email.value
|
||||
password = self.password.value
|
||||
password_hash = self.user_manager.hash_password(password)
|
||||
user = self.user_manager.authenticate_user(email, password_hash)
|
||||
if user:
|
||||
self.page.client_storage.set("is_authenticated", True)
|
||||
self.page.session.set("user", user)
|
||||
self.error_message.value = ''
|
||||
self.error_message.update()
|
||||
if user['role'] == 'admin':
|
||||
self.page.go('/admin')
|
||||
else:
|
||||
if user['name'] is None or len(user['name'])<=1:
|
||||
self.page.go("/profil")
|
||||
else:
|
||||
self.page.go('/')
|
||||
else:
|
||||
self.error_message.value = 'E-mail sau parola sunt gresite!'
|
||||
self.error_message.update()
|
||||
|
||||
def on_register_btn_click(self, e):
|
||||
self.auth.placeholder.content = self.register.build()
|
||||
self.auth.placeholder.update()
|
||||
|
||||
def on_forgot_password_btn_click(self, e):
|
||||
forgot_password = ForgotPassword(self.page, self.auth, self)
|
||||
self.auth.placeholder.content.clean()
|
||||
self.auth.placeholder.content = forgot_password.build()
|
||||
self.auth.placeholder.update()
|
||||
|
||||
def build(self):
|
||||
return ft.Column(
|
||||
[
|
||||
self.email,
|
||||
self.password,
|
||||
self.error_message,
|
||||
ft.Row(
|
||||
[
|
||||
ft.Button("Autentificare", width=200, on_click=self.on_login_btn_click)
|
||||
],
|
||||
alignment=ft.MainAxisAlignment.CENTER
|
||||
),
|
||||
ft.Text(),
|
||||
ft.Row(
|
||||
[
|
||||
ft.TextButton("Creaza cont", on_click=self.on_register_btn_click),
|
||||
ft.TextButton("Ai uitat parola?", on_click=self.on_forgot_password_btn_click)
|
||||
],
|
||||
alignment=ft.MainAxisAlignment.SPACE_BETWEEN
|
||||
)
|
||||
]
|
||||
)
|
||||
123
UI_V2/pages/auth/register.py
Normal file
123
UI_V2/pages/auth/register.py
Normal file
@@ -0,0 +1,123 @@
|
||||
import flet as ft
|
||||
from dbActions.users import Users
|
||||
import re
|
||||
import time
|
||||
|
||||
class Register:
|
||||
def __init__(self, page: ft.Page, auth, login):
|
||||
self.page = page
|
||||
self.auth = auth
|
||||
self.login = login
|
||||
self.users_manager = Users()
|
||||
self.email = ft.TextField(label="E-mail")
|
||||
self.password = ft.TextField(label="Parola", password=True, can_reveal_password=True)
|
||||
self.repeat_password = ft.TextField(label="Repeta parola", password=True, can_reveal_password=True)
|
||||
self.error_message = ft.Text("", color=ft.Colors.RED)
|
||||
|
||||
def on_login_btn_click(self, e):
|
||||
self.auth.placeholder.content = self.login.build()
|
||||
self.auth.placeholder.update()
|
||||
|
||||
def _is_valid_email(self, email: str) -> bool:
|
||||
email_regex = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
|
||||
if re.fullmatch(email_regex, email) is not None:
|
||||
self.error_message.value = ""
|
||||
self.error_message.update()
|
||||
return True
|
||||
else:
|
||||
self.error_message.value = "Va rugam inserati un e-mail valid!"
|
||||
self.error_message.update()
|
||||
return False
|
||||
|
||||
def _are_all_fields_inserted(self, email=None, password=None, repeat_password=None):
|
||||
valid = True
|
||||
self.error_message.value = ''
|
||||
if not email:
|
||||
valid = False
|
||||
if not password:
|
||||
valid = False
|
||||
if not repeat_password:
|
||||
valid = False
|
||||
if not valid:
|
||||
self.error_message.value = "Toate campurile sunt obligatori!"
|
||||
self.error_message.update()
|
||||
return valid
|
||||
|
||||
def _check_repeat_password(self, password, confirm_password):
|
||||
if password == confirm_password:
|
||||
self.error_message.value = ""
|
||||
self.error_message.update()
|
||||
return True
|
||||
else:
|
||||
self.error_message.value = "Parolele nu se potrivesc!"
|
||||
self.error_message.update()
|
||||
return False
|
||||
|
||||
def _is_password_strong(self, password):
|
||||
self.error_message.value = ""
|
||||
if len(password) < 8:
|
||||
self.error_message.value = "Parola trebuie sa fie cel putin 8 caractere!"
|
||||
self.error_message.update()
|
||||
return False
|
||||
if not re.search(r"[A-Z]", password):
|
||||
self.error_message.value = "Parola trebuie sa contina cel putin o litera mare!"
|
||||
self.error_message.update()
|
||||
return False
|
||||
if not re.search(r"[a-z]", password):
|
||||
self.error_message.value = "Parola trebuie sa contina cel putin o litera mica!"
|
||||
self.error_message.update()
|
||||
return False
|
||||
if not re.search(r"[0-9]", password):
|
||||
self.error_message.value = "Parola trebuie sa contina cel putin un numar!"
|
||||
self.error_message.update()
|
||||
return False
|
||||
if not re.search(r"[^a-zA-Z0-9]", password):
|
||||
self.error_message.value = "Parola trebuie sa contina cel putin un caracter special (exp: !@#$%^&*)!"
|
||||
self.error_message.update()
|
||||
return False
|
||||
self.error_message.update()
|
||||
return True
|
||||
|
||||
|
||||
def on_register_btn_click(self, e):
|
||||
email = self.email.value
|
||||
password = self.password.value
|
||||
repeat_password = self.repeat_password.value
|
||||
if self._are_all_fields_inserted(email, password, repeat_password):
|
||||
print("All fileds are inserted")
|
||||
if self._is_valid_email(email):
|
||||
print("Email is valid")
|
||||
if self._is_password_strong(password):
|
||||
print('Password is string')
|
||||
if self._check_repeat_password(password, repeat_password):
|
||||
print("Password is valid!")
|
||||
password_hash = self.users_manager.hash_password(password)
|
||||
self.users_manager.register_user(email, password_hash)
|
||||
self.error_message.value = "Inregistrarea a avut loc cu succes, va puteti autentifica!"
|
||||
self.error_message.color = ft.Colors.GREEN
|
||||
self.error_message.update()
|
||||
time.sleep(3)
|
||||
self.on_login_btn_click('')
|
||||
|
||||
def build(self):
|
||||
return ft.Column(
|
||||
[
|
||||
self.email,
|
||||
self.password,
|
||||
self.repeat_password,
|
||||
self.error_message,
|
||||
ft.Row(
|
||||
[
|
||||
ft.Button("Creaza cont", width=200, on_click=self.on_register_btn_click)
|
||||
],
|
||||
alignment=ft.MainAxisAlignment.CENTER
|
||||
),
|
||||
ft.Text(),
|
||||
ft.Row(
|
||||
[
|
||||
ft.TextButton("Inapoi la Autentificare", on_click=self.on_login_btn_click),
|
||||
],
|
||||
alignment=ft.MainAxisAlignment.CENTER
|
||||
)
|
||||
]
|
||||
)
|
||||
BIN
UI_V2/pages/categories/__pycache__/category.cpython-313.pyc
Normal file
BIN
UI_V2/pages/categories/__pycache__/category.cpython-313.pyc
Normal file
Binary file not shown.
156
UI_V2/pages/categories/category.py
Normal file
156
UI_V2/pages/categories/category.py
Normal file
@@ -0,0 +1,156 @@
|
||||
import flet as ft
|
||||
from dbActions.products import Products
|
||||
|
||||
class Category:
|
||||
def __init__(self, page: ft.Page):
|
||||
self.page = page
|
||||
self.products_manager = Products()
|
||||
self.category = self.page.session.get("category")
|
||||
|
||||
self.products_group = ft.GridView(
|
||||
spacing=10,
|
||||
runs_count=5,
|
||||
max_extent=200,
|
||||
child_aspect_ratio=1.0,
|
||||
expand=True,
|
||||
width=1000
|
||||
)
|
||||
self.products = self.products_manager.get_all_by_category(self.category['id'])
|
||||
self.add_products(self.products)
|
||||
self.searchbar = ft.TextField(
|
||||
label="Cauta produsul aceasta categorie",
|
||||
expand=True,
|
||||
on_submit=self.on_search_btn_click
|
||||
)
|
||||
|
||||
self.profile_placeholder = ft.Column()
|
||||
self.profile_btn = ft.IconButton(
|
||||
icon=ft.Icons.ACCOUNT_CIRCLE_OUTLINED,
|
||||
on_click=self.on_profile_btn_click,
|
||||
bgcolor=ft.Colors.BROWN,
|
||||
icon_color=ft.Colors.WHITE
|
||||
)
|
||||
self.login_btn = ft.IconButton(
|
||||
icon=ft.Icons.LOGIN,
|
||||
on_click=self.on_login_btn_click,
|
||||
bgcolor=ft.Colors.BROWN,
|
||||
icon_color=ft.Colors.WHITE
|
||||
)
|
||||
if self.page.session.get("user") is not None and '@default.com' not in self.page.session.get("user")['email']:
|
||||
self.profile_placeholder.controls.append(self.profile_btn)
|
||||
else:
|
||||
self.profile_placeholder.controls.append(self.login_btn)
|
||||
|
||||
def on_login_btn_click(self, e):
|
||||
self.page.go('/auth')
|
||||
|
||||
def add_products(self, products):
|
||||
for product in products:
|
||||
self.new_price = ft.Text(
|
||||
value=f"{float(product['price']) - float(product['price'])*float(product['discount'])/100}",
|
||||
size=14 if product['discount'] != 0 else 12,
|
||||
color=ft.Colors.RED if product['discount'] != 0 else ft.Colors.BLACK,
|
||||
weight=ft.FontWeight.BOLD
|
||||
)
|
||||
print(type(product['discount']))
|
||||
self.old_price = ft.Text(
|
||||
value=f"{product['price']}" if product['discount'] != 0 else '',
|
||||
size=12,
|
||||
color=ft.Colors.GREY,
|
||||
style=ft.TextStyle(decoration=ft.TextDecoration.LINE_THROUGH),
|
||||
)
|
||||
card = ft.Card(
|
||||
content=ft.Container(
|
||||
content=ft.Column(
|
||||
[
|
||||
ft.Image(src=product['image'], width=170, height=100, border_radius=10, fit=ft.ImageFit.COVER),
|
||||
ft.Text(product['name'], weight=ft.FontWeight.BOLD),
|
||||
ft.Row(
|
||||
[
|
||||
ft.Text(f"Pret:", size=12),
|
||||
self.old_price,
|
||||
self.new_price,
|
||||
ft.Text(f"lei/{product['quantity']}g", size=12),
|
||||
],
|
||||
alignment=ft.MainAxisAlignment.CENTER,
|
||||
spacing=4
|
||||
)
|
||||
],
|
||||
horizontal_alignment=ft.CrossAxisAlignment.CENTER
|
||||
),
|
||||
ink=True,
|
||||
on_click=lambda e, title=product: self.on_product_click(title),
|
||||
padding=5
|
||||
)
|
||||
)
|
||||
self.products_group.controls.append(card)
|
||||
|
||||
def on_search_btn_click(self, e):
|
||||
search = self.searchbar.value
|
||||
buffer = []
|
||||
for product in self.products:
|
||||
if search.lower() in product['name'].lower():
|
||||
buffer.append(product)
|
||||
self.products_group.controls.clear()
|
||||
self.add_products(buffer)
|
||||
self.products_group.update()
|
||||
|
||||
def on_profile_btn_click(self, e):
|
||||
self.page.go('/profil')
|
||||
|
||||
def on_home_btn_click(self, e):
|
||||
self.page.go('/')
|
||||
|
||||
def on_product_click(self, product):
|
||||
self.page.session.set("product", product)
|
||||
name = product['name'].replace(" ", "-").lower()
|
||||
self.page.go(f'/produs/{name}')
|
||||
|
||||
def on_cart_btn_click(self, e):
|
||||
self.page.go("/pre_load_cos")
|
||||
|
||||
def build(self):
|
||||
return ft.Container(
|
||||
content=ft.Column(
|
||||
[
|
||||
ft.Row(
|
||||
[
|
||||
self.searchbar,
|
||||
ft.IconButton(
|
||||
icon=ft.Icons.SEARCH,
|
||||
on_click=self.on_search_btn_click,
|
||||
bgcolor=ft.Colors.BROWN,
|
||||
icon_color=ft.Colors.WHITE
|
||||
),
|
||||
ft.VerticalDivider(),
|
||||
self.profile_placeholder,
|
||||
ft.IconButton(
|
||||
icon=ft.Icons.SHOPPING_CART_OUTLINED,
|
||||
bgcolor=ft.Colors.BROWN,
|
||||
icon_color=ft.Colors.WHITE,
|
||||
on_click=self.on_cart_btn_click
|
||||
)
|
||||
],
|
||||
width=1000
|
||||
),
|
||||
ft.Row(
|
||||
[
|
||||
ft.IconButton(icon=ft.Icons.HOME, on_click=self.on_home_btn_click),
|
||||
ft.Text(
|
||||
value=self.category['name'],
|
||||
weight=ft.FontWeight.BOLD,
|
||||
size=18
|
||||
),
|
||||
],
|
||||
width=1000
|
||||
),
|
||||
self.products_group
|
||||
],
|
||||
scroll=ft.ScrollMode.ADAPTIVE,
|
||||
expand=True,
|
||||
horizontal_alignment=ft.CrossAxisAlignment.CENTER
|
||||
),
|
||||
expand=True,
|
||||
padding=10,
|
||||
bgcolor=ft.Colors.WHITE
|
||||
)
|
||||
BIN
UI_V2/pages/home/__pycache__/home.cpython-313.pyc
Normal file
BIN
UI_V2/pages/home/__pycache__/home.cpython-313.pyc
Normal file
Binary file not shown.
216
UI_V2/pages/home/home.py
Normal file
216
UI_V2/pages/home/home.py
Normal file
@@ -0,0 +1,216 @@
|
||||
import flet as ft
|
||||
from dbActions.categories import Categories
|
||||
from dbActions.products import Products
|
||||
|
||||
class Home:
|
||||
def __init__(self, page: ft.Page):
|
||||
self.page = page
|
||||
self.categories_manager = Categories()
|
||||
self.header = ft.Row(
|
||||
[
|
||||
#ft.Button("Acasa", icon=ft.Icons.HOME, on_click=self.on_acasa_btn_click)
|
||||
ft.Text("Categori", weight=ft.FontWeight.BOLD, size=18)
|
||||
],
|
||||
alignment=ft.MainAxisAlignment.CENTER,
|
||||
width=1000
|
||||
)
|
||||
self.banner = ft.Image("images/banner.png", width=1000, height=350, fit=ft.ImageFit.COVER)
|
||||
self.categories_group = ft.Row([], scroll=ft.ScrollMode.ADAPTIVE, expand=True)
|
||||
self.add_categories()
|
||||
self.products_manager = Products()
|
||||
self.products_group = ft.GridView(
|
||||
spacing=10,
|
||||
runs_count=5,
|
||||
max_extent=200,
|
||||
child_aspect_ratio=1.0,
|
||||
expand=True,
|
||||
width=1000
|
||||
)
|
||||
self.products = self.products_manager.get_all()
|
||||
self.add_products(self.products)
|
||||
|
||||
self.searchbar = ft.TextField(
|
||||
label="Cauta produsul in toate categoriile",
|
||||
expand=True,
|
||||
on_submit=self.on_search_btn_click
|
||||
)
|
||||
|
||||
self.profile_placeholder = ft.Column()
|
||||
self.profile_btn = ft.IconButton(
|
||||
icon=ft.Icons.ACCOUNT_CIRCLE_OUTLINED,
|
||||
on_click=self.on_profile_btn_click,
|
||||
bgcolor=ft.Colors.BROWN,
|
||||
icon_color=ft.Colors.WHITE
|
||||
)
|
||||
self.login_btn = ft.IconButton(
|
||||
icon=ft.Icons.LOGIN,
|
||||
on_click=self.on_login_btn_click,
|
||||
bgcolor=ft.Colors.BROWN,
|
||||
icon_color=ft.Colors.WHITE
|
||||
)
|
||||
|
||||
if self.page.session.get("user") is not None and '@default.com' not in self.page.session.get("user")['email']:
|
||||
self.profile_placeholder.controls.append(self.profile_btn)
|
||||
else:
|
||||
self.profile_placeholder.controls.append(self.login_btn)
|
||||
self.search_for = self.page.session.get("search_for")
|
||||
if self.search_for:
|
||||
self.searchbar.value = self.page.session.get("search_for")
|
||||
search = self.searchbar.value
|
||||
buffer = []
|
||||
for product in self.products:
|
||||
if search.lower() in product['name'].lower():
|
||||
buffer.append(product)
|
||||
self.products_group.controls.clear()
|
||||
self.add_products(buffer)
|
||||
self.page.session.set("search_for", None)
|
||||
|
||||
def on_acasa_btn_click(self, e):
|
||||
self.page.go('/')
|
||||
|
||||
def on_login_btn_click(self, e):
|
||||
self.page.go('/auth')
|
||||
|
||||
def add_products(self, products):
|
||||
for product in products:
|
||||
self.new_price = ft.Text(
|
||||
value=f"{round(float(product['price']) - float(product['price'])*float(product['discount'])/100,2)}",
|
||||
size=14 if product['discount'] != 0 else 12,
|
||||
color=ft.Colors.RED if product['discount'] != 0 else ft.Colors.BLACK,
|
||||
weight=ft.FontWeight.BOLD
|
||||
)
|
||||
print(type(product['discount']))
|
||||
self.old_price = ft.Text(
|
||||
value=f"{product['price']}" if product['discount'] != 0 else '',
|
||||
size=12,
|
||||
color=ft.Colors.GREY,
|
||||
style=ft.TextStyle(decoration=ft.TextDecoration.LINE_THROUGH),
|
||||
)
|
||||
card = ft.Card(
|
||||
content=ft.Container(
|
||||
content=ft.Column(
|
||||
[
|
||||
ft.Image(src=product['image'], width=170, height=100, border_radius=10, fit=ft.ImageFit.COVER),
|
||||
ft.Text(product['name'], weight=ft.FontWeight.BOLD),
|
||||
ft.Row(
|
||||
[
|
||||
ft.Text(f"Pret:", size=12),
|
||||
self.old_price,
|
||||
self.new_price,
|
||||
ft.Text(f"lei/{product['quantity']}g", size=12),
|
||||
],
|
||||
alignment=ft.MainAxisAlignment.CENTER,
|
||||
spacing=4
|
||||
)
|
||||
],
|
||||
horizontal_alignment=ft.CrossAxisAlignment.CENTER
|
||||
),
|
||||
ink=True,
|
||||
on_click=lambda e, title=product: self.on_product_click(title),
|
||||
padding=5
|
||||
)
|
||||
)
|
||||
self.products_group.controls.append(card)
|
||||
|
||||
def add_categories(self):
|
||||
categories = self.categories_manager.get_categories()
|
||||
for category in categories:
|
||||
card = ft.Card(
|
||||
content=ft.Container(
|
||||
content=ft.Column(
|
||||
[
|
||||
ft.Image(
|
||||
src=category['image'],
|
||||
width=100,
|
||||
height = 80,
|
||||
border_radius=10,
|
||||
fit=ft.ImageFit.COVER),
|
||||
ft.Text(category['name'])
|
||||
],
|
||||
horizontal_alignment=ft.CrossAxisAlignment.CENTER,
|
||||
alignment=ft.MainAxisAlignment.SPACE_BETWEEN
|
||||
),
|
||||
ink=True,
|
||||
on_click=lambda e, title=category: self.on_category_click(title),
|
||||
padding=5,
|
||||
width=120,
|
||||
height=120
|
||||
)
|
||||
)
|
||||
self.categories_group.controls.append(card)
|
||||
|
||||
def on_category_click(self, cat):
|
||||
name = cat['name'].replace(" ","-").lower()
|
||||
self.page.session.set("category", cat)
|
||||
self.page.go(f"/categorie/{name}")
|
||||
|
||||
def on_product_click(self, product):
|
||||
self.page.session.set("product", product)
|
||||
name = product['name'].replace(" ", "-").lower()
|
||||
self.page.go(f'/produs/{name}')
|
||||
|
||||
def on_profile_btn_click(self, e):
|
||||
self.page.go('/profil')
|
||||
|
||||
def on_cart_btn_click(self, e):
|
||||
self.page.go("/pre_load_cos")
|
||||
|
||||
def on_search_btn_click(self, e):
|
||||
search = self.searchbar.value
|
||||
buffer = []
|
||||
for product in self.products:
|
||||
if search.lower() in product['name'].lower():
|
||||
buffer.append(product)
|
||||
self.products_group.controls.clear()
|
||||
self.add_products(buffer)
|
||||
self.products_group.update()
|
||||
|
||||
def build(self):
|
||||
return ft.Container(
|
||||
content=ft.Column(
|
||||
[
|
||||
ft.Row(
|
||||
[
|
||||
self.searchbar,
|
||||
ft.IconButton(
|
||||
icon=ft.Icons.SEARCH,
|
||||
on_click=self.on_search_btn_click,
|
||||
bgcolor=ft.Colors.BROWN,
|
||||
icon_color=ft.Colors.WHITE
|
||||
),
|
||||
ft.VerticalDivider(),
|
||||
self.profile_placeholder,
|
||||
ft.IconButton(
|
||||
icon=ft.Icons.SHOPPING_CART_OUTLINED,
|
||||
bgcolor=ft.Colors.BROWN,
|
||||
icon_color=ft.Colors.WHITE,
|
||||
on_click = self.on_cart_btn_click
|
||||
)
|
||||
],
|
||||
width=1000
|
||||
),
|
||||
self.banner,
|
||||
ft.Column(
|
||||
[
|
||||
self.header,
|
||||
self.categories_group,
|
||||
ft.Row(
|
||||
[
|
||||
ft.Text("Produse Populare", size=18, weight=ft.FontWeight.BOLD),
|
||||
],
|
||||
alignment=ft.MainAxisAlignment.CENTER,
|
||||
width=1000
|
||||
),
|
||||
self.products_group
|
||||
],
|
||||
horizontal_alignment=ft.CrossAxisAlignment.CENTER,
|
||||
expand=True
|
||||
)
|
||||
],
|
||||
scroll=ft.ScrollMode.ADAPTIVE,
|
||||
horizontal_alignment=ft.CrossAxisAlignment.CENTER,
|
||||
),
|
||||
expand=True,
|
||||
padding=10,
|
||||
bgcolor=ft.Colors.WHITE
|
||||
)
|
||||
BIN
UI_V2/pages/products/__pycache__/product.cpython-313.pyc
Normal file
BIN
UI_V2/pages/products/__pycache__/product.cpython-313.pyc
Normal file
Binary file not shown.
464
UI_V2/pages/products/product.py
Normal file
464
UI_V2/pages/products/product.py
Normal file
@@ -0,0 +1,464 @@
|
||||
import flet as ft
|
||||
from dbActions.orders import Orders
|
||||
from dbActions.products import Products
|
||||
from helpers.default_user import DefaultUser
|
||||
|
||||
class ProductPage:
|
||||
def __init__(self, page: ft.Page, shop=''):
|
||||
self.page = page
|
||||
self.shop = shop
|
||||
self.orders = Orders()
|
||||
self.product = self.page.session.get('product')
|
||||
print(self.product)
|
||||
|
||||
self.product_main_image = ft.Image(
|
||||
src = self.product['image'],
|
||||
width=300,
|
||||
height=250,
|
||||
border_radius=10,
|
||||
fit=ft.ImageFit.COVER
|
||||
)
|
||||
|
||||
self.product_name = ft.Text(
|
||||
value = self.product['name'],
|
||||
size=20,
|
||||
weight=ft.FontWeight.BOLD
|
||||
)
|
||||
self.old_price = ft.Text(
|
||||
value=f"{self.product['price']} Lei" if self.product['discount'] > 0 else '',
|
||||
size=12,
|
||||
color=ft.Colors.GREY,
|
||||
style=ft.TextStyle(decoration=ft.TextDecoration.LINE_THROUGH)
|
||||
)
|
||||
self.price = ft.Text(
|
||||
value=f"{round(self.product['price'] - self.product['price']*self.product['discount']/100, 2)} Lei",
|
||||
size=17 if self.product['discount'] > 0 else None,
|
||||
color=ft.Colors.RED if self.product['discount'] > 0 else None,
|
||||
weight=ft.FontWeight.BOLD
|
||||
)
|
||||
|
||||
self.description = ft.Text(
|
||||
value=self.product['description'],
|
||||
width=600
|
||||
)
|
||||
|
||||
self.details = ft.Text(
|
||||
value=self.product['details'],
|
||||
width=600
|
||||
)
|
||||
|
||||
self.quantity = ft.TextField(label="", value="1", width=60)
|
||||
self.quantify_group = ft.Row(
|
||||
[
|
||||
ft.IconButton(ft.Icons.ARROW_CIRCLE_LEFT, on_click=self.remove_quantity),
|
||||
self.quantity,
|
||||
ft.IconButton(ft.Icons.ARROW_CIRCLE_RIGHT, on_click=self.add_quantity),
|
||||
]
|
||||
)
|
||||
|
||||
aviab = {
|
||||
'in_stock': "In stoc",
|
||||
'in_provider_stock': "In stoc la furnizor",
|
||||
'not_available': "Indisponibil"
|
||||
}
|
||||
|
||||
self.availability = ft.Text(aviab[self.product['aviability']])
|
||||
self.stock_quantity = ft.Text(self.product['quantity'])
|
||||
|
||||
self.similar_products = ft.Row(width=1000, scroll=ft.ScrollMode.ADAPTIVE)
|
||||
for sp in self.get_similar_porducts():
|
||||
product = ft.Card(
|
||||
content=ft.Container(
|
||||
content=ft.Column(
|
||||
[
|
||||
ft.Stack(
|
||||
[
|
||||
ft.Image(
|
||||
src=f"images/{sp['image']}",
|
||||
fit=ft.ImageFit.COVER,
|
||||
repeat=ft.ImageRepeat.NO_REPEAT,
|
||||
border_radius=ft.border_radius.all(5),
|
||||
width=220,
|
||||
height=220
|
||||
),
|
||||
|
||||
ft.Container(
|
||||
content=ft.Column(
|
||||
[
|
||||
ft.Text(f"{sp['name']}", size=12),
|
||||
ft.Row(
|
||||
[
|
||||
ft.Row(
|
||||
[
|
||||
ft.Text(
|
||||
f"{sp['price']} Lei/{sp['quantity']}" if sp['discount']>0 else '',
|
||||
size=12,
|
||||
color=ft.Colors.GREY,
|
||||
style=ft.TextStyle(decoration=ft.TextDecoration.LINE_THROUGH)
|
||||
),
|
||||
ft.Text(
|
||||
f"{sp['price'] - sp['price']*sp['discount']/100} Lei/{sp['quantity']}",
|
||||
size=14,
|
||||
weight=ft.FontWeight.BOLD
|
||||
),
|
||||
],
|
||||
alignment=ft.MainAxisAlignment.CENTER
|
||||
),
|
||||
ft.IconButton(ft.Icons.ADD_SHOPPING_CART, on_click=lambda e, i=sp: self.on_sp_add_to_cart_click(i))
|
||||
],
|
||||
width=200,
|
||||
alignment=ft.MainAxisAlignment.SPACE_BETWEEN
|
||||
)
|
||||
|
||||
],
|
||||
horizontal_alignment=ft.CrossAxisAlignment.CENTER
|
||||
),
|
||||
bgcolor=ft.Colors.WHITE,
|
||||
bottom=0,
|
||||
border_radius=ft.border_radius.only(bottom_left=5, bottom_right=5),
|
||||
padding=10
|
||||
)
|
||||
],
|
||||
),
|
||||
],
|
||||
horizontal_alignment=ft.CrossAxisAlignment.CENTER,
|
||||
alignment=ft.MainAxisAlignment.SPACE_BETWEEN
|
||||
|
||||
),
|
||||
padding=10,
|
||||
ink=True,
|
||||
on_click=lambda e, i=sp: self.on_sp_product_click(i)
|
||||
),
|
||||
width=250,
|
||||
height=250,
|
||||
)
|
||||
self.similar_products.controls.append(product)
|
||||
|
||||
self.product_content_image = ft.Column(
|
||||
[
|
||||
ft.Card(
|
||||
content=ft.Container(
|
||||
self.product_main_image,
|
||||
padding=10
|
||||
)
|
||||
)
|
||||
]
|
||||
)
|
||||
self.product_content_details = ft.Column(
|
||||
[
|
||||
|
||||
ft.Row(
|
||||
[
|
||||
ft.Text("Pret:", weight=ft.FontWeight.BOLD),
|
||||
self.old_price,
|
||||
self.price
|
||||
]
|
||||
),
|
||||
ft.Text("Descriere", weight=ft.FontWeight.BOLD),
|
||||
self.description,
|
||||
ft.Text("Detalii", weight=ft.FontWeight.BOLD),
|
||||
self.details,
|
||||
ft.Row(
|
||||
[
|
||||
ft.Text("Disponibilitate", weight=ft.FontWeight.BOLD),
|
||||
self.availability
|
||||
]
|
||||
),
|
||||
ft.Row(
|
||||
[
|
||||
ft.Text('Cantitate (g)', weight=ft.FontWeight.BOLD),
|
||||
self.stock_quantity
|
||||
]
|
||||
),
|
||||
ft.Row(
|
||||
[
|
||||
self.quantify_group,
|
||||
ft.FilledButton(
|
||||
"Adauga in cos",
|
||||
icon=ft.Icons.SHOPPING_CART,
|
||||
width=150,
|
||||
on_click= lambda e, i=self.product: self.on_add_to_cart_btn_click(i)
|
||||
)
|
||||
]
|
||||
)
|
||||
],
|
||||
alignment=ft.MainAxisAlignment.START
|
||||
)
|
||||
|
||||
self.desktop_container = ft.Row(alignment=ft.MainAxisAlignment.CENTER)
|
||||
self.mobile_container = ft.Column()
|
||||
|
||||
if self.page.width < 600:
|
||||
self.mobile_container.controls.append(self.product_content_image)
|
||||
self.mobile_container.controls.append(self.product_content_details)
|
||||
else:
|
||||
self.desktop_container.controls.append(self.product_content_image)
|
||||
self.desktop_container.controls.append(self.product_content_details)
|
||||
|
||||
self.confirm_dialog = ft.AlertDialog(
|
||||
title=ft.Text('Adauga in cos?'),
|
||||
content=ft.Column(
|
||||
[
|
||||
ft.Icon(ft.Icons.SHOPPING_CART, size=100)
|
||||
],
|
||||
height=100,
|
||||
alignment=ft.MainAxisAlignment.CENTER,
|
||||
horizontal_alignment=ft.CrossAxisAlignment.CENTER
|
||||
),
|
||||
actions=[
|
||||
ft.FilledButton(
|
||||
"Anuleaza",
|
||||
bgcolor=ft.Colors.GREY,
|
||||
on_click=self.on_cancel_btn_click),
|
||||
ft.FilledButton(
|
||||
"Confirma",
|
||||
on_click=self.on_confirm_btn_click)
|
||||
]
|
||||
)
|
||||
self.page.add(self.confirm_dialog)
|
||||
|
||||
self.searchbar = ft.TextField(
|
||||
label="Cauta produsul in toate categoriile",
|
||||
expand=True,
|
||||
on_submit=self.on_search_btn_click
|
||||
)
|
||||
|
||||
self.ask_for_login_dialog = ft.AlertDialog(
|
||||
title=ft.Text("Va rugam sa va autentificati!"),
|
||||
content=ft.Column(
|
||||
[
|
||||
ft.Text("Daca nu aveti un cont activ, puteti crea unul."),
|
||||
ft.Text("Dupa confirmare, selectati din nou produsul.")
|
||||
],
|
||||
height=50
|
||||
),
|
||||
actions=[
|
||||
ft.FilledButton(
|
||||
"Continua fara cont",
|
||||
bgcolor=ft.Colors.GREY,
|
||||
on_click=self.on_cancel_go_to_login_btn_click),
|
||||
ft.FilledButton(
|
||||
"Autentificare",
|
||||
on_click=self.on_confirm_go_to_login_btn_click)
|
||||
]
|
||||
)
|
||||
|
||||
self.selected_item = None
|
||||
|
||||
self.profile_placeholder = ft.Column()
|
||||
self.profile_btn = ft.IconButton(
|
||||
icon=ft.Icons.ACCOUNT_CIRCLE_OUTLINED,
|
||||
on_click=self.on_profile_btn_click,
|
||||
bgcolor=ft.Colors.BROWN,
|
||||
icon_color=ft.Colors.WHITE
|
||||
)
|
||||
self.login_btn = ft.IconButton(
|
||||
icon=ft.Icons.LOGIN,
|
||||
on_click=self.on_login_btn_click,
|
||||
bgcolor=ft.Colors.BROWN,
|
||||
icon_color=ft.Colors.WHITE
|
||||
)
|
||||
if self.page.session.get("user") is not None and '@default.com' not in self.page.session.get("user")['email']:
|
||||
self.profile_placeholder.controls.append(self.profile_btn)
|
||||
else:
|
||||
self.profile_placeholder.controls.append(self.login_btn)
|
||||
|
||||
def on_login_btn_click(self, e):
|
||||
self.page.go('/auth')
|
||||
|
||||
def on_cancel_go_to_login_btn_click(self, e):
|
||||
self.page.close(self.ask_for_login_dialog)
|
||||
self.user = DefaultUser(self.page)
|
||||
#print(self.user.default_user)
|
||||
self.page.session.set("user", self.user.default_user)
|
||||
# print(self.page.session.get("user"))
|
||||
# try:
|
||||
# quantity = int(self.quantity.value)
|
||||
# if quantity > 0:
|
||||
# self.page.open(self.confirm_dialog)
|
||||
# self._product = self.selected_item
|
||||
# except Exception as e:
|
||||
# print(e)
|
||||
|
||||
def on_confirm_go_to_login_btn_click(self, e):
|
||||
self.page.close(self.ask_for_login_dialog)
|
||||
self.page.go('/auth')
|
||||
|
||||
def on_search_btn_click(self, e):
|
||||
self.page.session.set("search_for", self.searchbar.value)
|
||||
self.page.go('/')
|
||||
|
||||
def on_profile_btn_click(self, e):
|
||||
self.page.go('/profil')
|
||||
|
||||
def on_cart_btn_click(self, e):
|
||||
if self.page.session.get('user') == None:
|
||||
self.page.go("/pre_load_cos")
|
||||
else:
|
||||
self.page.go("/cos")
|
||||
|
||||
def on_cancel_btn_click(self, e):
|
||||
self.page.close(self.confirm_dialog)
|
||||
|
||||
def on_confirm_btn_click(self, e):
|
||||
item = self.product
|
||||
self.page.close(self.confirm_dialog)
|
||||
user = self.page.session.get('user')
|
||||
print("user:", user)
|
||||
if user:
|
||||
_cart = self.orders.get_on_hold_order(user['id'])
|
||||
if not _cart:
|
||||
self.orders.add_order(user['id'])
|
||||
_cart = self.orders.get_on_hold_order(user['id'])
|
||||
self.add_product_if_not_exists(item, _cart)
|
||||
|
||||
def add_product_if_not_exists(self, product, cart):
|
||||
user = self.page.session.get('user')
|
||||
self.on_hold_orders = self.orders.get_on_hold_order(user['id'])
|
||||
self.order_products = self.orders.get_order_products(self.on_hold_orders['id'])
|
||||
found = False
|
||||
for order_product in self.order_products:
|
||||
if str(product['id']) == str(order_product['prdouct_id']):
|
||||
quantity = order_product['quantity'] + int(self.quantity.value)
|
||||
self.orders.update_order_map_quantity(order_product['id'], quantity)
|
||||
found = True
|
||||
break
|
||||
if not found:
|
||||
self.orders.add_product_to_order(product['id'], cart['id'], int(self.quantity.value))
|
||||
|
||||
def get_similar_porducts(self):
|
||||
productsDB = Products()
|
||||
similar_products = productsDB.get_all_by_category(self.product['category_id'])
|
||||
products = []
|
||||
|
||||
for product in similar_products:
|
||||
if product['id'] != self.product['id']:
|
||||
products.append(product)
|
||||
return products
|
||||
|
||||
def remove_quantity(self, e):
|
||||
buffer = int(self.quantity.value)
|
||||
if buffer > 0:
|
||||
self.quantity.value = str(buffer-1)
|
||||
self.quantity.update()
|
||||
self.product['quantity'] -=1
|
||||
|
||||
def add_quantity(self, e):
|
||||
buffer = int(self.quantity.value)
|
||||
self.quantity.value = str(buffer+1)
|
||||
self.quantity.update()
|
||||
self.product['quantity'] +=1
|
||||
|
||||
def on_chanage_image_click(self, item):
|
||||
self.product_main_image.src = 'images/'+item
|
||||
self.product_main_image.update()
|
||||
print(self.product_main_image.src)
|
||||
|
||||
def on_home_btn_click(self, e):
|
||||
self.page.go('/')
|
||||
|
||||
def on_sp_product_click(self, product):
|
||||
self.page.session.set('product', product)
|
||||
|
||||
def ask_for_create_user(self):
|
||||
self.page.open(self.ask_for_login_dialog)
|
||||
|
||||
def on_add_to_cart_btn_click(self, item):
|
||||
self.selected_item = item
|
||||
user = self.page.session.get('user')
|
||||
print(user)
|
||||
if not user:
|
||||
self.ask_for_create_user()
|
||||
else:
|
||||
try:
|
||||
quantity = int(self.quantity.value)
|
||||
if quantity > 0:
|
||||
self.page.open(self.confirm_dialog)
|
||||
self._product = self.selected_item
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
def on_sp_add_to_cart_click(self, item):
|
||||
user = self.page.session.get('user')
|
||||
if not user:
|
||||
self.page.go('/login')
|
||||
self.page.client_storage.remove("remembered_token")
|
||||
self.page.client_storage.remove("remembered_user")
|
||||
self.page.session.remove('user')
|
||||
_cart = self.orders.get_on_hold_order(user['id'])
|
||||
if not _cart:
|
||||
self.orders.add_order(user['id'])
|
||||
_cart = self.orders.get_on_hold_order(user['id'])
|
||||
self.orders.add_product_to_order(item['id'], _cart['id'], 1)
|
||||
|
||||
def build(self):
|
||||
return ft.Container(
|
||||
content=ft.Column(
|
||||
[
|
||||
ft.Row(
|
||||
[
|
||||
self.searchbar,
|
||||
ft.IconButton(
|
||||
icon=ft.Icons.SEARCH,
|
||||
on_click=self.on_search_btn_click,
|
||||
bgcolor=ft.Colors.BROWN,
|
||||
icon_color=ft.Colors.WHITE
|
||||
),
|
||||
ft.VerticalDivider(),
|
||||
self.profile_placeholder,
|
||||
ft.IconButton(
|
||||
icon=ft.Icons.SHOPPING_CART_OUTLINED,
|
||||
bgcolor=ft.Colors.BROWN,
|
||||
icon_color=ft.Colors.WHITE,
|
||||
on_click=self.on_cart_btn_click
|
||||
)
|
||||
],
|
||||
width=1000
|
||||
),
|
||||
ft.Row(
|
||||
[
|
||||
ft.IconButton(
|
||||
on_click=self.on_home_btn_click,
|
||||
icon=ft.Icons.HOME
|
||||
),
|
||||
self.product_name,
|
||||
],
|
||||
alignment=ft.MainAxisAlignment.START,
|
||||
expand=True,
|
||||
width=1000
|
||||
),
|
||||
ft.Container(
|
||||
content= ft.Column(
|
||||
[
|
||||
self.desktop_container,
|
||||
self.mobile_container,
|
||||
],
|
||||
alignment=ft.CrossAxisAlignment.START,
|
||||
width=1000
|
||||
),
|
||||
padding=10
|
||||
),
|
||||
ft.Container(
|
||||
content=ft.Column(
|
||||
[
|
||||
ft.Text("Produse similare", size=17, weight=ft.FontWeight.BOLD),
|
||||
self.similar_products,
|
||||
]
|
||||
),
|
||||
padding=10
|
||||
),
|
||||
ft.Row(
|
||||
[
|
||||
ft.Text()
|
||||
],
|
||||
expand=True
|
||||
)
|
||||
],
|
||||
scroll=ft.ScrollMode.ADAPTIVE,
|
||||
horizontal_alignment=ft.CrossAxisAlignment.CENTER,
|
||||
width=1000
|
||||
),
|
||||
expand=True,
|
||||
bgcolor=ft.Colors.WHITE,
|
||||
padding=ft.padding.only(left=10, right=10)
|
||||
)
|
||||
BIN
UI_V2/pages/profile/__pycache__/profilepage.cpython-313.pyc
Normal file
BIN
UI_V2/pages/profile/__pycache__/profilepage.cpython-313.pyc
Normal file
Binary file not shown.
208
UI_V2/pages/profile/profilepage.py
Normal file
208
UI_V2/pages/profile/profilepage.py
Normal file
@@ -0,0 +1,208 @@
|
||||
import flet as ft
|
||||
from dbActions.users import Users
|
||||
from dbActions.company import Company
|
||||
|
||||
class ProfilePage:
|
||||
def __init__(self, page: ft.Page):
|
||||
self.page = page
|
||||
self.user_manager = Users()
|
||||
self.company_manager = Company()
|
||||
self.user = self.page.session.get("user")
|
||||
self.company = self.company_manager.get_company(self.user['id'])
|
||||
self.user_name = ft.TextField(label="Nume si Prenume", value=self.user['name'])
|
||||
self.email = ft.TextField(label="E-mail", value=self.user['email'], read_only=True)
|
||||
self.phone = ft.TextField(label="Telefon", value=self.user['phone'])
|
||||
self.address = ft.TextField(
|
||||
label="Adresa",
|
||||
multiline=True,
|
||||
min_lines=3,
|
||||
max_lines=5,
|
||||
value = self.user['address'].split("~")[0] if self.user['address'] else ''
|
||||
)
|
||||
self.company_name = ft.TextField(
|
||||
label="Denumire firma",
|
||||
value=self.company['name'] if self.company else ''
|
||||
)
|
||||
self.vat = ft.TextField(
|
||||
label="CUI",
|
||||
value=self.company['vat'] if self.company else ''
|
||||
)
|
||||
self.register_number = ft.TextField(
|
||||
label="Numar registru comert",
|
||||
value=self.company['register_number'] if self.company else ''
|
||||
)
|
||||
self.company_address = ft.TextField(
|
||||
label="Sediu",
|
||||
multiline=True,
|
||||
min_lines=3,
|
||||
max_lines=5,
|
||||
value=self.company['address'] if self.company else '')
|
||||
self.second_address_placeholder = ft.Column()
|
||||
self.second_address = ft.TextField(
|
||||
label="Adresa de livrare",
|
||||
multiline=True,
|
||||
min_lines=3,
|
||||
max_lines=5,
|
||||
value=self.user['address'].split("~")[1] if self.user['address'] and len(self.user['address'].split("~"))>1 else ''
|
||||
)
|
||||
self.second_address_placeholder =ft.Column()
|
||||
self.order_placeholder =ft.Column()
|
||||
self.error_message = ft.Text("", text_align=ft.TextAlign.CENTER)
|
||||
|
||||
if self.user['address'] and len(self.user['address'].split("~"))>1 :
|
||||
self.is_second_address = True
|
||||
self.second_address_placeholder.controls.append(self.second_address)
|
||||
if self.company:
|
||||
self.is_company = True
|
||||
self.order_placeholder.controls.append(self.company_name)
|
||||
self.order_placeholder.controls.append(self.vat)
|
||||
self.order_placeholder.controls.append(self.register_number)
|
||||
self.order_placeholder.controls.append(self.company_address)
|
||||
|
||||
self.is_company = False
|
||||
self.is_second_address = False
|
||||
|
||||
def on_second_address_btn_click(self, e):
|
||||
self.is_second_address = True
|
||||
self.second_address_placeholder.controls.append(self.second_address)
|
||||
self.second_address_placeholder.update()
|
||||
|
||||
def on_order_btn_click(self, e):
|
||||
self.is_company = True
|
||||
self.order_placeholder.controls.append(self.company_name)
|
||||
self.order_placeholder.controls.append(self.vat)
|
||||
self.order_placeholder.controls.append(self.register_number)
|
||||
self.order_placeholder.controls.append(self.company_address)
|
||||
self.order_placeholder.update()
|
||||
|
||||
def check_inserted_user_data(self, username, phone, address):
|
||||
found = False
|
||||
if username is None or len(username)< 1:
|
||||
found = True
|
||||
if phone is None or len(phone)< 1:
|
||||
found = True
|
||||
if address is None or len(address)< 1:
|
||||
found = True
|
||||
if found:
|
||||
self.error_message.value = "Toate campurile sunt obligatori!"
|
||||
self.error_message.color = ft.Colors.RED
|
||||
self.error_message.update()
|
||||
|
||||
return found
|
||||
|
||||
def check_second_address_inserted(self, address):
|
||||
if address is None or len(address)< 1:
|
||||
self.error_message.value = "Va rugam inserati adresa de livrare!"
|
||||
self.error_message.color = ft.Colors.RED
|
||||
self.error_message.update()
|
||||
return True
|
||||
return False
|
||||
|
||||
def check_company_data_inserted(self, company_name, vat, register_number, company_address):
|
||||
found = False
|
||||
if company_name is None or len(company_name)< 1:
|
||||
found = True
|
||||
if vat is None or len(vat)< 1:
|
||||
found = True
|
||||
if register_number is None or len(register_number)< 1:
|
||||
found = True
|
||||
if company_address is None or len(company_address)< 1:
|
||||
found = True
|
||||
if found:
|
||||
self.error_message.value = "Toate campurile sunt obligatori!"
|
||||
self.error_message.color = ft.Colors.RED
|
||||
self.error_message.update()
|
||||
return found
|
||||
|
||||
def on_save_btn_click(self, e):
|
||||
username = self.user_name.value
|
||||
phone = self.phone.value
|
||||
address = self.address.value
|
||||
if self.is_second_address:
|
||||
if self.check_second_address_inserted(self.second_address.value):
|
||||
return
|
||||
address = self.address.value + '~' + self.second_address.value
|
||||
if self.check_inserted_user_data(username, phone, address):
|
||||
return
|
||||
self.user_manager.update_user_data(username, phone, address, self.user['id'])
|
||||
|
||||
if self.is_company:
|
||||
if self.check_company_data_inserted(self.company_name.value, self.vat.value, self.register_number.value, self.company_address.value):
|
||||
return
|
||||
if self.company:
|
||||
company['name'] = self.company_name.value
|
||||
company['vat'] = self.vat.value
|
||||
company['register_number'] = self.register_number.value
|
||||
company['address'] = self.company_address.value
|
||||
self.company_manager.update_company(company)
|
||||
else:
|
||||
company = {
|
||||
'user_id' : self.user['id'],
|
||||
'name': self.company_name.value,
|
||||
'vat': self.vat.value,
|
||||
'register_number': self.register_number.value,
|
||||
'address': self.company_address.value
|
||||
}
|
||||
self.company_manager.add_company(company)
|
||||
|
||||
self.error_message.value = "Profilul a fost salvat!"
|
||||
self.error_message.color = ft.Colors.GREEN
|
||||
self.error_message.update()
|
||||
|
||||
def on_back_btn_click(self, e):
|
||||
self.page.go('/')
|
||||
|
||||
def on_logout_btn_click(self, e):
|
||||
self.page.session.clear()
|
||||
self.page.go('/')
|
||||
|
||||
def build(self):
|
||||
return ft.Container(
|
||||
content=ft.Column(
|
||||
[
|
||||
ft.Row(
|
||||
[
|
||||
ft.FilledButton(
|
||||
"Inapoi",
|
||||
icon=ft.Icons.ARROW_BACK,
|
||||
on_click = self.on_back_btn_click
|
||||
)
|
||||
],
|
||||
alignment=ft.MainAxisAlignment.END
|
||||
),
|
||||
ft.Icon(name=ft.Icons.ACCOUNT_CIRCLE, size=100),
|
||||
self.user_name,
|
||||
self.email,
|
||||
self.phone,
|
||||
self.address,
|
||||
ft.Divider(),
|
||||
ft.Text("Adresa de livrare difera de adresa de domiciliu?", text_align=ft.TextAlign.CENTER),
|
||||
ft.Button("Adauga adresa livrare", width=400, on_click=self.on_second_address_btn_click),
|
||||
self.second_address_placeholder,
|
||||
ft.Divider(),
|
||||
ft.Button("Doriti Factura?", width=400, on_click=self.on_order_btn_click),
|
||||
self.order_placeholder,
|
||||
self.error_message,
|
||||
ft.FilledButton(
|
||||
"Salveaza",
|
||||
icon=ft.Icons.SAVE,
|
||||
on_click=self.on_save_btn_click,
|
||||
width=400
|
||||
),
|
||||
ft.FilledButton(
|
||||
"Deconectare",
|
||||
icon=ft.Icons.LOGOUT,
|
||||
on_click=self.on_logout_btn_click,
|
||||
width=400,
|
||||
bgcolor=ft.Colors.GREY
|
||||
),
|
||||
ft.Text("")
|
||||
],
|
||||
width=400,
|
||||
alignment=ft.MainAxisAlignment.START,
|
||||
horizontal_alignment=ft.CrossAxisAlignment.CENTER,
|
||||
scroll=ft.ScrollMode.ADAPTIVE
|
||||
),
|
||||
padding=10,
|
||||
expand=True
|
||||
)
|
||||
BIN
UI_V2/pages/shopping_cart/__pycache__/cart.cpython-313.pyc
Normal file
BIN
UI_V2/pages/shopping_cart/__pycache__/cart.cpython-313.pyc
Normal file
Binary file not shown.
Binary file not shown.
535
UI_V2/pages/shopping_cart/cart.py
Normal file
535
UI_V2/pages/shopping_cart/cart.py
Normal file
@@ -0,0 +1,535 @@
|
||||
import flet as ft
|
||||
from dbActions.orders import Orders
|
||||
from dbActions.products import Products
|
||||
from dbActions.company import Company
|
||||
from dbActions.users import Users
|
||||
|
||||
class Cart:
|
||||
def __init__(self, page: ft.Page):
|
||||
self.page = page
|
||||
self.user = self.page.session.get('user')
|
||||
self.orders = Orders()
|
||||
self.productsDB = Products()
|
||||
self.company_manager = Company()
|
||||
self.user_manager = Users()
|
||||
self.products = []
|
||||
self.is_second_address = None
|
||||
self.is_company = None
|
||||
|
||||
self.delete_dialog = ft.AlertDialog(
|
||||
title=ft.Text("Stergeti?"),
|
||||
actions=[
|
||||
ft.FilledButton("Da", on_click=self.on_confirm_delete_btn_click),
|
||||
ft.FilledButton("Nu", on_click=self.on_cancel_delete_btn_click, bgcolor=ft.Colors.GREY)
|
||||
]
|
||||
)
|
||||
|
||||
self.on_hold_orders = self.orders.get_on_hold_order(self.user['id'])
|
||||
if self.on_hold_orders:
|
||||
self.order_products = self.orders.get_order_products(self.on_hold_orders['id'])
|
||||
|
||||
for product in self.order_products:
|
||||
self.products.append(
|
||||
{
|
||||
'product':self.productsDB.get(product['prdouct_id']),
|
||||
'quantity':product['quantity']
|
||||
}
|
||||
)
|
||||
self.product_list = ft.ListView(
|
||||
controls=self.create_list(self.products, self.on_delete_product_click),
|
||||
spacing=10,
|
||||
expand=5
|
||||
)
|
||||
|
||||
self.payment = ft.RadioGroup(
|
||||
content=ft.Row(
|
||||
[
|
||||
ft.Radio(value="ramburs", label="Ramburs la curier"),
|
||||
ft.Radio(value="plata_online_cu_cardul", label="Plata online cu cardul"),
|
||||
]
|
||||
),
|
||||
on_change=self.on_payment_value_change
|
||||
)
|
||||
self.payment_message = ft.Text("")
|
||||
self.error_message = ft.Text(
|
||||
color=ft.Colors.RED
|
||||
)
|
||||
|
||||
self.confirm_dialog = ft.AlertDialog(
|
||||
title=ft.Text("Confirma"),
|
||||
actions=[
|
||||
ft.FilledButton(
|
||||
"Da",
|
||||
on_click=self.on_confim_btn_click
|
||||
),
|
||||
ft.FilledButton(
|
||||
"Nu",
|
||||
on_click=self.on_cancel_btn_click,
|
||||
bgcolor=ft.Colors.GREY
|
||||
)
|
||||
]
|
||||
)
|
||||
|
||||
if '@default.com' not in self.user['email']:
|
||||
self.all_orders = self.orders.get_orders_for_user(self.page.session.get('user')['id'])
|
||||
self.all_orders = self.all_orders[::-1]
|
||||
self.orders_list = ft.ListView(
|
||||
controls=self.create_history_list(self.all_orders),
|
||||
spacing=10,
|
||||
expand=True
|
||||
)
|
||||
self.user = self.page.session.get("user")
|
||||
self.company = self.company_manager.get_company(self.user['id'])
|
||||
self.user_name = ft.TextField(
|
||||
label="Nume si Prenume",
|
||||
value=self.user['name'] if "@default.com" not in self.user['email'] else None
|
||||
)
|
||||
self.email = ft.TextField(
|
||||
label="E-mail",
|
||||
value=self.user['email'] if "@default.com" not in self.user['email'] else None,
|
||||
read_only=True
|
||||
)
|
||||
self.phone = ft.TextField(
|
||||
label="Telefon",
|
||||
value=self.user['phone'] if "@default.com" not in self.user['email'] else None
|
||||
)
|
||||
self.address = ft.TextField(
|
||||
label="Adresa",
|
||||
multiline=True,
|
||||
min_lines=3,
|
||||
max_lines=5,
|
||||
value = self.user['address'].split("~")[0] if self.user['address'] else ''
|
||||
)
|
||||
self.company_name = ft.TextField(
|
||||
label="Denumire firma",
|
||||
value=self.company['name'] if self.company else ''
|
||||
)
|
||||
self.vat = ft.TextField(
|
||||
label="CUI",
|
||||
value=self.company['vat'] if self.company else ''
|
||||
)
|
||||
self.register_number = ft.TextField(
|
||||
label="Numar registru comert",
|
||||
value=self.company['register_number'] if self.company else ''
|
||||
)
|
||||
self.company_address = ft.TextField(
|
||||
label="Sediu",
|
||||
multiline=True,
|
||||
min_lines=3,
|
||||
max_lines=5,
|
||||
value=self.company['address'] if self.company else '')
|
||||
self.second_address_placeholder = ft.Column()
|
||||
self.second_address = ft.TextField(
|
||||
label="Adresa de livrare",
|
||||
multiline=True,
|
||||
min_lines=3,
|
||||
max_lines=5,
|
||||
value=self.user['address'].split("~")[1] if self.user['address'] and len(self.user['address'].split("~"))>1 else ''
|
||||
)
|
||||
self.second_address_placeholder =ft.Column()
|
||||
self.order_placeholder =ft.Column()
|
||||
|
||||
if self.user['address'] and len(self.user['address'].split("~"))>1 :
|
||||
self.is_second_address = True
|
||||
self.second_address_placeholder.controls.append(self.second_address)
|
||||
if self.company:
|
||||
self.is_company = True
|
||||
self.order_placeholder.controls.append(self.company_name)
|
||||
self.order_placeholder.controls.append(self.vat)
|
||||
self.order_placeholder.controls.append(self.register_number)
|
||||
self.order_placeholder.controls.append(self.company_address)
|
||||
|
||||
self.delivery_details = ft.Column(
|
||||
[
|
||||
ft.Text(
|
||||
"Detaili de livrare",
|
||||
weight=ft.FontWeight.BOLD
|
||||
),
|
||||
self.user_name,
|
||||
self.email,
|
||||
self.phone,
|
||||
self.address,
|
||||
ft.Divider(),
|
||||
ft.Text("Adresa de livrare difera de adresa de domiciliu?", text_align=ft.TextAlign.CENTER),
|
||||
ft.Button("Adauga adresa livrare", width=500, on_click=self.on_second_address_btn_click),
|
||||
self.second_address_placeholder,
|
||||
ft.Divider(),
|
||||
ft.Button("Doriti Factura?", width=500, on_click=self.on_order_btn_click),
|
||||
self.order_placeholder,
|
||||
|
||||
ft.Text(
|
||||
"Metoda de plata",
|
||||
weight=ft.FontWeight.BOLD
|
||||
),
|
||||
self.payment,
|
||||
self.payment_message,
|
||||
ft.Row([self.error_message],alignment=ft.MainAxisAlignment.CENTER),
|
||||
ft.Row(
|
||||
[
|
||||
ft.FilledButton(
|
||||
"Comanda",
|
||||
width=150,
|
||||
on_click=self.open_confirm_dialog
|
||||
)
|
||||
],
|
||||
alignment=ft.MainAxisAlignment.CENTER
|
||||
)
|
||||
],
|
||||
expand=5,
|
||||
alignment=ft.MainAxisAlignment.START
|
||||
)
|
||||
|
||||
if self.page.width < 600:
|
||||
self.cart_placeholder = ft.Column(
|
||||
[
|
||||
self.product_list,
|
||||
self.delivery_details
|
||||
]
|
||||
)
|
||||
else:
|
||||
self.cart_placeholder = ft.Row(
|
||||
[
|
||||
self.product_list,
|
||||
self.delivery_details
|
||||
],
|
||||
vertical_alignment=ft.CrossAxisAlignment.START
|
||||
)
|
||||
self.order_list_placeholder = ft.Column()
|
||||
if '@default.com' not in self.user['email']:
|
||||
self.order_list_placeholder.controls.append(
|
||||
ft.Text(
|
||||
"Istoric comenzi",
|
||||
weight=ft.FontWeight.BOLD
|
||||
)
|
||||
)
|
||||
self.order_list_placeholder.controls.append(self.orders_list)
|
||||
|
||||
self.item_to_be_deleted = None
|
||||
|
||||
self.page.add(self.delete_dialog)
|
||||
self.page.add(self.confirm_dialog)
|
||||
|
||||
def on_second_address_btn_click(self, e):
|
||||
self.is_second_address = True
|
||||
self.second_address_placeholder.controls.append(self.second_address)
|
||||
self.second_address_placeholder.update()
|
||||
|
||||
def on_order_btn_click(self, e):
|
||||
self.is_company = True
|
||||
self.order_placeholder.controls.append(self.company_name)
|
||||
self.order_placeholder.controls.append(self.vat)
|
||||
self.order_placeholder.controls.append(self.register_number)
|
||||
self.order_placeholder.controls.append(self.company_address)
|
||||
self.order_placeholder.update()
|
||||
|
||||
def on_payment_value_change(self, e):
|
||||
print(e.data)
|
||||
if e.data == 'plata_online_cu_cardul':
|
||||
pass
|
||||
else:
|
||||
pass
|
||||
|
||||
def order_products(self, id):
|
||||
products = self.orders.get_order_products(id)
|
||||
all_products = []
|
||||
for product in products:
|
||||
name = self.productsDB.get(product['prdouct_id'])['name']
|
||||
if name not in all_products:
|
||||
all_products.append(name)
|
||||
return ft.Text(
|
||||
value=' '.join(all_products)
|
||||
)
|
||||
|
||||
def on_go_back_button_click(self, e):
|
||||
self.page.go("/")
|
||||
|
||||
def create_list(self, items, on_click_handler):
|
||||
"""Helper to create list items for a column."""
|
||||
return [
|
||||
ft.Container(
|
||||
content=ft.Row(
|
||||
[
|
||||
ft.Column(
|
||||
[
|
||||
ft.Row(
|
||||
[
|
||||
ft.Icon(ft.Icons.ARROW_RIGHT, size=20),
|
||||
ft.Row(
|
||||
[
|
||||
ft.Image(
|
||||
src=item['product']['image'],
|
||||
width=100,
|
||||
height=100,
|
||||
fit=ft.ImageFit.COVER,
|
||||
border_radius=10
|
||||
),
|
||||
ft.Column(
|
||||
[
|
||||
ft.Text(f"Denumire Produs: {item['product']['name']}", weight=ft.FontWeight.BOLD),
|
||||
ft.Text(f"Cantitate: {item['quantity']}"),
|
||||
ft.Text(f"Descriere: {item['product']['description']}", size=12 , color=ft.Colors.GREY),
|
||||
]
|
||||
)
|
||||
]
|
||||
)
|
||||
|
||||
]
|
||||
),
|
||||
]
|
||||
),
|
||||
ft.Row(
|
||||
[
|
||||
ft.FilledButton("Sterge",on_click=lambda e, id=item: on_click_handler(id), bgcolor=ft.Colors.RED),
|
||||
]
|
||||
)
|
||||
|
||||
],
|
||||
alignment=ft.MainAxisAlignment.SPACE_BETWEEN,
|
||||
),
|
||||
width=300,
|
||||
bgcolor=ft.Colors.BROWN_50,
|
||||
padding=10,
|
||||
border_radius=8,
|
||||
border = ft.border.all(1, ft.Colors.GREY),
|
||||
)
|
||||
for item in items
|
||||
]
|
||||
|
||||
def create_history_list(self, items):
|
||||
return [
|
||||
ft.Container(
|
||||
content=ft.Column(
|
||||
[
|
||||
|
||||
ft.Row(
|
||||
[
|
||||
ft.Icon(ft.icons.ARROW_RIGHT, size=20),
|
||||
ft.Text(value="Numar comanda: "),
|
||||
ft.Text(value=item['id'])
|
||||
]
|
||||
),
|
||||
ft.Row(
|
||||
[
|
||||
ft.Text(
|
||||
value='Status: '
|
||||
),
|
||||
ft.Text(
|
||||
value=item['status']
|
||||
)
|
||||
]
|
||||
),
|
||||
ft.Row(
|
||||
[
|
||||
ft.Text(
|
||||
value='Produse: '
|
||||
),
|
||||
#self.order_products(item['id'])
|
||||
]
|
||||
)
|
||||
],
|
||||
alignment=ft.MainAxisAlignment.START,
|
||||
),
|
||||
width=300,
|
||||
bgcolor=ft.Colors.BROWN_50,
|
||||
padding=10,
|
||||
border_radius=8,
|
||||
border = ft.border.all(1, ft.Colors.GREY),
|
||||
)
|
||||
for item in items
|
||||
]
|
||||
|
||||
|
||||
def on_delete_product_click(self, item):
|
||||
print('Delte item', item)
|
||||
|
||||
self.page.open(self.delete_dialog)
|
||||
self.page.update()
|
||||
self.item_to_be_deleted = item['product']['id']
|
||||
|
||||
def on_confirm_delete_btn_click(self, e):
|
||||
print("confirm delete item", self.item_to_be_deleted)
|
||||
#remove item
|
||||
self.orders.remove_product_from_order(self.on_hold_orders['id'], self.item_to_be_deleted)
|
||||
#update list
|
||||
self.order_products = self.orders.get_order_products(self.on_hold_orders['id'])
|
||||
self.products = []
|
||||
for product in self.order_products:
|
||||
self.products.append(
|
||||
{
|
||||
'product':self.productsDB.get(product['prdouct_id']),
|
||||
'quantity':product['quantity']
|
||||
}
|
||||
)
|
||||
self.product_list.controls.clear()
|
||||
self.product_list.controls = self.create_list(self.products, self.on_delete_product_click)
|
||||
self.product_list.update()
|
||||
|
||||
self.item_to_be_deleted = None
|
||||
self.page.close(self.delete_dialog)
|
||||
|
||||
def on_cancel_delete_btn_click(self, e):
|
||||
print("cancel item deletion: ", self.item_to_be_deleted)
|
||||
self.item_to_be_deleted = None
|
||||
self.page.close(self.delete_dialog)
|
||||
|
||||
|
||||
def open_confirm_dialog(self, e):
|
||||
print('open dialog')
|
||||
print(self.on_hold_orders)
|
||||
if self.on_hold_orders:
|
||||
self.error_message.value = ''
|
||||
self.error_message.update()
|
||||
self.page.open(self.confirm_dialog)
|
||||
else:
|
||||
self.error_message.value = "Nu aveti nici un produs in cos!"
|
||||
self.error_message.update()
|
||||
|
||||
def on_cancel_btn_click(self, e):
|
||||
self.page.close(self.confirm_dialog)
|
||||
|
||||
def check_second_address_inserted(self, address):
|
||||
if address is None or len(address)< 1:
|
||||
self.error_message.value = "Va rugam inserati adresa de livrare!"
|
||||
self.error_message.color = ft.Colors.RED
|
||||
self.error_message.update()
|
||||
return True
|
||||
return False
|
||||
|
||||
def check_company_data_inserted(self, company_name, vat, register_number, company_address):
|
||||
found = False
|
||||
if company_name is None or len(company_name)< 1:
|
||||
found = True
|
||||
if vat is None or len(vat)< 1:
|
||||
found = True
|
||||
if register_number is None or len(register_number)< 1:
|
||||
found = True
|
||||
if company_address is None or len(company_address)< 1:
|
||||
found = True
|
||||
if found:
|
||||
self.error_message.value = "Toate campurile sunt obligatori!"
|
||||
self.error_message.color = ft.Colors.RED
|
||||
self.error_message.update()
|
||||
return found
|
||||
|
||||
def check_inserted_user_data(self, username, phone, address):
|
||||
found = False
|
||||
if username is None or len(username)< 1:
|
||||
found = True
|
||||
if phone is None or len(phone)< 1:
|
||||
found = True
|
||||
if address is None or len(address)< 1:
|
||||
found = True
|
||||
if found:
|
||||
self.error_message.value = "Toate campurile sunt obligatori!"
|
||||
self.error_message.color = ft.Colors.RED
|
||||
self.error_message.update()
|
||||
|
||||
return found
|
||||
|
||||
def create_update_user_details(self):
|
||||
username = self.user_name.value
|
||||
phone = self.phone.value
|
||||
address = self.address.value
|
||||
|
||||
if self.is_second_address:
|
||||
if self.check_second_address_inserted(self.second_address.value):
|
||||
return
|
||||
address = self.address.value + '~' + self.second_address.value
|
||||
if self.check_inserted_user_data(username, phone, address):
|
||||
return
|
||||
|
||||
if '@default.com' in self.user['email']:
|
||||
self.user = self.user_manager.invite_user()
|
||||
self.page.session.set("user", self.user)
|
||||
else:
|
||||
self.user_manager.update_user_data(username, phone, address, self.user['id'])
|
||||
|
||||
if self.is_company:
|
||||
if self.check_company_data_inserted(self.company_name.value, self.vat.value, self.register_number.value, self.company_address.value):
|
||||
return
|
||||
if self.company:
|
||||
company['name'] = self.company_name.value
|
||||
company['vat'] = self.vat.value
|
||||
company['register_number'] = self.register_number.value
|
||||
company['address'] = self.company_address.value
|
||||
self.company_manager.update_company(company)
|
||||
else:
|
||||
company = {
|
||||
'user_id' : self.user['id'],
|
||||
'name': self.company_name.value,
|
||||
'vat': self.vat.value,
|
||||
'register_number': self.register_number.value,
|
||||
'address': self.company_address.value
|
||||
}
|
||||
self.company_manager.add_company(company)
|
||||
|
||||
def on_confim_btn_click(self, e):
|
||||
#create / update user details:
|
||||
self.create_update_user_details()
|
||||
|
||||
print('confirm')
|
||||
self.page.close(self.confirm_dialog)
|
||||
self.orders.update_order_status("new", self.on_hold_orders['id'])
|
||||
|
||||
self.products = []
|
||||
self.on_hold_orders = self.orders.get_on_hold_order(self.user['id'])
|
||||
if self.on_hold_orders:
|
||||
self.order_products = self.orders.get_order_products(self.on_hold_orders['id'])
|
||||
|
||||
for product in self.order_products:
|
||||
self.products.append(
|
||||
{
|
||||
'product':self.productsDB.get(product['prdouct_id']),
|
||||
'quantity':product['quantity']
|
||||
}
|
||||
)
|
||||
self.product_list.controls.clear()
|
||||
self.product_list.controls = self.create_list(self.products, self.on_delete_product_click)
|
||||
self.product_list.update()
|
||||
if '@default.com' not in self.user['email']:
|
||||
self.all_orders = self.orders.get_orders_for_user(self.page.session.get('user')['id'])
|
||||
self.all_orders = self.all_orders[::-1]
|
||||
self.orders_list.controls.clear()
|
||||
self.orders_list.controls = self.create_history_list(self.all_orders)
|
||||
self.orders_list.update()
|
||||
|
||||
def build(self):
|
||||
return ft.Container(
|
||||
content=ft.Column(
|
||||
[
|
||||
ft.Row(
|
||||
[
|
||||
ft.Row(
|
||||
[
|
||||
ft.Icon(
|
||||
ft.Icons.SHOPPING_CART_CHECKOUT,
|
||||
size=40,
|
||||
),
|
||||
ft.Text(
|
||||
"Produse adugate:",
|
||||
weight=ft.FontWeight.BOLD,
|
||||
size=15
|
||||
)
|
||||
]
|
||||
),
|
||||
|
||||
ft.FilledButton(
|
||||
text="Inapoi",
|
||||
icon=ft.Icons.ARROW_BACK,
|
||||
on_click=self.on_go_back_button_click
|
||||
)
|
||||
],
|
||||
alignment=ft.MainAxisAlignment.SPACE_BETWEEN
|
||||
),
|
||||
ft.Divider(),
|
||||
self.cart_placeholder,
|
||||
self.order_list_placeholder,
|
||||
ft.Text()
|
||||
],
|
||||
expand=True,
|
||||
scroll=ft.ScrollMode.ADAPTIVE
|
||||
),
|
||||
expand=True,
|
||||
width=1000,
|
||||
padding=10
|
||||
)
|
||||
60
UI_V2/pages/shopping_cart/peload_card.py
Normal file
60
UI_V2/pages/shopping_cart/peload_card.py
Normal file
@@ -0,0 +1,60 @@
|
||||
import flet as ft
|
||||
from helpers.default_user import DefaultUser
|
||||
|
||||
class PreloadCard:
|
||||
def __init__(self, page: ft.Page):
|
||||
self.page = page
|
||||
self.ask_for_login_dialog = ft.AlertDialog(
|
||||
title="Va rugam sa va autentificati",
|
||||
content=ft.Text("Daca nu aveti un cont activ, puteti crea unul."),
|
||||
actions=[
|
||||
ft.FilledButton(
|
||||
"Continua fara cont",
|
||||
bgcolor=ft.Colors.GREY,
|
||||
on_click=self.on_cancel_go_to_login_btn_click),
|
||||
ft.FilledButton(
|
||||
"Autentificare",
|
||||
on_click=self.on_confirm_go_to_login_btn_click)
|
||||
]
|
||||
)
|
||||
|
||||
def on_cancel_go_to_login_btn_click(self, e):
|
||||
#self.page.close(self.ask_for_login_dialog)
|
||||
self.user = DefaultUser(self.page)
|
||||
self.page.session.set("user", self.user.default_user)
|
||||
self.page.go('/cos')
|
||||
|
||||
def on_confirm_go_to_login_btn_click(self, e):
|
||||
#self.page.close(self.ask_for_login_dialog)
|
||||
self.page.go('/auth')
|
||||
|
||||
def build(self):
|
||||
if not self.page.session.get("user"):
|
||||
return ft.Container(
|
||||
content=ft.Column(
|
||||
[
|
||||
ft.Text("Va rugam sa va autentificati", size=18, weight=ft.FontWeight.BOLD),
|
||||
ft.Text("Daca nu aveti un cont activ, puteti crea unul."),
|
||||
ft.Row(
|
||||
[
|
||||
ft.FilledButton(
|
||||
"Continua fara cont",
|
||||
bgcolor=ft.Colors.GREY,
|
||||
on_click=self.on_cancel_go_to_login_btn_click),
|
||||
ft.FilledButton(
|
||||
"Autentificare",
|
||||
on_click=self.on_confirm_go_to_login_btn_click)
|
||||
],
|
||||
alignment=ft.MainAxisAlignment.CENTER
|
||||
)
|
||||
#self.page.open(self.ask_for_login_dialog)
|
||||
],
|
||||
alignment=ft.MainAxisAlignment.CENTER,
|
||||
horizontal_alignment=ft.CrossAxisAlignment.CENTER
|
||||
)
|
||||
)
|
||||
else:
|
||||
return ft.Container(
|
||||
content=self.page.go('/cos')
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user