Skip to content

Commit 4c3e017

Browse files
committed
Implement user roles
1 parent 37cdc28 commit 4c3e017

4 files changed

Lines changed: 30 additions & 18 deletions

File tree

libs/ktem/ktem/db/base_models.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import datetime
22
import uuid
33
from typing import Optional
4+
from enum import Enum
45

56
from sqlalchemy import JSON, Column
67
from sqlmodel import Field, SQLModel
@@ -43,6 +44,10 @@ class BaseConversation(SQLModel):
4344
default_factory=lambda: datetime.datetime.now(get_localzone())
4445
)
4546

47+
class Role(str, Enum):
48+
CHAT_USER = "chat_user"
49+
AGENT_CREATOR = "agent_creator"
50+
ADMIN = "admin"
4651

4752
class BaseUser(SQLModel):
4853
"""Store the user information
@@ -61,7 +66,7 @@ class BaseUser(SQLModel):
6166
username: str = Field(unique=True)
6267
username_lower: str = Field(unique=True)
6368
password: str
64-
admin: bool = Field(default=False)
69+
role: Role = Field(default=Role.CHAT_USER)
6570

6671

6772
class BaseSettings(SQLModel):

libs/ktem/ktem/main.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import gradio as gr
22
from decouple import config
33
from ktem.app import BaseApp
4+
from ktem.db.base_models import Role
45
from ktem.pages.chat import ChatPage
56
from ktem.pages.help import HelpPage
67
from ktem.pages.resources import ResourcesTab
@@ -153,7 +154,7 @@ def toggle_login_visibility(user_id):
153154
for k in self._tabs.keys()
154155
)
155156

156-
is_admin = user.admin
157+
is_admin = user.role == Role.ADMIN
157158

158159
tabs_update = []
159160
for k in self._tabs.keys():

libs/ktem/ktem/pages/resources/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import gradio as gr
22
from ktem.app import BasePage
3+
from ktem.db.base_models import Role
34
from ktem.db.models import User, engine
45
from ktem.embeddings.ui import EmbeddingManagement
56
from ktem.index.ui import IndexManagement
@@ -58,7 +59,7 @@ def toggle_user_management(self, user_id):
5859
"""Show/hide the user management, depending on the user's role"""
5960
with Session(engine) as session:
6061
user = session.exec(select(User).where(User.id == user_id)).first()
61-
if user and user.admin:
62+
if user and user.role == Role.ADMIN:
6263
return gr.update(visible=True)
6364

6465
return gr.update(visible=False)

libs/ktem/ktem/pages/resources/user.py

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import gradio as gr
44
import pandas as pd
55
from ktem.app import BasePage
6+
from ktem.db.base_models import Role
67
from ktem.db.models import User, engine
78
from sqlmodel import Session, select
89
from theflow.settings import settings as flowsettings
@@ -109,7 +110,7 @@ def create_user(usn, pwd, user_id=None, is_admin=True) -> bool:
109110
username=usn,
110111
username_lower=usn.lower(),
111112
password=hashed_password,
112-
admin=is_admin,
113+
role=Role.ADMIN if is_admin else Role.CHAT_USER,
113114
)
114115
session.add(user)
115116
session.commit()
@@ -136,7 +137,7 @@ def on_building_ui(self):
136137
with gr.Tab(label="User list"):
137138
self.state_user_list = gr.State(value=None)
138139
self.user_list = gr.DataFrame(
139-
headers=["id", "name", "admin"],
140+
headers=["id", "name", "role"],
140141
column_widths=[0, 50, 50],
141142
interactive=False,
142143
)
@@ -150,7 +151,11 @@ def on_building_ui(self):
150151
label="Confirm change password",
151152
type="password",
152153
)
153-
self.admin_edit = gr.Checkbox(label="Admin")
154+
self.role_edit = gr.Dropdown(
155+
label="Role",
156+
choices=[role.value for role in Role],
157+
value=Role.CHAT_USER.value,
158+
)
154159

