feat: UI discounts
This commit is contained in:
parent
882e0850e7
commit
7cb4c07128
111
UI/src/main.py
111
UI/src/main.py
|
@ -2,118 +2,10 @@ import flet as ft
|
||||||
from flet.core.page import RouteChangeEvent
|
from flet.core.page import RouteChangeEvent
|
||||||
|
|
||||||
from pages.profile import profile
|
from pages.profile import profile
|
||||||
from requests.board_games import get_sections, get_games
|
from pages.root import root
|
||||||
from requests.auth import login as login_req, registration
|
from requests.auth import login as login_req, registration
|
||||||
|
|
||||||
|
|
||||||
def root(page: ft.Page):
|
|
||||||
def update_games(section):
|
|
||||||
current_section.value = section
|
|
||||||
games = get_games(None if section == "Все" else section)
|
|
||||||
grid.controls.clear()
|
|
||||||
for game in games:
|
|
||||||
grid.controls.append(
|
|
||||||
ft.Column([
|
|
||||||
ft.Text(str(game)),
|
|
||||||
ft.Row([
|
|
||||||
ft.IconButton(icon=ft.icons.SHOPPING_CART),
|
|
||||||
ft.IconButton(icon=ft.icons.FAVORITE),
|
|
||||||
]),
|
|
||||||
])
|
|
||||||
)
|
|
||||||
page.update()
|
|
||||||
|
|
||||||
sections = [*get_sections(), "Все"]
|
|
||||||
|
|
||||||
sections_buttons = [ft.Button(section, on_click=lambda e, s=section: update_games(s)) for section in sections]
|
|
||||||
|
|
||||||
games = get_games()
|
|
||||||
|
|
||||||
current_section = ft.Ref[str]()
|
|
||||||
|
|
||||||
grid = ft.GridView(
|
|
||||||
expand=1,
|
|
||||||
runs_count=5,
|
|
||||||
max_extent=200,
|
|
||||||
child_aspect_ratio=1.0,
|
|
||||||
spacing=5,
|
|
||||||
run_spacing=5,
|
|
||||||
)
|
|
||||||
|
|
||||||
for game in games:
|
|
||||||
grid.controls.append(
|
|
||||||
ft.Column([
|
|
||||||
ft.Text(str(game)),
|
|
||||||
ft.Row([
|
|
||||||
ft.IconButton(
|
|
||||||
icon=ft.Icons.SHOPPING_CART
|
|
||||||
),
|
|
||||||
ft.IconButton(
|
|
||||||
icon=ft.Icons.FAVORITE
|
|
||||||
)
|
|
||||||
])
|
|
||||||
])
|
|
||||||
)
|
|
||||||
|
|
||||||
def go_to_login():
|
|
||||||
page.route = "/login"
|
|
||||||
page.update()
|
|
||||||
|
|
||||||
def go_to_register():
|
|
||||||
page.route = "/register"
|
|
||||||
page.update()
|
|
||||||
|
|
||||||
def go_to_profile():
|
|
||||||
page.route = "/profile"
|
|
||||||
page.update()
|
|
||||||
|
|
||||||
def logout():
|
|
||||||
page.client_storage.remove("user_id")
|
|
||||||
page.clean()
|
|
||||||
root(page)
|
|
||||||
page.update()
|
|
||||||
|
|
||||||
user_id = page.client_storage.get("user_id")
|
|
||||||
|
|
||||||
page.add(
|
|
||||||
ft.Row(
|
|
||||||
[
|
|
||||||
ft.Text(
|
|
||||||
"Весёлые кубики",
|
|
||||||
color="#59799f",
|
|
||||||
size=24,
|
|
||||||
weight=ft.FontWeight.BOLD,
|
|
||||||
),
|
|
||||||
ft.Row([
|
|
||||||
ft.Button(
|
|
||||||
text="Вход",
|
|
||||||
on_click=lambda e: go_to_login(),
|
|
||||||
),
|
|
||||||
ft.Button(
|
|
||||||
text="Регистрация",
|
|
||||||
on_click=lambda e: go_to_register(),
|
|
||||||
),
|
|
||||||
]) if user_id is None else ft.Row([
|
|
||||||
ft.Button(
|
|
||||||
"Профиль",
|
|
||||||
on_click=lambda e: go_to_profile()
|
|
||||||
),
|
|
||||||
ft.Button(
|
|
||||||
text="Выйти",
|
|
||||||
on_click=lambda e: logout(),
|
|
||||||
)
|
|
||||||
])
|
|
||||||
],
|
|
||||||
alignment=ft.MainAxisAlignment.SPACE_BETWEEN, # Adjust alignment if needed
|
|
||||||
),
|
|
||||||
ft.Column(
|
|
||||||
[ft.Row(sections_buttons, alignment=ft.MainAxisAlignment.CENTER)],
|
|
||||||
alignment=ft.MainAxisAlignment.START
|
|
||||||
),
|
|
||||||
grid
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def login(page):
|
def login(page):
|
||||||
def close_banner(e):
|
def close_banner(e):
|
||||||
page.close(banner)
|
page.close(banner)
|
||||||
|
@ -268,4 +160,3 @@ def main(page: ft.Page):
|
||||||
|
|
||||||
|
|
||||||
ft.app(main)
|
ft.app(main)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
class Discount:
|
||||||
|
def __init__(self, game_id, discount):
|
||||||
|
self.game_id = game_id
|
||||||
|
self.discount = discount
|
|
@ -1,11 +1,18 @@
|
||||||
|
import math
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
class Game:
|
class Game:
|
||||||
def __init__(self, board_game_id, name, genre, publisher, price, count = None):
|
def __init__(self, board_game_id, name, genre, publisher, price, count = None, discount = None):
|
||||||
self.board_game_id = board_game_id
|
self.board_game_id = board_game_id
|
||||||
self.name = name
|
self.name = name
|
||||||
self.genre = genre
|
self.genre = genre
|
||||||
self.publisher = publisher
|
self.publisher = publisher
|
||||||
self.price = price
|
self.price = price
|
||||||
self.count = count
|
self.count = count
|
||||||
|
self.discount = discount
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"{self.name}\nЖанр: {self.genre}\nИздатель: {self.publisher}\n{self.price}" + (f"\n{self.count} шт." if self.count is not None else "")
|
cleaned_string = self.price.replace("\u202f", "")[:-2]
|
||||||
|
cleaned_string = cleaned_string.replace(",", ".")
|
||||||
|
return f"{self.name}\nЖанр: {self.genre}\nИздатель: {self.publisher}\n" + (str(self.price) if self.discount is None else f"{math.ceil(float(cleaned_string) * self.discount / 100)} -{self.discount}%") + (f"\n{self.count} шт." if self.count is not None else "")
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import flet as ft
|
import flet as ft
|
||||||
|
|
||||||
from requests.auth import get_user
|
from requests.auth import get_user
|
||||||
|
from requests.board_games import get_user_discounts
|
||||||
from requests.clients import get_wishlist, get_cart, get_history
|
from requests.clients import get_wishlist, get_cart, get_history
|
||||||
|
|
||||||
|
|
||||||
|
@ -17,6 +18,18 @@ def profile(page: ft.Page):
|
||||||
cart = get_cart(user.id)
|
cart = get_cart(user.id)
|
||||||
history = get_history(user.id)
|
history = get_history(user.id)
|
||||||
|
|
||||||
|
discounts = get_user_discounts(user.id)
|
||||||
|
|
||||||
|
for game in wishlist:
|
||||||
|
for d in discounts:
|
||||||
|
if d.game_id == game.board_game_id:
|
||||||
|
game.discount = d.discount
|
||||||
|
|
||||||
|
for game in cart:
|
||||||
|
for d in discounts:
|
||||||
|
if d.game_id == game.board_game_id:
|
||||||
|
game.discount = d.discount
|
||||||
|
|
||||||
page.add(ft.Column([
|
page.add(ft.Column([
|
||||||
ft.TextButton("Назад", on_click=back_clicked),
|
ft.TextButton("Назад", on_click=back_clicked),
|
||||||
ft.Text(f"Здравствуйте, {user.forename} {user.patronymic}!", size=24),
|
ft.Text(f"Здравствуйте, {user.forename} {user.patronymic}!", size=24),
|
||||||
|
|
|
@ -0,0 +1,121 @@
|
||||||
|
import flet as ft
|
||||||
|
from requests.board_games import get_sections, get_games, get_user_discounts
|
||||||
|
|
||||||
|
|
||||||
|
def root(page: ft.Page):
|
||||||
|
def update_games(section):
|
||||||
|
current_section.value = section
|
||||||
|
games = get_games(None if section == "Все" else section)
|
||||||
|
grid.controls.clear()
|
||||||
|
for game in games:
|
||||||
|
grid.controls.append(
|
||||||
|
ft.Column([
|
||||||
|
ft.Text(str(game)),
|
||||||
|
ft.Row([
|
||||||
|
ft.IconButton(icon=ft.icons.SHOPPING_CART),
|
||||||
|
ft.IconButton(icon=ft.icons.FAVORITE),
|
||||||
|
]),
|
||||||
|
])
|
||||||
|
)
|
||||||
|
page.update()
|
||||||
|
|
||||||
|
sections = [*get_sections(), "Все"]
|
||||||
|
|
||||||
|
sections_buttons = [ft.Button(section, on_click=lambda e, s=section: update_games(s)) for section in sections]
|
||||||
|
|
||||||
|
games = get_games()
|
||||||
|
|
||||||
|
current_section = ft.Ref[str]()
|
||||||
|
|
||||||
|
user_id = page.client_storage.get("user_id");
|
||||||
|
|
||||||
|
discounts = []
|
||||||
|
|
||||||
|
if user_id is not None:
|
||||||
|
discounts = get_user_discounts(user_id)
|
||||||
|
|
||||||
|
grid = ft.GridView(
|
||||||
|
expand=1,
|
||||||
|
runs_count=5,
|
||||||
|
max_extent=200,
|
||||||
|
child_aspect_ratio=1.0,
|
||||||
|
spacing=5,
|
||||||
|
run_spacing=5,
|
||||||
|
)
|
||||||
|
|
||||||
|
for game in games:
|
||||||
|
for d in discounts:
|
||||||
|
if d.game_id == game.board_game_id:
|
||||||
|
game.discount = d.discount
|
||||||
|
|
||||||
|
grid.controls.append(
|
||||||
|
ft.Column([
|
||||||
|
ft.Text(str(game)),
|
||||||
|
ft.Row([
|
||||||
|
ft.IconButton(
|
||||||
|
icon=ft.Icons.SHOPPING_CART
|
||||||
|
),
|
||||||
|
ft.IconButton(
|
||||||
|
icon=ft.Icons.FAVORITE
|
||||||
|
)
|
||||||
|
])
|
||||||
|
])
|
||||||
|
)
|
||||||
|
|
||||||
|
def go_to_login():
|
||||||
|
page.route = "/login"
|
||||||
|
page.update()
|
||||||
|
|
||||||
|
def go_to_register():
|
||||||
|
page.route = "/register"
|
||||||
|
page.update()
|
||||||
|
|
||||||
|
def go_to_profile():
|
||||||
|
page.route = "/profile"
|
||||||
|
page.update()
|
||||||
|
|
||||||
|
def logout():
|
||||||
|
page.client_storage.remove("user_id")
|
||||||
|
page.clean()
|
||||||
|
root(page)
|
||||||
|
page.update()
|
||||||
|
|
||||||
|
user_id = page.client_storage.get("user_id")
|
||||||
|
|
||||||
|
page.add(
|
||||||
|
ft.Row(
|
||||||
|
[
|
||||||
|
ft.Text(
|
||||||
|
"Весёлые кубики",
|
||||||
|
color="#59799f",
|
||||||
|
size=24,
|
||||||
|
weight=ft.FontWeight.BOLD,
|
||||||
|
),
|
||||||
|
ft.Row([
|
||||||
|
ft.Button(
|
||||||
|
text="Вход",
|
||||||
|
on_click=lambda e: go_to_login(),
|
||||||
|
),
|
||||||
|
ft.Button(
|
||||||
|
text="Регистрация",
|
||||||
|
on_click=lambda e: go_to_register(),
|
||||||
|
),
|
||||||
|
]) if user_id is None else ft.Row([
|
||||||
|
ft.Button(
|
||||||
|
"Профиль",
|
||||||
|
on_click=lambda e: go_to_profile()
|
||||||
|
),
|
||||||
|
ft.Button(
|
||||||
|
text="Выйти",
|
||||||
|
on_click=lambda e: logout(),
|
||||||
|
)
|
||||||
|
])
|
||||||
|
],
|
||||||
|
alignment=ft.MainAxisAlignment.SPACE_BETWEEN, # Adjust alignment if needed
|
||||||
|
),
|
||||||
|
ft.Column(
|
||||||
|
[ft.Row(sections_buttons, alignment=ft.MainAxisAlignment.CENTER)],
|
||||||
|
alignment=ft.MainAxisAlignment.START
|
||||||
|
),
|
||||||
|
grid
|
||||||
|
)
|
|
@ -1,5 +1,6 @@
|
||||||
import psycopg2
|
import psycopg2
|
||||||
|
|
||||||
|
from models.discount import Discount
|
||||||
from models.game import Game
|
from models.game import Game
|
||||||
from requests.connection import get_cursor
|
from requests.connection import get_cursor
|
||||||
|
|
||||||
|
@ -32,3 +33,14 @@ def get_games(section = None):
|
||||||
res = [Game(game[1], game[2], game[3], game[4], game[5]) for game in cursor.fetchall()]
|
res = [Game(game[1], game[2], game[3], game[4], game[5]) for game in cursor.fetchall()]
|
||||||
|
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
def get_user_discounts(user_id):
|
||||||
|
cursor = get_cursor()[0]
|
||||||
|
|
||||||
|
cursor.execute(f"""
|
||||||
|
select discounts.board_game_id, discounts.amount
|
||||||
|
from discounts join clients_discounts on discounts.discount_id = clients_discounts.discount
|
||||||
|
where clients_discounts.client_id = {user_id}
|
||||||
|
""")
|
||||||
|
|
||||||
|
return [Discount(res[0], res[1]) for res in cursor.fetchall()]
|
||||||
|
|
Loading…
Reference in New Issue