fletable 0.0.1__tar.gz

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.
@@ -0,0 +1,383 @@
1
+ Metadata-Version: 2.4
2
+ Name: fletable
3
+ Version: 0.0.1
4
+ Summary: Tables that take data from SQL database
5
+ Home-page: https://github.com/RichCake/fletable
6
+ Author: RichCake
7
+ Author-email: abs2016123@gmail.com
8
+ Project-URL: GitHub, https://github.com/RichCake/fletable
9
+ Keywords: flet sql table
10
+ Classifier: Programming Language :: Python :: 3.12
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Operating System :: OS Independent
13
+ Requires-Python: >=3.9
14
+ Description-Content-Type: text/markdown
15
+ Requires-Dist: flet==0.28.3
16
+ Requires-Dist: flet-cli==0.28.3
17
+ Requires-Dist: flet-desktop==0.28.3
18
+ Requires-Dist: flet-web==0.28.3
19
+ Dynamic: author
20
+ Dynamic: author-email
21
+ Dynamic: classifier
22
+ Dynamic: description
23
+ Dynamic: description-content-type
24
+ Dynamic: home-page
25
+ Dynamic: keywords
26
+ Dynamic: project-url
27
+ Dynamic: requires-dist
28
+ Dynamic: requires-python
29
+ Dynamic: summary
30
+
31
+ # Fletable
32
+
33
+ **Fletable** — Python-библиотека для создания интерактивных таблиц с данными из SQL-баз в приложениях на Flet. Поддерживает редактирование данных, автоматическую обработку внешних ключей и удобную работу с формами.
34
+
35
+ ## ✨ Возможности
36
+
37
+ - 📝 **Редактируемые таблицы** — изменение, добавление и удаление записей прямо в интерфейсе
38
+ - 👀 **Таблицы только для чтения** — отображение данных с возможностью выбора строк
39
+ - 🔗 **Автоматическая обработка внешних ключей** — dropdown-списки для связанных таблиц
40
+ - ✅ **Множественный выбор** — чекбоксы для выделения строк
41
+ - 🔐 **Встроенная форма авторизации** — готовый компонент для входа пользователей
42
+ - 🎨 **Настраиваемые подписи полей** — удобное отображение имен колонок
43
+
44
+ ## 📦 Установка
45
+
46
+ ```bash
47
+ pip install fletable
48
+ ```
49
+
50
+ Или установите из исходного кода:
51
+
52
+ ```bash
53
+ git clone <repository-url>
54
+ cd fletable
55
+ pip install -e .
56
+ ```
57
+
58
+ ## 🚀 Быстрый старт
59
+
60
+ ### 1. Редактируемая таблица
61
+
62
+ ```python
63
+ import flet as ft
64
+ import psycopg2
65
+ from fletable import EditableTable, FieldConfig
66
+
67
+ def main(page: ft.Page):
68
+ # Подключение к базе данных
69
+ conn = psycopg2.connect(
70
+ host="localhost",
71
+ database="mydb",
72
+ user="user",
73
+ password="password"
74
+ )
75
+ cursor = conn.cursor()
76
+
77
+ # Создание таблицы
78
+ table = EditableTable(
79
+ cursor=cursor,
80
+ table_name="employees",
81
+ field_mapping={
82
+ "employee_id": "ID",
83
+ "name": "Имя",
84
+ "email": "Email",
85
+ "department_id": FieldConfig(
86
+ label="Отдел",
87
+ foreign_key=ForeignKeyConfig(
88
+ table="departments",
89
+ id_column="department_id",
90
+ label_column="department_name"
91
+ )
92
+ )
93
+ },
94
+ )
95
+
96
+ # Форма добавления
97
+ add_form, handle_add = table.create_add_form()
98
+
99
+ def add_record(e):
100
+ success, message = handle_add()
101
+ if success:
102
+ # Обновление таблицы после добавления
103
+ container.content = table.create_table()
104
+ page.update()
105
+
106
+ add_button = ft.ElevatedButton("Добавить", on_click=add_record)
107
+
108
+ # Контейнер с таблицей
109
+ container = ft.Container(
110
+ content=table.create_table(),
111
+ padding=10
112
+ )
113
+
114
+ page.add(
115
+ ft.Column([
116
+ ft.Text("Управление сотрудниками", size=24, weight="bold"),
117
+ add_form,
118
+ add_button,
119
+ container
120
+ ])
121
+ )
122
+
123
+ ft.app(target=main)
124
+ ```
125
+
126
+ ### 2. Таблица только для чтения
127
+
128
+ ```python
129
+ import flet as ft
130
+ from fletable import SqlTable
131
+
132
+ def main(page: ft.Page):
133
+ # Подключение к БД
134
+ cursor = conn.cursor()
135
+
136
+ # Создание read-only таблицы
137
+ table = SqlTable(
138
+ cursor=cursor,
139
+ table_name="products",
140
+ field_mapping={
141
+ "product_id": "ID",
142
+ "product_name": "Название",
143
+ "price": "Цена",
144
+ "category_id": "Категория"
145
+ }
146
+ )
147
+
148
+ # Кнопка для получения выделенных строк
149
+ def show_selected(e):
150
+ selected = table.get_selected_rows()
151
+ print("Выбрано записей:", len(selected))
152
+ for row in selected:
153
+ print(row)
154
+
155
+ page.add(
156
+ ft.Column([
157
+ ft.Container(content=table.create_table(), padding=10),
158
+ ft.ElevatedButton("Показать выбранные", on_click=show_selected)
159
+ ])
160
+ )
161
+
162
+ ft.app(target=main)
163
+ ```
164
+
165
+ ### 3. Форма авторизации
166
+
167
+ ```python
168
+ import flet as ft
169
+ from fletable import LoginView
170
+
171
+ def main(page: ft.Page):
172
+ def after_login(page):
173
+ # Переход на главную страницу после успешного входа
174
+ page.views.append(
175
+ ft.View("/home", [
176
+ ft.Text("Добро пожаловать!")
177
+ ])
178
+ )
179
+ page.update()
180
+
181
+ login_view = LoginView(
182
+ user_table="users",
183
+ user_login_col="login",
184
+ user_password_col="password",
185
+ dbapi_cursor=cursor,
186
+ next=after_login,
187
+ user_role_col="role",
188
+ user_role_key="user_role",
189
+ user_id_col="user_id",
190
+ user_id_key="current_user_id"
191
+ )
192
+
193
+ page.views.append(login_view)
194
+ page.update()
195
+
196
+ ft.app(target=main)
197
+ ```
198
+
199
+ ## 📚 Документация API
200
+
201
+ ### EditableTable
202
+
203
+ Класс для создания редактируемых таблиц с поддержкой CRUD-операций.
204
+
205
+ #### Конструктор
206
+
207
+ ```python
208
+ EditableTable(
209
+ cursor, # Курсор базы данных (DB-API 2.0)
210
+ table_name: str, # Имя таблицы в БД
211
+ field_mapping: dict, # Маппинг полей {column: label или FieldConfig}
212
+ width: int = 800, # Ширина таблицы (пикселей)
213
+ height: int = 400 # Высота таблицы (пикселей)
214
+ )
215
+ ```
216
+
217
+ #### Методы
218
+
219
+ - **`create_table()`** — создает и возвращает `ft.DataTable` с данными
220
+ - **`create_add_form()`** — создает форму для добавления новых записей, возвращает `(form_row, handle_add)`
221
+ - **`get_selected_rows()`** — возвращает список словарей с данными выделенных строк
222
+
223
+ ### SqlTable
224
+
225
+ Класс для создания таблиц только для чтения с возможностью выбора строк.
226
+
227
+ #### Конструктор
228
+
229
+ ```python
230
+ SqlTable(
231
+ cursor, # Курсор базы данных
232
+ table_name: str, # Имя таблицы
233
+ field_mapping: dict, # Маппинг полей
234
+ width: int = 800,
235
+ height: int = 400
236
+ )
237
+ ```
238
+
239
+ #### Методы
240
+
241
+ - **`create_table()`** — создает и возвращает `ft.DataTable`
242
+ - **`get_selected_rows()`** — возвращает выделенные строки
243
+
244
+ ### FieldConfig
245
+
246
+ Конфигурация для настройки отображения полей.
247
+
248
+ ```python
249
+ @dataclass
250
+ class FieldConfig:
251
+ label: str # Отображаемое название поля
252
+ foreign_key: ForeignKeyConfig | None = None # Конфигурация внешнего ключа
253
+ ```
254
+
255
+ ### ForeignKeyConfig
256
+
257
+ Настройка внешнего ключа для автоматического создания dropdown-списков.
258
+
259
+ ```python
260
+ @dataclass
261
+ class ForeignKeyConfig:
262
+ table: str # Имя связанной таблицы
263
+ id_column: str # Колонка с ID
264
+ label_column: str # Колонка с отображаемым значением
265
+ ```
266
+
267
+ ### LoginView
268
+
269
+ Готовая форма авторизации пользователей.
270
+
271
+ ```python
272
+ LoginView(
273
+ user_table: str, # Таблица с пользователями
274
+ user_login_col: str, # Колонка с логином
275
+ user_password_col: str, # Колонка с паролем
276
+ dbapi_cursor, # Курсор БД
277
+ next: callable, # Функция после успешного входа
278
+ user_role_col: str = None, # Колонка с ролью (опционально)
279
+ user_role_key: str = None, # Ключ для хранения роли
280
+ user_id_col: str = None, # Колонка с ID пользователя
281
+ user_id_key: str = None # Ключ для хранения ID
282
+ )
283
+ ```
284
+
285
+ ## 🔧 Автоматическая обработка внешних ключей
286
+
287
+ Fletable автоматически создает dropdown-списки для полей с именами, заканчивающимися на `_id` (кроме первичного ключа таблицы):
288
+
289
+ ```python
290
+ field_mapping = {
291
+ "order_id": "ID заказа",
292
+ "customer_id": "Клиент", # Автоматически создаст dropdown из таблицы "customer"
293
+ "product_id": "Товар" # Автоматически создаст dropdown из таблицы "product"
294
+ }
295
+ ```
296
+
297
+ Для более точной настройки используйте `ForeignKeyConfig`:
298
+
299
+ ```python
300
+ field_mapping = {
301
+ "order_id": "ID заказа",
302
+ "customer_id": FieldConfig(
303
+ label="Клиент",
304
+ foreign_key=ForeignKeyConfig(
305
+ table="customers",
306
+ id_column="customer_id",
307
+ label_column="full_name"
308
+ )
309
+ )
310
+ }
311
+ ```
312
+
313
+ ## 💡 Примеры использования
314
+
315
+ ### Обновление таблицы после изменений
316
+
317
+ ```python
318
+ def refresh_table(e):
319
+ container.content = table.create_table()
320
+ page.update()
321
+
322
+ refresh_button = ft.IconButton(
323
+ icon=ft.Icons.REFRESH,
324
+ on_click=refresh_table
325
+ )
326
+ ```
327
+
328
+ ### Работа с выделенными строками
329
+
330
+ ```python
331
+ def process_selected(e):
332
+ selected = table.get_selected_rows()
333
+ for row in selected:
334
+ print(f"ID: {row['employee_id']}, Name: {row['name']}")
335
+ ```
336
+
337
+ ### Массовое удаление
338
+
339
+ ```python
340
+ def delete_selected(e):
341
+ selected = table.get_selected_rows()
342
+ for row in selected:
343
+ cursor.execute(
344
+ "DELETE FROM employees WHERE employee_id = %s",
345
+ (row['employee_id'],)
346
+ )
347
+ conn.commit()
348
+ refresh_table(e)
349
+ ```
350
+
351
+ ## 🗄️ Поддерживаемые базы данных
352
+
353
+ Fletable работает с любыми базами данных, поддерживающими DB-API 2.0:
354
+
355
+ - PostgreSQL (psycopg2)
356
+ - MySQL (mysql-connector-python)
357
+ - SQLite (sqlite3)
358
+ - Oracle
359
+ - Microsoft SQL Server
360
+
361
+ ## 📋 Требования
362
+
363
+ - Python >= 3.6
364
+ - flet >= 0.28.3
365
+ - Драйвер базы данных (psycopg2, mysql-connector, и т.д.)
366
+
367
+ ## 🤝 Участие в разработке
368
+
369
+ Мы приветствуем ваши предложения и pull request'ы!
370
+
371
+ ## 📄 Лицензия
372
+
373
+ MIT License
374
+
375
+ ## 👨‍💻 Автор
376
+
377
+ **RichCake**
378
+ Email: abs2016123@gmail.com
379
+
380
+ ---
381
+
382
+ ⭐ Если вам понравился проект, поставьте звезду на GitHub!
383
+