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