panclas 3.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- panclas/__init__.py +0 -0
- panclas/database.py +32 -0
- panclas/main.py +270 -0
- panclas-3.0.0.dist-info/METADATA +15 -0
- panclas-3.0.0.dist-info/RECORD +7 -0
- panclas-3.0.0.dist-info/WHEEL +5 -0
- panclas-3.0.0.dist-info/top_level.txt +1 -0
panclas/__init__.py
ADDED
|
File without changes
|
panclas/database.py
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import database_creatorplus as dc
|
|
2
|
+
import flet as ft
|
|
3
|
+
|
|
4
|
+
db = dc.Database("base")
|
|
5
|
+
|
|
6
|
+
db.Table.create(db,"users",
|
|
7
|
+
[
|
|
8
|
+
"ID", "role","full_name", "login", "password",],
|
|
9
|
+
[
|
|
10
|
+
"INTEGER PRIMARY KEY AUTOINCREMENT","TEXT","TEXT","TEXT","TEXT"
|
|
11
|
+
]
|
|
12
|
+
)
|
|
13
|
+
db.Table.create(db,"products",
|
|
14
|
+
[
|
|
15
|
+
"ID", "article", "name", "unit", "price", "supplier", "manufacturer", "category",
|
|
16
|
+
"discount", "count", "description", "image_path"
|
|
17
|
+
],
|
|
18
|
+
[
|
|
19
|
+
"INTEGER PRIMARY KEY AUTOINCREMENT","TEXT","TEXT","TEXT","TEXT",
|
|
20
|
+
"TEXT","TEXT","TEXT","TEXT","TEXT","TEXT","TEXT",
|
|
21
|
+
]
|
|
22
|
+
)
|
|
23
|
+
db.Table.create(db,"pick",["ID", "pick"],["INTEGER PRIMARY KEY AUTOINCREMENT","TEXT"])
|
|
24
|
+
|
|
25
|
+
db.Table.create(db,"orders",
|
|
26
|
+
[
|
|
27
|
+
"ID", "number_order", "article", "date_order", "date_delivery", "pick", "client", "code", "status",
|
|
28
|
+
],
|
|
29
|
+
[
|
|
30
|
+
"INTEGER PRIMARY KEY AUTOINCREMENT","TEXT","TEXT","TEXT","TEXT","TEXT","TEXT","TEXT","TEXT"
|
|
31
|
+
]
|
|
32
|
+
)
|
panclas/main.py
ADDED
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import database_creatorplus as dc
|
|
2
|
+
import flet as ft
|
|
3
|
+
import pandas as pd
|
|
4
|
+
|
|
5
|
+
db = dc.Database("base")
|
|
6
|
+
|
|
7
|
+
def import_data(path,table_name):
|
|
8
|
+
data = pd.read_excel(path)
|
|
9
|
+
for data in data.values:
|
|
10
|
+
db.Table.write(db,table_name,*data)
|
|
11
|
+
|
|
12
|
+
def main(page:ft.Page):
|
|
13
|
+
page.title = "Приложение"
|
|
14
|
+
login = ft.TextField(label='enter login',width=500)
|
|
15
|
+
password = ft.TextField(label='enter password',width=500)
|
|
16
|
+
error = ft.Text()
|
|
17
|
+
tovar_field = [ft.TextField(label=i) for i in db.Info.getColumns(db,"products")]
|
|
18
|
+
zakaz_field = [ft.TextField(label=i) for i in db.Info.getColumns(db,"orders")]
|
|
19
|
+
id_update = 0
|
|
20
|
+
user_role = 0 # 0 - гость авторизованный клиент, 1 - менеджер, 2 - админ
|
|
21
|
+
|
|
22
|
+
def get_columns(data):
|
|
23
|
+
nonlocal user_role
|
|
24
|
+
list = [ft.DataColumn(ft.Text(i)) for i in data]
|
|
25
|
+
if user_role != 1:
|
|
26
|
+
list.append(ft.DataColumn(ft.Text("del")))
|
|
27
|
+
list.append(ft.DataColumn(ft.Text("update")))
|
|
28
|
+
return list
|
|
29
|
+
|
|
30
|
+
def get_rows(data):
|
|
31
|
+
nonlocal user_role
|
|
32
|
+
list = []
|
|
33
|
+
for row in data:
|
|
34
|
+
list2 = []
|
|
35
|
+
for cell in row:
|
|
36
|
+
list2.append(ft.DataCell(ft.Text(cell)))
|
|
37
|
+
if user_role != 1:
|
|
38
|
+
list2.append(ft.DataCell(ft.ElevatedButton("del",
|
|
39
|
+
on_click=lambda e,a = row[0]:[
|
|
40
|
+
db.Table.delete(db,"orders",f"ID = {a}"),
|
|
41
|
+
route_change("/zakaz")
|
|
42
|
+
]
|
|
43
|
+
)))
|
|
44
|
+
list2.append(ft.DataCell(ft.ElevatedButton("update",
|
|
45
|
+
on_click=lambda e,a = row[0],i = zakaz_field:
|
|
46
|
+
update(a,i,"orders")
|
|
47
|
+
)))
|
|
48
|
+
list.append(ft.DataRow(list2))
|
|
49
|
+
return list
|
|
50
|
+
|
|
51
|
+
def update(id, list, table_name):
|
|
52
|
+
nonlocal id_update
|
|
53
|
+
data = db.Table.get(db,table_name,request=f"WHERE ID = {id}")
|
|
54
|
+
for i, field in enumerate(list):
|
|
55
|
+
field.value = data[0][i]
|
|
56
|
+
id_update = id
|
|
57
|
+
page.update()
|
|
58
|
+
|
|
59
|
+
def authorization(e):
|
|
60
|
+
nonlocal user_role
|
|
61
|
+
log = db.Table.get(db,"users","role, login, password",f"WHERE login = '{login.value}' and password = '{password.value}'")
|
|
62
|
+
if log != [] and log[0][0] == "Администратор":
|
|
63
|
+
user_role = 2
|
|
64
|
+
page.go("/tovar_admin")
|
|
65
|
+
elif log != [] and log[0][0] == "Авторизированный клиент":
|
|
66
|
+
page.go("/tovar_guest_user")
|
|
67
|
+
elif log != [] and log[0][0] == "Менеджер":
|
|
68
|
+
user_role = 1
|
|
69
|
+
page.go("/tovar_meneger")
|
|
70
|
+
else: error.value = "Неверное имя пользователя или пароль"
|
|
71
|
+
page.update()
|
|
72
|
+
|
|
73
|
+
def search_tovar(e):
|
|
74
|
+
search = db.Table.get(db,"products",request=f"WHERE LOWER(name || ' ' || price || ' ' || supplier || ' ' || category) LIKE LOWER('%{e.control.value}%')")
|
|
75
|
+
card_tovar_list.controls.clear()
|
|
76
|
+
card_tovar_list.controls = (tovar_card(search))
|
|
77
|
+
page.update()
|
|
78
|
+
|
|
79
|
+
def update_searh(e):
|
|
80
|
+
card_tovar_list.controls.clear()
|
|
81
|
+
card_tovar_list.controls = (tovar_card(db.Table.get(db,"products")))
|
|
82
|
+
route_change("/tovar_admin")
|
|
83
|
+
|
|
84
|
+
def tovar_card(data_):
|
|
85
|
+
nonlocal user_role
|
|
86
|
+
|
|
87
|
+
cards = []
|
|
88
|
+
|
|
89
|
+
for data in data_:
|
|
90
|
+
|
|
91
|
+
bg_color = None
|
|
92
|
+
if int(data[9]) == 0:
|
|
93
|
+
bg_color = ft.colors.BLUE_100 # Голубой для отсутствующих товаров
|
|
94
|
+
elif int(data[8]) > 15:
|
|
95
|
+
bg_color = ft.colors.GREEN_800 # #2E8B57
|
|
96
|
+
row = ft.Row(
|
|
97
|
+
[
|
|
98
|
+
# Фото товара
|
|
99
|
+
ft.Column(
|
|
100
|
+
[
|
|
101
|
+
ft.Image(src=f"import\\{"picture.png" if data[11] == "nan" else data[11]}", width=150, height=150, fit=ft.ImageFit.CONTAIN),
|
|
102
|
+
],
|
|
103
|
+
alignment=ft.MainAxisAlignment.CENTER
|
|
104
|
+
),
|
|
105
|
+
|
|
106
|
+
# Категория | Наименование
|
|
107
|
+
ft.Column(
|
|
108
|
+
[
|
|
109
|
+
ft.Row([ft.Text(f"{data[7]} | ", color=ft.colors.GREY_600),
|
|
110
|
+
ft.Text(data[2])]),
|
|
111
|
+
ft.Text(f"Описание товара: {data[10]}"),
|
|
112
|
+
ft.Text(f"Производитель: {data[6]}"),
|
|
113
|
+
ft.Text(f"Поставщик: {data[5]}"),
|
|
114
|
+
ft.Text(f"Цена: {data[4]}"),
|
|
115
|
+
ft.Text(f"Единица измерения: {data[3]}"),
|
|
116
|
+
ft.Text(f"Количество на складе: {data[9]}"),
|
|
117
|
+
],
|
|
118
|
+
alignment=ft.MainAxisAlignment.START,
|
|
119
|
+
width=400
|
|
120
|
+
),
|
|
121
|
+
|
|
122
|
+
# Действующая скидка
|
|
123
|
+
ft.Column(
|
|
124
|
+
[
|
|
125
|
+
ft.Text("Действующая скидка:"),
|
|
126
|
+
ft.Text(f"{data[8]}%", size=16, weight=ft.FontWeight.BOLD, color=ft.colors.GREEN),
|
|
127
|
+
ft.ElevatedButton("del", on_click=lambda e: [
|
|
128
|
+
db.Table.delete(db,"products",f"ID = {data[0]}"),
|
|
129
|
+
route_change("/tovar")
|
|
130
|
+
]) if user_role == 2 else ft.Text()
|
|
131
|
+
]
|
|
132
|
+
)
|
|
133
|
+
],
|
|
134
|
+
spacing=8
|
|
135
|
+
)
|
|
136
|
+
card = ft.Card(
|
|
137
|
+
content=ft.Container(
|
|
138
|
+
width=100,
|
|
139
|
+
padding=20,
|
|
140
|
+
bgcolor=bg_color,
|
|
141
|
+
content=row, on_click =lambda e,a = data[0],i = tovar_field:update(a,i,"products") if user_role == 2 else None
|
|
142
|
+
),
|
|
143
|
+
margin=10
|
|
144
|
+
)
|
|
145
|
+
cards.append(card)
|
|
146
|
+
|
|
147
|
+
return cards
|
|
148
|
+
|
|
149
|
+
card_tovar_list = ft.ListView(tovar_card(db.Table.get(db,"products")),auto_scroll=True,width=800,height=800)
|
|
150
|
+
|
|
151
|
+
def route_change(route):
|
|
152
|
+
page.views.clear()
|
|
153
|
+
nonlocal id_update, user_role
|
|
154
|
+
for i in zakaz_field[1:]:
|
|
155
|
+
i.value = ""
|
|
156
|
+
|
|
157
|
+
for i in tovar_field[1:]:
|
|
158
|
+
i.value = ""
|
|
159
|
+
|
|
160
|
+
if page.route == "/log":
|
|
161
|
+
error.value = ""
|
|
162
|
+
login.value = ""
|
|
163
|
+
password.value = ""
|
|
164
|
+
user_role = 0
|
|
165
|
+
page.views.append(
|
|
166
|
+
ft.View(route="/log",
|
|
167
|
+
controls=[
|
|
168
|
+
login,password,
|
|
169
|
+
error,
|
|
170
|
+
ft.Row([
|
|
171
|
+
ft.ElevatedButton("Войти", on_click=authorization),
|
|
172
|
+
ft.ElevatedButton("Гость", on_click=lambda e: page.go("/tovar_guest_user"))
|
|
173
|
+
],alignment=ft.MainAxisAlignment.CENTER
|
|
174
|
+
),
|
|
175
|
+
],
|
|
176
|
+
vertical_alignment=ft.MainAxisAlignment.CENTER,
|
|
177
|
+
horizontal_alignment=ft.CrossAxisAlignment.CENTER)
|
|
178
|
+
)
|
|
179
|
+
elif page.route == "/tovar_guest_user":
|
|
180
|
+
page.views.append(
|
|
181
|
+
ft.View(route="/tovar",
|
|
182
|
+
controls=[ft.Row([card_tovar_list,
|
|
183
|
+
ft.Column([
|
|
184
|
+
ft.ElevatedButton("back",on_click=lambda e: page.go("/log")),
|
|
185
|
+
])
|
|
186
|
+
])
|
|
187
|
+
],
|
|
188
|
+
vertical_alignment=ft.MainAxisAlignment.CENTER,
|
|
189
|
+
horizontal_alignment=ft.CrossAxisAlignment.CENTER)
|
|
190
|
+
)
|
|
191
|
+
elif page.route == "/tovar_meneger":
|
|
192
|
+
page.views.append(
|
|
193
|
+
ft.View(route="/tovar_meneger",
|
|
194
|
+
controls=[ft.Row([card_tovar_list,
|
|
195
|
+
ft.Column([
|
|
196
|
+
ft.ElevatedButton("Заказы",on_click=lambda e: page.go("/zakaz_meneger")),
|
|
197
|
+
ft.ElevatedButton("back",on_click=lambda e: page.go("/log"))
|
|
198
|
+
])
|
|
199
|
+
])
|
|
200
|
+
],
|
|
201
|
+
vertical_alignment=ft.MainAxisAlignment.CENTER,
|
|
202
|
+
horizontal_alignment=ft.CrossAxisAlignment.CENTER)
|
|
203
|
+
)
|
|
204
|
+
elif page.route == "/tovar_admin":
|
|
205
|
+
page.views.append(
|
|
206
|
+
ft.View(route="/tovar_admin",
|
|
207
|
+
controls=[ft.Row([card_tovar_list,
|
|
208
|
+
ft.Column([
|
|
209
|
+
ft.TextField(label = "Поиск",on_change=search_tovar),
|
|
210
|
+
*tovar_field[1:],
|
|
211
|
+
ft.ElevatedButton("Заказы",on_click=lambda e: page.go("/zakaz_admin")),
|
|
212
|
+
ft.ElevatedButton("add",on_click=lambda e: [
|
|
213
|
+
db.Table.write(db,"products",*[str(i.value) for i in tovar_field[1:]]),
|
|
214
|
+
route_change("/tovar_admin")
|
|
215
|
+
]),
|
|
216
|
+
ft.ElevatedButton("update",on_click=lambda e: [
|
|
217
|
+
db.Table.update(db, "products",f"ID = {id_update}",*[str(i.value) for i in tovar_field[1:]]),
|
|
218
|
+
update_searh(e)
|
|
219
|
+
]),
|
|
220
|
+
ft.ElevatedButton("back",on_click=lambda e: page.go("/log")),
|
|
221
|
+
])
|
|
222
|
+
])
|
|
223
|
+
],
|
|
224
|
+
vertical_alignment=ft.MainAxisAlignment.CENTER,
|
|
225
|
+
horizontal_alignment=ft.CrossAxisAlignment.CENTER)
|
|
226
|
+
)
|
|
227
|
+
elif page.route == "/zakaz_admin":
|
|
228
|
+
page.views.append(
|
|
229
|
+
ft.View(route="/zakaz_admin",
|
|
230
|
+
controls=[ft.Row([ft.DataTable(get_columns(db.Info.getColumns(db,"orders")),get_rows(db.Table.get(db,"orders"))),
|
|
231
|
+
ft.Column(
|
|
232
|
+
[
|
|
233
|
+
*zakaz_field,
|
|
234
|
+
ft.ElevatedButton("back",on_click=lambda e: page.go("/tovar_admin")),
|
|
235
|
+
ft.ElevatedButton("add",on_click=lambda e: [
|
|
236
|
+
db.Table.write(db,"orders",*[str(i.value) for i in zakaz_field]),
|
|
237
|
+
route_change("/zakaz")
|
|
238
|
+
]),
|
|
239
|
+
ft.ElevatedButton("update",on_click=lambda e: [
|
|
240
|
+
db.Table.update(db, "orders",f"ID = {id_update}",*[str(i.value) for i in zakaz_field]),
|
|
241
|
+
route_change("/tovar")
|
|
242
|
+
])
|
|
243
|
+
])
|
|
244
|
+
]),
|
|
245
|
+
|
|
246
|
+
],
|
|
247
|
+
vertical_alignment=ft.MainAxisAlignment.CENTER,
|
|
248
|
+
horizontal_alignment=ft.CrossAxisAlignment.CENTER)
|
|
249
|
+
)
|
|
250
|
+
elif page.route == "/zakaz_meneger":
|
|
251
|
+
page.views.append(
|
|
252
|
+
ft.View(route="/zakaz_meneger",
|
|
253
|
+
controls=[ft.Row([ft.DataTable(get_columns(db.Info.getColumns(db,"orders")),get_rows(db.Table.get(db,"orders"))),
|
|
254
|
+
ft.Column(
|
|
255
|
+
[
|
|
256
|
+
ft.ElevatedButton("back",on_click=lambda e: page.go("/tovar_meneger")),
|
|
257
|
+
])
|
|
258
|
+
]),
|
|
259
|
+
|
|
260
|
+
],
|
|
261
|
+
vertical_alignment=ft.MainAxisAlignment.CENTER,
|
|
262
|
+
horizontal_alignment=ft.CrossAxisAlignment.CENTER)
|
|
263
|
+
)
|
|
264
|
+
page.update()
|
|
265
|
+
|
|
266
|
+
page.on_route_change = route_change
|
|
267
|
+
|
|
268
|
+
page.go("/log")
|
|
269
|
+
|
|
270
|
+
ft.app(main)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: panclas
|
|
3
|
+
Version: 3.0.0
|
|
4
|
+
Author: OlegMagistr
|
|
5
|
+
Author-email: oreg227@gmail.com
|
|
6
|
+
Classifier: Programming Language :: Python :: 3
|
|
7
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
8
|
+
Classifier: Operating System :: OS Independent
|
|
9
|
+
Requires-Python: >=3.12
|
|
10
|
+
Description-Content-Type: text/markdown
|
|
11
|
+
Dynamic: author
|
|
12
|
+
Dynamic: author-email
|
|
13
|
+
Dynamic: classifier
|
|
14
|
+
Dynamic: description-content-type
|
|
15
|
+
Dynamic: requires-python
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
panclas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
panclas/database.py,sha256=HOvW8teMRksR0Xy6iQQa-858h9zW7QdWeUjiE2FvwHA,976
|
|
3
|
+
panclas/main.py,sha256=b0lKEG5XtSh1Lq28dYBy29vUsuHXF5kKeKi--SIZMtE,13544
|
|
4
|
+
panclas-3.0.0.dist-info/METADATA,sha256=MFAgkaaFK4ddOwzqp57SaU11kKc-hCO6x-NbxZ5y6WY,445
|
|
5
|
+
panclas-3.0.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
|
|
6
|
+
panclas-3.0.0.dist-info/top_level.txt,sha256=NhYXTQvxHPnwzyOD_VLLQMBHAH2Rp4GyHiM3u9W_rD8,8
|
|
7
|
+
panclas-3.0.0.dist-info/RECORD,,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
panclas
|