100% coverage for object views
PEP8 fixes
This commit is contained in:
@@ -39,10 +39,11 @@ LOG = logging.getLogger('django_openstack.dash')
|
|||||||
|
|
||||||
class DeleteObject(forms.SelfHandlingForm):
|
class DeleteObject(forms.SelfHandlingForm):
|
||||||
object_name = forms.CharField(widget=forms.HiddenInput())
|
object_name = forms.CharField(widget=forms.HiddenInput())
|
||||||
|
container_name = forms.CharField(widget=forms.HiddenInput())
|
||||||
|
|
||||||
def handle(self, request, data):
|
def handle(self, request, data):
|
||||||
api.swift_delete_object(
|
api.swift_delete_object(
|
||||||
request.POST['container_name'],
|
data['container_name'],
|
||||||
data['object_name'])
|
data['object_name'])
|
||||||
messages.info(request,
|
messages.info(request,
|
||||||
'Successfully deleted object: %s' % \
|
'Successfully deleted object: %s' % \
|
||||||
@@ -53,12 +54,13 @@ class DeleteObject(forms.SelfHandlingForm):
|
|||||||
class UploadObject(forms.SelfHandlingForm):
|
class UploadObject(forms.SelfHandlingForm):
|
||||||
name = forms.CharField(max_length="255", label="Object Name")
|
name = forms.CharField(max_length="255", label="Object Name")
|
||||||
object_file = forms.FileField(label="File")
|
object_file = forms.FileField(label="File")
|
||||||
|
container_name = forms.CharField(widget=forms.HiddenInput())
|
||||||
|
|
||||||
def handle(self, request, data):
|
def handle(self, request, data):
|
||||||
api.swift_upload_object(
|
api.swift_upload_object(
|
||||||
request.POST['container_name'],
|
data['container_name'],
|
||||||
data['name'],
|
data['name'],
|
||||||
request.FILES['object_file'].read())
|
self.files['object_file'].read())
|
||||||
|
|
||||||
messages.success(request, "Object was successfully uploaded.")
|
messages.success(request, "Object was successfully uploaded.")
|
||||||
return shortcuts.redirect(request.build_absolute_uri())
|
return shortcuts.redirect(request.build_absolute_uri())
|
||||||
@@ -70,17 +72,20 @@ class CopyObject(forms.SelfHandlingForm):
|
|||||||
|
|
||||||
new_object_name = forms.CharField(max_length="255",
|
new_object_name = forms.CharField(max_length="255",
|
||||||
label="New object name")
|
label="New object name")
|
||||||
|
orig_container_name = forms.CharField(widget=forms.HiddenInput())
|
||||||
|
orig_object_name = forms.CharField(widget=forms.HiddenInput())
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super(CopyObject, self).__init__(*args, **kwargs)
|
super(CopyObject, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
container_choices = [(c.name, c.name) for c in api.swift_get_containers()]
|
container_choices = \
|
||||||
|
[(c.name, c.name) for c in api.swift_get_containers()]
|
||||||
self.fields['new_container_name'].choices = container_choices
|
self.fields['new_container_name'].choices = container_choices
|
||||||
|
|
||||||
def handle(self, request, data):
|
def handle(self, request, data):
|
||||||
orig_container_name = request.POST['orig_container_name']
|
orig_container_name = data['orig_container_name']
|
||||||
orig_object_name = request.POST['orig_object_name']
|
orig_object_name = data['orig_object_name']
|
||||||
new_container_name = request.POST['new_container_name']
|
new_container_name = data['new_container_name']
|
||||||
new_object_name = data['new_object_name']
|
new_object_name = data['new_object_name']
|
||||||
|
|
||||||
api.swift_copy_object(orig_container_name, orig_object_name,
|
api.swift_copy_object(orig_container_name, orig_object_name,
|
||||||
@@ -101,6 +106,7 @@ def index(request, tenant_id, container_name):
|
|||||||
|
|
||||||
objects = api.swift_get_objects(container_name)
|
objects = api.swift_get_objects(container_name)
|
||||||
|
|
||||||
|
delete_form.fields['container_name'].initial = container_name
|
||||||
return render_to_response('dash_objects.html', {
|
return render_to_response('dash_objects.html', {
|
||||||
'container_name': container_name,
|
'container_name': container_name,
|
||||||
'objects': objects,
|
'objects': objects,
|
||||||
@@ -114,6 +120,7 @@ def upload(request, tenant_id, container_name):
|
|||||||
if handled:
|
if handled:
|
||||||
return handled
|
return handled
|
||||||
|
|
||||||
|
form.fields['container_name'].initial = container_name
|
||||||
return render_to_response('dash_objects_upload.html', {
|
return render_to_response('dash_objects_upload.html', {
|
||||||
'container_name': container_name,
|
'container_name': container_name,
|
||||||
'upload_form': form,
|
'upload_form': form,
|
||||||
@@ -137,11 +144,13 @@ def download(request, tenant_id, container_name, object_name):
|
|||||||
def copy(request, tenant_id, container_name, object_name):
|
def copy(request, tenant_id, container_name, object_name):
|
||||||
form, handled = CopyObject.maybe_handle(request)
|
form, handled = CopyObject.maybe_handle(request)
|
||||||
|
|
||||||
form.fields['new_container_name'].initial = container_name
|
|
||||||
|
|
||||||
if handled:
|
if handled:
|
||||||
return handled
|
return handled
|
||||||
|
|
||||||
|
form.fields['new_container_name'].initial = container_name
|
||||||
|
form.fields['orig_container_name'].initial = container_name
|
||||||
|
form.fields['orig_object_name'].initial = object_name
|
||||||
|
|
||||||
return render_to_response(
|
return render_to_response(
|
||||||
'dash_object_copy.html',
|
'dash_object_copy.html',
|
||||||
{'container_name': container_name,
|
{'container_name': container_name,
|
||||||
|
|||||||
@@ -0,0 +1,166 @@
|
|||||||
|
import tempfile
|
||||||
|
|
||||||
|
from django.core.urlresolvers import reverse
|
||||||
|
from django_openstack import api
|
||||||
|
from django_openstack.tests.view_tests import base
|
||||||
|
|
||||||
|
|
||||||
|
class ObjectViewTests(base.BaseViewTests):
|
||||||
|
CONTAINER_NAME = 'containerName'
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(ObjectViewTests, self).setUp()
|
||||||
|
swift_object = self.mox.CreateMock(api.SwiftObject)
|
||||||
|
self.swift_objects = [swift_object]
|
||||||
|
|
||||||
|
def test_index(self):
|
||||||
|
self.mox.StubOutWithMock(api, 'swift_get_objects')
|
||||||
|
api.swift_get_objects(
|
||||||
|
self.CONTAINER_NAME).AndReturn(self.swift_objects)
|
||||||
|
|
||||||
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
|
res = self.client.get(reverse('dash_objects',
|
||||||
|
args=[self.TEST_TENANT,
|
||||||
|
self.CONTAINER_NAME]))
|
||||||
|
self.assertTemplateUsed(res, 'dash_objects.html')
|
||||||
|
self.assertItemsEqual(res.context['objects'], self.swift_objects)
|
||||||
|
|
||||||
|
self.mox.VerifyAll()
|
||||||
|
|
||||||
|
def test_upload_index(self):
|
||||||
|
res = self.client.get(reverse('dash_objects_upload',
|
||||||
|
args=[self.TEST_TENANT,
|
||||||
|
self.CONTAINER_NAME]))
|
||||||
|
|
||||||
|
self.assertTemplateUsed(res, 'dash_objects_upload.html')
|
||||||
|
|
||||||
|
def test_upload(self):
|
||||||
|
OBJECT_DATA = 'objectData'
|
||||||
|
OBJECT_FILE = tempfile.TemporaryFile()
|
||||||
|
OBJECT_FILE.write(OBJECT_DATA)
|
||||||
|
OBJECT_FILE.flush()
|
||||||
|
OBJECT_FILE.seek(0)
|
||||||
|
OBJECT_NAME = 'objectName'
|
||||||
|
|
||||||
|
formData = {'method': 'UploadObject',
|
||||||
|
'container_name': self.CONTAINER_NAME,
|
||||||
|
'name': OBJECT_NAME,
|
||||||
|
'object_file': OBJECT_FILE}
|
||||||
|
|
||||||
|
self.mox.StubOutWithMock(api, 'swift_upload_object')
|
||||||
|
api.swift_upload_object(unicode(self.CONTAINER_NAME),
|
||||||
|
unicode(OBJECT_NAME),
|
||||||
|
OBJECT_DATA)
|
||||||
|
|
||||||
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
|
res = self.client.post(reverse('dash_objects_upload',
|
||||||
|
args=[self.TEST_TENANT,
|
||||||
|
self.CONTAINER_NAME]),
|
||||||
|
formData)
|
||||||
|
|
||||||
|
self.assertRedirectsNoFollow(res, reverse('dash_objects_upload',
|
||||||
|
args=[self.TEST_TENANT,
|
||||||
|
self.CONTAINER_NAME]))
|
||||||
|
|
||||||
|
self.mox.VerifyAll()
|
||||||
|
|
||||||
|
def test_delete(self):
|
||||||
|
OBJECT_NAME = 'objectName'
|
||||||
|
formData = {'method': 'DeleteObject',
|
||||||
|
'container_name': self.CONTAINER_NAME,
|
||||||
|
'object_name': OBJECT_NAME}
|
||||||
|
|
||||||
|
self.mox.StubOutWithMock(api, 'swift_delete_object')
|
||||||
|
api.swift_delete_object(self.CONTAINER_NAME, OBJECT_NAME)
|
||||||
|
|
||||||
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
|
res = self.client.post(reverse('dash_objects',
|
||||||
|
args=[self.TEST_TENANT,
|
||||||
|
self.CONTAINER_NAME]),
|
||||||
|
formData)
|
||||||
|
|
||||||
|
self.assertRedirectsNoFollow(res, reverse('dash_objects',
|
||||||
|
args=[self.TEST_TENANT,
|
||||||
|
self.CONTAINER_NAME]))
|
||||||
|
|
||||||
|
self.mox.VerifyAll()
|
||||||
|
|
||||||
|
def test_download(self):
|
||||||
|
OBJECT_DATA = 'objectData'
|
||||||
|
OBJECT_NAME = 'objectName'
|
||||||
|
|
||||||
|
self.mox.StubOutWithMock(api, 'swift_get_object_data')
|
||||||
|
api.swift_get_object_data(unicode(self.CONTAINER_NAME),
|
||||||
|
unicode(OBJECT_NAME)).AndReturn(OBJECT_DATA)
|
||||||
|
|
||||||
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
|
res = self.client.get(reverse('dash_objects_download',
|
||||||
|
args=[self.TEST_TENANT,
|
||||||
|
self.CONTAINER_NAME,
|
||||||
|
OBJECT_NAME]))
|
||||||
|
|
||||||
|
self.assertEqual(res.content, OBJECT_DATA)
|
||||||
|
self.assertTrue(res.has_header('Content-Disposition'))
|
||||||
|
|
||||||
|
self.mox.VerifyAll()
|
||||||
|
|
||||||
|
def test_copy_index(self):
|
||||||
|
OBJECT_NAME = 'objectName'
|
||||||
|
|
||||||
|
container = self.mox.CreateMock(api.Container)
|
||||||
|
container.name = self.CONTAINER_NAME
|
||||||
|
|
||||||
|
self.mox.StubOutWithMock(api, 'swift_get_containers')
|
||||||
|
api.swift_get_containers().AndReturn([container])
|
||||||
|
|
||||||
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
|
res = self.client.get(reverse('dash_object_copy',
|
||||||
|
args=[self.TEST_TENANT,
|
||||||
|
self.CONTAINER_NAME,
|
||||||
|
OBJECT_NAME]))
|
||||||
|
|
||||||
|
self.assertTemplateUsed(res, 'dash_object_copy.html')
|
||||||
|
|
||||||
|
self.mox.VerifyAll()
|
||||||
|
|
||||||
|
def test_copy(self):
|
||||||
|
NEW_CONTAINER_NAME = self.CONTAINER_NAME
|
||||||
|
NEW_OBJECT_NAME = 'newObjectName'
|
||||||
|
ORIG_CONTAINER_NAME = 'origContainerName'
|
||||||
|
ORIG_OBJECT_NAME = 'origObjectName'
|
||||||
|
|
||||||
|
formData = {'method': 'CopyObject',
|
||||||
|
'new_container_name': NEW_CONTAINER_NAME,
|
||||||
|
'new_object_name': NEW_OBJECT_NAME,
|
||||||
|
'orig_container_name': ORIG_CONTAINER_NAME,
|
||||||
|
'orig_object_name': ORIG_OBJECT_NAME}
|
||||||
|
|
||||||
|
container = self.mox.CreateMock(api.Container)
|
||||||
|
container.name = self.CONTAINER_NAME
|
||||||
|
|
||||||
|
self.mox.StubOutWithMock(api, 'swift_get_containers')
|
||||||
|
api.swift_get_containers().AndReturn([container])
|
||||||
|
|
||||||
|
self.mox.StubOutWithMock(api, 'swift_copy_object')
|
||||||
|
api.swift_copy_object(ORIG_CONTAINER_NAME, ORIG_OBJECT_NAME,
|
||||||
|
NEW_CONTAINER_NAME, NEW_OBJECT_NAME)
|
||||||
|
|
||||||
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
|
res = self.client.post(reverse('dash_object_copy',
|
||||||
|
args=[self.TEST_TENANT,
|
||||||
|
ORIG_CONTAINER_NAME,
|
||||||
|
ORIG_OBJECT_NAME]),
|
||||||
|
formData)
|
||||||
|
|
||||||
|
self.assertRedirectsNoFollow(res, reverse('dash_object_copy',
|
||||||
|
args=[self.TEST_TENANT,
|
||||||
|
ORIG_CONTAINER_NAME,
|
||||||
|
ORIG_OBJECT_NAME]))
|
||||||
|
|
||||||
|
self.mox.VerifyAll()
|
||||||
@@ -6,7 +6,5 @@
|
|||||||
{{ field.errors }}
|
{{ field.errors }}
|
||||||
{{ field }}
|
{{ field }}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
<input type="hidden" name="orig_container_name" value="{{ container_name }}" />
|
|
||||||
<input type="hidden" name="orig_object_name" value="{{ object_name }}" />
|
|
||||||
<input type="submit" value="Copy Object" class="large-rounded" />
|
<input type="submit" value="Copy Object" class="large-rounded" />
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
{% for hidden in form.hidden_fields %}
|
{% for hidden in form.hidden_fields %}
|
||||||
{{hidden}}
|
{{hidden}}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
<input type="hidden" name="container_name" value="{{ container_name }}" />
|
|
||||||
<input name="object_name" type="hidden" value="{{ object.name }}" />
|
<input name="object_name" type="hidden" value="{{ object.name }}" />
|
||||||
<input id="delete_{{ object.name }}" class="delete" title="Object: {{ object.name }}" type="submit" value="Delete" />
|
<input id="delete_{{ object.name }}" class="delete" title="Object: {{ object.name }}" type="submit" value="Delete" />
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
<form id="object_form" enctype="multipart/form-data" method="post">
|
<form id="object_form" enctype="multipart/form-data" method="post">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<input type="hidden" name="container_name" value="{{ container_name }}" />
|
|
||||||
{% for hidden in form.hidden_fields %}{{ hidden }}{% endfor %}
|
{% for hidden in form.hidden_fields %}{{ hidden }}{% endfor %}
|
||||||
{% for field in form.visible_fields %}
|
{% for field in form.visible_fields %}
|
||||||
{{ field.label_tag }}
|
{{ field.label_tag }}
|
||||||
|
|||||||
Reference in New Issue
Block a user