Skip to content

Commit

Permalink
bug 1310214: UI for scheduled changes of Releases (#205). r=bhearsum
Browse files Browse the repository at this point in the history
  • Loading branch information
NinadBhat authored and bhearsum committed Jan 23, 2017
1 parent eda43c6 commit 887c669
Show file tree
Hide file tree
Showing 18 changed files with 944 additions and 13 deletions.
4 changes: 2 additions & 2 deletions auslib/admin/views/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -352,7 +352,7 @@ class EditScheduledChangeNewReleaseForm(ScheduledChangeTimeForm):
Release."""
name = StringField('Name', validators=[Optional()])
product = StringField('Product', validators=[Optional()])
data = JSONStringField({}, 'Data', validators=[Optional()], widget=FileInput())
data = JSONStringField(None, 'Data', validators=[Optional()], widget=FileInput())
sc_data_version = IntegerField('sc_data_version', validators=[InputRequired()], widget=HiddenInput())


Expand All @@ -361,6 +361,6 @@ class EditScheduledChangeExistingReleaseForm(ScheduledChangeTimeForm):
a Release. Name cannot be changed because it is a PK field, and product
cannot be changed because it almost never makes sense to (and can be done
by deleting/recreating instead)."""
data = JSONStringField({}, 'Data', validators=[Optional()], widget=FileInput())
data = JSONStringField(None, 'Data', validators=[Optional()], widget=FileInput())
data_version = IntegerField('data_version', widget=HiddenInput())
sc_data_version = IntegerField('sc_data_version', validators=[InputRequired()], widget=HiddenInput())
14 changes: 10 additions & 4 deletions auslib/admin/views/releases.py
Original file line number Diff line number Diff line change
Expand Up @@ -555,12 +555,18 @@ def __init__(self):

@requirelogin
def _post(self, sc_id, transaction, changed_by):
if request.json and request.json.get("data_version"):
change_type = request.json.get("change_type")

if change_type == "update":
form = EditScheduledChangeExistingReleaseForm()
else:
elif change_type == "insert":
form = EditScheduledChangeNewReleaseForm()

form.data.data = createBlob(form.data.data)
elif change_type == "delete":
form = EditScheduledChangeExistingReleaseForm()
else:
return Response(status=400, response="Invalid or missing change_type")
if form.data.data:
form.data.data = createBlob(form.data.data)
return super(ReleaseScheduledChangeView, self)._post(sc_id, form, transaction, changed_by)

@requirelogin
Expand Down
2 changes: 1 addition & 1 deletion auslib/test/admin/views/test_permissions.py
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@ def setUp(self):
base_permission="rule", base_username="janet", base_options={"products": ["foo"]},
)
dbo.permissions.scheduled_changes.signoffs.t.insert().execute(sc_id=1, username="bill", role="releng")

dbo.permissions.scheduled_changes.signoffs.history.t.insert().execute(change_id=1, changed_by="bill", timestamp=30, sc_id=1, username="bill")
dbo.permissions.scheduled_changes.signoffs.history.t.insert().execute(change_id=2, changed_by="bill", timestamp=31, sc_id=1,
username="bill", role="releng")
Expand Down Expand Up @@ -224,7 +225,6 @@ def setUp(self):
dbo.permissions.scheduled_changes.conditions.history.t.insert().execute(
change_id=7, changed_by="bill", timestamp=100, sc_id=3, when=30000000, data_version=2
)

