256 lines
8.8 KiB
Python
256 lines
8.8 KiB
Python
import flet as ft
|
|
import requests
|
|
from helpers.roles import Roles
|
|
|
|
import flet as ft
|
|
|
|
class UsersSettings:
|
|
def __init__(self, page: ft.Page):
|
|
self.page = page
|
|
self.base_url = self.page.session.store.get('api_base_url')
|
|
self.token = self.page.session.store.get('token')
|
|
self.selected_user_id = None
|
|
|
|
self.user_roles = [
|
|
'toti',
|
|
Roles.USER,
|
|
Roles.PROPRIETAR,
|
|
Roles.CENZOR,
|
|
Roles.ADMINISTRATOR,
|
|
Roles.PRESEDINTE,
|
|
Roles.EXPERT,
|
|
Roles.BA,
|
|
]
|
|
|
|
self.all_roles_list = ft.ListView(
|
|
controls=self.create_list(self.user_roles, self.on_role_btn_click),
|
|
spacing=10,
|
|
width=350
|
|
)
|
|
self.all_users = self.get_all_users()
|
|
self.role_users = ft.ListView(
|
|
controls=self.create_users_list(self.all_users, self.on_user_btn_click),
|
|
spacing=10,
|
|
expand=True
|
|
)
|
|
|
|
self.placeholder = ft.Container(
|
|
margin=ft.Margin.only(top=5),
|
|
content=self.role_users,
|
|
expand=True
|
|
)
|
|
|
|
self.email = ft.TextField(label="Email", read_only=True, expand=True)
|
|
self.first_name = ft.TextField(label="Prenume", expand=True)
|
|
self.last_name = ft.TextField(label = "Nume", expand=True)
|
|
self.address = ft.TextField(label="Adresa", expand=True)
|
|
self.profession = ft.TextField(label="Profesie", expand=True)
|
|
self.role = ft.RadioGroup(
|
|
content=ft.Row(
|
|
[ft.Radio(value=role, label=role.upper()) for role in self.user_roles if role != "toti"]
|
|
)
|
|
)
|
|
self.status = ft.TextField(label="Status", expand=True)
|
|
self.profile_pic = ft.TextField(label="Poza profil", read_only=True, expand=True)
|
|
self.created_at = ft.TextField(label="Data creare cont",read_only=True, expand=True)
|
|
self.active = ft.TextField(label="Active: 0-Nu, 1-Da", expand=True)
|
|
self.error = ft.Text(color=ft.Colors.RED)
|
|
|
|
self.user_details = ft.Column(
|
|
[
|
|
ft.Text("Detalii utilizator", weight=ft.FontWeight.BOLD),
|
|
self.email,
|
|
self.first_name,
|
|
self.last_name,
|
|
self.address,
|
|
self.profession,
|
|
ft.Text("Rol:", weight=ft.FontWeight.BOLD),
|
|
self.role,
|
|
#self.status,
|
|
#self.profile_pic,
|
|
self.active,
|
|
self.created_at,
|
|
self.error,
|
|
ft.Row(
|
|
[
|
|
ft.FilledButton("Salveaza", on_click=self.on_save_btn_click)
|
|
],
|
|
alignment=ft.MainAxisAlignment.CENTER
|
|
),
|
|
ft.Text()
|
|
],
|
|
scroll=ft.ScrollMode.ADAPTIVE
|
|
)
|
|
|
|
self.search_bar = ft.TextField(
|
|
label="Cauta",
|
|
on_submit=self.on_search_bar_submit,
|
|
expand=True
|
|
)
|
|
|
|
def on_role_btn_click(self, role):
|
|
self.placeholder.content = self.role_users
|
|
self.placeholder.update()
|
|
self.role_users.controls.clear()
|
|
users = self.users_by_role(role) if role != 'toti' else self.all_users
|
|
self.role_users.controls = self.create_users_list(users, self.on_user_btn_click)
|
|
self.role_users.update()
|
|
|
|
def on_user_btn_click(self, user):
|
|
self.selected_user_id = user['id']
|
|
self.email.value = user['email']
|
|
self.first_name.value = user['first_name']
|
|
self.last_name.value = user['last_name']
|
|
self.address.value = user['address']
|
|
self.profession.value = user['profession']
|
|
self.role.value = user['role']
|
|
self.status.value = user['status']
|
|
self.profile_pic.value = user['profile_pic']
|
|
self.active.value = str(user['active'])
|
|
self.created_at.value = user['created_at']
|
|
self.error.value = ""
|
|
self.placeholder.content = self.user_details
|
|
self.placeholder.update()
|
|
|
|
def create_list(self, items, on_click_handler):
|
|
return [
|
|
ft.Container(
|
|
content=ft.Row(
|
|
[
|
|
|
|
ft.Row(
|
|
[
|
|
ft.Icon(ft.Icons.ARROW_RIGHT, size=20),
|
|
ft.Text(value=item.upper())
|
|
]
|
|
),
|
|
],
|
|
alignment=ft.MainAxisAlignment.SPACE_BETWEEN,
|
|
),
|
|
expand=True,
|
|
bgcolor=ft.Colors.BLUE_50,
|
|
border = ft.Border.all(1, ft.Colors.GREY),
|
|
padding=10,
|
|
border_radius=8,
|
|
ink=True,
|
|
on_click=lambda e, cid=item: on_click_handler(cid)
|
|
)
|
|
for item in items
|
|
]
|
|
|
|
def create_users_list(self, items, on_click_handler):
|
|
return [
|
|
ft.Container(
|
|
content=ft.Row(
|
|
[
|
|
|
|
ft.Row(
|
|
[
|
|
ft.Icon(ft.Icons.ARROW_RIGHT, size=20),
|
|
ft.Text(value=item['email'])
|
|
]
|
|
),
|
|
],
|
|
alignment=ft.MainAxisAlignment.SPACE_BETWEEN,
|
|
),
|
|
expand=True,
|
|
bgcolor=ft.Colors.BLUE_50,
|
|
border = ft.Border.all(1, ft.Colors.GREY),
|
|
padding=10,
|
|
border_radius=8,
|
|
ink=True,
|
|
on_click=lambda e, cid=item: on_click_handler(cid)
|
|
)
|
|
for item in items
|
|
]
|
|
|
|
def get_all_users(self):
|
|
payload = {}
|
|
response = requests.get(
|
|
f"{self.base_url}/users/",
|
|
json=payload,
|
|
headers={'Authorization': f'Bearer {self.token}'}
|
|
)
|
|
print(response.text)
|
|
return response.json()
|
|
|
|
def users_by_role(self, role):
|
|
users = []
|
|
for user in self.all_users:
|
|
if user['role']==role:
|
|
users.append(user)
|
|
print(users)
|
|
return users
|
|
|
|
def on_save_btn_click(self, e):
|
|
if self.selected_user_id is None:
|
|
return
|
|
|
|
payload = {
|
|
"first_name": self.first_name.value,
|
|
"last_name": self.last_name.value,
|
|
"address": self.address.value,
|
|
"profession": self.profession.value,
|
|
"role": self.role.value,
|
|
"status": self.status.value,
|
|
"active": int(self.active.value) if str(self.active.value).isdigit() else 1
|
|
}
|
|
|
|
response = requests.put(
|
|
f"{self.base_url}/users/update/{self.selected_user_id}",
|
|
json=payload,
|
|
headers={'Authorization': f'Bearer {self.token}'}
|
|
)
|
|
|
|
if response.status_code == 200:
|
|
self.error.value = "Modificări salvate cu succes!"
|
|
self.error.color = ft.Colors.GREEN
|
|
self.all_users = self.get_all_users() # Refresh lista locală
|
|
else:
|
|
self.error.value = response.json().get("error", "Eroare la salvarea datelor")
|
|
self.error.color = ft.Colors.RED
|
|
|
|
self.error.update()
|
|
|
|
def on_search_bar_submit(self, e):
|
|
search = self.search_bar.value
|
|
self.placeholder.content = self.role_users
|
|
self.placeholder.update()
|
|
self.role_users.controls.clear()
|
|
users = [user for user in self.all_users if search in user['email']]
|
|
self.role_users.controls = self.create_users_list(users, self.on_user_btn_click)
|
|
self.role_users.update()
|
|
|
|
|
|
def build(self):
|
|
return ft.Container(
|
|
content=ft.Column(
|
|
[
|
|
ft.Row(
|
|
[
|
|
self.all_roles_list,
|
|
ft.VerticalDivider(width=1),
|
|
ft.Container(
|
|
content = ft.Column(
|
|
[
|
|
ft.Row(
|
|
[
|
|
self.search_bar
|
|
]
|
|
),
|
|
#ft.Divider(height=1),
|
|
self.placeholder
|
|
],
|
|
expand=True
|
|
),
|
|
padding=5,
|
|
expand=True
|
|
)
|
|
],
|
|
expand=True
|
|
)
|
|
],
|
|
expand=True
|
|
),
|
|
expand=True
|
|
) |