155160
with gr.Row(visible=False) as self._selected_panel_btn:
156161
with gr.Column():
@@ -208,7 +213,7 @@ def on_register_events(self):
208213
self.usn_edit,
209214
self.pwd_edit,
210215
self.pwd_cnf_edit,
211-
self.admin_edit,
216+
self.role_edit,
212217
],
213218
show_progress="hidden",
214219
)
@@ -245,7 +250,7 @@ def on_register_events(self):
245250
self.usn_edit,
246251
self.pwd_edit,
247252
self.pwd_cnf_edit,
248-
self.admin_edit,
253+
self.role_edit,
249254
],
250255
outputs=[self.pwd_edit, self.pwd_cnf_edit],
251256
show_progress="hidden",
@@ -315,27 +320,27 @@ def create_user(self, usn, pwd, pwd_cnf):
315320
def list_users(self, user_id):
316321
if user_id is None:
317322
return [], pd.DataFrame.from_records(
318-
[{"id": "-", "username": "-", "admin": "-"}]
323+
[{"id": "-", "username": "-", "role": "-"}]
319324
)
320325

321326
with Session(engine) as session:
322327
statement = select(User).where(User.id == user_id)
323328
user = session.exec(statement).one()
324-
if not user.admin:
329+
if not user.role == Role.ADMIN:
325330
return [], pd.DataFrame.from_records(
326-
[{"id": "-", "username": "-", "admin": "-"}]
331+
[{"id": "-", "username": "-", "role": "-"}]
327332
)
328333

329334
statement = select(User)
330335
results = [
331-
{"id": user.id, "username": user.username, "admin": user.admin}
336+
{"id": user.id, "username": user.username, "role": user.role.value}
332337
for user in session.exec(statement).all()
333338
]
334339
if results:
335340
user_list = pd.DataFrame.from_records(results)
336341
else:
337342
user_list = pd.DataFrame.from_records(
338-
[{"id": "-", "username": "-", "admin": "-"}]
343+
[{"id": "-", "username": "-", "role": "-"}]
339344
)
340345

341346
return results, user_list
@@ -360,7 +365,7 @@ def on_selected_user_change(self, selected_user_id):
360365
usn_edit = gr.update(value="")
361366
pwd_edit = gr.update(value="")
362367
pwd_cnf_edit = gr.update(value="")
363-
admin_edit = gr.update(value=False)
368+
role_edit = gr.update(value=Role.CHAT_USER.value)
364369
else:
365370
_selected_panel = gr.update(visible=True)
366371
_selected_panel_btn = gr.update(visible=True)
@@ -375,7 +380,7 @@ def on_selected_user_change(self, selected_user_id):
375380
usn_edit = gr.update(value=user.username)
376381
pwd_edit = gr.update(value="")
377382
pwd_cnf_edit = gr.update(value="")
378-
admin_edit = gr.update(value=user.admin)
383+
role_edit = gr.update(value=user.role.value)
379384

380385
return (
381386
_selected_panel,
@@ -386,7 +391,7 @@ def on_selected_user_change(self, selected_user_id):
386391
usn_edit,
387392
pwd_edit,
388393
pwd_cnf_edit,
389-
admin_edit,
394+
role_edit,
390395
)
391396

392397
def on_btn_delete_click(self, selected_user_id):
@@ -403,7 +408,7 @@ def on_btn_delete_click(self, selected_user_id):
403408

404409
return btn_delete, btn_delete_yes, btn_delete_no
405410

406-
def save_user(self, selected_user_id, usn, pwd, pwd_cnf, admin):
411+
def save_user(self, selected_user_id, usn, pwd, pwd_cnf, role):
407412
errors = validate_username(usn)
408413
if errors:
409414
gr.Warning(errors)
@@ -420,7 +425,7 @@ def save_user(self, selected_user_id, usn, pwd, pwd_cnf, admin):
420425
user = session.exec(statement).one()
421426
user.username = usn
422427
user.username_lower = usn.lower()
423-
user.admin = admin
428+
user.role = Role(role)
424429
if pwd:
425430
user.password = hashlib.sha256(pwd.encode()).hexdigest()
426431
session.commit()

0 commit comments

Comments
 (0)