Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
8ba8ae0
Merging Ben's PR
NinadBhat Dec 24, 2016
06e7fad
Initial commit
NinadBhat Jan 2, 2017
a5a1c5f
Added new scheduled release button
NinadBhat Jan 3, 2017
bd872d2
New Release Scheduled change added
NinadBhat Jan 4, 2017
abce865
adds scheduled change and scheduled delete buttons to releases
NinadBhat Jan 4, 2017
9e29e69
Reloving merge conflicts
NinadBhat Jan 5, 2017
dcf7ee5
Removing blank lines
NinadBhat Jan 5, 2017
fc515b0
Adds release name for update
NinadBhat Jan 8, 2017
758ff1d
Corrects ordering
NinadBhat Jan 8, 2017
ce9efac
Implements history page
NinadBhat Jan 9, 2017
a55d29f
Adds data controller
NinadBhat Jan 9, 2017
161fc8a
Removing View data button
NinadBhat Jan 11, 2017
392356f
Suggested changes for history view
NinadBhat Jan 11, 2017
803cd9c
Merging origin/master
NinadBhat Jan 17, 2017
2343a1e
updating checks for change_type delete
NinadBhat Jan 17, 2017
67026be
Suggested changes
NinadBhat Jan 17, 2017
972da39
Corrects error of data version
NinadBhat Jan 17, 2017
e9d6c32
Merge branch 'master' into ui-scheduled-changes
NinadBhat Jan 19, 2017
2687692
Correcting forms
NinadBhat Jan 19, 2017
3045f58
Corrects tests
NinadBhat Jan 19, 2017
910bf97
Returning null if file not entered
NinadBhat Jan 19, 2017
92b747f
Corrects tests
NinadBhat Jan 19, 2017
27168cc
Returning None for default Value
NinadBhat Jan 20, 2017
7bea0c8
Neglecting fields with None Value
NinadBhat Jan 20, 2017
11f58e0
Resolving merge conflicts
NinadBhat Jan 20, 2017
8a92e5b
Removing blank lines
NinadBhat Jan 20, 2017
8714500
Resolving merge conflicts
NinadBhat Jan 20, 2017
a545999
use create blob only when data is entered
NinadBhat Jan 20, 2017
0c0220c
Minor correction
NinadBhat Jan 20, 2017
d39ed8a
adds readAsText
NinadBhat Jan 20, 2017
b4087f1
Reverting changes
NinadBhat Jan 21, 2017
4049c81
Not posting data when file not uploaded
NinadBhat Jan 21, 2017
046f385
Make sure blob reading happens before posting.
bhearsum Jan 20, 2017
f0ec43e
Merge branch 'master' of github.com:mozilla/balrog into ui-scheduled-…
bhearsum Jan 23, 2017
c269f54
Merge branch 'master' of github.com:mozilla/balrog into ui-scheduled-…
bhearsum Jan 23, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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');
};
});
Loading