Merge "Handler for changing notifications statuses added"

This commit is contained in:
Jenkins 2017-02-08 14:32:33 +00:00 committed by Gerrit Code Review
commit da7f9b12a2
6 changed files with 107 additions and 7 deletions

View File

@ -19,15 +19,14 @@ Handlers dealing with notifications
""" """
import web import web
from nailgun.api.v1.handlers.base import BaseHandler
from nailgun.api.v1.handlers.base import CollectionHandler from nailgun.api.v1.handlers.base import CollectionHandler
from nailgun.api.v1.handlers.base import SingleHandler
from nailgun import objects
from nailgun.api.v1.handlers.base import handle_errors from nailgun.api.v1.handlers.base import handle_errors
from nailgun.api.v1.handlers.base import serialize from nailgun.api.v1.handlers.base import serialize
from nailgun.api.v1.handlers.base import SingleHandler
from nailgun.api.v1.handlers.base import validate from nailgun.api.v1.handlers.base import validate
from nailgun.api.v1.validators.notification import NotificationValidator from nailgun.api.v1.validators.notification import NotificationValidator
from nailgun import objects
class NotificationHandler(SingleHandler): class NotificationHandler(SingleHandler):
@ -89,3 +88,22 @@ class NotificationCollectionStatsHandler(CollectionHandler):
:http: * 405 (Method not allowed) :http: * 405 (Method not allowed)
""" """
raise self.http(405) raise self.http(405)
class NotificationStatusHandler(BaseHandler):
validator = NotificationValidator
@handle_errors
@validate
@serialize
def PUT(self):
"""Updates status of all notifications
:http: * 200 (OK)
* 400 (Invalid data)
"""
web_data = web.data()
data = self.validator.validate_change_status(web_data)
status = data['status']
objects.NotificationCollection.update_statuses(status)

View File

@ -88,6 +88,9 @@ from nailgun.api.v1.handlers.plugin_link import PluginLinkHandler
from nailgun.api.v1.handlers.notifications import NotificationCollectionHandler from nailgun.api.v1.handlers.notifications import NotificationCollectionHandler
from nailgun.api.v1.handlers.notifications import \ from nailgun.api.v1.handlers.notifications import \
NotificationCollectionStatsHandler NotificationCollectionStatsHandler
from nailgun.api.v1.handlers.notifications import \
NotificationStatusHandler
from nailgun.api.v1.handlers.notifications import NotificationHandler from nailgun.api.v1.handlers.notifications import NotificationHandler
from nailgun.api.v1.handlers.orchestrator import DefaultDeploymentInfo from nailgun.api.v1.handlers.orchestrator import DefaultDeploymentInfo
@ -336,6 +339,8 @@ urls = (
r'/notifications/?$', r'/notifications/?$',
NotificationCollectionHandler, NotificationCollectionHandler,
r'/notifications/change_status/?$',
NotificationStatusHandler,
r'/notifications/(?P<obj_id>\d+)/?$', r'/notifications/(?P<obj_id>\d+)/?$',
NotificationHandler, NotificationHandler,
r'/notifications/stats/?$', r'/notifications/stats/?$',

View File

@ -0,0 +1,29 @@
# Copyright 2017 Mirantis, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from nailgun import consts
NOTIFICATIONS_CHANGE_STATUS = {
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"required": ["status"],
"properties": {
"status": {
"type": "string",
"enum": list(consts.NOTIFICATION_STATUSES)
},
}
}

View File

@ -13,11 +13,11 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from nailgun import consts
from nailgun import objects
from nailgun.api.v1.validators.base import BasicValidator from nailgun.api.v1.validators.base import BasicValidator
from nailgun.api.v1.validators.json_schema import notification
from nailgun import consts
from nailgun import errors from nailgun import errors
from nailgun import objects
class NotificationValidator(BasicValidator): class NotificationValidator(BasicValidator):
@ -90,3 +90,9 @@ class NotificationValidator(BasicValidator):
without any validations. without any validations.
""" """
pass pass
@classmethod
def validate_change_status(cls, data):
parsed = super(NotificationValidator, cls).validate(data)
cls.validate_schema(parsed, notification.NOTIFICATIONS_CHANGE_STATUS)
return parsed

View File

@ -109,3 +109,8 @@ class Notification(NailgunObject):
class NotificationCollection(NailgunCollection): class NotificationCollection(NailgunCollection):
single = Notification single = Notification
@classmethod
def update_statuses(cls, status):
db().query(cls.single.model).update(
{cls.single.model.status: status}, synchronize_session=False)

View File

@ -16,6 +16,7 @@
from oslo_serialization import jsonutils from oslo_serialization import jsonutils
from nailgun import consts
from nailgun.test.base import BaseIntegrationTest from nailgun.test.base import BaseIntegrationTest
from nailgun.utils import reverse from nailgun.utils import reverse
@ -140,3 +141,39 @@ class TestHandlers(BaseIntegrationTest):
expect_errors=True expect_errors=True
) )
self.assertEqual(405, resp.status_code) self.assertEqual(405, resp.status_code)
def test_notification_status(self):
self.env.create_notification(status=consts.NOTIFICATION_STATUSES.read)
self.env.create_notification(
status=consts.NOTIFICATION_STATUSES.unread)
self.env.create_notification(
status=consts.NOTIFICATION_STATUSES.unread)
expected_status = consts.NOTIFICATION_STATUSES.unread
resp = self.app.put(
reverse('NotificationStatusHandler'),
params=jsonutils.dumps({'status': expected_status}),
headers=self.default_headers
)
self.assertEqual(200, resp.status_code)
# Checking statuses are changed
resp = self.app.get(
reverse('NotificationCollectionHandler'),
headers=self.default_headers
)
self.assertEqual(200, resp.status_code)
for notif in resp.json_body:
self.assertEqual(expected_status, notif['status'])
def test_notification_status_not_allowed_methods(self):
methods = ('get', 'post', 'delete', 'patch', 'head')
url = reverse('NotificationStatusHandler')
for m in methods:
method = getattr(self.app, m)
resp = method(
url,
headers=self.default_headers,
expect_errors=True
)
self.assertEqual(405, resp.status_code)