108 lines
3.7 KiB
JavaScript
108 lines
3.7 KiB
JavaScript
define([
|
|
'backbone',
|
|
'jquery',
|
|
'js/programs/utils/api_config',
|
|
'js/programs/models/auto_auth_model',
|
|
'gettext',
|
|
'jquery.cookie'
|
|
],
|
|
function(Backbone, $, apiConfig, AutoAuthModel, gettext) {
|
|
'use strict';
|
|
|
|
return AutoAuthModel.extend({
|
|
|
|
// Backbone.Validation rules.
|
|
// See: http://thedersen.com/projects/backbone-validation/#configure-validation-rules-on-the-model.
|
|
validation: {
|
|
name: {
|
|
required: true,
|
|
maxLength: 255
|
|
},
|
|
subtitle: {
|
|
// The underlying Django model does not require a subtitle.
|
|
maxLength: 255
|
|
},
|
|
category: {
|
|
required: true,
|
|
// TODO: Populate with the results of an API call for valid categories.
|
|
oneOf: ['XSeries', 'MicroMasters']
|
|
},
|
|
organizations: 'validateOrganizations',
|
|
marketing_slug: {
|
|
maxLength: 255
|
|
}
|
|
},
|
|
|
|
initialize: function() {
|
|
this.url = apiConfig.get('programsApiUrl') + 'programs/' + this.id + '/';
|
|
},
|
|
|
|
validateOrganizations: function(orgArray) {
|
|
/**
|
|
* The array passed to this method contains a single object representing
|
|
* the selected organization; the object contains the organization's key.
|
|
* In the future, multiple organizations might be associated with a program.
|
|
*/
|
|
var i,
|
|
len = orgArray ? orgArray.length : 0;
|
|
|
|
for (i = 0; i < len; i++) {
|
|
if (orgArray[i].key === 'false') {
|
|
return gettext('Please select a valid organization.');
|
|
}
|
|
}
|
|
},
|
|
|
|
getConfig: function(options) {
|
|
var patch = options && options.patch,
|
|
params = patch ? this.get('id') + '/' : '',
|
|
config = _.extend({validate: true, parse: true}, {
|
|
type: patch ? 'PATCH' : 'POST',
|
|
url: apiConfig.get('programsApiUrl') + 'programs/' + params,
|
|
contentType: patch ? 'application/merge-patch+json' : 'application/json',
|
|
context: this,
|
|
// NB: setting context fails in tests
|
|
success: _.bind(this.saveSuccess, this),
|
|
error: _.bind(this.saveError, this)
|
|
});
|
|
|
|
if (patch) {
|
|
config.data = JSON.stringify(options.update) || this.attributes;
|
|
}
|
|
|
|
return config;
|
|
},
|
|
|
|
patch: function(data) {
|
|
this.save({
|
|
patch: true,
|
|
update: data
|
|
});
|
|
},
|
|
|
|
save: function(options) {
|
|
var method,
|
|
patch = options && options.patch ? true : false,
|
|
config = this.getConfig(options);
|
|
|
|
/**
|
|
* Simplified version of code from the default Backbone save function
|
|
* http://backbonejs.org/docs/backbone.html#section-87
|
|
*/
|
|
method = this.isNew() ? 'create' : (patch ? 'patch' : 'update');
|
|
|
|
this.sync(method, this, config);
|
|
},
|
|
|
|
saveError: function(jqXHR) {
|
|
this.trigger('error', jqXHR);
|
|
},
|
|
|
|
saveSuccess: function(data) {
|
|
this.set({id: data.id});
|
|
this.trigger('sync', this);
|
|
}
|
|
});
|
|
}
|
|
);
|