diff --git a/assets/templates/partials/asset_buttons.html b/assets/templates/partials/asset_buttons.html
index 39402cbe..3c99225f 100644
--- a/assets/templates/partials/asset_buttons.html
+++ b/assets/templates/partials/asset_buttons.html
@@ -4,7 +4,7 @@
Duplicate
{% elif duplicate %}
-
+
{% elif create %}
diff --git a/assets/tests/pages.py b/assets/tests/pages.py
index a81078d5..e31859e1 100644
--- a/assets/tests/pages.py
+++ b/assets/tests/pages.py
@@ -68,6 +68,7 @@ class AssetList(BasePage):
class AssetForm(FormPage):
_purchased_from_select_locator = (By.CSS_SELECTOR, 'div#purchased-from-group>div.bootstrap-select')
_parent_select_locator = (By.CSS_SELECTOR, 'div#parent-group>div.bootstrap-select')
+ _submit_locator = (By.CLASS_NAME, 'btn-success')
form_items = {
'asset_id': (regions.TextBox, (By.ID, 'id_asset_id')),
'description': (regions.TextBox, (By.ID, 'id_description')),
@@ -97,16 +98,15 @@ class AssetForm(FormPage):
def parent_selector(self):
return regions.BootstrapSelectElement(self, self.find_element(*self._parent_select_locator))
-
-class AssetEdit(AssetForm):
- URL_TEMPLATE = '/assets/asset/id/{asset_id}/edit/'
- _submit_locator = (By.CLASS_NAME, 'btn-success')
-
def submit(self):
previous_errors = self.errors
self.find_element(*self._submit_locator).click()
self.wait.until(lambda x: self.errors != previous_errors or self.success)
+
+class AssetEdit(AssetForm):
+ URL_TEMPLATE = '/assets/asset/id/{asset_id}/edit/'
+
@property
def success(self):
return '/edit' not in self.driver.current_url
@@ -114,18 +114,20 @@ class AssetEdit(AssetForm):
class AssetCreate(AssetForm):
URL_TEMPLATE = '/assets/asset/create/'
- _submit_locator = (By.CLASS_NAME, 'btn-success')
-
- def submit(self):
- previous_errors = self.errors
- self.find_element(*self._submit_locator).click()
- self.wait.until(lambda x: self.errors != previous_errors or self.success)
@property
def success(self):
return '/create' not in self.driver.current_url
+class AssetDuplicate(AssetForm):
+ URL_TEMPLATE = '/assets/asset/id/{asset_id}/duplicate'
+
+ @property
+ def success(self):
+ return '/duplicate' not in self.driver.current_url
+
+
class SupplierList(BasePage):
URL_TEMPLATE = reverse('supplier_list')
diff --git a/assets/tests/test_assets.py b/assets/tests/test_assets.py
index d0be8c86..fca845ec 100644
--- a/assets/tests/test_assets.py
+++ b/assets/tests/test_assets.py
@@ -116,7 +116,7 @@ class TestAssetForm(AutoLoginTest):
self.assertTrue(self.page.success)
def test_asset_edit(self):
- self.page = pages.AssetEdit(self.driver, self.live_server_url, asset_id="9000").open()
+ self.page = pages.AssetEdit(self.driver, self.live_server_url, asset_id=self.parent.asset_id).open()
self.assertTrue(self.driver.find_element_by_id('id_asset_id').get_attribute('readonly') is not None)
@@ -126,7 +126,20 @@ class TestAssetForm(AutoLoginTest):
self.page.submit()
self.assertTrue(self.page.success)
- self.assertEqual(models.Asset.objects.get(asset_id="9000").description, new_description)
+ self.assertEqual(models.Asset.objects.get(asset_id=self.parent.asset_id).description, new_description)
+
+ def test_asset_duplicate(self):
+ self.page = pages.AssetDuplicate(self.driver, self.live_server_url, asset_id=self.parent.asset_id).open()
+
+ self.assertNotEqual(self.parent.asset_id, self.page.asset_id)
+ self.assertEqual(self.parent.description, self.page.description)
+ self.assertEqual(self.parent.status.name, self.page.status)
+ self.assertEqual(self.parent.category.name, self.page.category)
+ self.assertEqual(self.parent.date_acquired, self.page.date_acquired.date())
+
+ self.page.submit()
+ self.assertTrue(self.page.success)
+ self.assertEqual(models.Asset.objects.last().description, self.parent.description)
class TestSupplierList(AutoLoginTest):
@@ -335,6 +348,15 @@ class TestFormValidation(TestCase):
self.assertFormError(response, 'form', 'circuits', 'There must be at least one circuit in a cable')
self.assertFormError(response, 'form', 'cores', 'There must be at least one core in a cable')
+ def test_asset_duplicate(self):
+ url = reverse('asset_duplicate', kwargs={'pk': self.cable_asset.asset_id})
+ response = self.client.post(url, {'is_cable': True, 'length': 0, 'csa': 0, 'circuits': 0, 'cores': 0})
+
+ self.assertFormError(response, 'form', 'length', 'The length of a cable must be more than 0')
+ self.assertFormError(response, 'form', 'csa', 'The CSA of a cable must be more than 0')
+ self.assertFormError(response, 'form', 'circuits', 'There must be at least one circuit in a cable')
+ self.assertFormError(response, 'form', 'cores', 'There must be at least one core in a cable')
+
class TestSampleDataGenerator(TestCase):
@override_settings(DEBUG=True)
diff --git a/assets/views.py b/assets/views.py
index 4b1e6b98..1bc597a3 100644
--- a/assets/views.py
+++ b/assets/views.py
@@ -1,6 +1,6 @@
from django.contrib.auth.mixins import LoginRequiredMixin
from django.http import JsonResponse
-from django.http import HttpResponse
+from django.http import HttpResponse, Http404
from django.views import generic
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
@@ -87,8 +87,7 @@ class AssetIDUrlMixin:
# Get the single item from the filtered queryset
obj = queryset.get()
except queryset.model.DoesNotExist:
- raise Http404(_("No %(verbose_name)s found matching the query") %
- {'verbose_name': queryset.model._meta.verbose_name})
+ raise Http404("No assets found matching the query")
return obj