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 */ 62 Membership.remove = function(membership) { 63 if (membership && membership.constructor === Membership) { 64 if (!membership.getPermission("delete") && !User.require(User.PRIVILEGED)) { 65 throw Error(gettext("Sorry, an owner of a site cannot be removed.")); 66 } 67 var recipient = membership.creator.email; 68 membership.remove(); 69 if (req.action === "delete") { 70 membership.notify(req.action, recipient, 71 gettext("Notification of membership cancellation")); 72 } 73 } 74 return; 75 } 76 77 /** 78 * @name Membership 79 * @constructor 80 * @param {Object} user 81 * @param {Object} role 82 * @property {Date} created 83 * @property {User} creator 84 * @property {File[]} files 85 * @property {Image[]} images 86 * @property {Date} modified 87 * @property {User} modifier 88 * @property {String} name 89 * @property {Poll[]} polls 90 * @property {String} role 91 * @property {Site} site 92 * @property {Story[]} stories 93 * @extends HopObject 94 */ 95 Membership.prototype.constructor = function(user, role) { 96 user || (user = session.user); 97 if (user) { 98 this.map({ 99 creator: user, 100 name: user.name, 101 role: role, 102 created: new Date 103 }); 104 this.touch(); 105 } 106 return this; 107 } 108 109 /** 110 * 111 * @param {String} action 112 * @return {Boolean} 113 */ 114 Membership.prototype.getPermission = function(action) { 115 if (!res.handlers.site.getPermission("main")) { 116 return false; 117 } 118 switch (action) { 119 case "contact": 120 return true; 121 case "edit": 122 return this.creator !== session.user; 123 case "delete": 124 return this.role !== Membership.OWNER; 125 } 126 return false; 127 } 128 129 /** 130 * 131 * @param {String} name 132 * @returns {Object} 133 */ 134 Membership.prototype.getFormOptions = function(name) { 135 switch (name) { 136 case "role": 137 return Membership.getRoles(); 138 } 139 return; 140 } 141 142 Membership.prototype.edit_action = function() { 143 if (req.postParams.save) { 144 try { 145 this.update(req.postParams); 146 res.message = gettext("The changes were saved successfully."); 147 res.redirect(this._parent.href()); 148 } catch(ex) { 149 res.message = ex; 150 app.log(ex); 151 } 152 } 153 154 res.data.action = this.href(req.action); 155 res.data.title = gettext("Edit membership {0}", this.name); 156 res.data.body = this.renderSkinAsString("$Membership#edit"); 157 this.site.renderSkin("Site#page"); 158 return; 159 } 160 161 /** 162 * 163 * @param {Object} data 164 */ 165 Membership.prototype.update = function(data) { 166 if (!data.role) { 167 throw Error(gettext("Please choose a role for this member.")); 168 } else if (this.user === session.user) { 169 throw Error(gettext("Sorry, you are not allowed to edit your own membership.")); 170 } else if (data.role !== this.role) { 171 this.role = data.role || Membership.SUBSCRIBER; 172 this.touch(); 173 this.notify(req.action, this.creator.email, 174 gettext("Notification of membership change")); 175 } 176 return; 177 } 178 179 Membership.prototype.contact_action = function() { 180 if (req.postParams.send) { 181 try { 182 if (!req.postParams.text) { 183 throw Error(gettext("Please enter the message text.")); 184 } 185 this.notify(req.action, this.creator.email, 186 gettext('Message from user {0} of {1}', 187 session.user.name, root.title)); 188 res.message = gettext("Your message was sent successfully."); 189 res.redirect(this._parent.href()); 190 } catch(ex) { 191 res.message = ex; 192 app.log(ex); 193 } 194 } 195 196 res.data.action = this.href(req.action); 197 res.data.title = gettext('Contact user {0}', this.name); 198 res.data.body = this.renderSkinAsString("$Membership#contact"); 199 this.site.renderSkin("Site#page"); 200 return; 201 } 202 203 /** 204 * 205 * @param {String} name 206 * @returns {HopObject} 207 */ 208 Membership.prototype.getMacroHandler = function(name) { 209 switch (name) { 210 case "creator": 211 return this.creator; 212 } 213 } 214 215 /** 216 * @deprecated 217 * @param {Object} param 218 * @throws {Error} 219 */ 220 Membership.prototype.email_macro = function(param) { 221 throw Error("Due to privacy reasons the display of e-mail addresses is disabled.") 222 } 223 224 /** 225 * 226 */ 227 Membership.prototype.status_macro = function() { 228 this.renderSkin(session.user ? "Membership#status" : "Membership#login"); 229 return; 230 } 231 232 /** 233 * 234 * @param {Object} value 235 * @param {Object} param 236 * @returns {String} 237 * @see HopObject#link_filter 238 */ 239 Membership.prototype.link_filter = function(value, param) { 240 if (!session.user || !session.user.url) { 241 return value; 242 } 243 return HopObject.prototype.link_filter.call(this, value, 244 param, session.user.url); // || this.href()); 245 } 246 247 /** 248 * 249 * @param {String} role 250 * @returns {Boolean} 251 */ 252 Membership.prototype.require = function(role) { 253 var roles = [Membership.SUBSCRIBER, Membership.CONTRIBUTOR, 254 Membership.MANAGER, Membership.OWNER]; 255 if (role) { 256 return roles.indexOf(this.role) >= roles.indexOf(role); 257 } 258 return false; 259 } 260 261 /** 262 * 263 * @param {String} action 264 * @param {String} recipient 265 * @param {String} subject 266 */ 267 Membership.prototype.notify = function(action, recipient, subject) { 268 switch (action) { 269 case "add": 270 case "contact": 271 case "delete": 272 case "edit": 273 case "register": 274 res.handlers.sender = User.getMembership(); 275 sendMail(root.email, recipient, subject, 276 this.renderSkinAsString("$Membership#notify_" + action)); 277 } 278 return; 279 } 280 281 /** 282 * @function 283 * @see #toString 284 */ 285 Membership.prototype.valueOf = Membership.prototype.toString; 286 287 /** 288 * @returns {String} 289 */ 290 Membership.prototype.toString = function() { 291 return "the membership of user " + this.name + " in site " + this.site.name; 292 } 293