]> err.no Git - scalable-opengroupware.org/blobdiff - UI/Scheduler/UIxComponentEditor.m
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1087 d1b88da0-ebda-0310...
[scalable-opengroupware.org] / UI / Scheduler / UIxComponentEditor.m
index 1b8c8d7d63c4355be0c6edaf9818c871cbd5a8f2..08ef20929f68b0aa5af8a5d43c9af3f5c42b553b 100644 (file)
@@ -24,6 +24,7 @@
 #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"
 
@@ -62,6 +65,7 @@
       organizer = nil;
       attendeesNames = nil;
       attendeesEmails = nil;
+      calendarList = nil;
     }
 
   return self;
@@ -82,6 +86,7 @@
   [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