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