Skip to content

Commit 5c3d728

Browse files
committed
Upgrading admin to new gen
1 parent 72f0c85 commit 5c3d728

File tree

13 files changed

+141
-22
lines changed

13 files changed

+141
-22
lines changed

server/src/uds/REST/methods/accountsusage.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,10 @@ def as_dict(item: 'AccountUsage', perm: int) -> AccountItem:
8989
elapsed_timemark=item.elapsed_timemark,
9090
permission=perm,
9191
)
92+
93+
def get_item_position(self, parent: 'Model', item_uuid: str) -> int:
94+
parent = ensure.is_instance(parent, Account)
95+
return self.calc_item_position(item_uuid, parent.usages.all())
9296

9397
def get_items(self, parent: 'Model') -> types.rest.ItemsResult[AccountItem]:
9498
parent = ensure.is_instance(parent, Account)

server/src/uds/REST/methods/authenticators.py

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@
5454

5555
from uds.core.module import Module
5656

57+
if typing.TYPE_CHECKING:
58+
from django.db.models.query import QuerySet
59+
5760
logger = logging.getLogger(__name__)
5861

5962

@@ -110,9 +113,9 @@ class Authenticators(ModelHandler[AuthenticatorItem]):
110113
.icon(name='name', title=_('Name'), visible=True)
111114
.text_column(name='type_name', title=_('Type'))
112115
.text_column(name='comments', title=_('Comments'))
113-
.numeric_column(name='priority', title=_('Priority'), width='5rem')
116+
.numeric_column(name='priority', title=_('Priority'), width='8rem')
114117
.text_column(name='small_name', title=_('Label'))
115-
.numeric_column(name='users_count', title=_('Users'), width='1rem')
118+
.numeric_column(name='users_count', title=_('Users'), width='6rem')
116119
.text_column(name='mfa_name', title=_('MFA'))
117120
.text_column(name='tags', title=_('tags'), visible=False)
118121
.row_style(prefix='row-state-', field='state')
@@ -218,6 +221,29 @@ def get_item(self, item: 'models.Model') -> AuthenticatorItem:
218221
type_info=type(self).as_typeinfo(item.get_type()),
219222
)
220223

224+
def apply_sort(self, qs: 'QuerySet[typing.Any]') -> 'list[typing.Any] | QuerySet[typing.Any]':
225+
if field_info := self.get_sort_field_info('users_count'):
226+
field_name, is_descending = field_info
227+
order_by_field = f"-{field_name}" if is_descending else field_name
228+
return qs.annotate(users_count=models.Count('users')).order_by(order_by_field)
229+
230+
if field_info := self.get_sort_field_info('type_name'):
231+
_, is_descending = field_info
232+
order_by_field = f'-data_type' if is_descending else 'data_type'
233+
return qs.order_by(order_by_field)
234+
235+
if field_info := self.get_sort_field_info('numeric_id'):
236+
_, is_descending = field_info
237+
order_by_field = f'-pk' if is_descending else 'pk'
238+
return qs.order_by(order_by_field)
239+
240+
if field_info := self.get_sort_field_info('mfa_name'):
241+
_, is_descending = field_info
242+
order_by_field = f'-mfa__name' if is_descending else 'mfa__name'
243+
return qs.order_by(order_by_field)
244+
245+
return super().apply_sort(qs)
246+
221247
def post_save(self, item: 'models.Model') -> None:
222248
item = ensure.is_instance(item, Authenticator)
223249
try:

server/src/uds/REST/methods/calendarrules.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,10 @@ def rule_as_dict(item: CalendarRule, perm: int) -> CalendarRuleItem:
9393
duration_unit=item.duration_unit,
9494
permission=perm,
9595
)
96+
97+
def get_item_position(self, parent: 'models.Model', item_uuid: str) -> int:
98+
parent = ensure.is_instance(parent, Calendar)
99+
return self.calc_item_position(item_uuid, parent.rules.all())
96100

97101
def get_items(self, parent: 'models.Model') -> types.rest.ItemsResult[CalendarRuleItem]:
98102
parent = ensure.is_instance(parent, Calendar)

