Monotone-Parent: 1ccd34fd9ea99e675935d745db7e70d19716428a

Monotone-Revision: c40151185171e3ba8a257569b8ab5ec86930d393

Monotone-Author: wsourdeau@inverse.ca
Monotone-Date: 2010-05-05T14:40:53
Monotone-Branch: ca.inverse.sogo
This commit is contained in:
Wolfgang Sourdeau committed 2010-05-05 14:40:53 +00:00
1 parent f7799b9cf8
commit 2bf4b7cf8b
42 files changed
+625 -279

No files matched your search

@@ -460,8 +460,9 @@ validate_endbeforestart = "A data que você informou ocorre antes da data ini
= "Você tem certeza que quer apagar o calendário \"%{0}\"?";
/* Legend */
"Required participant" = "Participante Requerido";
"Optional participant" = "Participante Opcional";
"Participant" = "Participante";
"Optional Participant" = "Participante Opcional";
"Non Participant" = "Não Participante";
"Chair" = "Cadeira";
"Needs action" = "Ações necessárias";
+3 -2
View File
@@ -460,8 +460,9 @@ validate_endbeforestart = "Zadané datum konce je před začátkem události.
= "Opravdu chcete smazat kalendář \"%{0}\"?";
/* Legend */
"Required participant" = "Vyžadovaný účastník";
"Optional participant" = "Nepovinný účastník";
"Participant" = "Účastník";
"Optional Participant" = "Nepovinný účastník";
"Non Participant" = "Non Participant";
"Chair" = "Židle";
"Needs action" = "Vyžaduje akci";
+3 -2
View File
@@ -460,8 +460,9 @@ validate_endbeforestart = "Het begin vindt plaats vóór het einde.";
= "Weet u zeker dat u de agenda \"%{0}\" wilt verwijderen?";
/* Legend */
"Required participant" = "Vereiste deelnemer";
"Optional participant" = "Gewenste deelnemer";
"Participant" = "Deelnemer";
"Optional Participant" = "Gewenste deelnemer";
"Non Participant" = "Non Participant";
"Chair" = "Voorzitter";
"Needs action" = "Actie vereist";
@@ -246,10 +246,10 @@
/* Appointments (participation state) */
"partStat_NEEDS-ACTION" = "Needs action";
"partStat_NEEDS-ACTION" = "I will confirm later";
"partStat_ACCEPTED" = "I will attend";
"partStat_DECLINED" = "I will not attend";
"partStat_TENTATIVE" = "I will confirm later";
"partStat_TENTATIVE" = "I might attend";
"partStat_DELEGATED" = "I delegate";
"partStat_OTHER" = "Other";
@@ -460,8 +460,9 @@ validate_endbeforestart = "The end date that you entered occurs before the st
= "Are you sure you want to delete the calendar \"%{0}\"?";
/* Legend */
"Required participant" = "Required participant";
"Optional participant" = "Optional participant";
"Participant" = "Participant";
"Optional Participant" = "Optional Participant";
"Non Participant" = "Non Participant";
"Chair" = "Chair";
"Needs action" = "Needs action";
@@ -246,10 +246,10 @@
/* Appointments (participation state) */
"partStat_NEEDS-ACTION" = "Décision attendue";
"partStat_NEEDS-ACTION" = "Je confirmerai plus tard";
"partStat_ACCEPTED" = "Je participerai";
"partStat_DECLINED" = "Je ne participerai pas";
"partStat_TENTATIVE" = "Je confirmerai plus tard";
"partStat_TENTATIVE" = "Je participerai peut-être";
"partStat_DELEGATED" = "Je délègue";
"partStat_OTHER" = "???";
@@ -460,9 +460,10 @@ validate_endbeforestart = "La date de fin est avant la date de début.";
= "Voulez-vous vraiment supprimer l'agenda «%{0}»?";
/* Legend */
"Required participant" = "Participant obligatoire";
"Optional participant" = "Participant facultatif";
"Chair" = "Chaise";
"Participant" = "Invité";
"Optional Participant" = "Invité optionnel";
"Non Participant" = "Non-invité";
"Chair" = "Président";
"Needs action" = "En attente";
"Accepted" = "Accepté";
@@ -460,8 +460,9 @@ validate_endbeforestart = "Ihr Beginn ist nach dem Ende";
= "Wollen Sie diesen Kalender wirklich löschen \"%{0}\"?";
/* Legend */
"Required participant" = "notwendiger Teilnehmer";
"Optional participant" = "optionaler Teilnehmer";
"Participant" = "Teilnehmer";
"Optional Participant" = "optionaler Teilnehmer";
"Non Participant" = "Non Participant";
"Chair" = "Vorsitz";
"Needs action" = "Benötigt Eingriff";
@@ -460,8 +460,9 @@ validate_endbeforestart = "A megadott befejező dátum korábbi, mint a kezd
= "Biztosan törli ezt a naptárat: \"%{0}\"?";
/* Legend */
"Required participant" = "Kötelező résztvevő";
"Optional participant" = "Nem kötelező résztvevő";
"Participant" = "Kötelező résztvevő";
"Optional Participant" = "Nem kötelező résztvevő";
"Non Participant" = "Non Participant";
"Chair" = "Szék";
"Needs action" = "Foglalkozni kell vele";
@@ -460,8 +460,9 @@ validate_endbeforestart = "La data finale specificata è precedente alla data
= "Sei sicuro di voler cancellare il calendario \"%{0}\"?";
/* Legend */
"Required participant" = "Richiede partecipanti";
"Optional participant" = "Partecipanti opzionali";
"Participant" = "Partecipanti";
"Optional Participant" = "Partecipanti opzionali";
"Non Participant" = "Non Partecipanti";
"Chair" = "Sedia";
"Needs action" = "Richiede un'azione";
@@ -460,8 +460,9 @@ validate_endbeforestart = "The end date that you entered occurs before the st
= "Вы уверены что хотите удалить календарь \"%{0}\"?";
/* Legend */
"Required participant" = "Required participant";
"Optional participant" = "Optional participant";
"Participant" = "Participant";
"Optional Participant" = "Optional Participant";
"Non Participant" = "Non Participant";
"Chair" = "Chair";
"Needs action" = "Needs action";
@@ -460,8 +460,9 @@ validate_endbeforestart = "Su fecha/hora de comienzo es posterio a la de fina
= "¿Está seguro/a que desea borrar el calendario \"%{0}\"?";
/* Legend */
"Required participant" = "Asistente obligatorio";
"Optional participant" = "Asistentes opcionales";
"Participant" = "Asistente";
"Optional Participant" = "Asistentes opcionales";
"Non Participant" = "Non Particpant";
"Chair" = "Presidente";
"Needs action" = "Requiere intervención";
@@ -460,8 +460,9 @@ validate_endbeforestart = "Angivet slutdatumet inträffar före angivet start
= "Är du säker på att du vill ta bort kalendern \"%{0}\"?";
/* Legend */
"Required participant" = "Deltagande krävs";
"Optional participant" = "Deltagande valfritt";
"Participant" = "Deltagande krävs";
"Optional Participant" = "Deltagande valfritt";
"Non Participant" = "Non Participant";
"Chair" = "Stol";
"Needs action" = "Behöver åtgärd";
+19 -9
View File
@@ -522,22 +522,32 @@
[event setTransparency: (isTransparent? @"TRANSPARENT" : @"OPAQUE")];
}
// TODO: add tentatively
- (id) _statusChangeAction: (NSString *) newStatus
{
[[self clientObject] changeParticipationStatus: newStatus
withDelegate: nil];
return [self responseWith204];
}
- (id) acceptAction
{
[[self clientObject] changeParticipationStatus: @"ACCEPTED"
withDelegate: nil];
return self;
return [self _statusChangeAction: @"ACCEPTED"];
}
- (id) declineAction
{
[[self clientObject] changeParticipationStatus: @"DECLINED"
withDelegate: nil];
return [self _statusChangeAction: @"DECLINED"];
}
return self;
- (id) needsActionAction
{
return [self _statusChangeAction: @"NEEDS-ACTION"];
}
- (id) tentativeAction
{
return [self _statusChangeAction: @"TENTATIVE"];
}
- (id) delegateAction
@@ -584,7 +594,7 @@
reason: @"missing 'to' parameter"];
if (!response)
response = [self responseWithStatus: 200];
response = [self responseWith204];
return response;
}
+130 -45
View File
@@ -54,7 +54,6 @@
#import <Appointments/SOGoAppointmentObject.h>
#import <Appointments/SOGoAppointmentOccurence.h>
#import <Appointments/SOGoTaskObject.h>
#import <SOGo/iCalEntityObject+Utilities.h>
#import <SOGo/NSArray+Utilities.h>
#import <SOGo/NSDictionary+BSJSONAdditions.h>
#import <SOGo/NSDictionary+Utilities.h>
@@ -268,6 +267,8 @@ iRANGE(2);
[currentAttendeeData setObject: [[currentAttendee partStat] lowercaseString]
forKey: @"partstat"];
[currentAttendeeData setObject: [[currentAttendee role] lowercaseString]
forKey: @"role"];
if ([[currentAttendee delegatedTo] length])
[currentAttendeeData setObject: [[currentAttendee delegatedTo] rfc822Email]
@@ -587,7 +588,7 @@ iRANGE(2);
um = [SOGoUserManager sharedUserManager];
owner = [componentCalendar ownerInContext: context];
ownerEmail = [um getEmailForUID: owner];
ASSIGN (ownerAsAttendee, [component findParticipantWithEmail: (id)ownerEmail]);
ASSIGN (ownerAsAttendee, [component findAttendeeWithEmail: (id)ownerEmail]);
}
}
// /* cycles */
@@ -990,14 +991,26 @@ iRANGE(2);
{
NSString *word;
if ([item intValue] == iCalPersonPartStatAccepted)
word = @"ACCEPTED";
else if ([item intValue] == iCalPersonPartStatDeclined)
word = @"DECLINED";
else if ([item intValue] == iCalPersonPartStatDelegated)
word = @"DELEGATED";
else
word = @"UNKNOWN";
switch ([item intValue])
{
case iCalPersonPartStatAccepted:
word = @"ACCEPTED";
break;
case iCalPersonPartStatDeclined:
word = @"DECLINED";
break;
case iCalPersonPartStatNeedsAction:
word = @"NEEDS-ACTION";
break;
case iCalPersonPartStatTentative:
word = @"TENTATIVE";
break;
case iCalPersonPartStatDelegated:
word = @"DELEGATED";
break;
default:
word = @"UNKNOWN";
}
return [self labelForKey: [NSString stringWithFormat: @"partStat_%@", word]];
}
@@ -1005,8 +1018,10 @@ iRANGE(2);
- (NSArray *) replyList
{
return [NSArray arrayWithObjects:
[NSNumber numberWithInt: iCalPersonPartStatAccepted],
[NSNumber numberWithInt: iCalPersonPartStatAccepted],
[NSNumber numberWithInt: iCalPersonPartStatDeclined],
[NSNumber numberWithInt: iCalPersonPartStatNeedsAction],
[NSNumber numberWithInt: iCalPersonPartStatTentative],
[NSNumber numberWithInt: iCalPersonPartStatDelegated],
nil];
}
@@ -1508,7 +1523,7 @@ RANGE(2);
unsigned int count, max;
NSString *currentEmail;
iCalPerson *currentAttendee;
NSString *json;
NSString *json, *role, *partstat;
NSDictionary *attendeesData;
NSArray *attendees;
NSDictionary *currentData;
@@ -1529,17 +1544,33 @@ RANGE(2);
{
currentData = [attendees objectAtIndex: count];
currentEmail = [currentData objectForKey: @"email"];
currentAttendee = [component findParticipantWithEmail: currentEmail];
role = [[currentData objectForKey: @"role"] uppercaseString];
if (!role)
role = @"REQ-PARTICIPANT";
if ([role isEqualToString: @"NON-PARTICIPANT"])
partstat = @"";
else
{
partstat = [[currentData objectForKey: @"partstat"]
uppercaseString];
if (!partstat)
partstat = @"NEEDS-ACTION";
}
currentAttendee = [component findAttendeeWithEmail: currentEmail];
if (!currentAttendee)
{
currentAttendee = [iCalPerson elementWithTag: @"attendee"];
[currentAttendee setCn: [currentData objectForKey: @"name"]];
[currentAttendee setEmail: currentEmail];
[currentAttendee setRole: @"REQ-PARTICIPANT"];
[currentAttendee setRsvp: @"TRUE"];
[currentAttendee
setParticipationStatus: iCalPersonPartStatNeedsAction];
// [currentAttendee
// setParticipationStatus: iCalPersonPartStatNeedsAction];
}
[currentAttendee
setRsvp: ([role isEqualToString: @"NON-PARTICIPANT"]
? @"FALSE"
: @"TRUE")];
[currentAttendee setRole: role];
[currentAttendee setPartStat: partstat];
[newAttendees addObject: currentAttendee];
}
[component setAttendees: newAttendees];
@@ -1965,8 +1996,7 @@ RANGE(2);
isOrganizer = ![ownerUser hasEmail: [[component organizer] sentBy]];
if ([componentCalendar isKindOfClass: [SOGoWebAppointmentFolder class]]
|| ([[component attendees] count]
&& [component userIsParticipant: ownerUser]
|| ([component userIsAttendee: ownerUser]
&& !isOrganizer
// Lightning does not manage participation status within tasks,
// so we also ignore the participation status of tasks in the
@@ -1991,14 +2021,12 @@ RANGE(2);
{
SoSecurityManager *sm;
NSString *toolbarFilename, *adminToolbar;
SOGoUser *currentUser;
if ([clientObject isKindOfClass: [SOGoAppointmentObject class]])
adminToolbar = @"SOGoAppointmentObject.toolbar";
else
adminToolbar = @"SOGoTaskObject.toolbar";
currentUser = [context activeUser];
sm = [SoSecurityManager sharedSecurityManager];
if (![sm validatePermission: SOGoCalendarPerm_ModifyComponent
@@ -2035,36 +2063,45 @@ RANGE(2);
- (int) ownerIsAttendee: (SOGoUser *) ownerUser
andClientObject: (SOGoContentObject
<SOGoComponentOccurence> *) clientObject
andClientObject: (SOGoContentObject
<SOGoComponentOccurence> *) clientObject
{
BOOL isOrganizer;
int rc = 0;
iCalPerson *ownerAttendee;
int rc;
rc = 0;
isOrganizer = [component userIsOrganizer: ownerUser];
if (isOrganizer)
isOrganizer = ![ownerUser hasEmail: [[component organizer] sentBy]];
if ([[component attendees] count]
&& [component userIsParticipant: ownerUser]
&& !isOrganizer
&& ![[component tag] isEqualToString: @"VTODO"])
rc = 1;
if (!isOrganizer && ![[component tag] isEqualToString: @"VTODO"])
{
ownerAttendee = [component userAsAttendee: ownerUser];
if (ownerAttendee)
{
if ([[ownerAttendee rsvp] isEqualToString: @"true"])
rc = 1;
else
rc = 2;
}
}
return rc;
}
- (int) delegateIsAttendee: (SOGoUser *) ownerUser
andClientObject: (SOGoContentObject
<SOGoComponentOccurence> *) clientObject
andClientObject: (SOGoContentObject
<SOGoComponentOccurence> *) clientObject
{
SoSecurityManager *sm;
SOGoUser *currentUser;
int rc = 0;
iCalPerson *ownerAttendee;
int rc;
rc = 0;
currentUser = [context activeUser];
sm = [SoSecurityManager sharedSecurityManager];
if (![sm validatePermission: SOGoCalendarPerm_ModifyComponent
onObject: clientObject
inContext: context])
@@ -2072,11 +2109,15 @@ RANGE(2);
andClientObject: clientObject];
else if (![sm validatePermission: SOGoCalendarPerm_RespondToComponent
onObject: clientObject
inContext: context]
&& [[component attendees] count]
&& [component userIsParticipant: ownerUser]
&& ![component userIsOrganizer: ownerUser])
rc = 1;
inContext: context])
{
ownerAttendee = [component userAsAttendee: ownerUser];
if ([[ownerAttendee rsvp] isEqualToString: @"true"]
&& ![component userIsOrganizer: ownerUser])
rc = 1;
else
rc = 2;
}
else
rc = 2; // not invited, just RO
@@ -2090,9 +2131,8 @@ RANGE(2);
int rc;
clientObject = [self clientObject];
ownerUser = [SOGoUser userWithLogin: [clientObject ownerInContext: context]
roles: nil];
ownerUser
= [SOGoUser userWithLogin: [clientObject ownerInContext: context]];
if ([componentCalendar isKindOfClass: [SOGoWebAppointmentFolder class]])
rc = 2;
else
@@ -2113,9 +2153,54 @@ RANGE(2);
return [self getEventRWType] != 0;
}
- (BOOL) userIsAttendee
- (BOOL) userHasRSVP
{
return [self getEventRWType] == 1;
return ([self getEventRWType] == 1);
}
- (NSString *) currentAttendeeClasses
{
NSMutableArray *classes;
iCalPerson *ownerAttendee;
SOGoUser *ownerUser;
NSString *role, *partStat;
SOGoCalendarComponent *co;
classes = [NSMutableArray arrayWithCapacity: 5];
/* rsvp class */
if (![[attendee rsvp] isEqualToString: @"true"])
[classes addObject: @"not-rsvp"];
/* partstat class */
partStat = [[attendee partStat] lowercaseString];
if (![partStat length])
partStat = @"no-partstat";
[classes addObject: partStat];
/* role class */
role = [[attendee role] lowercaseString];
if (![partStat length])
role = @"no-role";
[classes addObject: role];
/* attendee class */
if ([[attendee delegatedFrom] length] > 0)
[classes addObject: @"delegate"];
/* current attendee class */
co = [self clientObject];
ownerUser = [SOGoUser userWithLogin: [co ownerInContext: context]];
ownerAttendee = [component userAsAttendee: ownerUser];
if (attendee == ownerAttendee)
[classes addObject: @"attendeeUser"];
return [classes componentsJoinedByString: @" "];
}
- (NSString *) ownerLogin
{
return [[self clientObject] ownerInContext: context];
}
@end
@@ -462,6 +462,7 @@ validate_endbeforestart = "Mae'r dyddiad gorffen sydd wedi'i roi yn digwydd c
/* Legend */
"Required participant" = "Cyfranogwr gofynnol";
"Optional participant" = "Cyfranogwr opsiynol";
"Non Participant" = "Non Participant";
"Chair" = "Cadair";
"Needs action" = "Angen gweithred";
+10
View File
@@ -235,6 +235,16 @@
pageName = "UIxAppointmentEditor";
actionName = "delegate";
};
tentative = {
protectedBy = "RespondToComponent";
pageName = "UIxAppointmentEditor";
actionName = "tentative";
};
needsaction = {
protectedBy = "RespondToComponent";
pageName = "UIxAppointmentEditor";
actionName = "needsAction";
};
adjust = {
protectedBy = "ModifyComponent";
actionClass = "UIxAppointmentActions";