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