define(["backbone", "underscore", "gettext", "js/models/chapter", "js/collections/chapter", "backbone.associations", "cms/js/main"], function(Backbone, _, gettext, ChapterModel, ChapterCollection) { var Textbook = Backbone.AssociatedModel.extend({ defaults: function() { return { name: "", chapters: new ChapterCollection([{}]), showChapters: false, editing: false }; }, relations: [{ type: Backbone.Many, key: "chapters", relatedModel: ChapterModel, collectionType: ChapterCollection }], initialize: function() { this.setOriginalAttributes(); return this; }, setOriginalAttributes: function() { this._originalAttributes = this.parse(this.toJSON()); }, reset: function() { this.set(this._originalAttributes, {parse: true}); }, isDirty: function() { return !_.isEqual(this._originalAttributes, this.parse(this.toJSON())); }, isEmpty: function() { return !this.get('name') && this.get('chapters').isEmpty(); }, urlRoot: function() { return CMS.URL.TEXTBOOKS; }, parse: function(response) { var ret = $.extend(true, {}, response); if("tab_title" in ret && !("name" in ret)) { ret.name = ret.tab_title; delete ret.tab_title; } if("url" in ret && !("chapters" in ret)) { ret.chapters = {"url": ret.url}; delete ret.url; } _.each(ret.chapters, function(chapter, i) { chapter.order = chapter.order || i+1; }); return ret; }, toJSON: function() { return { tab_title: this.get('name'), chapters: this.get('chapters').toJSON() }; }, // NOTE: validation functions should return non-internationalized error // messages. The messages will be passed through gettext in the template. validate: function(attrs, options) { if (!attrs.name) { return { message: gettext("Textbook name is required"), attributes: {name: true} }; } if (attrs.chapters.length === 0) { return { message: gettext("Please add at least one chapter"), attributes: {chapters: true} }; } else { // validate all chapters var invalidChapters = []; attrs.chapters.each(function(chapter) { if(!chapter.isValid()) { invalidChapters.push(chapter); } }); if(!_.isEmpty(invalidChapters)) { return { message: gettext("All chapters must have a name and asset"), attributes: {chapters: invalidChapters} }; } } } }); return Textbook; });