/** * this model contains information about the organization for * the current user and the users who are inside the organizacion. * * Attributes: * - users: collection with user instances whithin the organization (see cdb.admin.Organization.Users */ cdb.admin.Organization = cdb.core.Model.extend({ url: '/api/v1/org/', initialize: function(attrs, opts) { attrs = attrs || {} this.owner = new cdb.admin.User(this.get('owner')); this.display_email = (typeof attrs.admin_email != 'undefined') && attrs.admin_email != null && (attrs.admin_email == '' ? this.owner.email : attrs.admin_email); var collectionOpts = { organization: this, currentUserId: opts && opts.currentUserId }; this.users = new cdb.admin.Organization.Users(attrs.users, collectionOpts); this.groups = new cdb.admin.OrganizationGroups(attrs.groups, collectionOpts); this.grantables = new cdb.admin.Grantables(undefined, collectionOpts); // make sure all the users/groups have a reference to this organization this.users.each(this._setOrganizationOnModel, this); this.groups.each(this._setOrganizationOnModel, this); }, _setOrganizationOnModel: function(m) { m.organization = this; }, fetch: function() { throw new Error("organization should not be fetch, should be static"); }, containsUser: function(user) { return !!this.users.find(function(u) { return u.id === user.id; }) }, isOrgAdmin: function (user) { return this.owner.id === user.id || !!_.find(this.get('admins'), function (u) { return u.id === user.id; }); }, viewUrl: function() { return new cdb.common.OrganizationUrl({ base_url: this.get('base_url') }) } }); // helper to manage organization users cdb.admin.Organization.Users = Backbone.Collection.extend({ model: cdb.admin.User, _DEFAULT_EXCLUDE_CURRENT_USER: true, url: function() { return '/api/v1/organization/' + this.organization.id + '/users'; }, initialize: function(models, opts) { if (!opts.organization) { throw new Error('Organization is needed for fetching organization users'); } this.elder('initialize'); this.organization = opts.organization; this.currentUserId = opts.currentUserId; this._excludeCurrentUser = this._DEFAULT_EXCLUDE_CURRENT_USER; // Let's add abort behaviour this.sync = Backbone.syncAbort; }, comparator: function(mdl) { return mdl.get('username'); }, excludeCurrentUser: function(exclude) { exclude = !!exclude; this._excludeCurrentUser = exclude; if (exclude && !this.currentUserId) { cdb.log.error('set excludeCurrentUser to true, but there is no current user id set to exclude!'); } }, restoreExcludeCurrentUser: function() { this.excludeCurrentUser(this._DEFAULT_EXCLUDE_CURRENT_USER); }, parse: function(r) { this.total_entries = r.total_entries; this.total_user_entries = r.total_user_entries; return _.reduce(r.users, function(memo, user) { if (this._excludeCurrentUser && user.id === this.currentUserId) { this.total_user_entries--; this.total_entries--; } else { memo.push(user); } return memo; }, [], this); }, // @return {Number, undefined} may be undefined until a first fetch is done totalCount: function() { return this.total_user_entries; } }); cdb.admin.Organization.Invites = cdb.core.Model.extend({ defaults: { users_emails: [] }, url: function() { return '/api/v1/organization/' + this.organizationId + '/invitations'; }, initialize: function(attrs, opts) { if (!opts.organizationId) { throw new Error('Organization id is needed for fetching organization users'); } else { this.organizationId = opts.organizationId; this.set('welcome_text', 'I\'d like to invite you to my ' + cdb.config.get('app_name') + ' organization,\nBest regards'); } } });