Files
edx-platform/cms/static/js/programs/models/program_model.js
2016-08-08 15:04:06 -04:00

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);
}
});
}
);