Skip to content

Commit ae16e78

Browse files
committed
Refactor error handling and improve sorting methods in REST handlers
1 parent 5c3d728 commit ae16e78

File tree

4 files changed

+27
-7
lines changed

4 files changed

+27
-7
lines changed

server/src/uds/REST/dispatcher.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,8 @@
3737
import traceback
3838

3939
from django import http
40-
import django
41-
import django.db
42-
import django.db.models
4340
from django.utils.decorators import method_decorator
41+
from django.core.exceptions import ObjectDoesNotExist
4442
from django.views.decorators.csrf import csrf_exempt
4543
from django.views.generic.base import View
4644

@@ -209,9 +207,9 @@ def dispatch(self, request: 'http.request.HttpRequest', path: str) -> 'http.Http
209207
except exceptions.services.generics.Error as e:
210208
log.log_operation(handler, 503, types.log.LogLevel.ERROR)
211209
return http.HttpResponseServerError(
212-
f'{{"error": "{e}"}}'.encode(), content_type="application/json", code=503
210+
f'{{"error": "{e}"}}'.encode(), content_type="application/json", status=503
213211
)
214-
except django.db.models.Model.DoesNotExist as e: # All DoesNotExist exceptions are not found
212+
except ObjectDoesNotExist as e: # All DoesNotExist exceptions are not found
215213
log.log_operation(handler, 404, types.log.LogLevel.ERROR)
216214
return http.HttpResponseNotFound(f'{{"error": "{e}"}}'.encode(), content_type="application/json")
217215
except Exception as e:

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class Config(Handler):
5151
ROLE = consts.UserRole.ADMIN
5252

5353
def get(self) -> typing.Any:
54-
return self.filter_odata_data(CfgConfig.get_config_values(self.is_admin()))
54+
return CfgConfig.get_config_values(self.is_admin())
5555

5656
def put(self) -> typing.Any:
5757
for section, section_dict in typing.cast(dict[str, dict[str, dict[str, str]]], self._params).items():

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
import typing
3737

3838
from django.utils.translation import gettext, gettext_lazy as _
39-
from django.db.models import Model
39+
from django.db.models import Model, Count
4040

4141
import uds.core.types.permissions
4242
from uds.core import exceptions, services, types
@@ -51,6 +51,9 @@
5151

5252
logger = logging.getLogger(__name__)
5353

54+
if typing.TYPE_CHECKING:
55+
from django.db.models.query import QuerySet
56+
5457

5558
# Helper class for Provider offers
5659
@dataclasses.dataclass
@@ -96,13 +99,23 @@ class Providers(ModelHandler[ProviderItem]):
9699
.numeric_column(name='user_services_count', title=_('User Services'))
97100
.text_column(name='tags', title=_('Tags'), visible=False)
98101
.row_style(prefix='row-maintenance-', field='maintenance_mode')
102+
.with_field_mappings(type_name='data_type')
103+
.with_filter_fields('name', 'data_type', 'comments', 'maintenance_mode')
99104
).build()
100105

101106
# Rest api related information to complete the auto-generated API
102107
REST_API_INFO = types.rest.api.RestApiInfo(
103108
typed=types.rest.api.RestApiInfoGuiType.MULTIPLE_TYPES,
104109
)
105110

111+
def apply_sort(self, qs: 'QuerySet[typing.Any]') -> 'list[typing.Any] | QuerySet[typing.Any]':
112+
if field_info := self.get_sort_field_info('services_count'):
113+
field_name, is_descending = field_info
114+
order_by_field = f"-{field_name}" if is_descending else field_name
115+
return qs.annotate(services_count=Count('services')).order_by(order_by_field)
116+
117+
return super().apply_sort(qs)
118+
106119
def get_item(self, item: 'Model') -> ProviderItem:
107120
item = ensure.is_instance(item, Provider)
108121
type_ = item.get_type()

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@
5353

5454
from .user_services import AssignedUserService, UserServiceItem
5555

56+
if typing.TYPE_CHECKING:
57+
from django.db.models.query import QuerySet
5658

5759
logger = logging.getLogger(__name__)
5860

@@ -116,6 +118,13 @@ def as_user_item(user: 'User') -> UserItem:
116118
groups=[i.uuid for i in user.get_groups()],
117119
role=user.get_role().as_str(),
118120
)
121+
122+
def apply_sort(self, qs: 'QuerySet[typing.Any]') -> 'list[typing.Any] | QuerySet[typing.Any]':
123+
if field_info := self.get_sort_field_info('role'):
124+
descending = '-' if field_info[1] else ''
125+
return qs.order_by(f'{descending}is_admin', f'{descending}staff_member')
126+
127+
return super().apply_sort(qs)
119128

120129
def get_item_position(self, parent: 'Model', item_uuid: str) -> int:
121130
parent = ensure.is_instance(parent, Authenticator)

0 commit comments

Comments
 (0)