Monotone-Parent: 01c5e5314c26ef13463ba2e2dec3d854ef793f1d

Monotone-Revision: eea6de6db85c76d95dc3f6d1ca4e05b3fa7fc455

Monotone-Author: wsourdeau@inverse.ca
Monotone-Date: 2010-03-10T21:53:26
Monotone-Branch: ca.inverse.sogo
maint-2.0.2
Wolfgang Sourdeau 2010-03-10 21:53:26 +00:00
parent 3b056b3226
commit 251a538c12
8 changed files with 187 additions and 182 deletions

View File

@ -1,3 +1,29 @@
2010-03-10 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* UI/WebServerResources/SchedulerUI.js (updateCalendarProperties):
the displayname can now also be set by subscribers, in their own
environment.
* UI/Scheduler/UIxCalendarProperties.m (-setCalendarName:): this
action is now unconditional.
(-calendarNameIsDisabled): removed obsolete accessor.
* SoObjects/SOGo/SOGoGCSFolder.m
(-setFolderPropertyValue:inCategory:): new setter for properties
pertaining to the ACTIVE user (who may or may not be the owner).
(-folderPropertyValueInCategory:): getter corollary to the new
method above.
(-_fetchDisplayNameFromSubscriber): new method for getting the
display name of the folder for the active user.
(renameTo:): split the method in an instance for the owner and
another one for subscribers. Respectively: _ownerRenameTo: and
_subscriberRenameTo:. The latter invoke the new methods above.
* SoObjects/Appointments/SOGoAppointmentFolder.m
(_setCalendarProperty:forKey:): replaced method with a new
and more generic accessor from SOGoGCSFolder
"setFolderPropertyValue:inCategory:".
2010-03-09 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* UI/Common/WODirectAction+SOGo.m

View File

