274 lines
12 KiB
Python
274 lines
12 KiB
Python
import flet as ft
|
|
import requests
|
|
from config import API_BASE_URL
|
|
|
|
class Users:
|
|
def __init__(self, page: ft.Page, dashboard):
|
|
self.page = page
|
|
self.dashboard = dashboard
|
|
self.users = self.get_users()
|
|
self.selected_user = None
|
|
self.users_list = ft.ListView(
|
|
controls=self.create_users_list(self.users, self.on_edit_btn_click, self.on_delete_btn_click),
|
|
spacing=10,
|
|
expand=True
|
|
)
|
|
self.add_user_dialog = ft.AlertDialog(
|
|
title="Add Company User",
|
|
content=ft.Column(
|
|
[
|
|
ft.TextField(label="Name"),
|
|
ft.TextField(label="Email"),
|
|
ft.TextField(label="Temporary Password", password=True, can_reveal_password=True),
|
|
ft.Text("Give user access to add and modify:"),
|
|
ft.Checkbox(label="Orders In"),
|
|
ft.Checkbox(label="Order Out"),
|
|
ft.Checkbox(label="Addresses"),
|
|
ft.Checkbox(label="Clients"),
|
|
ft.Checkbox(label="Transporters"),
|
|
ft.Checkbox(label="Report"),
|
|
ft.Text("", color=ft.Colors.RED)
|
|
],
|
|
width=600,
|
|
height=500
|
|
),
|
|
actions=[
|
|
ft.TextButton(
|
|
"Cancel",
|
|
width=100,
|
|
on_click=self.on_cancel_btn_click
|
|
),
|
|
ft.ElevatedButton(
|
|
"Save",
|
|
width=100,
|
|
on_click=self.on_save_btn_click
|
|
)
|
|
]
|
|
)
|
|
|
|
self.delete_dialog = ft.AlertDialog(
|
|
title=ft.Text("Delete User?"),
|
|
actions=[
|
|
ft.TextButton("Cancel", on_click=self.on_cancel_delete_btn_click, width=100),
|
|
ft.Button("Yes", on_click=self.on_confirm_delete_btn_click, width=100),
|
|
]
|
|
)
|
|
|
|
self.edit_user_dialog = ft.AlertDialog(
|
|
title=ft.Text(f"Edit User"),
|
|
content=ft.Column(
|
|
[
|
|
ft.Checkbox(label="Orders In"),
|
|
ft.Checkbox(label="Order Out"),
|
|
ft.Checkbox(label="Addresses"),
|
|
ft.Checkbox(label="Clients"),
|
|
ft.Checkbox(label="Transporters"),
|
|
ft.Checkbox(label="Report"),
|
|
],
|
|
width=400,
|
|
height=350
|
|
),
|
|
actions=[
|
|
ft.TextButton(
|
|
"Cancel",
|
|
width=100,
|
|
on_click=self.on_edit_cancel_btn_click
|
|
),
|
|
ft.ElevatedButton(
|
|
"Save",
|
|
width=100,
|
|
on_click=self.on_edit_save_btn_click
|
|
)
|
|
]
|
|
)
|
|
|
|
def on_edit_cancel_btn_click(self, e):
|
|
self.page.close(self.edit_user_dialog)
|
|
|
|
def on_edit_save_btn_click(self, e):
|
|
token = self.page.client_storage.get("token")
|
|
headers = {"Authorization": f"Bearer {token}"}
|
|
access_payload = {
|
|
'company_user_id':self.selected_user['id'],
|
|
'orders_in':1 if self.edit_user_dialog.content.controls[0].value else 0,
|
|
'orders_out':1 if self.edit_user_dialog.content.controls[1].value else 0,
|
|
'addresses':1 if self.edit_user_dialog.content.controls[2].value else 0,
|
|
'clients':1 if self.edit_user_dialog.content.controls[3].value else 0,
|
|
'transporters':1 if self.edit_user_dialog.content.controls[4].value else 0,
|
|
'report':1 if self.edit_user_dialog.content.controls[5].value else 0
|
|
}
|
|
response = requests.put(f"{API_BASE_URL}/company_user/update_access", headers=headers, json=access_payload)
|
|
|
|
#set to default
|
|
self.selected_user = None
|
|
self.page.close(self.edit_user_dialog)
|
|
self.edit_user_dialog.content.controls[0].value = False
|
|
self.edit_user_dialog.content.controls[1].value = False
|
|
self.edit_user_dialog.content.controls[2].value = False
|
|
self.edit_user_dialog.content.controls[3].value = False
|
|
self.edit_user_dialog.content.controls[4].value = False
|
|
self.edit_user_dialog.content.controls[5].value = False
|
|
self.edit_user_dialog.update()
|
|
|
|
def on_confirm_delete_btn_click(self, e):
|
|
self.page.close(self.delete_dialog)
|
|
try:
|
|
token = self.page.client_storage.get("token")
|
|
headers = {"Authorization": f"Bearer {token}"}
|
|
delete_payload = {
|
|
'user_id':self.selected_user['id']
|
|
}
|
|
response = requests.post(f"{API_BASE_URL}/admin/users/deactivate", headers=headers, json=delete_payload)
|
|
except Exception as e:
|
|
print("Error deleting company users:", e)
|
|
users = self.get_users()
|
|
self.users_list.controls.clear()
|
|
self.users_list.controls = self.create_users_list(users, self.on_edit_btn_click, self.on_delete_btn_click)
|
|
self.users_list.update()
|
|
self.selected_user = None
|
|
|
|
def on_cancel_delete_btn_click(self, e):
|
|
self.page.close(self.delete_dialog)
|
|
|
|
def add_new_user(self, e):
|
|
self.page.open(self.add_user_dialog)
|
|
|
|
def on_edit_btn_click(self, item):
|
|
self.selected_user = item
|
|
access = self.get_user_access(item['id'])
|
|
self.edit_user_dialog.content.controls[0].value = True if access['orders_in']==1 else False
|
|
self.edit_user_dialog.content.controls[1].value = True if access['orders_out']==1 else False
|
|
self.edit_user_dialog.content.controls[2].value = True if access['destinations']==1 else False
|
|
self.edit_user_dialog.content.controls[3].value = True if access['clients']==1 else False
|
|
self.edit_user_dialog.content.controls[4].value = True if access['transporters']==1 else False
|
|
self.edit_user_dialog.content.controls[5].value = True if access['report']==1 else False
|
|
self.page.open(self.edit_user_dialog)
|
|
|
|
def get_user_access(self, id):
|
|
try:
|
|
token = self.page.client_storage.get("token")
|
|
headers = {"Authorization": f"Bearer {token}"}
|
|
response = requests.get(f"{API_BASE_URL}/company_user/access/{id}", headers=headers)
|
|
return response.json()
|
|
except Exception as e:
|
|
print("Error loading company user access:", e)
|
|
|
|
def on_delete_btn_click(self, item):
|
|
self.selected_user = item
|
|
self.page.open(self.delete_dialog)
|
|
|
|
def on_save_btn_click(self, e):
|
|
self.page.close(self.add_user_dialog)
|
|
try:
|
|
token = self.page.client_storage.get("token")
|
|
headers = {"Authorization": f"Bearer {token}"}
|
|
create_payload = {
|
|
'name':self.add_user_dialog.content.controls[0].value,
|
|
'email':self.add_user_dialog.content.controls[1].value,
|
|
'company_id':self.page.session.get("user_id"),
|
|
'password':self.add_user_dialog.content.controls[2].value
|
|
}
|
|
response = requests.post(f"{API_BASE_URL}/company_user/register_company_user", headers=headers, json=create_payload)
|
|
company_user_id = response.json()['company_user_id'] if response.status_code == 201 else self.show_error_mesage
|
|
if company_user_id:
|
|
access_payload = {
|
|
'company_user_id':company_user_id,
|
|
'orders_in':1 if self.add_user_dialog.content.controls[4].value else 0,
|
|
'orders_out':1 if self.add_user_dialog.content.controls[5].value else 0,
|
|
'addresses':1 if self.add_user_dialog.content.controls[6].value else 0,
|
|
'clients':1 if self.add_user_dialog.content.controls[7].value else 0,
|
|
'transporters':1 if self.add_user_dialog.content.controls[8].value else 0,
|
|
'report':1 if self.add_user_dialog.content.controls[9].value else 0
|
|
}
|
|
response = requests.post(f"{API_BASE_URL}/company_user/access", headers=headers, json=access_payload)
|
|
except Exception as e:
|
|
print("Error loading company users:", e)
|
|
|
|
users = self.get_users()
|
|
self.users_list.controls.clear()
|
|
self.users_list.controls = self.create_users_list(users, self.on_edit_btn_click, self.on_delete_btn_click)
|
|
self.users_list.update()
|
|
#set dialog to default valuse:
|
|
self.add_user_dialog.content.controls[0].value = ''
|
|
self.add_user_dialog.content.controls[1].value = ''
|
|
self.add_user_dialog.content.controls[2].value = ''
|
|
self.add_user_dialog.content.controls[4].value = False
|
|
self.add_user_dialog.content.controls[5].value = False
|
|
self.add_user_dialog.content.controls[6].value = False
|
|
self.add_user_dialog.content.controls[7].value = False
|
|
self.add_user_dialog.content.controls[8].value = False
|
|
self.add_user_dialog.content.controls[9].value = False
|
|
self.add_user_dialog.content.controls[10].value = ""
|
|
self.add_user_dialog.update()
|
|
|
|
def show_error_mesage(self):
|
|
self.add_user_dialog.content.controls[10].value = "A user with this email has been already created, to reactivate it send a request at office@ordergo.eu"
|
|
self.add_user_dialog.update()
|
|
|
|
def on_cancel_btn_click(self, e):
|
|
self.page.close(self.add_user_dialog)
|
|
|
|
def get_users(self):
|
|
try:
|
|
user_id = self.page.session.get("user_id")
|
|
users = []
|
|
token = self.page.client_storage.get("token")
|
|
headers = {"Authorization": f"Bearer {token}"}
|
|
response = requests.get(f"{API_BASE_URL}/admin/users/company_users", headers=headers)
|
|
if response.status_code == 200:
|
|
all_users=response.json()
|
|
for user in all_users:
|
|
if user['company_id'] == user_id and user['active'] == 1:
|
|
users.append(user)
|
|
return users
|
|
else:
|
|
return []
|
|
except Exception as e:
|
|
print("Error loading company users:", e)
|
|
|
|
def create_users_list(self, items, on_click_handler, on_click_handler2):
|
|
return [
|
|
ft.Container(
|
|
content=ft.Row(
|
|
[
|
|
ft.Column(
|
|
[
|
|
ft.Text(item['name'], expand=True, weight=ft.FontWeight.BOLD),
|
|
ft.Text(item['email'], size=12)
|
|
]
|
|
),
|
|
ft.Row(
|
|
[
|
|
ft.Button("Edit", on_click=lambda e, id=item: on_click_handler(id), width=100),
|
|
ft.FilledButton("Delete", on_click=lambda e, id=item: on_click_handler2(id), width=100, bgcolor=ft.Colors.RED)
|
|
]
|
|
)
|
|
],
|
|
alignment=ft.MainAxisAlignment.SPACE_BETWEEN,
|
|
),
|
|
width=300,
|
|
bgcolor=ft.Colors.BLUE_50,
|
|
padding=10,
|
|
border_radius=8,
|
|
border=ft.border.all(1, ft.Colors.GREY_300),
|
|
)
|
|
for item in items
|
|
]
|
|
|
|
def build(self):
|
|
return ft.Container(
|
|
content= ft.Column(
|
|
[
|
|
ft.Row(
|
|
[
|
|
ft.Text("Users", size=24, weight=ft.FontWeight.BOLD),
|
|
ft.Button("Add User", icon=ft.Icons.ADD, on_click=self.add_new_user)
|
|
],
|
|
alignment=ft.MainAxisAlignment.SPACE_BETWEEN
|
|
),
|
|
self.users_list
|
|
],
|
|
expand=True
|
|
),
|
|
expand=True
|
|
) |