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=ds.s(24), height=ds.s(24)) self._status = ft.Text(value="", size=ds.s(14)) super().__init__( spacing=ds.s(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=ds.s(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()