Merge lp:~lamont/maas/delete-fabric-domain-ui-cleanup into lp:~maas-committers/maas/trunk

Proposed by LaMont Jones
Status: Merged
Approved by: Andres Rodriguez
Approved revision: no longer in the source branch.
Merged at revision: 4817
Proposed branch: lp:~lamont/maas/delete-fabric-domain-ui-cleanup
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 366 lines (+205/-63)
8 files modified
src/maasserver/api/dnsresourcerecords.py (+3/-0)
src/maasserver/api/tests/test_dnsresourcerecords.py (+35/-8)
src/maasserver/static/js/angular/controllers/domain_details.js (+9/-0)
src/maasserver/static/js/angular/controllers/fabric_details.js (+9/-0)
src/maasserver/static/js/angular/controllers/tests/test_domain_details.js (+45/-11)
src/maasserver/static/js/angular/controllers/tests/test_fabric_details.js (+45/-11)
src/maasserver/static/partials/domain-details.html (+30/-29)
src/maasserver/static/partials/fabric-details.html (+29/-4)
To merge this branch: bzr merge lp:~lamont/maas/delete-fabric-domain-ui-cleanup
Reviewer Review Type Date Requested Status
Blake Rouse (community) Approve
Review via email: mp+289721@code.launchpad.net

Commit message

Cleanup delete UI for fabric/domain details pages.

Description of the change

Cleanup delete UI for fabric/domain details pages.

To post a comment you must log in.
Revision history for this message
Blake Rouse (blake-rouse) wrote :

