132 lines
4.4 KiB
Python
132 lines
4.4 KiB
Python
import asyncio
|
|
import flet as ft
|
|
import designer as ds
|
|
import api_client
|
|
|
|
|
|
class ProfilePage(ft.Column):
|
|
def __init__(self, page: ft.Page):
|
|
self._page = page
|
|
self._orgs: list = []
|
|
|
|
self._first_name = ds.CastomTextField_input(
|
|
label="Имя",
|
|
hint_text="Введите имя...",
|
|
prefix_icon=ft.Icons.PERSON,
|
|
)
|
|
self._last_name = ds.CastomTextField_input(
|
|
label="Фамилия",
|
|
hint_text="Введите фамилию...",
|
|
prefix_icon=ft.Icons.PERSON_OUTLINE,
|
|
)
|
|
|
|
self._org_dropdown = ds.CastomDropdown(
|
|
label="Организация",
|
|
hint_text="Загрузка...",
|
|
)
|
|
self._org_dropdown.on_select = self._on_org_change
|
|
|
|
self._group_dropdown = ds.CastomDropdown(
|
|
label="Группа",
|
|
hint_text="Загрузка...",
|
|
)
|
|
|
|
self._loading = ft.ProgressRing(visible=False, width=24, height=24)
|
|
self._status = ft.Text(value="", size=14)
|
|
|
|
super().__init__(
|
|
spacing=16,
|
|
controls=[
|
|
ds.CastomText(
|
|
text="Редактировать профиль",
|
|
size=18,
|
|
weight=ft.FontWeight.BOLD,
|
|
),
|
|
self._first_name,
|
|
self._last_name,
|
|
self._org_dropdown,
|
|
self._group_dropdown,
|
|
ft.Row(
|
|
spacing=12,
|
|
controls=[
|
|
ds.CastomButton(text="Сохранить", on_click=self._save),
|
|
self._loading,
|
|
],
|
|
),
|
|
self._status,
|
|
],
|
|
)
|
|
|
|
async def load(self):
|
|
token = self._page.session.store.get("auth_token") or ""
|
|
me, orgs, groups = await asyncio.gather(
|
|
api_client.get_me(token),
|
|
api_client.get_organizations(),
|
|
api_client.get_groups(),
|
|
)
|
|
self._orgs = orgs or []
|
|
|
|
_opt_style = ft.ButtonStyle(color=ds.clolors.ferst)
|
|
|
|
self._org_dropdown.options = [
|
|
ft.DropdownOption(key=o["id"], text=o["name_organization"], style=_opt_style)
|
|
for o in self._orgs
|
|
]
|
|
self._org_dropdown.hint_text = "Выберите организацию..."
|
|
|
|
self._group_dropdown.options = [
|
|
ft.DropdownOption(key=g["id"], text=g["name_group"], style=_opt_style)
|
|
for g in (groups or [])
|
|
]
|
|
self._group_dropdown.hint_text = "Выберите группу..."
|
|
|
|
if me:
|
|
self._first_name.value = me.get("first_name", "")
|
|
self._last_name.value = me.get("last_name", "")
|
|
self._org_dropdown.value = me.get("organization_id")
|
|
self._group_dropdown.value = me.get("group_id")
|
|
|
|
self.update()
|
|
|
|
def _on_org_change(self, e):
|
|
selected_id = e.control.value
|
|
for o in self._orgs:
|
|
if o["id"] == selected_id:
|
|
self._group_dropdown.value = o.get("group_id")
|
|
break
|
|
self.update()
|
|
|
|
async def _save(self, e):
|
|
self._loading.visible = True
|
|
self._status.value = ""
|
|
self.update()
|
|
|
|
token = self._page.session.store.get("auth_token") or ""
|
|
user_id = self._page.session.store.get("user_id") or ""
|
|
|
|
fn = self._first_name.value.strip() if self._first_name.value else None
|
|
ln = self._last_name.value.strip() if self._last_name.value else None
|
|
|
|
data, err = await api_client.update_user(
|
|
user_id=user_id,
|
|
token=token,
|
|
first_name=fn,
|
|
last_name=ln,
|
|
group_id=self._group_dropdown.value,
|
|
organization_id=self._org_dropdown.value,
|
|
)
|
|
|
|
self._loading.visible = False
|
|
if err:
|
|
self._status.value = err
|
|
self._status.color = "red"
|
|
else:
|
|
self._status.value = "Данные успешно сохранены!"
|
|
self._status.color = ds.clolors.ferst
|
|
# Обновляем сессию для корректного сохранения при прохождении тестов
|
|
if data:
|
|
self._page.session.store.set("group_id", data.get("group_id") or "")
|
|
self._page.session.store.set("org_id", data.get("organization_id") or "")
|
|
self.update()
|
|
|