dbo.permissions.scheduled_changes.t.insert().execute(
sc_id=4, scheduled_by="bill", change_type="delete", data_version=1, base_permission="scheduled_change", base_username="mary",
complete=False, base_data_version=1,
Expand Down
17 changes: 13 additions & 4 deletions auslib/test/admin/views/test_releases.py
Original file line number Diff line number Diff line change
Expand Up @@ -1084,7 +1084,6 @@ def setUp(self):
dbo.releases.scheduled_changes.conditions.history.t.insert().execute(
change_id=7, changed_by="bill", timestamp=25, sc_id=3, when=10000000, data_version=2
)

dbo.releases.scheduled_changes.t.insert().execute(
sc_id=4, complete=False, scheduled_by="bill", change_type="delete", data_version=1, base_name="ab", base_data_version=1,
)
Expand Down Expand Up @@ -1219,7 +1218,7 @@ def testAddScheduledChangeNewRelease(self):
def testUpdateScheduledChangeExistingRelease(self):
data = {
"data": '{"name": "c", "hashFunction": "sha512", "extv": "3.0", "schema_version": 1}', "name": "c",
"data_version": 1, "sc_data_version": 1, "when": 78900000000,
"data_version": 1, "sc_data_version": 1, "when": 78900000000, "change_type": "update",
}
ret = self._post("/scheduled_changes/releases/2", data=data)
self.assertEquals(ret.status_code, 200, ret.data)
Expand All @@ -1239,11 +1238,20 @@ def testUpdateScheduledChangeExistingRelease(self):
cond_expected = {"sc_id": 2, "data_version": 2, "when": 78900000000}
self.assertEquals(dict(cond[0]), cond_expected)

@mock.patch("time.time", mock.MagicMock(return_value=300))
def testUpdateScheduledChangeExistingDeleteRelease(self):
data = {
"name": "c",
"data_version": 1, "sc_data_version": 1, "when": 78900000000, "change_type": "delete"
}
ret = self._post("/scheduled_changes/releases/4", data=data)
self.assertEquals(ret.status_code, 200, ret.data)

@mock.patch("time.time", mock.MagicMock(return_value=300))
def testUpdateScheduledChangeNewRelease(self):
data = {
"data": '{"name": "m", "hashFunction": "sha512", "appv": "4.0", "schema_version": 1}', "name": "m", "product": "m",
"sc_data_version": 1,
"sc_data_version": 1, "change_type": "insert",
}
ret = self._post("/scheduled_changes/releases/1", data=data)
self.assertEquals(ret.status_code, 200, ret.data)
Expand All @@ -1267,7 +1275,8 @@ def testUpdateScheduledChangeNewRelease(self):
def testUpdateScheduledChangeNewReleaseChangeName(self):
data = {
"data": '{"name": "mm", "hashFunction": "sha512", "appv": "4.0", "schema_version": 1}', "name": "mm", "product": "mm",
"sc_data_version": 1,
"sc_data_version": 1, "change_type": "insert",

}
ret = self._post("/scheduled_changes/releases/1", data=data)
self.assertEquals(ret.status_code, 200, ret.data)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
angular.module("app").controller("DeleteReleaseScheduledChangeCtrl",
function ($scope, $modalInstance, CSRF, Releases, sc, scheduled_changes) {

$scope.sc = sc;
$scope.scheduled_changes = scheduled_changes;
$scope.saving = false;

$scope.saveChanges = function () {
$scope.saving = true;
CSRF.getToken()
.then(function(csrf_token) {
Releases.deleteScheduledChange($scope.sc.sc_id, $scope.sc, csrf_token)
.success(function(response) {
$scope.scheduled_changes.splice($scope.scheduled_changes.indexOf($scope.sc), 1);
$modalInstance.close();
})
.error(function(response) {
if (typeof response === 'object') {
sweetAlert(
{
title: "Form submission error",
text: response.exception
},
function() { $scope.cancel(); }
);
}
})
.finally(function() {
$scope.saving = false;
});
});
};

$scope.cancel = function () {
$modalInstance.dismiss("cancel");
};
});
134 changes: 134 additions & 0 deletions ui/app/js/controllers/release_scheduled_change_edit_controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@

angular.module('app').controller('EditReleaseScheduledChangeCtrl',
function ($scope, $modalInstance, CSRF, Releases, sc) {

$scope.is_edit = true;
$scope.original_sc = sc;
$scope.sc = angular.copy(sc);
$scope.products = [];
Releases.getProducts().success(function(response) {
$scope.products = response.product;
});

$scope.errors = {};
$scope.saving = false;

$scope.setWhen = function(newDate) {
if (!newDate) {
newDate = new Date($("#id_when")[0].value);
$scope.sc.when = newDate;
}
$scope.calendar_is_open = false;
if (newDate <= new Date()) {
$scope.errors.when = ["Scheduled time cannot be in the past"];
$scope.sc.when = $scope.original_sc.when;
}
else {
$scope.errors.when = null;
}
};

$scope.clearWhen = function () {
$scope.sc.when = null;
$scope.errors.when = null;
};

$scope.fillName = function () {
var file = $scope.dataFile;
$scope.errors.data = [];
var reader = new FileReader();
reader.onloadend = function(evt) {
var blob = evt.target.result;
$scope.$apply( function() {
try {
var name = JSON.parse(blob).name;
if(!name) {
$scope.errors.data = ["Form submission error", "Name missing in blob.\n"];
}
else if (name !== $scope.sc.name) {
$scope.errors.data = ["Form submission error", "Name differs compared to name in blob.\n"];
}
} catch(err) {
$scope.errors.data = ["Form submission error", "Malformed JSON file.\n"];
}
});
if ($scope.errors.data.length === 0) {
$scope.sc.data = blob;
}
};
if (typeof file !== 'undefined') {
// should work
reader.readAsText(file);
}
};

$scope.changeName = function () {
//wait for actual file to be loaded
setTimeout($scope.fillName, 0);
};

$scope.saveChanges = function () {
if ($scope.sc.change_type !== "delete") {
if (!$scope.sc.product.trim()) {
sweetAlert(
"Form Error",
"Product is required.",
"error"
);
return;
}

if (!$scope.sc.name.trim()) {
sweetAlert(
"Form Error",
"Name is required",
"error"
);
return;
}

if (!$scope.dataFile) {
delete $scope.sc.data;
}
}

$scope.saving = true;

CSRF.getToken()
.then(function(csrf_token) {
Releases.updateScheduledChange($scope.sc.sc_id, $scope.sc, csrf_token)
.success(function(response) {
$scope.sc.sc_data_version = response.new_data_version;
angular.copy($scope.sc, $scope.original_sc);
$scope.saving = false;
$modalInstance.close();
})
.error(function(response) {
if (typeof response === 'object') {
$scope.errors = response;
sweetAlert(
"Form submission error",
"See fields highlighted in red.",
"error"
);
}
else if (typeof response === 'string') {
// quite possibly an error in the blob validation
sweetAlert(
"Form submission error",
"Unable to submit successfully.\n" +
"(" + response+ ")",
"error"
);
}
})
.finally(function() {
$scope.saving = false;
});
});
}; // /saveChanges

$scope.cancel = function () {
$modalInstance.dismiss('cancel');
};
});

0 comments on commit 887c669

Please sign in to comment.