#import <Foundation/NSBundle.h>
#import <Foundation/NSException.h>
#import <Foundation/NSCalendarDate.h>
+#import <Foundation/NSKeyValueCoding.h>
#import <Foundation/NSString.h>
#import <Foundation/NSUserDefaults.h>
#import <Foundation/NSURL.h>
#import <NGCards/iCalRecurrenceRule.h>
#import <NGCards/NSString+NGCards.h>
#import <NGCards/NSCalendarDate+NGCards.h>
+#import <NGObjWeb/SoSecurityManager.h>
+#import <NGObjWeb/NSException+HTTP.h>
+#import <NGObjWeb/WORequest.h>
#import <NGExtensions/NSCalendarDate+misc.h>
#import <NGExtensions/NSObject+Logs.h>
#import <NGExtensions/NSString+misc.h>
-#import <NGObjWeb/NSException+HTTP.h>
-#import <NGObjWeb/WORequest.h>
-#import <SOGo/AgenorUserManager.h>
-#import <SOGo/SOGoUser.h>
-#import <SOGoUI/SOGoDateFormatter.h>
+#import <SoObjects/Appointments/SOGoAppointmentFolder.h>
#import <SoObjects/Appointments/SOGoAppointmentObject.h>
#import <SoObjects/Appointments/SOGoTaskObject.h>
+#import <SoObjects/SOGo/NSString+Utilities.h>
+#import <SoObjects/SOGo/SOGoUser.h>
+#import <SoObjects/SOGo/SOGoPermissions.h>
-#import "UIxComponent+Agenor.h"
+#import "UIxComponent+Scheduler.h"
#import "UIxComponentEditor.h"
organizer = nil;
attendeesNames = nil;
attendeesEmails = nil;
+ calendarList = nil;
}
return self;
[url release];
[attendeesNames release];
[attendeesEmails release];
+ [calendarList release];
[super dealloc];
}
- (NSString *) itemPrivacyText
{
- return [self labelForKey: [NSString stringWithFormat: @"privacy_%@", item]];
+ NSString *tag;
+
+ tag = [[self clientObject] componentTag];
+
+ return [self labelForKey: [NSString stringWithFormat: @"%@_%@", item, tag]];
}
- (NSString *) itemStatusText
- (NSString *) itemCategoryText
{
- return [self labelForKey: [NSString stringWithFormat: @"category_%@", item]];
+ return [self labelForKey:
+ [NSString stringWithFormat: @"category_%@", item]];
+}
+
+- (NSArray *) calendarList
+{
+ SOGoAppointmentFolder *folder;
+ NSEnumerator *allCalendars;
+ NSDictionary *currentCalendar;
+
+ if (!calendarList)
+ {
+ calendarList = [NSMutableArray new];
+ folder = [[self clientObject] container];
+ allCalendars = [[folder calendarFolders] objectEnumerator];
+ currentCalendar = [allCalendars nextObject];
+ while (currentCalendar)
+ {
+ if ([[currentCalendar objectForKey: @"active"] boolValue])
+ [calendarList addObject: currentCalendar];
+ currentCalendar = [allCalendars nextObject];
+ }
+ }
+
+ return calendarList;
+}
+
+- (NSString *) calendarsFoldersList
+{
+ NSArray *calendars;
+
+ calendars = [[self calendarList] valueForKey: @"folder"];
+
+ return [calendars componentsJoinedByString: @","];
+}
+
+- (NSString *) componentCalendar
+{
+ return @"/";
}
/* priorities */
}
/* helpers */
-- (NSFormatter *) titleDateFormatter
-{
- SOGoDateFormatter *fmt;
-
- fmt = [[SOGoDateFormatter alloc] initWithLocale: [self locale]];
- [fmt autorelease];
- [fmt setFullWeekdayNameAndDetails];
-
- return fmt;
-}
-
- (NSString *) completeURIForMethod: (NSString *) _method
{
NSString *uri;
- (BOOL) isMyComponent
{
- // TODO: this should check a set of emails against the SoUser
- return ([[organizer rfc822Email] isEqualToString: [self emailForUser]]);
+ return ([[context activeUser] hasEmail: [organizer rfc822Email]]);
}
- (BOOL) canEditComponent
: @"visibility: hidden;");
}
-- (NSString *) iCalParticipantsAndResourcesStringFromQueryParameters
-{
- NSString *s;
+// - (NSString *) iCalParticipantsAndResourcesStringFromQueryParameters
+// {
+// NSString *s;
- s = [self iCalParticipantsStringFromQueryParameters];
- return [s stringByAppendingString:
- [self iCalResourcesStringFromQueryParameters]];
-}
-
-- (NSString *) iCalParticipantsStringFromQueryParameters
-{
- static NSString *iCalParticipantString = \
- @"ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;CN=\"%@\":MAILTO:%@\r\n";
+// s = [self iCalParticipantsStringFromQueryParameters];
+// return [s stringByAppendingString:
+// [self iCalResourcesStringFromQueryParameters]];
+// }
+
+// - (NSString *) iCalParticipantsStringFromQueryParameters
+// {
+// static NSString *iCalParticipantString = @"ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;CN=\"%@\":MAILTO:%@\r\n";
- return [self iCalStringFromQueryParameter: @"ps"
- format: iCalParticipantString];
-}
-
-- (NSString *) iCalResourcesStringFromQueryParameters
-{
- static NSString *iCalResourceString = \
- @"ATTENDEE;ROLE=NON-PARTICIPANT;CN=\"%@\":MAILTO:%@\r\n";
-
- return [self iCalStringFromQueryParameter: @"rs"
- format: iCalResourceString];
-}
-
-- (NSString *) iCalStringFromQueryParameter: (NSString *) _qp
- format: (NSString *) _format
-{
- AgenorUserManager *um;
- NSMutableString *iCalRep;
- NSString *s;
-
- um = [AgenorUserManager sharedUserManager];
- iCalRep = (NSMutableString *)[NSMutableString string];
- s = [self queryParameterForKey:_qp];
- if(s && [s length] > 0) {
- NSArray *es;
- unsigned i, count;
+// return [self iCalStringFromQueryParameter: @"ps"
+// format: iCalParticipantString];
+// }
+
+// - (NSString *) iCalResourcesStringFromQueryParameters
+// {
+// static NSString *iCalResourceString = @"ATTENDEE;ROLE=NON-PARTICIPANT;CN=\"%@\":MAILTO:%@\r\n";
+
+// return [self iCalStringFromQueryParameter: @"rs"
+// format: iCalResourceString];
+// }
+
+// - (NSString *) iCalStringFromQueryParameter: (NSString *) _qp
+// format: (NSString *) _format
+// {
+// AgenorUserManager *um;
+// NSMutableString *iCalRep;
+// NSString *s;
+
+// um = [AgenorUserManager sharedUserManager];
+// iCalRep = (NSMutableString *)[NSMutableString string];
+// s = [self queryParameterForKey:_qp];
+// if(s && [s length] > 0) {
+// NSArray *es;
+// unsigned i, count;
- es = [s componentsSeparatedByString: @","];
- count = [es count];
- for(i = 0; i < count; i++) {
- NSString *email, *cn;
+// es = [s componentsSeparatedByString: @","];
+// count = [es count];
+// for(i = 0; i < count; i++) {
+// NSString *email, *cn;
- email = [es objectAtIndex:i];
- cn = [um getCNForUID:[um getUIDForEmail:email]];
- [iCalRep appendFormat:_format, cn, email];
- }
- }
- return iCalRep;
-}
-
-- (NSString *) iCalOrganizerString
-{
- return [NSString stringWithFormat: @"ORGANIZER;CN=\"%@\":MAILTO:%@\r\n",
- [self cnForUser], [self emailForUser]];
-}
+// email = [es objectAtIndex:i];
+// cn = [um getCNForUID:[um getUIDForEmail:email]];
+// [iCalRep appendFormat:_format, cn, email];
+// }
+// }
+// return iCalRep;
+// }
- (NSException *) validateObjectForStatusChange
{
id co;
co = [self clientObject];
- if (![co
- respondsToSelector: @selector(changeParticipationStatus:inContext:)])
- return [NSException exceptionWithHTTPStatus:400 /* Bad Request */
+ if (![co respondsToSelector: @selector(changeParticipationStatus:)])
+ return [NSException exceptionWithHTTPStatus: 400 /* Bad Request */
reason:
@"method cannot be invoked on the specified object"];
/* contact editor compatibility */
-- (NSArray *) availableCalendars
-{
- NSEnumerator *rawContacts;
- NSString *list, *currentId;
- NSMutableArray *calendars;
- SOGoUser *user;
-
- calendars = [NSMutableArray array];
-
- user = [context activeUser];
- list = [[user userDefaults] stringForKey: @"calendaruids"];
- if ([list length] == 0)
- list = [self shortUserNameForDisplay];
-
- rawContacts
- = [[list componentsSeparatedByString: @","] objectEnumerator];
- currentId = [rawContacts nextObject];
- while (currentId)
- {
- if ([currentId hasPrefix: @"-"])
- [calendars addObject: [currentId substringFromIndex: 1]];
- else
- [calendars addObject: currentId];
- currentId = [rawContacts nextObject];
- }
-
- return calendars;
-}
-
-- (NSString *) componentOwner
-{
- return componentOwner;
-}
-
- (NSString *) urlButtonClasses
{
NSString *classes;
- (void) _handleOrganizer
{
NSString *organizerEmail;
+ SOGoUser *activeUser;
organizerEmail = [[component organizer] email];
if ([organizerEmail length] == 0)
if ([[component attendees] count] > 0)
{
ASSIGN (organizer, [iCalPerson elementWithTag: @"organizer"]);
- [organizer setCn: [self cnForUser]];
- [organizer setEmail: [self emailForUser]];
+ activeUser = [context activeUser];
+ [organizer setCn: [activeUser cn]];
+ [organizer setEmail: [activeUser primaryEmail]];
[component setOrganizer: organizer];
}
}
[component setLocation: location];
[component setComment: comment];
[component setUrl: url];
+ [component setAccessClass: privacy];
[self _handleAttendeesEdition];
[self _handleOrganizer];
clientObject = [self clientObject];
[component setLastModified: now];
}
+- (NSString *) toolbar
+{
+ SOGoCalendarComponent *clientObject;
+ NSString *toolbarFilename;
+ iCalPerson *participant;
+ iCalPersonPartStat participationStatus;
+ SoSecurityManager *sm;
+ NSString *owner;
+
+ sm = [SoSecurityManager sharedSecurityManager];
+ clientObject = [self clientObject];
+
+ owner = [clientObject ownerInContext: context];
+ participant = [clientObject findParticipantWithUID: owner];
+
+ if (participant
+ && ![sm validatePermission: SOGoCalendarPerm_RespondToComponent
+ onObject: clientObject
+ inContext: context])
+ {
+ participationStatus = [participant participationStatus];
+ /* Lightning does not manage participation status within tasks */
+ if (participationStatus == iCalPersonPartStatAccepted)
+ toolbarFilename = @"SOGoAppointmentObjectDecline.toolbar";
+ else if (participationStatus == iCalPersonPartStatDeclined)
+ toolbarFilename = @"SOGoAppointmentObjectAccept.toolbar";
+ else
+ toolbarFilename = @"SOGoAppointmentObjectAcceptOrDecline.toolbar";
+ }
+ else if (![sm validatePermission: SOGoCalendarPerm_ModifyComponent
+ onObject: clientObject
+ inContext: context])
+ {
+ if ([[clientObject componentTag] isEqualToString: @"vevent"])
+ toolbarFilename = @"SOGoAppointmentObject.toolbar";
+ else
+ toolbarFilename = @"SOGoTaskObject.toolbar";
+ }
+ else
+ toolbarFilename = @"SOGoComponentClose.toolbar";
+
+ return toolbarFilename;
+}
+
@end