Skip to content

Commit

Permalink
universal validators for status changes
Browse files Browse the repository at this point in the history
  • Loading branch information
yarsanich committed Aug 11, 2017
1 parent a76f7ff commit c2529a7
Showing 1 changed file with 49 additions and 1 deletion.
50 changes: 49 additions & 1 deletion openregistry/api/validation.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from schematics.exceptions import ModelValidationError, ModelConversionError
from openregistry.api.utils import apply_data_patch, update_logging_context
from openregistry.api.utils import raise_operation_error


def validate_json_data(request):
Expand Down Expand Up @@ -61,4 +62,51 @@ def validate_data(request, model, partial=False, data=None):
m.__parent__ = request.context
request.validated[model.__name__.lower()] = m

return data
return data


def validate_change_status(request, error_handler, **kwargs):
"""
This validator get dict from adapter and validate availibility
to change status by dict.
"""
# Get resource_type
resource_type = request.validated['resource_type']
# Get status from PATCH validated data
new_status = request.validated['data'].get("status")
# Get model from context
model = request.context

# Check status in data and not equal to context status
if not new_status or new_status == model.status:
return

# get available statuses from dict
statuses = request.content_configurator.available_statuses[model.status]
# verify right status change (auth_role and target status)
msg = 'Can\'t update {} in current ({}) status'.format(resource_type,
model.status)
if new_status not in statuses or \
request.authenticated_role not in statuses.get(new_status, {}):
raise_operation_error(request, error_handler, msg)


def validate_terminated_statuses(request, error_handler, **kwargs):
"""
This validator get terminated statuses from configurator and validate
impossibility to change terminated status
"""
# Get resource_type
resource_type = request.validated['resource_type']

# get context
model = request.context

# get terminated_statuses
terminated_statuses = request.content_configurator.terminated_statuses

# check context status
if model.status in terminated_statuses:
msg = 'Can\'t update {} in current ({}) status'.format(resource_type,
model.status)
raise_operation_error(request, error_handler, msg)

0 comments on commit c2529a7

Please sign in to comment.