mirror of
https://github.com/dkmstr/openuds.git
synced 2025-03-20 06:50:23 +03:00
fixed put incorrectly reporting 500 on bad requests
This commit is contained in:
parent
01144fe9ba
commit
5fb8130baa
@ -47,6 +47,8 @@ from uds.core.environment import Environment
|
||||
from uds.core.ui.images import DEFAULT_THUMB_BASE64
|
||||
from uds.core.ui import gui
|
||||
from uds.core.util.state import State
|
||||
from uds.core.module import Module
|
||||
|
||||
|
||||
from uds.REST.model import DetailHandler
|
||||
from uds.REST import NotFound, ResponseError, RequestError, AccessDenied
|
||||
@ -192,7 +194,7 @@ class Services(DetailHandler): # pylint: disable=too-many-public-methods
|
||||
)
|
||||
)
|
||||
raise RequestError(_('Element already exists (duplicate key error)'))
|
||||
except services.Service.ValidationException as e:
|
||||
except Module.ValidationException as e:
|
||||
if (
|
||||
not item and service
|
||||
): # Only remove partially saved element if creating new (if editing, ignore this)
|
||||
|
@ -45,6 +45,7 @@ from uds.core.ui import gui as uiGui
|
||||
from uds.core.util import log
|
||||
from uds.core.util import permissions
|
||||
from uds.core.util.model import processUuid
|
||||
from uds.core import Module
|
||||
|
||||
from uds.models import Tag, TaggingMixin, ManagedObjectModel, Network
|
||||
|
||||
@ -61,7 +62,6 @@ from .handlers import (
|
||||
# Not imported at runtime, just for type checking
|
||||
if typing.TYPE_CHECKING:
|
||||
from uds.models import User
|
||||
from uds.core import Module
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@ -72,7 +72,9 @@ TABLEINFO: typing.Final[str] = 'tableinfo'
|
||||
GUI: typing.Final[str] = 'gui'
|
||||
LOG: typing.Final[str] = 'log'
|
||||
|
||||
OK: typing.Final[str] = 'ok' # Constant to be returned when result is just "operation complete successfully"
|
||||
OK: typing.Final[
|
||||
str
|
||||
] = 'ok' # Constant to be returned when result is just "operation complete successfully"
|
||||
|
||||
# Exception to "rethrow" on save error
|
||||
class SaveException(HandlerError):
|
||||
@ -247,7 +249,10 @@ class BaseModelHandler(Handler):
|
||||
return gui
|
||||
|
||||
def ensureAccess(
|
||||
self, obj: models.Model, permission: permissions.PermissionType, root: bool = False
|
||||
self,
|
||||
obj: models.Model,
|
||||
permission: permissions.PermissionType,
|
||||
root: bool = False,
|
||||
) -> None:
|
||||
if not permissions.hasAccess(self._user, obj, permission, root):
|
||||
raise self.accessDenied()
|
||||
@ -866,10 +871,7 @@ class ModelHandler(BaseModelHandler):
|
||||
else:
|
||||
requiredPermission = permissions.PermissionType.READ
|
||||
|
||||
if (
|
||||
permissions.hasAccess(self._user, item, requiredPermission)
|
||||
is False
|
||||
):
|
||||
if permissions.hasAccess(self._user, item, requiredPermission) is False:
|
||||
logger.debug(
|
||||
'Permission for user %s does not comply with %s',
|
||||
self._user,
|
||||
@ -896,7 +898,6 @@ class ModelHandler(BaseModelHandler):
|
||||
except AttributeError:
|
||||
raise self.invalidMethodException()
|
||||
|
||||
|
||||
def getItems(
|
||||
self, *args, **kwargs
|
||||
) -> typing.Generator[typing.MutableMapping[str, typing.Any], None, None]:
|
||||
@ -1117,11 +1118,39 @@ class ModelHandler(BaseModelHandler):
|
||||
): # Present, but list is empty (will be proccesed on "if" else)
|
||||
item.tags.clear()
|
||||
|
||||
if not deleteOnError:
|
||||
self.checkSave(
|
||||
item
|
||||
) # Will raise an exception if item can't be saved (only for modify operations..)
|
||||
|
||||
# Store associated object if requested (data_type)
|
||||
try:
|
||||
if isinstance(item, ManagedObjectModel):
|
||||
data_type: typing.Optional[str] = self._params.get(
|
||||
'data_type', self._params.get('type')
|
||||
)
|
||||
if data_type:
|
||||
item.data_type = data_type
|
||||
item.data = item.getInstance(self._params).serialize()
|
||||
|
||||
item.save()
|
||||
|
||||
res = self.item_as_dict(item)
|
||||
self.fillIntanceFields(item, res)
|
||||
except:
|
||||
if deleteOnError:
|
||||
item.delete()
|
||||
raise
|
||||
|
||||
self.afterSave(item)
|
||||
|
||||
return res
|
||||
|
||||
except self.model.DoesNotExist:
|
||||
raise NotFound('Item not found')
|
||||
except IntegrityError: # Duplicate key probably
|
||||
raise RequestError('Element already exists (duplicate key error)')
|
||||
except SaveException as e:
|
||||
except (SaveException, Module.ValidationException) as e:
|
||||
raise RequestError(str(e))
|
||||
except (RequestError, ResponseError):
|
||||
raise
|
||||
@ -1129,34 +1158,6 @@ class ModelHandler(BaseModelHandler):
|
||||
logger.exception('Exception on put')
|
||||
raise RequestError('incorrect invocation to PUT')
|
||||
|
||||
if not deleteOnError:
|
||||
self.checkSave(
|
||||
item
|
||||
) # Will raise an exception if item can't be saved (only for modify operations..)
|
||||
|
||||
# Store associated object if requested (data_type)
|
||||
try:
|
||||
if isinstance(item, ManagedObjectModel):
|
||||
data_type: typing.Optional[str] = self._params.get(
|
||||
'data_type', self._params.get('type')
|
||||
)
|
||||
if data_type:
|
||||
item.data_type = data_type
|
||||
item.data = item.getInstance(self._params).serialize()
|
||||
|
||||
item.save()
|
||||
|
||||
res = self.item_as_dict(item)
|
||||
self.fillIntanceFields(item, res)
|
||||
except:
|
||||
if deleteOnError:
|
||||
item.delete()
|
||||
raise
|
||||
|
||||
self.afterSave(item)
|
||||
|
||||
return res
|
||||
|
||||
def delete(self) -> typing.Any:
|
||||
"""
|
||||
Processes a DELETE request
|
||||
|
Loading…
x
Reference in New Issue
Block a user