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