Implement update segment
Added update segment functionality. Also added test cases that actually not covering the line of code but tested the update segment functionally. Change-Id: Ib0424ee076ff0e8cc8c3ea898d986d32cc195ed2
This commit is contained in:
parent
3e90629f3e
commit
3894892f3d
|
@ -100,3 +100,12 @@ def segment_create(request, data):
|
|||
def get_segment(request, segment_id):
|
||||
"""Returns segment by id"""
|
||||
return masakariclient(request).get_segment(segment_id)
|
||||
|
||||
|
||||
def segment_update(request, update):
|
||||
"""Update segment."""
|
||||
attrs = {'name': update['name'],
|
||||
'recovery_method': update['recovery_method'],
|
||||
'service_type': update['service_type']}
|
||||
return masakariclient(request).update_segment(
|
||||
update['uuid'], **attrs)
|
||||
|
|
|
@ -105,3 +105,64 @@ class CreateForm(forms.SelfHandlingForm):
|
|||
msg = _('Failed to create segments.')
|
||||
redirect = reverse('horizon:masakaridashboard:segment:index')
|
||||
exceptions.handle(request, msg, redirect=redirect)
|
||||
|
||||
|
||||
class UpdateForm(forms.SelfHandlingForm):
|
||||
uuid = forms.CharField(widget=forms.HiddenInput())
|
||||
name = forms.CharField(
|
||||
label=_('Segment Name'),
|
||||
widget=forms.TextInput())
|
||||
recovery_method = forms.ChoiceField(
|
||||
label=_('Recovery Method'),
|
||||
choices=[('auto', 'auto'),
|
||||
('reserved_host', 'reserved_host'),
|
||||
('auto_priority', 'auto_priority'),
|
||||
('rh_priority', 'rh_priority')],
|
||||
widget=forms.Select(
|
||||
attrs={'class': 'switchable',
|
||||
'data-slug': 'recovery_method'})
|
||||
)
|
||||
service_type = forms.CharField(
|
||||
label=_('Service Type'),
|
||||
widget=forms.TextInput())
|
||||
|
||||
def clean(self):
|
||||
cleaned_data = super(UpdateForm, self).clean()
|
||||
name = cleaned_data.get('name')
|
||||
service_type = cleaned_data.get('service_type')
|
||||
if name is not None:
|
||||
if len(name) < 255 and isinstance(name, six.text_type):
|
||||
cleaned_data['name'] = name
|
||||
else:
|
||||
error_msg = _("validation failed")
|
||||
self._errors['name'] = self.error_class([error_msg])
|
||||
return cleaned_data
|
||||
else:
|
||||
error_msg = _("You must specify name")
|
||||
self._errors['name'] = self.error_class([error_msg])
|
||||
return cleaned_data
|
||||
if service_type is not None:
|
||||
if len(service_type) < 255 and isinstance(
|
||||
service_type, six.text_type):
|
||||
cleaned_data['service_type'] = service_type
|
||||
else:
|
||||
error_msg = _("validation failed")
|
||||
self._errors['service_type'] = self.error_class([error_msg])
|
||||
return cleaned_data
|
||||
else:
|
||||
error_msg = _("You must specify service_type")
|
||||
self._errors['service_type'] = self.error_class([error_msg])
|
||||
return cleaned_data
|
||||
|
||||
return cleaned_data
|
||||
|
||||
def handle(self, request, data):
|
||||
try:
|
||||
api.segment_update(request, data)
|
||||
msg = _('Successfully updated segment.')
|
||||
messages.success(request, msg)
|
||||
return True
|
||||
except Exception:
|
||||
msg = _('Failed to update segment.')
|
||||
redirect = reverse('horizon:masakaridashboard:segment:index')
|
||||
exceptions.handle(request, msg, redirect=redirect)
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from horizon import tables
|
||||
|
@ -25,6 +26,18 @@ class CreateSegment(tables.LinkAction):
|
|||
icon = "plus"
|
||||
|
||||
|
||||
class UpdateSegment(tables.LinkAction):
|
||||
name = "update"
|
||||
verbose_name = _("Update Segment")
|
||||
classes = ("ajax-modal",)
|
||||
|
||||
def get_link_url(self, datum):
|
||||
obj_id = datum.uuid
|
||||
url = "horizon:masakaridashboard:segment:update"
|
||||
|
||||
return reverse(url, args=[obj_id])
|
||||
|
||||
|
||||
class FailoverSegmentTable(tables.DataTable):
|
||||
|
||||
name = tables.Column('name', verbose_name=_("Name"))
|
||||
|
@ -45,3 +58,4 @@ class FailoverSegmentTable(tables.DataTable):
|
|||
table_actions = (CreateSegment,
|
||||
tables.FilterAction
|
||||
)
|
||||
row_actions = (UpdateSegment,)
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
{% extends "horizon/common/_modal_form.html" %}
|
||||
{% load i18n %}
|
||||
{% block modal-body-right %}
|
||||
|
||||
{% endblock %}
|
|
@ -0,0 +1,7 @@
|
|||
{% extends 'base.html' %}
|
||||
{% load i18n %}
|
||||
{% block title %}{% trans "Update Segment" %}{% endblock %}
|
||||
|
||||
{% block main %}
|
||||
{% include 'masakaridashboard/segment/_update.html' %}
|
||||
{% endblock %}
|
|
@ -17,10 +17,12 @@ from django.conf.urls import url
|
|||
from masakaridashboard.segment import views
|
||||
|
||||
|
||||
SEGMENT = r'^(?P<segment_id>[^/]+)/%s$'
|
||||
urlpatterns = [
|
||||
url(r'^$', views.IndexView.as_view(), name='index'),
|
||||
url(r'^validate_segment$',
|
||||
views.ValidateSegmentView.as_view(),
|
||||
name='validate_segment'),
|
||||
url(r'^create$', views.CreateView.as_view(), name='create'),
|
||||
url(SEGMENT % 'update', views.UpdateView.as_view(), name='update'),
|
||||
]
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.core.urlresolvers import reverse_lazy
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
|
@ -21,6 +22,7 @@ from masakaridashboard.segment import tables as masakari_tab
|
|||
|
||||
from horizon import exceptions
|
||||
from horizon import forms
|
||||
from horizon.utils import memoized
|
||||
from masakaridashboard.segment import forms as segment_forms
|
||||
|
||||
|
||||
|
@ -97,3 +99,41 @@ class CreateView(forms.ModalFormView):
|
|||
initial['service_type'] = self.kwargs.get('service_type')
|
||||
|
||||
return initial
|
||||
|
||||
|
||||
class UpdateView(forms.ModalFormView):
|
||||
template_name = 'masakaridashboard/segment/update.html'
|
||||
modal_header = _("Update Segment")
|
||||
form_id = "update_segment"
|
||||
form_class = segment_forms.UpdateForm
|
||||
submit_label = _("Update")
|
||||
submit_url = "horizon:masakaridashboard:segment:update"
|
||||
success_url = reverse_lazy("horizon:masakaridashboard:segment:index")
|
||||
page_title = _("Update Segment")
|
||||
|
||||
@memoized.memoized_method
|
||||
def get_object(self):
|
||||
try:
|
||||
segment = api.get_segment(self.request, self.kwargs['segment_id'])
|
||||
return segment
|
||||
except Exception:
|
||||
msg = _('Unable to retrieve segment.')
|
||||
redirect = reverse('horizon:masakaridashboard:segment:index')
|
||||
exceptions.handle(self.request, msg, redirect=redirect)
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(UpdateView, self).get_context_data(**kwargs)
|
||||
context['submit_url'] = reverse(
|
||||
self.submit_url,
|
||||
args=[self.kwargs["segment_id"]]
|
||||
)
|
||||
|
||||
return context
|
||||
|
||||
def get_initial(self, **kwargs):
|
||||
segment = self.get_object()
|
||||
|
||||
return {'uuid': self.kwargs['segment_id'],
|
||||
'name': segment.name,
|
||||
'recovery_method': segment.recovery_method,
|
||||
'service_type': segment.service_type}
|
||||
|
|
|
@ -28,6 +28,8 @@ SEGMENT_LIST = [
|
|||
]
|
||||
INDEX_URL = reverse('horizon:masakaridashboard:segment:index')
|
||||
CREATE_URL = reverse('horizon:masakaridashboard:segment:create')
|
||||
UPDATE_URL = reverse('horizon:masakaridashboard:segment:update',
|
||||
args=SEGMENT_LIST[0].uuid)
|
||||
|
||||
|
||||
class SegmentTest(test.TestCase):
|
||||
|
@ -109,3 +111,49 @@ class SegmentTest(test.TestCase):
|
|||
result = api.pagination_list(self.request, marker='', paginate=True)
|
||||
self.assertIn(SEGMENT_LIST, result)
|
||||
mock_segments.assert_called_once_with(limit=21, marker='')
|
||||
|
||||
def test_update_post(self):
|
||||
segment_obj = SEGMENT_LIST[0]
|
||||
updated_segment = segment.Segment(uuid='1', name='fake',
|
||||
recovery_method='auto',
|
||||
service_type='service')
|
||||
form_data = {
|
||||
'uuid': segment_obj.uuid,
|
||||
'name': 'fake',
|
||||
'recovery_method': segment_obj.recovery_method,
|
||||
'service_type': segment_obj.service_type}
|
||||
|
||||
with mock.patch(
|
||||
'masakaridashboard.api.api.get_segment',
|
||||
return_value=segment_obj), mock.patch(
|
||||
'masakaridashboard.api.api.segment_update',
|
||||
return_value=updated_segment) as mocked_update:
|
||||
res = self.client.post(UPDATE_URL, form_data)
|
||||
|
||||
self.assertNoFormErrors(res)
|
||||
self.assertEqual(res.status_code, 302)
|
||||
self.assertRedirectsNoFollow(res, INDEX_URL)
|
||||
|
||||
mocked_update.assert_called_once_with(
|
||||
mock.ANY,
|
||||
form_data
|
||||
)
|
||||
|
||||
@mock.patch.object(proxy_obj.Proxy, 'update_segment')
|
||||
def test_segment_update(self, mock_update_segment):
|
||||
segment = SEGMENT_LIST[0]
|
||||
mock_update_segment.return_value = segment
|
||||
data1 = {
|
||||
'name': segment.name,
|
||||
'uuid': segment.uuid,
|
||||
'recovery_method': segment.recovery_method,
|
||||
'service_type': segment.service_type
|
||||
}
|
||||
data2 = {
|
||||
'name': segment.name,
|
||||
'recovery_method': segment.recovery_method,
|
||||
'service_type': segment.service_type
|
||||
}
|
||||
result = api.segment_update(self.request, data1)
|
||||
self.assertEqual(segment, result)
|
||||
mock_update_segment.assert_called_once_with(segment.uuid, **data2)
|
||||
|
|
Loading…
Reference in New Issue