server/src/uds/REST/methods/meta_service_pools.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ def as_dict(item: models.MetaPoolMember) -> 'MetaItem':
9191
user_services_count=item.pool.userServices.exclude(state__in=State.INFO_STATES).count(),
9292
user_services_in_preparation=item.pool.userServices.filter(state=State.PREPARING).count(),
9393
)
94+
95+
def get_item_position(self, parent: 'Model', item_uuid: str) -> int:
96+
parent = ensure.is_instance(parent, models.MetaPool)
97+
return self.calc_item_position(item_uuid, parent.members.all())
9498

9599
def get_items(self, parent: 'Model') -> types.rest.ItemsResult['MetaItem']:
96100
parent = ensure.is_instance(parent, models.MetaPool)
@@ -201,7 +205,7 @@ def _assigned_userservices_for_pools(
201205
.prefetch_related('deployed_service', 'publication')
202206
):
203207
yield u, properties.get(u.uuid, {})
204-
208+
205209
def get_items(self, parent: 'Model') -> types.rest.ItemsResult[UserServiceItem]:
206210
parent = ensure.is_instance(parent, models.MetaPool)
207211

server/src/uds/REST/methods/op_calendars.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,15 @@ def as_item(item: 'models.CalendarAccess|models.CalendarAccessMeta') -> AccessCa
7373
access=item.access,
7474
priority=item.priority,
7575
)
76+
77+
def get_item_position(self, parent: 'Model', item_uuid: str) -> int:
78+
# parent can be a ServicePool or a metaPool
79+
if isinstance(parent, models.ServicePool):
80+
parent = ensure.is_instance(parent, models.ServicePool)
81+
return self.calc_item_position(item_uuid, parent.calendarAccess.all())
82+
83+
parent = ensure.is_instance(parent, models.MetaPool)
84+
return self.calc_item_position(item_uuid, parent.calendarAccess.all())
7685

7786
def get_items(self, parent: 'Model') -> types.rest.ItemsResult[AccessCalendarItem]:
7887
# parent can be a ServicePool or a metaPool
@@ -186,6 +195,10 @@ def as_dict(item: 'models.CalendarAction') -> ActionCalendarItem:
186195
next_execution=item.next_execution,
187196
last_execution=item.last_execution,
188197
)
198+
199+
def get_item_position(self, parent: 'Model', item_uuid: str) -> int:
200+
parent = ensure.is_instance(parent, models.ServicePool)
201+
return self.calc_item_position(item_uuid, parent.calendaraction_set.all())
189202

190203
def get_items(self, parent: 'Model') -> types.rest.ItemsResult[ActionCalendarItem]:
191204
parent = ensure.is_instance(parent, models.ServicePool)

server/src/uds/REST/methods/services.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,10 @@ def service_item(item: models.Service, perm: int, full: bool = False) -> Service
155155
ret_value.info = Services.service_info(item)
156156

157157
return ret_value
158+
159+
def get_item_position(self, parent: Model, item_uuid: str) -> int:
160+
parent = ensure.is_instance(parent, models.Provider)
161+
return self.calc_item_position(item_uuid, parent.services.all())
158162

159163
def get_items(self, parent: 'Model') -> types.rest.ItemsResult[ServiceItem]:
160164
parent = ensure.is_instance(parent, models.Provider)

server/src/uds/REST/methods/services_usage.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,13 @@ def item_as_dict(item: UserService) -> ServicesUsageItem:
109109
source_ip=item.src_ip,
110110
in_use=item.in_use,
111111
)
112+
113+
def get_item_position(self, parent: 'Model', item_uuid: str) -> int:
114+
parent = ensure.is_instance(parent, Provider)
115+
return self.calc_item_position(
116+
item_uuid,
117+
UserService.objects.filter(deployed_service__service__provider=parent).order_by('creation_date'),
118+
)
112119

113120
def get_items(self, parent: 'Model') -> types.rest.ItemsResult[ServicesUsageItem]:
114121
parent = ensure.is_instance(parent, Provider)

