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