]> err.no Git - scalable-opengroupware.org/blob - UI/Scheduler/UIxAppointmentView.m
moved SOGo files up
[scalable-opengroupware.org] / UI / Scheduler / UIxAppointmentView.m
1 /*
2   Copyright (C) 2004-2005 SKYRIX Software AG
3
4   This file is part of OpenGroupware.org.
5
6   OGo is free software; you can redistribute it and/or modify it under
7   the terms of the GNU Lesser General Public License as published by the
8   Free Software Foundation; either version 2, or (at your option) any
9   later version.
10
11   OGo is distributed in the hope that it will be useful, but WITHOUT ANY
12   WARRANTY; without even the implied warranty of MERCHANTABILITY or
13   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
14   License for more details.
15
16   You should have received a copy of the GNU Lesser General Public
17   License along with OGo; see the file COPYING.  If not, write to the
18   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
19   02111-1307, USA.
20 */
21
22 #include "UIxAppointmentView.h"
23 #include <NGiCal/NGiCal.h>
24 #include <SOGo/SOGoAppointment.h>
25 #include <SOGo/WOContext+Agenor.h>
26 #include <Appointments/SOGoAppointmentObject.h>
27 #include <SOGoUI/SOGoDateFormatter.h>
28 #include "UIxComponent+Agenor.h"
29 #include "common.h"
30
31 @interface UIxAppointmentView (PrivateAPI)
32 - (BOOL)isAttendeeActiveUser;
33 @end
34
35 @implementation UIxAppointmentView
36
37 - (void)dealloc {
38   [self->appointment   release];
39   [self->attendee      release];
40   [self->dateFormatter release];
41   [self->item          release];
42   [super dealloc];
43 }
44
45 /* accessors */
46
47 - (NSString *)tabSelection {
48   NSString *selection;
49     
50   selection = [self queryParameterForKey:@"tab"];
51   if (selection == nil)
52     selection = @"attributes";
53   return selection;
54 }
55
56 - (void)setAttendee:(id)_attendee {
57   ASSIGN(self->attendee, _attendee);
58 }
59 - (id)attendee {
60   return self->attendee;
61 }
62
63 - (BOOL)isAttendeeActiveUser {
64   NSString *email, *attEmail;
65   
66   email    = [[[self context] activeUser] email];
67   attEmail = [[self attendee] rfc822Email];
68   return [email isEqualToString:attEmail];
69 }
70 - (BOOL)showAcceptButton {
71   return [[self attendee] participationStatus] != iCalPersonPartStatAccepted;
72 }
73 - (BOOL)showRejectButton {
74   return [[self attendee] participationStatus] != iCalPersonPartStatDeclined;
75 }
76 - (NSString *)attendeeStatusColspan {
77   return [self isAttendeeActiveUser] ? @"1" : @"2";
78 }
79
80 - (void)setItem:(id)_item {
81   ASSIGN(self->item, _item);
82 }
83 - (id)item {
84   return self->item;
85 }
86
87 - (SOGoDateFormatter *)dateFormatter {
88   if (self->dateFormatter == nil) {
89     self->dateFormatter =
90       [[SOGoDateFormatter alloc] initWithLocale:[self locale]];
91     [self->dateFormatter setFullWeekdayNameAndDetails];
92   }
93   return self->dateFormatter;
94 }
95
96 - (NSCalendarDate *)startTime {
97   NSCalendarDate *date;
98     
99   date = [[self appointment] startDate];
100   [date setTimeZone:[self viewTimeZone]];
101   return date;
102 }
103
104 - (NSCalendarDate *)endTime {
105   NSCalendarDate *date;
106   
107   date = [[self appointment] endDate];
108   [date setTimeZone:[self viewTimeZone]];
109   return date;
110 }
111
112 - (NSString *)resourcesAsString {
113   NSArray *resources, *cns;
114
115   resources = [[self appointment] resources];
116   cns = [resources valueForKey:@"cnForDisplay"];
117   return [cns componentsJoinedByString:@"<br />"];
118 }
119
120 - (NSString *)categoriesAsString {
121   unsigned i, count;
122   NSArray *cats;
123   NSMutableString *s;
124   
125   s = [NSMutableString stringWithCapacity:32];
126   cats = [((SOGoAppointment *)self->appointment) categories];
127   count = [cats count];
128   for(i = 0; i < count; i++) {
129     NSString *cat, *label;
130
131     cat = [cats objectAtIndex:i];
132     label = [self labelForKey:cat];
133     [s appendString:label];
134     if(i != (count - 1))
135       [s appendString:@", "];
136   }
137   return s;
138 }
139
140 /* backend */
141
142 - (SOGoAppointment *)appointment {
143   NSString *iCalString;
144     
145   if (self->appointment != nil)
146     return self->appointment;
147     
148   iCalString = [[self clientObject] valueForKey:@"iCalString"];
149   if (![iCalString isNotNull] || [iCalString length] == 0) {
150     [self errorWithFormat:@"(%s): missing iCal string!", 
151             __PRETTY_FUNCTION__];
152     return nil;
153   }
154     
155   self->appointment = [[SOGoAppointment alloc] initWithICalString:iCalString];
156   return self->appointment;
157 }
158
159
160 /* hrefs */
161
162 - (NSString *)attributesTabLink {
163   return [self completeHrefForMethod:[self ownMethodName]
164                withParameter:@"attributes"
165                forKey:@"tab"];
166 }
167
168 - (NSString *)participantsTabLink {
169     return [self completeHrefForMethod:[self ownMethodName]
170                  withParameter:@"participants"
171                  forKey:@"tab"];
172 }
173
174 - (NSString *)debugTabLink {
175   return [self completeHrefForMethod:[self ownMethodName]
176                withParameter:@"debug"
177                forKey:@"tab"];
178 }
179
180 - (NSString *)completeHrefForMethod:(NSString *)_method
181   withParameter:(NSString *)_param
182   forKey:(NSString *)_key
183 {
184   NSString *href;
185
186   [self setQueryParameter:_param forKey:_key];
187   href = [self completeHrefForMethod:[self ownMethodName]];
188   [self setQueryParameter:nil forKey:_key];
189   return href;
190 }
191
192
193 /* access */
194
195 - (BOOL)isMyApt {
196   NSString   *email;
197   iCalPerson *organizer;
198
199   email     = [[[self context] activeUser] email];
200   organizer = [[self appointment] organizer];
201   if (!organizer) return YES; // assume this is correct to do, right?
202   return [[organizer rfc822Email] isEqualToString:email];
203 }
204
205 - (BOOL)canAccessApt {
206   NSString *email;
207   NSArray  *partMails;
208
209   if ([self isMyApt])
210     return YES;
211   
212   /* not my apt - can access if it's public */
213   if ([[self appointment] isPublic])
214     return YES;
215
216   /* can access it if I'm invited :-) */
217   email     = [[[self context] activeUser] email];
218   partMails = [[[self appointment] participants] valueForKey:@"rfc822Email"];
219   return [partMails containsObject:email];
220 }
221
222 - (BOOL)canEditApt {
223   return [self isMyApt];
224 }
225
226
227 /* action */
228
229 - (id<WOActionResults>)defaultAction {
230   if ([self appointment] == nil) {
231     return [NSException exceptionWithHTTPStatus:404 /* Not Found */
232                         reason:@"could not locate appointment"];
233   }
234   
235   return self;
236 }
237
238 - (BOOL)isDeletableClientObject {
239   return [[self clientObject] respondsToSelector:@selector(delete)];
240 }
241
242 - (id)deleteAction {
243   NSException *ex;
244   id url;
245
246   if ([self appointment] == nil) {
247     return [NSException exceptionWithHTTPStatus:404 /* Not Found */
248                         reason:@"could not locate appointment"];
249   }
250
251   if (![self isDeletableClientObject]) {
252     /* return 400 == Bad Request */
253     return [NSException exceptionWithHTTPStatus:400
254                         reason:@"method cannot be invoked on "
255                                @"the specified object"];
256   }
257   
258   if ((ex = [[self clientObject] delete]) != nil) {
259     // TODO: improve error handling
260     [self debugWithFormat:@"failed to delete: %@", ex];
261     return ex;
262   }
263   
264   url = [[[self clientObject] container] baseURLInContext:[self context]];
265   return [self redirectToLocation:url];
266 }
267
268 @end /* UIxAppointmentView */