@ -278,53 +278,11 @@ static NSNumber *sharedYes = nil;
return objectClass;
}
- (void) _setCalendarProperty: (id) theValue
forKey: (NSString *) theKey
{
SOGoUserSettings *settings;
NSMutableDictionary *calendarSettings, *values;
settings = [[context activeUser] userSettings];
calendarSettings = [settings objectForKey: @"Calendar"];
if (!calendarSettings)
{
calendarSettings = [NSMutableDictionary dictionary];
[settings setObject: calendarSettings
forKey: @"Calendar"];
}
values = [calendarSettings objectForKey: theKey];
if (theValue)
{
if (!values)
{
// Create the property dictionary
values = [NSMutableDictionary dictionary];
[calendarSettings setObject: values forKey: theKey];
}
[values setObject: theValue forKey: [self folderReference]];
}
else if (values)
{
// Remove the property for the calendar
[values removeObjectForKey: [self folderReference]];
if ([values count] == 0)
// Also remove the property dictionary when empty
[calendarSettings removeObjectForKey: theKey];
}
[settings synchronize];
}
- (NSString *) calendarColor
{
SOGoUserSettings *settings;
NSDictionary *colors;
NSString *color;
settings = [[context activeUser] userSettings];
colors = [[settings objectForKey: @"Calendar"]
objectForKey: @"FolderColors"];
color = [colors objectForKey: [self folderReference]];
color = [self folderPropertyValueInCategory: @"FolderColors"];
if (!color)
color = defaultColor;
@ -333,78 +291,63 @@ static NSNumber *sharedYes = nil;
- (void) setCalendarColor: (NSString *) newColor
{
if ([newColor length])
[self _setCalendarProperty: newColor
forKey: @"FolderColors"];
else
[self _setCalendarProperty: nil
forKey: @"FolderColors"];
if (![newColor length])
newColor = nil;
[self setFolderPropertyValue: newColor
inCategory: @"FolderColors"];
}
- (BOOL) showCalendarAlarms
{
SOGoUserSettings *settings;
NSDictionary *values;
id test;
BOOL show = YES;
NSNumber *showAlarms;
settings = [[context activeUser] userSettings];
values = [[settings objectForKey: @"Calendar"]
objectForKey: @"FolderShowAlarms"];
test = [values objectForKey: [self folderReference]];
if (test)
show = [test boolValue];
showAlarms = [self folderPropertyValueInCategory: @"FolderShowAlarms"];
return show;
return (showAlarms ? [showAlarms boolValue] : YES);
}
- (void) setShowCalendarAlarms: (BOOL) new
{
NSNumber *showAlarms;
if (new)
[self _setCalendarProperty: nil
forKey: @"FolderShowAlarms"];
showAlarms = nil;
else
[self _setCalendarProperty: [NSNumber numberWithBool: new]
forKey: @"FolderShowAlarms"];
showAlarms = [NSNumber numberWithBool: NO];
[self setFolderPropertyValue: showAlarms
inCategory: @"FolderShowAlarms"];
}
- (BOOL) showCalendarTasks
{
SOGoUserSettings *settings;
NSDictionary *values;
id test;
BOOL show = YES;
NSNumber *showTasks;
settings = [[context activeUser] userSettings];
values = [[settings objectForKey: @"Calendar"]
objectForKey: @"FolderShowTasks"];
test = [values objectForKey: [self folderReference]];
if (test)
show = [test boolValue];
showTasks = [self folderPropertyValueInCategory: @"FolderShowTasks"];
return show;
return (showTasks ? [showTasks boolValue] : YES);
}
- (void) setShowCalendarTasks: (BOOL) new
{
NSNumber *showTasks;
/* the default value is "YES", so we keep only those with a value of "NO"... */
if (new)
[self _setCalendarProperty: nil
forKey: @"FolderShowTasks"];
showTasks = nil;
else
[self _setCalendarProperty: [NSNumber numberWithBool: new]
forKey: @"FolderShowTasks"];
showTasks = [NSNumber numberWithBool: NO];
[self setFolderPropertyValue: showTasks
inCategory: @"FolderShowTasks"];
}
- (NSString *) syncTag
{
SOGoUserSettings *settings;
NSDictionary *syncTags;
NSString *syncTag;
settings = [[context activeUser] userSettings];
syncTags = [[settings objectForKey: @"Calendar"]
objectForKey: @"FolderSyncTags"];
syncTag = [syncTags objectForKey: [self folderReference]];
syncTag = [self folderPropertyValueInCategory: @"FolderSyncTags"];
if (!syncTag)
syncTag = @"";
@ -413,71 +356,46 @@ static NSNumber *sharedYes = nil;
- (void) setSyncTag: (NSString *) newSyncTag
{
// Check for duplicated tags
SOGoUserSettings *settings;
NSDictionary *syncTags;
NSArray *values;
if ([newSyncTag length])
{
// Check for duplicated tags
SOGoUserSettings *settings;
NSMutableDictionary *calendarSettings;
NSMutableDictionary *syncTags;
NSEnumerator *keysList;
NSString *key;
BOOL hasDuplicate;
hasDuplicate = NO;
settings = [[context activeUser] userSettings];
calendarSettings = [settings objectForKey: @"Calendar"];
if (calendarSettings)
{
syncTags = [calendarSettings objectForKey: @"FolderSyncTags"];
if (syncTags)
{
keysList = [syncTags keyEnumerator];
while ((key = (NSString*)[keysList nextObject])) {
if (![key isEqualToString: [self folderReference]]
&& [(NSString*)[syncTags objectForKey: key] isEqualToString: newSyncTag])
{
hasDuplicate = YES;
break;
}
}
}
}
if (!hasDuplicate)
[self _setCalendarProperty: newSyncTag
forKey: @"FolderSyncTags"];
syncTags = [[settings objectForKey: @"Calendar"]
objectForKey: @"FolderSyncTags"];
values = [syncTags allValues];
if (![values containsObject: newSyncTag])
[self setFolderPropertyValue: newSyncTag
inCategory: @"FolderSyncTags"];
}
else
{
[self _setCalendarProperty: nil
forKey: @"FolderSyncTags"];
}
[self setFolderPropertyValue: nil
inCategory: @"FolderSyncTags"];
}
- (BOOL) synchronizeCalendar
{
SOGoUserSettings *settings;
NSDictionary *values;
id test;
BOOL synchronize = NO;
NSNumber *synchronize;
settings = [[context activeUser] userSettings];
values = [[settings objectForKey: @"Calendar"]
objectForKey: @"FolderSynchronize"];
test = [values objectForKey: [self folderReference]];
if (test)
synchronize = [test boolValue];
synchronize = [self folderPropertyValueInCategory: @"FolderSynchronize"];
return synchronize;
return [synchronize boolValue];
}
- (void) setSynchronizeCalendar: (BOOL) new
{
NSNumber *synchronize;
if (new)
[self _setCalendarProperty: [NSNumber numberWithBool: new]
forKey: @"FolderSynchronize"];
synchronize = [NSNumber numberWithBool: YES];
else
[self _setCalendarProperty: nil
forKey: @"FolderSynchronize"];
synchronize = nil;
[self setFolderPropertyValue: synchronize
inCategory: @"FolderSynchronize"];
}
/* selection */

View File

@ -69,6 +69,10 @@
- (NSString *) folderReference;
- (NSArray *) pathArrayToFolder;
- (void) setFolderPropertyValue: (id) theValue
inCategory: (NSString *) theKey;
- (id) folderPropertyValueInCategory: (NSString *) theKey;
/* lower level fetches */
- (BOOL) nameExistsInFolder: (NSString *) objectName;

View File

@ -209,9 +209,61 @@ static NSArray *childRecordFields = nil;
/* accessors */
- (void) setFolderPropertyValue: (id) theValue
inCategory: (NSString *) theKey
{
SOGoUserSettings *settings;
NSMutableDictionary *folderSettings, *values;
NSString *module;
settings = [[context activeUser] userSettings];
module = [container nameInContainer];
folderSettings = [settings objectForKey: module];
if (!folderSettings)
{
folderSettings = [NSMutableDictionary dictionary];
[settings setObject: folderSettings forKey: module];
}
values = [folderSettings objectForKey: theKey];
if (theValue)
{
if (!values)
{
// Create the property dictionary
values = [NSMutableDictionary dictionary];
[folderSettings setObject: values forKey: theKey];
}
[values setObject: theValue forKey: [self folderReference]];
}
else if (values)
{
// Remove the property for the folder
[values removeObjectForKey: [self folderReference]];
if ([values count] == 0)
// Also remove the property dictionary when empty
[folderSettings removeObjectForKey: theKey];
}
[settings synchronize];
}
- (id) folderPropertyValueInCategory: (NSString *) theKey
{
SOGoUserSettings *settings;
NSDictionary *folderSettings;
id value;
settings = [[context activeUser] userSettings];
folderSettings = [settings objectForKey: [container nameInContainer]];
value = [[folderSettings objectForKey: theKey]
objectForKey: [self folderReference]];
return value;
}
- (void) _setDisplayNameFromRow: (NSDictionary *) row
{
NSString *currentLogin, *ownerLogin, *primaryDN;
NSString *primaryDN;
NSDictionary *ownerIdentity;
primaryDN = [row objectForKey: @"c_foldername"];
@ -223,11 +275,9 @@ static NSArray *childRecordFields = nil;
else
[displayName appendString: primaryDN];
currentLogin = [[context activeUser] login];
ownerLogin = [self ownerInContext: context];
if (![currentLogin isEqualToString: ownerLogin])
if (!activeUserIsOwner)
{
ownerIdentity = [[SOGoUser userWithLogin: ownerLogin roles: nil]
ownerIdentity = [[SOGoUser userWithLogin: owner]
primaryIdentity];
[displayName
appendString: [ownerIdentity keysWithFormat:
@ -236,7 +286,10 @@ static NSArray *childRecordFields = nil;
}
}
- (void) _fetchDisplayName
/* This method fetches the display name defined by the owner, but is also the
fallback when a subscriber has not redefined the display name yet in his
environment. */
- (void) _fetchDisplayNameFromOwner
{
GCSChannelManager *cm;
EOAdaptorChannel *fc;
@ -265,10 +318,25 @@ static NSArray *childRecordFields = nil;
}
}
- (void) _fetchDisplayNameFromSubscriber
{
displayName = [self folderPropertyValueInCategory: @"FolderDisplayNames"];
[displayName retain];
}
- (NSString *) displayName
{
if (!displayName)
[self _fetchDisplayName];
{
if (activeUserIsOwner)
[self _fetchDisplayNameFromOwner];
else
{
[self _fetchDisplayNameFromSubscriber];
if (!displayName)
[self _fetchDisplayNameFromOwner];
}
}
return displayName;
}
@ -335,24 +403,15 @@ static NSArray *childRecordFields = nil;
- (NSException *) setDavDisplayName: (NSString *) newName
{
NSException *error;
NSArray *currentRoles;
currentRoles = [[context activeUser] rolesForObject: self
inContext: context];
if ([currentRoles containsObject: SoRole_Owner])
if ([newName length])
{
if ([newName length])
{
[self renameTo: newName];
error = nil;
}
else
error = [NSException exceptionWithHTTPStatus: 400
reason: @"Empty string"];
[self renameTo: newName];
error = nil;
}
else
error = [NSException exceptionWithHTTPStatus: 403
reason: @"Modification denied."];
error = [NSException exceptionWithHTTPStatus: 400
reason: @"Empty string"];
return error;
}
@ -437,23 +496,20 @@ static NSArray *childRecordFields = nil;
return error;
}
- (void) renameTo: (NSString *) newName
- (void) _ownerRenameTo: (NSString *) newName
{
GCSChannelManager *cm;
EOAdaptorChannel *fc;
NSURL *folderLocation;
NSString *sql;
#warning SOGoFolder should have the corresponding method
[displayName release];
displayName = nil;
cm = [GCSChannelManager defaultChannelManager];
folderLocation
= [[GCSFolderManager defaultFolderManager] folderInfoLocation];
fc = [cm acquireOpenChannelForURL: folderLocation];
if (fc)
{
#warning GDLContentStore should provide methods for renaming folders
sql
= [NSString stringWithFormat: (@"UPDATE %@ SET c_foldername = '%@'"
@" WHERE c_path = '%@'"),
@ -467,6 +523,25 @@ static NSArray *childRecordFields = nil;
}
}
- (void) _subscriberRenameTo: (NSString *) newName
{
if ([newName length])
[self setFolderPropertyValue: newName
inCategory: @"FolderDisplayNames"];
}
- (void) renameTo: (NSString *) newName
{
#warning SOGoFolder should have the corresponding method
[displayName release];
displayName = nil;
if (activeUserIsOwner)
[self _ownerRenameTo: newName];
else
[self _subscriberRenameTo: newName];
}
- (NSArray *) fetchContentObjectNames
{
NSArray *records, *names;

View File

@ -34,7 +34,6 @@
- (NSString *) calendarName;
- (void) setCalendarName: (NSString *) newName;
- (NSString *) calendarNameIsDisabled;
- (NSString *) calendarColor;
- (void) setCalendarColor: (NSString *) newColor;

View File

@ -56,22 +56,7 @@
- (void) setCalendarName: (NSString *) newName
{
NSString *login;
login = [[context activeUser] login];
if ([login isEqualToString: [calendar ownerInContext: context]])
[calendar renameTo: newName];
}
- (NSString *) calendarNameIsDisabled
{
NSString *login;
login = [[context activeUser] login];
return ([login isEqualToString: [calendar ownerInContext: context]]
? @"false" : @"true");
[calendar renameTo: newName];
}
- (NSString *) calendarColor

View File

@ -19,7 +19,6 @@
<div><span class="label"><var:string label:value="Name:"/></span
><span class="content"><input type="text"
name="calendarName" id="calendarName"
var:disabled="calendarNameIsDisabled"
class="textField"
var:value="calendarName"
/></span></div>

View File

@ -2154,13 +2154,12 @@ function updateCalendarProperties(calendarID, calendarName, calendarColor) {
if (idParts[0] != UserLogin)
nodeID = "/" + idParts[0].asCSSIdentifier() + "_" + folderName;
else {
else
nodeID = "/" + folderName;
// log("nodeID: " + nodeID);
var calendarNode = $(nodeID);
var childNodes = calendarNode.childNodes;
childNodes[childNodes.length-1].nodeValue = calendarName;
}
var calendarNode = $(nodeID);
var childNodes = calendarNode.childNodes;
childNodes[childNodes.length-1].nodeValue = calendarName;
appendStyleElement(nodeID, calendarColor);
}