1 // 2 // The Antville Project 3 // http://code.google.com/p/antville 4 // 5 // Copyright 2001-2007 by The Antville People 6 // 7 // Licensed under the Apache License, Version 2.0 (the ``License''); 8 // you may not use this file except in compliance with the License. 9 // You may obtain a copy of the License at 10 // 11 // http://www.apache.org/licenses/LICENSE-2.0 12 // 13 // Unless required by applicable law or agreed to in writing, software 14 // distributed under the License is distributed on an ``AS IS'' BASIS, 15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 // See the License for the specific language governing permissions and 17 // limitations under the License. 18 // 19 // $Revision$ 20 // $LastChangedBy$ 21 // $LastChangedDate$ 22 // $URL$ 23 // 24 25 /** 26 * @fileOverview Defines the Membership prototype 27 */ 28 29 /** 30 * 31 * @param {String} name 32 * @returns {Membership} 33 */ 34 Membership.getByName = function(name) { 35 return res.handlers.site.members.get(name); 36 } 37 38 /** 39 * 40 * @param {String} role 41 * @returns {Boolean} 42 */ 43 Membership.require = function(role) { 44 if (res.handlers.membership) { 45 return res.handlers.membership.require(role); 46 } 47 return false; 48 } 49 50 /** 51 * @function 52 * @returns {String[]} 53 * @see defineConstants 54 */ 55 Membership.getRoles = defineConstants(Membership, "Subscriber", "Contributor", 56 "Manager", "Owner"); 57 58 /** 59 * 60 * @param {Membership} membership 61 * @param {Object} options 62 */ 63 Membership.remove = function(options) { 64 if (this.constructor !== Membership) { 65 return; 66 } 67 if (!options.force && !this.getPermission("delete") && 68 !User.require(User.PRIVILEGED)) { 69 throw Error(gettext("Sorry, an owner of a site cannot be removed.")); 70 } 71 var recipient = this.creator.email; 72 this.remove(); 73 if (!options.force) { 74 this.notify(req.action, recipient, 75 gettext("Notification of membership cancellation")); 76 } 77 return; 78 } 79 80 /** 81 * @name Membership 82 * @constructor 83 * @param {Object} user 84 * @param {Object} role 85 * @property {Date} created 86 * @property {User} creator 87 * @property {File[]} files 88 * @property {Image[]} images 89 * @property {Date} modified 90 * @property {User} modifier 91 * @property {String} name 92 * @property {Poll[]} polls 93 * @property {String} role 94 * @property {Site} site 95 * @property {Story[]} stories 96 * @extends HopObject 97 */ 98 Membership.prototype.constructor = function(user, role) { 99 user || (user = session.user); 100 if (user) { 101 this.map({ 102 creator: user, 103 name: user.name, 104 role: role, 105 created: new Date 106 }); 107 this.touch(); 108 } 109 return this; 110 } 111 112 /** 113 * 114 * @param {String} action 115 * @return {Boolean} 116 */ 117 Membership.prototype.getPermission = function(action) { 118 if (!res.handlers.site.getPermission("main")) { 119 return false; 120 } 121 switch (action) { 122 case "contact": 123 return true; 124 case "edit": 125 return this.creator !== session.user; 126 case "delete": 127 return this.role !== Membership.OWNER; 128 } 129 return false; 130 } 131 132 /** 133 * 134 * @param {String} name 135 * @returns {Object} 136 */ 137 Membership.prototype.getFormOptions = function(name) { 138 switch (name) { 139 case "role": 140 return Membership.getRoles(); 141 } 142 return; 143 } 144 145 Membership.prototype.edit_action = function() { 146 if (req.postParams.save) { 147 try { 148 this.update(req.postParams); 149 res.message = gettext("The changes were saved successfully."); 150 res.redirect(this._parent.href()); 151 } catch(ex) { 152 res.message = ex; 153 app.log(ex); 154 } 155 } 156 157 res.data.action = this.href(req.action); 158 res.data.title = gettext("Edit Membership: {0}", this.name); 159 res.data.body = this.renderSkinAsString("$Membership#edit"); 160 this.site.renderSkin("Site#page"); 161 return; 162 } 163 164 /** 165 * 166 * @param {Object} data 167 */ 168 Membership.prototype.update = function(data) { 169 if (!data.role) { 170 throw Error(gettext("Please choose a role for this member.")); 171 } else if (this.user === session.user) { 172 throw Error(gettext("Sorry, you are not allowed to edit your own membership.")); 173 } else if (data.role !== this.role) { 174 this.role = data.role || Membership.SUBSCRIBER; 175 this.touch(); 176 this.notify(req.action, this.creator.email, 177 gettext("Notification of membership change")); 178 } 179 return; 180 } 181 182 Membership.prototype.contact_action = function() { 183 if (req.postParams.send) { 184 try { 185 if (!req.postParams.text) { 186 throw Error(gettext("Please enter the message text.")); 187 } 188 this.notify(req.action, this.creator.email, 189 gettext('Message from user {0} of {1}', 190 session.user.name, root.title)); 191 res.message = gettext("Your message was sent successfully."); 192 res.redirect(this._parent.href()); 193 } catch(ex) { 194 res.message = ex; 195 app.log(ex); 196 } 197 } 198 199 res.data.action = this.href(req.action); 200 res.data.title = gettext('Contact User: {0}', this.name); 201 res.data.body = this.renderSkinAsString("$Membership#contact"); 202 this.site.renderSkin("Site#page"); 203 return; 204 } 205 206 Membership.prototype.content_action = function() { 207 res.data.list = renderList(this.content, "$Story#listItem", 208 10, req.queryParams.page); 209 res.data.pager = renderPager(this.content, 210 this.href(), 10, req.queryParams.page); 211 res.data.title = gettext("Content of User: {0}", this.name); 212 res.data.body = this.renderSkinAsString("$Membership#content"); 213 this.site.renderSkin("Site#page"); 214 } 215 216 /** 217 * 218 * @param {String} name 219 * @returns {HopObject} 220 */ 221 Membership.prototype.getMacroHandler = function(name) { 222 switch (name) { 223 case "creator": 224 return this.creator; 225 } 226 } 227 228 /** 229 * @deprecated 230 * @param {Object} param 231 * @throws {Error} 232 */ 233 Membership.prototype.email_macro = function(param) { 234 throw Error(gettext("Due to privacy reasons the display of e-mail addresses is disabled.")); 235 } 236 237 /** 238 * 239 */ 240 Membership.prototype.status_macro = function() { 241 this.renderSkin(session.user ? "Membership#status" : "Membership#login"); 242 return; 243 } 244 245 /** 246 * 247 * @param {Object} value 248 * @param {Object} param 249 * @returns {String} 250 * @see HopObject#link_filter 251 */ 252 Membership.prototype.link_filter = function(value, param) { 253 if (!session.user || !session.user.url) { 254 return value; 255 } 256 return HopObject.prototype.link_filter.call(this, value, 257 param, session.user.url); // || this.href()); 258 } 259 260 /** 261 * 262 * @param {String} role 263 * @returns {Boolean} 264 */ 265 Membership.prototype.require = function(role) { 266 var roles = [Membership.SUBSCRIBER, Membership.CONTRIBUTOR, 267 Membership.MANAGER, Membership.OWNER]; 268 if (role) { 269 return roles.indexOf(this.role) >= roles.indexOf(role); 270 } 271 return false; 272 } 273 274 /** 275 * 276 * @param {String} action 277 * @param {String} recipient 278 * @param {String} subject 279 */ 280 Membership.prototype.notify = function(action, recipient, subject) { 281 switch (action) { 282 case "add": 283 case "contact": 284 case "delete": 285 case "edit": 286 case "register": 287 res.handlers.sender = User.getMembership(); 288 sendMail(recipient, subject, this.renderSkinAsString("$Membership#notify_" + action)); 289 } 290 return; 291 } 292 293 /** 294 * @function 295 * @see #toString 296 */ 297 Membership.prototype.valueOf = Membership.prototype.toString; 298 299 /** 300 * @returns {String} 301 */ 302 Membership.prototype.toString = function() { 303 return gettext("{0} membership of user {1}", this.role || "Transient", this.name); 304 } 305