server/src/uds/REST/methods/tunnels_management.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ def as_tunnel_server_item(item: models.Server) -> TunnelServerItem:
7373
mac=item.mac if item.mac != consts.NULL_MAC else '',
7474
maintenance=item.maintenance_mode,
7575
)
76+
77+
def get_item_position(self, parent: Model, item_uuid: str) -> int:
78+
parent = ensure.is_instance(parent, models.ServerGroup)
79+
return self.calc_item_position(item_uuid, parent.servers.all())
7680

7781
def get_items(
7882
self, parent: 'Model'

server/src/uds/REST/methods/user_services.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,19 @@ def annotated_sort(field: str, descending: bool) -> QuerySet[typing.Any]:
159159
first_order_by_field, is_descending = sort_info
160160

161161
return super().apply_sort(qs)
162+
163+
def get_qs(self, for_cached: bool) -> QuerySet[models.UserService]:
164+
parent = ensure.is_instance(self._parent, models.ServicePool)
165+
if for_cached:
166+
return parent.cached_users_services()
167+
return parent.assigned_user_services()
168+
169+
def do_get_item_position(self, for_cached: bool, parent: 'Model', item_uuid: str) -> int:
170+
parent = ensure.is_instance(parent, models.ServicePool)
171+
return self.calc_item_position(item_uuid, self.get_qs(for_cached).all())
172+
173+
def get_item_position(self, parent: Model, item_uuid: str) -> int:
174+
return self.do_get_item_position(for_cached=False, parent=parent, item_uuid=item_uuid)
162175

163176
def do_get_item(
164177
self,
@@ -168,13 +181,8 @@ def do_get_item(
168181
) -> 'UserServiceItem':
169182
parent = ensure.is_instance(parent, models.ServicePool)
170183

171-
def get_qs() -> QuerySet[models.UserService]:
172-
if for_cached:
173-
return parent.cached_users_services()
174-
return parent.assigned_user_services()
175-
176184
return AssignedUserService.userservice_item(
177-
get_qs().get(uuid=process_uuid(item)),
185+
self.get_qs(for_cached).get(uuid=process_uuid(item)),
178186
props={
179187
k: v
180188
for k, v in models.Properties.objects.filter(
@@ -337,6 +345,9 @@ class CachedService(AssignedUserService):
337345
"""
338346

339347
CUSTOM_METHODS = [] # Remove custom methods from assigned services
348+
349+
def get_item_position(self, parent: Model, item_uuid: str) -> int:
350+
return self.do_get_item_position(for_cached=True, parent=parent, item_uuid=item_uuid)
340351

341352
def get_items(self, parent: 'Model') -> types.rest.ItemsResult['UserServiceItem']:
342353
return self.do_get_items(parent, for_cached=True)

server/src/uds/REST/methods/users_groups.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,11 @@ def as_user_item(user: 'User') -> UserItem:
117117
role=user.get_role().as_str(),
118118
)
119119

120+
def get_item_position(self, parent: 'Model', item_uuid: str) -> int:
121+
parent = ensure.is_instance(parent, Authenticator)
122+
123+
return self.calc_item_position(item_uuid, parent.users.all())
124+
120125
def get_items(self, parent: 'Model') -> types.rest.ItemsResult[UserItem]:
121126
parent = ensure.is_instance(parent, Authenticator)
122127

@@ -361,6 +366,10 @@ def as_group_item(group: 'Group') -> GroupItem:
361366
val.groups = list(x.uuid for x in group.groups.all().order_by('name'))
362367
return val
363368

369+
def get_item_position(self, parent: 'Model', item_uuid: str) -> int:
370+
parent = ensure.is_instance(parent, Authenticator)
371+
return self.calc_item_position(item_uuid, parent.groups.all())
372+
364373
def get_items(self, parent: 'Model') -> types.rest.ItemsResult['GroupItem']:
365374
parent = ensure.is_instance(parent, Authenticator)
366375
q = self.odata_filter(parent.groups.all())

0 commit comments

Comments
 (0)