Looks good. Nice cleanup.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/maasserver/api/dnsresourcerecords.py'
2--- src/maasserver/api/dnsresourcerecords.py 2016-03-07 23:20:52 +0000
3+++ src/maasserver/api/dnsresourcerecords.py 2016-03-21 22:48:50 +0000
4@@ -199,5 +199,8 @@
5 """
6 dnsdata = DNSData.objects.get_dnsdata_or_404(
7 dnsresourcerecord_id, request.user, NODE_PERMISSION.ADMIN)
8+ dnsrr = dnsdata.dnsresource
9 dnsdata.delete()
10+ if dnsrr.dnsdata_set.count() == 0 and dnsrr.ip_addresses.count() == 0:
11+ dnsrr.delete()
12 return rc.DELETED
13
14=== modified file 'src/maasserver/api/tests/test_dnsresourcerecords.py'
15--- src/maasserver/api/tests/test_dnsresourcerecords.py 2016-02-26 18:39:26 +0000
16+++ src/maasserver/api/tests/test_dnsresourcerecords.py 2016-03-21 22:48:50 +0000
17@@ -297,14 +297,41 @@
18 self.assertEqual(
19 http.client.FORBIDDEN, response.status_code, response.content)
20
21- def test_delete_deletes_dnsresource(self):
22- self.become_admin()
23- dnsdata = factory.make_DNSData()
24- uri = get_dnsresourcerecord_uri(dnsdata)
25- response = self.client.delete(uri)
26- self.assertEqual(
27- http.client.NO_CONTENT, response.status_code, response.content)
28- self.assertIsNone(reload_object(dnsdata))
29+ def test_delete_deletes_dnsresource_record(self):
30+ self.become_admin()
31+ dnsdata = factory.make_DNSData()
32+ uri = get_dnsresourcerecord_uri(dnsdata)
33+ response = self.client.delete(uri)
34+ self.assertEqual(
35+ http.client.NO_CONTENT, response.status_code, response.content)
36+ self.assertIsNone(reload_object(dnsdata))
37+
38+ def test_delete_deletes_dnsresource_if_no_data(self):
39+ self.become_admin()
40+ dnsdata = factory.make_DNSData()
41+ dnsrr = dnsdata.dnsresource
42+ uri = get_dnsresourcerecord_uri(dnsdata)
43+ response = self.client.delete(uri)
44+ self.assertEqual(
45+ http.client.NO_CONTENT, response.status_code, response.content)
46+ self.assertIsNone(reload_object(dnsdata))
47+ self.assertIsNone(reload_object(dnsrr))
48+
49+ def test_delete_does_not_delete_dnsresource_if_data_present(self):
50+ self.become_admin()
51+ dnsdata = factory.make_DNSData()
52+ dnsrr = dnsdata.dnsresource
53+ while dnsdata.rrtype == 'CNAME':
54+ dnsdata.delete()
55+ dnsdata = factory.make_DNSData(dnsresource=dnsrr)
56+ # Now create a second DNSData record for this DNSRR.
57+ factory.make_DNSData(rrtype=dnsdata.rrtype, dnsresource=dnsrr)
58+ uri = get_dnsresourcerecord_uri(dnsdata)
59+ response = self.client.delete(uri)
60+ self.assertEqual(
61+ http.client.NO_CONTENT, response.status_code, response.content)
62+ self.assertIsNone(reload_object(dnsdata))
63+ self.assertEqual(dnsrr, reload_object(dnsrr))
64
65 def test_delete_403_when_not_admin(self):
66 dnsdata = factory.make_DNSData()
67
68=== modified file 'src/maasserver/static/js/angular/controllers/domain_details.js'
69--- src/maasserver/static/js/angular/controllers/domain_details.js 2016-03-12 03:12:41 +0000
70+++ src/maasserver/static/js/angular/controllers/domain_details.js 2016-03-21 22:48:50 +0000
71@@ -56,8 +56,17 @@
72 return $scope.domain.id === 0;
73 };
74
75+ // Called to check if the space can be deleted.
76+ $scope.canBeDeleted = function() {
77+ if(angular.isObject($scope.domain)) {
78+ return $scope.domain.rrsets.length === 0;
79+ }
80+ return false;
81+ };
82+
83 // Called when the delete domain button is pressed.
84 $scope.deleteButton = function() {
85+ $scope.error = null;
86 $scope.confirmingDelete = true;
87 };
88
89
90=== modified file 'src/maasserver/static/js/angular/controllers/fabric_details.js'
91--- src/maasserver/static/js/angular/controllers/fabric_details.js 2016-03-14 17:33:24 +0000
92+++ src/maasserver/static/js/angular/controllers/fabric_details.js 2016-03-21 22:48:50 +0000
93@@ -99,8 +99,17 @@
94 return $scope.fabric.id === 0;
95 };
96
97+ // Called to check if the space can be deleted.
98+ $scope.canBeDeleted = function() {
99+ if(angular.isObject($scope.fabric)) {
100+ return $scope.fabric.id !== 0;
101+ }
102+ return false;
103+ };
104+
105 // Called when the delete fabric button is pressed.
106 $scope.deleteButton = function() {
107+ $scope.error = null;
108 $scope.confirmingDelete = true;
109 };
110
111
112=== modified file 'src/maasserver/static/js/angular/controllers/tests/test_domain_details.js'
113--- src/maasserver/static/js/angular/controllers/tests/test_domain_details.js 2016-03-07 23:20:52 +0000
114+++ src/maasserver/static/js/angular/controllers/tests/test_domain_details.js 2016-03-21 22:48:50 +0000
115@@ -165,17 +165,51 @@
116 expect($rootScope.title).toBe("Default domain " + domain.name);
117 });
118
119- it("confirms delete", function() {
120- var controller = makeControllerResolveSetActiveItem();
121- $scope.deleteButton();
122- expect($scope.confirmingDelete).toBe(true);
123- });
124-
125- it("can cancel delete", function() {
126- var controller = makeControllerResolveSetActiveItem();
127- $scope.deleteButton();
128- $scope.cancelDeleteButton();
129- expect($scope.confirmingDelete).toBe(false);
130+ describe("canBeDeleted", function() {
131+
132+ it("returns false if domain is null", function() {
133+ var controller = makeControllerResolveSetActiveItem();
134+ $scope.domain = null;
135+ expect($scope.canBeDeleted()).toBe(false);
136+ });
137+
138+ it("returns false if domain has resources", function() {
139+ var controller = makeControllerResolveSetActiveItem();
140+ $scope.domain.rrsets = [makeInteger()];
141+ expect($scope.canBeDeleted()).toBe(false);
142+ });
143+
144+ it("returns true if domain has no resources", function() {
145+ var controller = makeControllerResolveSetActiveItem();
146+ $scope.domain.rrsets = [];
147+ expect($scope.canBeDeleted()).toBe(true);
148+ });
149+ });
150+
151+ describe("deleteButton", function() {
152+
153+ it("confirms delete", function() {
154+ var controller = makeControllerResolveSetActiveItem();
155+ $scope.deleteButton();
156+ expect($scope.confirmingDelete).toBe(true);
157+ });
158+
159+ it("clears error", function() {
160+ var controller = makeControllerResolveSetActiveItem();
161+ $scope.error = makeName("error");
162+ $scope.deleteButton();
163+ expect($scope.error).toBeNull();
164+ });
165+ });
166+
167+ describe("cancelDeleteButton", function() {
168+
169+ it("cancels delete", function() {
170+ var controller = makeControllerResolveSetActiveItem();
171+ $scope.deleteButton();
172+ $scope.cancelDeleteButton();
173+ expect($scope.confirmingDelete).toBe(false);
174+ });
175 });
176
177 describe("deleteDomain", function() {
178
179=== modified file 'src/maasserver/static/js/angular/controllers/tests/test_fabric_details.js'
180--- src/maasserver/static/js/angular/controllers/tests/test_fabric_details.js 2016-03-14 15:59:35 +0000
181+++ src/maasserver/static/js/angular/controllers/tests/test_fabric_details.js 2016-03-21 22:48:50 +0000
182@@ -174,17 +174,51 @@
183 expect($rootScope.title).toBe(fabric.name);
184 });
185
186- it("confirms delete", function() {
187- var controller = makeControllerResolveSetActiveItem();
188- $scope.deleteButton();
189- expect($scope.confirmingDelete).toBe(true);
190- });
191-
192- it("can cancel delete", function() {
193- var controller = makeControllerResolveSetActiveItem();
194- $scope.deleteButton();
195- $scope.cancelDeleteButton();
196- expect($scope.confirmingDelete).toBe(false);
197+ describe("canBeDeleted", function() {
198+
199+ it("returns false if fabric is null", function() {
200+ var controller = makeControllerResolveSetActiveItem();
201+ $scope.fabric = null;
202+ expect($scope.canBeDeleted()).toBe(false);
203+ });
204+
205+ it("returns false if fabric is default fabric", function() {
206+ var controller = makeControllerResolveSetActiveItem();
207+ $scope.fabric.id = 0;
208+ expect($scope.canBeDeleted()).toBe(false);
209+ });
210+
211+ it("returns true if fabric is not default fabric", function() {
212+ var controller = makeControllerResolveSetActiveItem();
213+ $scope.fabric.id = 1;
214+ expect($scope.canBeDeleted()).toBe(true);
215+ });
216+ });
217+
218+ describe("deleteButton", function() {
219+
220+ it("confirms delete", function() {
221+ var controller = makeControllerResolveSetActiveItem();
222+ $scope.deleteButton();
223+ expect($scope.confirmingDelete).toBe(true);
224+ });
225+
226+ it("clears error", function() {
227+ var controller = makeControllerResolveSetActiveItem();
228+ $scope.error = makeName("error");
229+ $scope.deleteButton();
230+ expect($scope.error).toBeNull();
231+ });
232+ });
233+
234+ describe("cancelDeleteButton", function() {
235+
236+ it("cancels delete", function() {
237+ var controller = makeControllerResolveSetActiveItem();
238+ $scope.deleteButton();
239+ $scope.cancelDeleteButton();
240+ expect($scope.confirmingDelete).toBe(false);
241+ });
242 });
243
244 describe("deleteFabric", function() {
245
246=== modified file 'src/maasserver/static/partials/domain-details.html'
247--- src/maasserver/static/partials/domain-details.html 2016-03-14 18:40:48 +0000
248+++ src/maasserver/static/partials/domain-details.html 2016-03-21 22:48:50 +0000
249@@ -13,43 +13,44 @@
250 </span>
251 </span>
252 </h1>
253- <div class="page-header__actions ng-hide" data-ng-show="isSuperUser() && !isDefaultFabric() && !loading">
254+ <div class="page-header__actions ng-hide" data-ng-show="isSuperUser() && !isDefaultDomain() && !loading">
255 <div class="right no-margin-bottom last-col">
256 <button class="cta-ubuntu"
257 data-ng-click="deleteButton()"
258- data-ng-hide="loading || confirmingDelete">Delete Domain</button>
259- <button class="cta-ubuntu secondary ng-hide"
260- data-ng-click="cancelDeleteButton()"
261- data-ng-show="loading || confirmingDelete">Cancel</button>
262+ data-ng-hide="confirmingDelete">Delete Domain</button>
263+ </div>
264+ </div>
265+ <div class="page-header__dropdown ng-hide" data-ng-show="confirmingDelete">
266+ <div class="page-header__feedback ng-hide" data-ng-hide="canBeDeleted()">
267+ <p class="page-header__feedback-message error">
268+ Domain cannot be deleted because it has resource records. Remove all resource records from the domain to allow deletion.
269+ </p>
270+ <div class="right">
271+ <a href="" class="margin-right" data-ng-click="cancelDeleteButton()">Cancel</a>
272+ </div>
273+ </div>
274+ <div class="page-header__feedback ng-hide" data-ng-show="canBeDeleted() && !error">
275+ <p class="page-header__feedback-message error">
276+ Are you sure you want to delete this domain?
277+ </p>
278+ <div class="right">
279+ <a href="" class="margin-right" data-ng-click="cancelDeleteButton()">Cancel</a>
280+ <button class="cta-ubuntu" data-ng-click="deleteConfirmButton()">Go</button>
281+ </div>
282+ </div>
283+ <div class="page-header__feedback ng-hide" data-ng-show="canBeDeleted() && error">
284+ <p class="page-header__feedback-message error">
285+ {$ error $}
286+ </p>
287+ <div class="right">
288+ <a href="" class="margin-right" data-ng-click="cancelDeleteButton()">Cancel</a>
289+ <button class="cta-ubuntu" data-ng-click="deleteConfirmButton()">Retry</button>
290+ </div>
291 </div>
292 </div>
293 </div>
294 </header>
295 <div data-ng-show="!loading">
296- <div class="page-header__dropdown border ng-hide" data-ng-show="confirmingDelete">
297- <div class="page-header__feedback twelve-col no-margin-bottom">
298- <div class="twelve-col ng-hide" data-ng-show="error">
299- <p class="page-header__feedback-message info">{$ error $}</p>
300- </div>
301- <div class="inner-wrapper">
302- <div class="twelve-col">
303- <div class="table">
304- <div class="table__row table__row--no-hover">
305- <div class="form-inline">
306- <div class="left">
307- Are you sure you want to delete this domain?
308- </div>
309- <div class="right">
310- <a data-ng-click="cancelDeleteButton()">Cancel</a>
311- <button class="cta-ubuntu secondary" data-ng-click="deleteConfirmButton()">Confirm</button>
312- </div>
313- </div>
314- </div>
315- </div>
316- </div>
317- </div>
318- </div>
319- </div>
320 <section class="row">
321 <div class="inner-wrapper">
322 <div class="twelve-col">
323
324=== modified file 'src/maasserver/static/partials/fabric-details.html'
325--- src/maasserver/static/partials/fabric-details.html 2016-03-14 21:08:41 +0000
326+++ src/maasserver/static/partials/fabric-details.html 2016-03-21 22:48:50 +0000
327@@ -10,10 +10,35 @@
328 <div class="right no-margin-bottom last-col">
329 <button class="cta-ubuntu"
330 data-ng-click="deleteButton()"
331- data-ng-hide="loading || confirmingDelete">Delete Fabric</button>
332- <button class="cta-ubuntu secondary ng-hide"
333- data-ng-click="cancelDeleteButton()"
334- data-ng-show="loading || confirmingDelete">Cancel</button>
335+ data-ng-hide="confirmingDelete">Delete Fabric</button>
336+ </div>
337+ </div>
338+ <div class="page-header__dropdown ng-hide" data-ng-show="confirmingDelete">
339+ <div class="page-header__feedback ng-hide" data-ng-hide="canBeDeleted()">
340+ <p class="page-header__feedback-message error">
341+ Fabric cannot be deleted because it is the default fabric.
342+ </p>
343+ <div class="right">
344+ <a href="" class="margin-right" data-ng-click="cancelDeleteButton()">Cancel</a>
345+ </div>
346+ </div>
347+ <div class="page-header__feedback ng-hide" data-ng-show="canBeDeleted() && !error">
348+ <p class="page-header__feedback-message error">
349+ Are you sure you want to delete this fabric?
350+ </p>
351+ <div class="right">
352+ <a href="" class="margin-right" data-ng-click="cancelDeleteButton()">Cancel</a>
353+ <button class="cta-ubuntu" data-ng-click="deleteConfirmButton()">Go</button>
354+ </div>
355+ </div>
356+ <div class="page-header__feedback ng-hide" data-ng-show="canBeDeleted() && error">
357+ <p class="page-header__feedback-message error">
358+ {$ error $}
359+ </p>
360+ <div class="right">
361+ <a href="" class="margin-right" data-ng-click="cancelDeleteButton()">Cancel</a>
362+ <button class="cta-ubuntu" data-ng-click="deleteConfirmButton()">Retry</button>
363+ </div>
364 </div>
365 </div>
366 </div>