Skip to content

/ Zope / gocept svn checkins / Archive / 2009 / 2009-02 / SVN: r29187 - gocept.webmail-buildout/trunk/profiles

[ << ] [ >> ]

[ SVN: r29148 - in gocept.async: . branches tags ... ] [ SVN: r29188 - AlphaFlow/branches/nilo-alf-plone32 ... ]

SVN: r29187 - gocept.webmail-buildout/trunk/profiles
Wolfgang Schnerring <ws(at)gocept.com>
2009-02-13 10:10:11 [ FULL ]
Author: wosc
Date: Fri Feb 13 10:10:09 2009
New Revision: 29187

Log:
whitespace



Modified:
   gocept.webmail-buildout/trunk/profiles/dev.cfg

Modified: gocept.webmail-buildout/trunk/profiles/dev.cfg
==============================================================================
--- gocept.webmail-buildout/trunk/profiles/dev.cfg	(original)
+++ gocept.webmail-buildout/trunk/profiles/dev.cfg	Fri Feb 13 10:10:09 2009
(at)(at) -55,7 +55,7 (at)(at)
     http://www.zope.org/Products/CMF/CMF-1.5.4/CMF-1.5.4.tar.gz
     http://codespeak.net/z3/five/release/Five-1.4.4.tgz
 nested-packages = CMF-1.5.4.tar.gz
-version-suffix-packages = 
+version-suffix-packages =
 
 [instance]
 recipe = plone.recipe.zope2instance
(at)(at) -69,7 +69,7 (at)(at)
     gocept.restmail
     gocept.webmail
 
-products = ${productdistros:location} 
+products = ${productdistros:location}
 
 [zopepy]
 recipe = zc.recipe.egg
(at)(at) -117,7 +117,7 (at)(at)
       prefix = ""
       inbox = yes
     }
-    
+
 mode = 664
 
 [dovecotpasswd]
(at)(at) -131,7 +131,7 (at)(at)
 
 [fakezope2eggs]
 recipe = affinitic.recipe.fakezope2eggs
-additional-fake-eggs = 
+additional-fake-eggs =
     ZODB3
     mechanize
     ClientForm

SVN: r29197 - gocept.webmail/trunk/gocept/webmail/browser/resources
Sebastian Wehrmann <sw(at)gocept.com>
2009-02-13 15:13:20 [ FULL ]
Author: sweh
Date: Fri Feb 13 15:13:17 2009
New Revision: 29197

Log:
- Regain compatability with Internet Explorer 7. (bug #4675)



Modified:
   gocept.webmail/trunk/gocept/webmail/browser/resources/connection.js
   gocept.webmail/trunk/gocept/webmail/browser/resources/management.js
   gocept.webmail/trunk/gocept/webmail/browser/resources/message.js
   gocept.webmail/trunk/gocept/webmail/browser/resources/runner.js
   gocept.webmail/trunk/gocept/webmail/browser/resources/utilities.js
   gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js
   gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js

Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/connection.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/connection.js	(original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/connection.js	Fri Feb
13 15:13:17 2009
(at)(at) -23,16 +23,19 (at)(at)
                     if (on_success) {
                         on_success(result);
                     }
-                },
+                }
             };
 
             request.method = method;
             request.url = url;
             request.callbacks = callbacks;
             request.file_upload = false;
-        },
+        }
     });
+});
 
+
+Def(function() {
     
     YAHOO.gocept.webmailer.Connection = Class({
         constructor: function() {
(at)(at) -63,10 +66,10 (at)(at)
                 };
                 for (var key in request.headers) {
                     YAHOO.util.Connect.initHeader(key, request.headers[key]);
-                }
+                };
                 if (request.form) {
                     YAHOO.util.Connect.setForm(request.form,
request.file_upload)
-                }
+                };
                 connection.tx_current = YAHOO.util.Connect.asyncRequest(
                     request.method, request.url, request.callbacks,
                     request.data);
(at)(at) -99,7 +102,7 (at)(at)
             request.form = form;
             request.file_upload = true;
             this._schedule_request(request);
-        },
-      });
+        }
+    });
 
 });

Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/management.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/management.js	(original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/management.js	Fri Feb
13 15:13:17 2009
(at)(at) -22,7 +22,7 (at)(at)
     YAHOO.gocept.webmailer.open_manage_accounts = function() {
         base_url = document.URL
         if (base_url.match("/$")!="/") { // url doesn't end with "/"?
-            base_url = base_url + "/"
+            base_url = base_url + "/";
         }
         document.App.lastwindow = window.open(
             base_url + 'management', '',

Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/message.js
==============================================================================
--- gocept.webmail/trunk/gocept/webmail/browser/resources/message.js	(original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/message.js	Fri Feb 13
15:13:17 2009
(at)(at) -1,4 +1,16 (at)(at)
 //
+// PATCH: Added to ensure only tasks with non-zero iterations are added 
+// refer to http://yuilibrary.com/projects/yui2/ticket/2286608
+//
+YAHOO.util.Chain.prototype.add = function(c) {
+
+    if (c.iterations !== 0) { 
+        this.q.push(c);
+        return this;
+    };
+};
+
+//
 // List of messages
 //
 Def(function(){
(at)(at) -18,26 +30,24 (at)(at)
 
         rowFormatter: function(elTr, oRecord) {
             var flags = oRecord.getData('flags');
-            if (!flags)
+            if (!flags) {
                 return true;
+            };
             var seen = false;
             for (i=0; i<flags.length; i++) {
                 if (flags[i] == '\\Seen') {
                     seen = true;
-                }
-                else if (flags[i] == '\\Recent') {
+                } else if (flags[i] == '\\Recent') {
                     YAHOO.util.Dom.addClass(elTr, 'recent');
-                }
-                else if (flags[i] == '\\Answered') {
+                } else if (flags[i] == '\\Answered') {
                     YAHOO.util.Dom.addClass(elTr, 'answered');
-                }
-                else if (flags[i] == '\\Flagged') {
+                } else if (flags[i] == '\\Flagged') {
                     YAHOO.util.Dom.addClass(elTr, 'flagged');
-                }
-            }
+                };
+            };
             if (!seen) {
                 YAHOO.util.Dom.addClass(elTr, 'unseen');
-            }
+            };
             return true;
         },
 
(at)(at) -53,8 +63,7 (at)(at)
             document.App.preview_pane.reset();
 
             config = YAHOO.gocept.webmailer['list-'+list_type](url);
-
-            table = new YAHOO.widget.DataTable(
+            table = new YAHOO.widget.ScrollingDataTable(
                 document.App.units.message_list.body,
                 config.columns,
                 config.source,
(at)(at) -74,12 +83,13 (at)(at)
                 message.canDelete = config.canDelete;
                 message.canBeRaw = config.canBeRaw;
                 var classnames = event.el.className.split(" ");
-                for (i=0; i<classnames.length; i++)
-                    if (classnames[i] == 'unseen')
+                for (i=0; i<classnames.length; i++) {
+                    if (classnames[i] == 'unseen') {
                         YAHOO.util.Dom.removeClass(event.el, 'unseen');
+                    };
+                };
                 return document.App.preview_pane.load(message);
             });
-            table.subscribe("cellMousedownEvent",table.onEventSelectRow);
             table.subscribe('cellMousedownEvent', function(event) {
                 var element =
table.getTrEl(YAHOO.util.Event.getTarget(event));
                 ddRow = new YAHOO.util.DDProxy(element.id);
(at)(at) -88,12 +98,12 (at)(at)
                 ddRow.onDragOver = function(ev, id) {
                     element = YAHOO.util.Dom.getChildren(id);
                     YAHOO.util.Dom.addClass(element, 'DDOver');
-                }
+                };
 
                 ddRow.onDragOut = function(ev, id) {
                     element = YAHOO.util.Dom.getChildren(id);
                     YAHOO.util.Dom.removeClass(element, 'DDOver');
-                }
+                };
 
                 ddRow.onDragDrop = function(ev, id) {
                     var node = document.App.tree.id_to_node[id]
(at)(at) -102,7 +112,7 (at)(at)
                     if (ev.ctrlKey) {
                         method = '/(at)(at)copy';
                         reload = false;
-                    }
+                    };
                     url = table.getRecord(this.id).getData().url + method;
                     document.Connection.post(
                         url, {folder_url: node.url}, function(result) {
(at)(at) -157,7 +167,8 (at)(at)
           if (url) {
               url = url + '/(at)(at)messages?';
           }
-          data_source = YAHOO.gocept.webmailer.get_data_source(url,
responseSchema);
+          data_source = YAHOO.gocept.webmailer.get_data_source(url,
+                                                              
responseSchema);
           config = new Object();
           config.source = data_source;
           config.columns = columns;
(at)(at) -211,20 +222,24 (at)(at)
             //
             // Register the message-context menu items
             //
-            preview_pane.reply_button = document.App.menu.addMenuItem('Reply',
function() {
-               
document.Connection.post(preview_pane.message.url+'/(at)(at)reply', null,
function(result) {
-                    var message = YAHOO.lang.JSON.parse(result.responseText);
-                    YAHOO.gocept.webmailer.open_composer(message['url']);
+            preview_pane.reply_button = document.App.menu.addMenuItem('Reply',
+                function() {
+                   
document.Connection.post(preview_pane.message.url+'/(at)(at)reply',
+                        null, function(result) {
+                            var message =
YAHOO.lang.JSON.parse(result.responseText);
+                           
YAHOO.gocept.webmailer.open_composer(message['url']);
+                    });
                 });
-            });
-            preview_pane.reply_button.cfg.setProperty('disabled', true);
-            preview_pane.edit_button = document.App.menu.addMenuItem('Edit',
function() {
-               
YAHOO.gocept.webmailer.open_composer(preview_pane.message.url);
-            });
-            preview_pane.edit_button.cfg.setProperty('disabled', true);
-            preview_pane.delete_button =
document.App.menu.addMenuItem('Delete', function() {
-               
document.Connection.post(preview_pane.message.url+'/(at)(at)delete', null,
function(result) {
-                    document.App.message_list.reload()
+                preview_pane.reply_button.cfg.setProperty('disabled', true);
+                preview_pane.edit_button =
document.App.menu.addMenuItem('Edit',
+                    function() {
+                       
YAHOO.gocept.webmailer.open_composer(preview_pane.message.url);
+                });
+                preview_pane.edit_button.cfg.setProperty('disabled', true);
+                preview_pane.delete_button =
document.App.menu.addMenuItem('Delete',
+                    function() {
+                       
document.Connection.post(preview_pane.message.url+'/(at)(at)delete', null,
function(result) {
+                        document.App.message_list.reload()
                 });
             });
             preview_pane.delete_button.cfg.setProperty('disabled', true);

Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/runner.js
==============================================================================
--- gocept.webmail/trunk/gocept/webmail/browser/resources/runner.js	(original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/runner.js	Fri Feb 13
15:13:17 2009
(at)(at) -12,8 +12,6 (at)(at)
     //
 
     function generic_init() {
-        YAHOO.util.Event.throwErrors = true;
-        // YAHOO.widget.Logger.enableBrowserConsole();
         document.Connection = new YAHOO.gocept.webmailer.Connection();
         document.App = new YAHOO.gocept.webmailer.App();
     };
(at)(at) -58,6 +56,7 (at)(at)
         require_modules.push(module_name);
     };
 
+
     loader.require(require_modules);
     loader.insert();
 });

Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/utilities.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/utilities.js	(original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/utilities.js	Fri Feb
13 15:13:17 2009
(at)(at) -46,6 +46,7 (at)(at)
     scope();
 };
 
+
 Def(function() {
     YAHOO.gocept.webmailer.get_data_source = function(url, schema) {
         if (!url) {
(at)(at) -62,5 +63,6 (at)(at)
         };
         data_source.responseSchema.resultsList = 'result';
         return data_source;
-    }
+    };
 });
+

Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js	(original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js	Fri
Feb 13 15:13:17 2009
(at)(at) -76,7 +76,6 (at)(at)
                 app.tree = new YAHOO.gocept.webmailer.Tree(
                     document.App.units.tree.body);
             });
-        },
-
+        }
     });
 });

Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js	(original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js	Fri Feb
13 15:13:17 2009
(at)(at) -24,8 +24,7 (at)(at)
 //
 Def(function() {
 
-    YAHOO.gocept.webmailer.onFolderSelected = new YAHOO.util.CustomEvent(
-        "onFolderSelected");
+    YAHOO.gocept.webmailer.onFolderSelected = new
YAHOO.util.CustomEvent("onFolderSelected");
 
     var responseSchema = {
             resultsList: "",
(at)(at) -38,7 +37,7 (at)(at)
     YAHOO.gocept.webmailer.Tree = Class({
         constructor: function(treebody) {
             var tree = this;
-            tree.id_to_node = new Array();
+            tree.id_to_node = [];
             tree.treeview = new YAHOO.widget.TreeView(treebody);
             tree.treeview.setDynamicLoad(function(node)
{tree.loadNodeData(node);});
             var root = tree.treeview.getRoot();
(at)(at) -78,7 +77,7 (at)(at)
                     }
                     this.fillFolders(node, subfolders);
                     node.loadComplete();
-                    this.setDragDropTargets()
+                    this.setDragDropTargets();
                     // We actually would like to automate this, but don't know
                     // how right now:
                 },
(at)(at) -89,7 +88,7 (at)(at)
                 },
                 scope: this,
                 argument: encodeURI(node.label)
-            }
+            };
             if (node == this.treeview.getRoot()) {
                 // The root node loads the list of accounts, not folders.
                 var url = "(at)(at)children";
(at)(at) -97,8 +96,7 (at)(at)
                 var url = node.url + "(at)(at)folders";
             };
 
-            YAHOO.gocept.webmailer.get_data_source(url, responseSchema).
-                sendRequest('', callback);
+            YAHOO.gocept.webmailer.get_data_source(url,
responseSchema).sendRequest('', callback);
         },
 
         fillFolders: function(node, children) {
(at)(at) -115,17 +113,12 (at)(at)
         },
 
         setDragDropTargets: function() {
-            var q = "//td[contains((at)class, 'ygtvcontent')]";
-            iterator = document.evaluate(q, document, null,
-                                     XPathResult.UNORDERED_NODE_ITERATOR_TYPE,
-                                     null);
-            var thisNode = iterator.iterateNext();
-            while (thisNode) {
-                if (this.id_to_node[thisNode.id].list_type == 'inbox') {
-                    new YAHOO.util.DDTarget(thisNode);
-                }
-                thisNode = iterator.iterateNext();
-            }
+            for (var key in this.id_to_node) {
+                var thisNode = this.id_to_node[key];
+                if (thisNode.list_type == 'inbox') {
+                    new YAHOO.util.DDTarget(key);
+                };
+            };
         }
     });
 });

SVN: r29205 - gocept.webmail/trunk/gocept/webmail/browser/resources
Sebastian Wehrmann <sw(at)gocept.com>
2009-02-16 11:52:56 [ FULL ]
Author: sweh
Date: Mon Feb 16 11:52:55 2009
New Revision: 29205

Log:
- Enable tree toggle for accounts.



Modified:
   gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js

Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js	(original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js	Mon Feb
16 11:52:55 2009
(at)(at) -53,9 +53,12 (at)(at)
             // Load dynamic tree entries
             root.foldersUrl = '';
             tree.loadNodeData(root);
-            tree.treeview.subscribe('clickEvent', function(node) {
+            tree.treeview.subscribe('clickEvent', function(event) {
                 // do not expand the node
-                return false;
+                if (event.node.list_type == "inbox") {
+                    return false;
+                }
+                return true;
             });
             tree.treeview.subscribe('labelClick', function(node) {
                 tree.selected_node = node;

SVN: r29206 - gocept.webmail/trunk/gocept/webmail/browser/resources/styles
Thomas Lotze <tl(at)gocept.com>
2009-02-16 14:25:32 [ FULL ]
Author: thomas
Date: Mon Feb 16 14:25:31 2009
New Revision: 29206

Log:
don't break YUI's width calculation, sort of fixes horizontal scrolling issue


Modified:
   gocept.webmail/trunk/gocept/webmail/browser/resources/styles/webmail.css

Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/styles/webmail.css
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/styles/webmail.css	(original)
+++
gocept.webmail/trunk/gocept/webmail/browser/resources/styles/webmail.css	Mon
Feb 16 14:25:31 2009
(at)(at) -18,11 +18,6 (at)(at)
   cursor: pointer;
 }
 
-.yui-skin-sam .yui-dt-hd table,
-.yui-skin-sam .yui-dt-bd table {
-    width: 100%;
-}
-
 html.webmailer .yui-layout-bd dl dt,
 html.webmailer .yui-layout-bd dl dd {
     display: block;

SVN: r29207 - in gocept.lms/trunk: . profiles
Christian Theune <ct(at)gocept.com>
2009-02-16 15:05:46 [ FULL ]
Author: ctheune
Date: Mon Feb 16 15:05:45 2009
New Revision: 29207

Log:
move to released version of gocept.reference. fix all versions.



Modified:
   gocept.lms/trunk/   (props changed)
   gocept.lms/trunk/profiles/base.cfg
   gocept.lms/trunk/profiles/versions.cfg

Modified: gocept.lms/trunk/profiles/base.cfg
==============================================================================
--- gocept.lms/trunk/profiles/base.cfg	(original)
+++ gocept.lms/trunk/profiles/base.cfg	Mon Feb 16 15:05:45 2009
(at)(at) -1,5 +1,5 (at)(at)
 [buildout]
-develop = . gocept.reference/
+develop = . 
 parts = eggbasket app data zodb zeo lms test
     runners scheduler checker notifier syncer
     ctl
(at)(at) -7,7 +7,7 (at)(at)
 # eggs will be installed in the default buildout location
 # (see .buildout/default.cfg in your home directory)
 # unless you specify an eggs-directory option here.
-
+allow-picked-versions = false
 versions = versions
 
 [app]

Modified: gocept.lms/trunk/profiles/versions.cfg
==============================================================================
--- gocept.lms/trunk/profiles/versions.cfg	(original)
+++ gocept.lms/trunk/profiles/versions.cfg	Mon Feb 16 15:05:45 2009
(at)(at) -110,7 +110,22 (at)(at)
 zope.thread = 3.4
 zope.traversing = 3.4.0
 zope.viewlet = 3.4.2
-
+setuptools = 0.6c9
+zc.zdaemonrecipe = 0.2
+gocept.ctl = 0.9.1
+zope.sendmail = 3.5.1
+zc.sourcefactory = 0.4.0
+zc.relation = 1.0
+zc.queue = 1.1
+z3c.schema = 0.6.0
+hurry.query = 0.9.2
+decorator = 3.0.1
+zope.browser = 0.5.0
+zope.site = 3.6.0
+zope.container = 3.7.1
+transaction = 1.0a1
+zope.broken = 3.5.0
+gocept.reference = 0.5.2
 
 # Here we pin the recipes used in the buildout.cfg
 lovely.recipe = 0.3.1b5

SVN: r29217 - gocept.webmail/trunk/gocept/webmail/browser/resources/styles
Christian Theune <ct(at)gocept.com>
2009-02-17 13:42:45 [ FULL ]
Author: ctheune
Date: Tue Feb 17 13:42:44 2009
New Revision: 29217

Log:
Clean up formatting of header block (float clearing and padding).

Reset font color.



Modified:
   gocept.webmail/trunk/gocept/webmail/browser/resources/styles/webmail.css

Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/styles/webmail.css
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/styles/webmail.css	(original)
+++
gocept.webmail/trunk/gocept/webmail/browser/resources/styles/webmail.css	Tue
Feb 17 13:42:44 2009
(at)(at) -1,8 +1,7 (at)(at)
 body {
-  background-color: #ffffff;
-  font-family: Verdana, "Bitstream Vera Sans", sans-serif;
-  font-size: 11px;
-  color: #265b72;
+    background-color: #ffffff;
+    font-family: Verdana, "Bitstream Vera Sans", sans-serif;
+    font-size: 11px;
 }
 
 #customization {
(at)(at) -10,41 +9,34 (at)(at)
 }
 
 html.webmailer {
-  position:absolute;
-  width:100%;
+    position: absolute;
+    width: 100%;
 }
 
 #maillisting li {
-  cursor: pointer;
-}
-
-html.webmailer .yui-layout-bd dl dt,
-html.webmailer .yui-layout-bd dl dd {
-    display: block;
-    color: black;
+    cursor: pointer;
 }
 
 html.webmailer .yui-layout-bd dl dt {
-    width:7em;
-    padding-right:0.5em;
-    font-weight:bold;
-    text-align:right;
-    float:left;
-    clear:both;
+    width: 7em;
+    padding-right: 0.5em;
+    font-weight: bold;
+    text-align: right;
+    float: left;
+    clear: left;
 }
 
 html.webmailer .yui-layout-bd dl dd {
+    float:left;
 }
 
 html.webmailer .yui-layout-bd dl {
     padding:1em;
-    height:12ex;
 }
 
 html.webmailer .yui-layout-bd div.messagepart {
     clear:both;
     background-color: white;
-    color: black;
     margin:1em;
     padding:1em;
     border:1px solid #BBB;
(at)(at) -104,4 +96,10 (at)(at)
 
 .yui-layout-content {
     display: none;
-}
\ No newline at end of file
+}
+
+/* Helpers */
+
+.novisclear {
+    clear: both;
+}

SVN: r29219 - gocept.webmail/trunk/gocept/webmail/browser/resources
Christian Theune <ct(at)gocept.com>
2009-02-17 15:27:33 [ FULL ]
Author: ctheune
Date: Tue Feb 17 15:27:31 2009
New Revision: 29219

Log:
- Instead of holding references to layout units on the application, hold
  references to the DOM nodes.

- Make the mail list batched and paginated (client side sorting and
  batching).




Modified:
   gocept.webmail/trunk/gocept/webmail/browser/resources/composer-main.js
   gocept.webmail/trunk/gocept/webmail/browser/resources/management-main.js
   gocept.webmail/trunk/gocept/webmail/browser/resources/message.js
   gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js
   gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js

Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/composer-main.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/composer-main.js	(original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/composer-main.js	Tue
Feb 17 15:27:31 2009
(at)(at) -3,17 +3,18 (at)(at)
 //
 
 Def(function() {
-
     YAHOO.gocept.webmailer.App = Class({
         constructor: function() {
             var app = this;
             // Bind early.
             document.App = app;
-            app.units = new Object();
 
-            //
+            // Hold DOM nodes with well-known names for specific
+            // purposes within the app. E.g. the element containing the
+            // message list.
+            app.domNodes = new Object();
+
             // Setup the static screen layouts
-            // 
             app.layout = new YAHOO.widget.Layout({
                 units: [
                     { position: 'top', height: 23,
(at)(at) -24,19 +25,18 (at)(at)
                       scroll: true,
                       body: 'composer-bottom'}]});
             app.layout.on('render', function() {
-                app.units.attachments = app.layout.getUnitByPosition(
+                app.domNodes.attachments = app.layout.getUnitByPosition(
                     'bottom').body;
-                app.units.composer = app.layout.getUnitByPosition(
+                app.domNodes.composer = app.layout.getUnitByPosition(
                     'center').body;
                 app.composer = new YAHOO.gocept.webmailer.Composer(
                     draft_url, profile_url);
-                app.units.menu = app.layout.getUnitByPosition('top');
+                app.domNodes.menu = app.layout.getUnitByPosition('top').body;
                 app.menu = new YAHOO.gocept.webmailer.ComposerMenu();
             });
             app.layout.render();
         }
     });
-
 });
 
 Def(function() {
(at)(at) -45,7 +45,7 (at)(at)
         constructor: function() {
             var menu = this;
             menu.menubar = new YAHOO.widget.MenuBar("composer-main-menu");
-            menu.menubar.render(document.App.units.menu.body);
+            menu.menubar.render(document.App.domNodes.menu);
             menu.addMenuItem('Save', function () {
                 document.App.composer.save_draft();
             });
(at)(at) -60,7 +60,7 (at)(at)
                 text: label, 
                 onclick: { fn: callback }
                 });
-            this.menubar.render(document.App.units.menu.body);
+            this.menubar.render(document.App.domNodes.menu);
             return new_item;
         }
 

Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/management-main.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/management-main.js	(original)
+++
gocept.webmail/trunk/gocept/webmail/browser/resources/management-main.js	Tue
Feb 17 15:27:31 2009
(at)(at) -9,11 +9,9 (at)(at)
             var app = this;
             // Bind early.
             document.App = app;
-            app.units = new Object();
+            app.domNodes = new Object();
 
-            //
             // Setup the static screen layouts
-            // 
             app.layout = new YAHOO.widget.Layout({
                 units: [
                     { position: 'top',
(at)(at) -23,12 +21,11 (at)(at)
                     { position: 'bottom',
                           height: 250, resize: true, body: ''}]});
             app.layout.on('render', function() {
-                app.units = new Object();
-                app.units.menu = app.layout.getUnitByPosition('top');
-                app.units.identity_list =
app.layout.getUnitByPosition('center').body;
-                app.units.identity_edit_form =
app.layout.getUnitByPosition('bottom').body;
+                app.domNodes.menu = app.layout.getUnitByPosition('top').body;
                 app.menu = new YAHOO.gocept.webmailer.ManagementMenu();
+                app.domNodes.identity_list =
app.layout.getUnitByPosition('center').body;
                 app.identity_list = new YAHOO.gocept.webmailer.IdentityList();
+                app.domNodes.identity_edit_form =
app.layout.getUnitByPosition('bottom').body;
             });
             app.layout.render();
         },
(at)(at) -55,7 +52,7 (at)(at)
         },
 
         reset: function() {
-            document.App.units.identity_edit_form.innerHTML = "";
+            document.App.domNodes.identity_edit_form.innerHTML = "";
             document.App.menu.delete_button.cfg.setProperty('disabled', true);
             document.App.selected_identity = null;
         }
(at)(at) -69,7 +66,7 (at)(at)
         constructor: function() {
             var menu = this;
             menu.menubar = new YAHOO.widget.MenuBar("management-main-menu");
-            menu.menubar.render(document.App.units.menu.body);
+            menu.menubar.render(document.App.domNodes.menu);
             menu.addMenuItem('New', document.App.loadIdentityEditForm);
             menu.delete_button = menu.addMenuItem('Delete', function() {
                   var url = document.App.selected_identity.url +
'/(at)(at)delete';
(at)(at) -90,7 +87,7 (at)(at)
                 text: label, 
                 onclick: { fn: callback }
                 });
-            this.menubar.render(document.App.units.menu.body);
+            this.menubar.render(document.App.domNodes.menu);
             return new_item;
         }
 
(at)(at) -141,11 +138,11 (at)(at)
             data_source.responseSchema = responseSchema;
             // Workaround for YUI bug # 214964
             data_source.doBeforeParseData = function (oRequest, oFullResponse,
oCallback) {
-             	return {result:oFullResponse};
+                return {result:oFullResponse};
             };
             data_source.responseSchema.resultsList = 'result';
             table = new YAHOO.widget.DataTable(
-                document.App.units.identity_list,
+                document.App.domNodes.identity_list,
                 columns,
                 data_source,
                 {scrollable: true, height:"200px"});
(at)(at) -188,7 +185,7 (at)(at)
     YAHOO.gocept.webmailer.IdentityEditForm = Class({
         constructor: function() {
             var editform = this;
-            document.App.units.identity_edit_form.innerHTML = editform_html;
+            document.App.domNodes.identity_edit_form.innerHTML =
editform_html;
             YAHOO.util.Event.addListener(
                 editform.getControl('identitySave'), 'click',
editform.save_identity, editform, true);
         },

Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/message.js
==============================================================================
--- gocept.webmail/trunk/gocept/webmail/browser/resources/message.js	(original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/message.js	Tue Feb 17
15:27:31 2009
(at)(at) -18,11 +18,12 (at)(at)
     YAHOO.gocept.webmailer.MessageList = Class({
         constructor: function() {
             var message_list = this;
-            message_list.load({foldersUrl: '', list_type: 'inbox'});
 
-            document.App.units.message_list.on('resize', function(event) {
-                message_list.adjust_size();
-            });
+            var paginator_node = document.createElement('div');
+            document.App.domNodes.message_list_paginator = paginator_node;
+           
document.App.domNodes.message_list.parentNode.insertBefore(paginator_node,
document.App.domNodes.message_list);
+
+            message_list.load({foldersUrl: '', list_type: 'inbox'});
 
             YAHOO.gocept.webmailer.onFolderSelected.subscribe(
                 function(type, arg){ message_list.load(arg[0]); });
(at)(at) -63,12 +64,15 (at)(at)
             document.App.preview_pane.reset();
 
             config = YAHOO.gocept.webmailer['list-'+list_type](url);
-            table = new YAHOO.widget.ScrollingDataTable(
-                document.App.units.message_list.body,
+
+            table = new YAHOO.widget.DataTable(
+                document.App.domNodes.message_list,
                 config.columns,
                 config.source,
-                {scrollable: true, renderLoopSize: 10, height:"200px",
-                 formatRow: this.rowFormatter});
+                {formatRow: this.rowFormatter,
+                 paginator: new YAHOO.widget.Paginator({
+                    containers: document.App.domNodes.message_list_paginator,
+                    rowsPerPage: 10})});
             message_list.table = table;
             table.set("selectionMode", "standard");
             table.subscribe("rowClickEvent", table.onEventSelectRow);
(at)(at) -126,7 +130,6 (at)(at)
                 };
 
             });
-            message_list.adjust_size();
         },
 
         reload: function() {
(at)(at) -135,16 +138,7 (at)(at)
             message_list.load(node);
             return true;
         },
-
-        adjust_size: function(){
-            // XXX magic number
-            target =
(document.App.units.message_list.getSizes().body.h-30)+'px';
-            table.set('height', target);
-            target = (document.App.units.message_list.getSizes().body.w)+'px';
-            table.set('width', target);
-        }
     });
-
 });
 
 //
(at)(at) -256,7 +250,7 (at)(at)
             // Load the message content and display it
             document.Connection.get(message.url+'/(at)(at)render',
function(result) {
                 var message_parts =
YAHOO.lang.JSON.parse(result.responseText);
-                document.App.units.preview_pane.body.innerHTML = (
+                document.App.domNodes.preview_pane.innerHTML = (
                     message_parts['header'] +
                     message_parts['body'] +
                     message_parts['footer']);
(at)(at) -286,7 +280,7 (at)(at)
             preview_pane.loading();
             document.Connection.get(message.url+'/(at)(at)raw',
function(result) {
                 var result = YAHOO.lang.JSON.parse(result.responseText);
-                document.App.units.preview_pane.body.innerHTML =
result['raw'];
+                document.App.domNodes.preview_pane.innerHTML = result['raw'];
                 preview_pane.raw_button.cfg.setProperty('text', 'View
normal');
                 preview_pane.raw_button.cfg.setProperty('disabled', false);
                 document.App.preview_pane.raw_button.cfg.setProperty(
(at)(at) -297,13 +291,12 (at)(at)
 
         loading: function() {
             var preview_pane = this;
-            document.App.units.preview_pane.body.innerHTML = '<img
src="++resource++gocept.webmail/images/loading.gif" style="position: relative;
left: 48%; top: 40%;" />';
+            document.App.domNodes.preview_pane.innerHTML = '<img
src="++resource++gocept.webmail/images/loading.gif" style="position: relative;
left: 48%; top: 40%;" />';
         },
 
         reset: function() {
             var preview_pane = this;
             preview_pane.message = null;
-            document.App.units.preview_pane.body.innerHTML = '<div
align="center">Um eine Vorschau in diesem Fenster zu erhalten, klicken Sie
auf die entsprechende Mail in der obigen Liste.</div>';
 
             // Deactivate message-context menu items.
             preview_pane.reply_button.cfg.setProperty('disabled', true);

Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js	(original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js	Tue
Feb 17 15:27:31 2009
(at)(at) -7,9 +7,9 (at)(at)
         constructor: function() {
             var app = this;
             document.App = app;
-            //
+            app.domNodes = new Object();
+
             // Setup the static screen layouts
-            // 
             app.outer_layout = new YAHOO.widget.Layout(
                 {units: [
                     {position: 'top',
(at)(at) -23,34 +23,26 (at)(at)
                     app.outer_layout.getUnitByPosition('center').body,
                     {units: [
                         { position: 'top',
-                              height: 45, body: ''},
+                              height: 30, body: ''},
                         { position: 'left',
                               width: 200, resize: true, body: '',
                               scroll: true},
-                        { position: 'center',
+                        { position: 'center', scroll: true,
                           body: ''}]});
 
                 app.layout.on('render', function() {
-                    app.center_layout = new YAHOO.widget.Layout(
-                        app.layout.getUnitByPosition('center').body,
-                        {units: [
-                            {position: 'top',
-                                height: 200,
-                                resize: true, body: ''},
-                            {position: 'center', scroll: true,
-                                body: 'message preview pane'}]});
-
-                    app.center_layout.on('render', function() {
-                        // Bind the slots to readable names
-                        app.units = new Object();
-                        app.units.menu = app.layout.getUnitByPosition('top');
-                        app.units.tree = app.layout.getUnitByPosition('left');
-                        app.units.preview_pane =
app.center_layout.getUnitByPosition('center');
-                        app.units.message_list =
app.center_layout.getUnitByPosition('top');
-
-                        app.setupStaticComponents();
-                    });
-                    app.center_layout.render();
+                    // Bind the slots to readable names
+                    app.domNodes.menu =
app.layout.getUnitByPosition('top').body;
+                    app.domNodes.tree =
app.layout.getUnitByPosition('left').body;
+
+                    app.domNodes.preview_pane = document.createElement('div');
+                    app.domNodes.message_list = document.createElement('div');
+
+                    var center = app.layout.getUnitByPosition('center').body;
+                    center.appendChild(app.domNodes.message_list);
+                    center.appendChild(app.domNodes.preview_pane);
+
+                    app.setupStaticComponents();
                 });
                 app.layout.render();
             });
(at)(at) -59,13 +51,11 (at)(at)
 
         reload_tree: function() {
             document.App.tree = new YAHOO.gocept.webmailer.Tree(
-                    document.App.units.tree.body);
+                    document.App.domNodes.tree);
         },
 
         setupStaticComponents: function() {
-            // 
             // Fill the screen layout units with their components
-            // 
             var app = this;
 
             app.menu = new YAHOO.gocept.webmailer.Menu();
(at)(at) -74,7 +64,7 (at)(at)
                 app.preview_pane = new YAHOO.gocept.webmailer.PreviewPane();
                 app.message_list = new YAHOO.gocept.webmailer.MessageList();
                 app.tree = new YAHOO.gocept.webmailer.Tree(
-                    document.App.units.tree.body);
+                    document.App.domNodes.tree);
             });
         }
     });

Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js	(original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js	Tue Feb
17 15:27:31 2009
(at)(at) -4,7 +4,7 (at)(at)
         constructor: function() {
             var menu = this;
             menu.menubar = new YAHOO.widget.MenuBar("webmailer-main-menu");
-            menu.menubar.render(document.App.units.menu.body);
+            menu.menubar.render(document.App.domNodes.menu);
             menu.menubar.show();
         },
 
(at)(at) -13,7 +13,7 (at)(at)
                 text: label, 
                 onclick: { fn: callback }
                 });
-            this.menubar.render(document.App.units.menu.body);
+            this.menubar.render(document.App.domNodes.menu);
             return new_item;
         }
     });

SVN: r29220 - gocept.webmail/trunk/gocept/webmail/browser/resources
Wolfgang Schnerring <ws(at)gocept.com>
2009-02-17 16:44:46 [ FULL ]
Author: wosc
Date: Tue Feb 17 16:44:45 2009
New Revision: 29220

Log:
Close #4682: removed akward passing around of 'this' to
YAHOO.gocept.webmailer.Composer.list_attachments().

I don't really understand what caused us to put this in in the first place, but
I distinctly remember that it did not work otherwise -- but it works just fine
without it now. 



Modified:
   gocept.webmail/trunk/gocept/webmail/browser/resources/composer.js

Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/composer.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/composer.js	(original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/composer.js	Tue Feb
17 16:44:45 2009
(at)(at) -253,19 +253,16 (at)(at)
             composer.getControl('AttachmentsUploading').style.display =
'inline';
             document.Connection.upload(
                 composer.draft_url+'/(at)(at)add_attachment',
'composeAttachments',
-                // XXX: need to understand JS scoping/this rules
                 function () {
                     composer.getControl('AttachmentsUploading').style.display
= 'none';
-                    composer.list_attachments(composer);
+                    composer.list_attachments();
                     composer.getControl('AttachmentsFile').value = '';
                 }
             );
         },
 
         list_attachments: function(composer) {
-            if (composer == null) {
-                composer = this;
-            }
+            var composer = this;
 
             document.Connection.get(composer.draft_url+'/(at)(at)attachments',
                 function (result) {
(at)(at) -303,8 +300,7 (at)(at)
             var composer = this;
             document.Connection.post(
                 attachment['url']+'/(at)(at)delete', null,
-                // XXX: need to understand JS scoping/this rules
-                function () { composer.list_attachments(composer); }
+                function () { composer.list_attachments(); }
             );
         },

SVN: r29221 - gocept.restmail/trunk/gocept/restmail/browser
Sebastian Wehrmann <sw(at)gocept.com>
2009-02-18 09:15:19 [ FULL ]
Author: sweh
Date: Wed Feb 18 09:15:18 2009
New Revision: 29221

Log:
- Fix tests.



Modified:
   gocept.restmail/trunk/gocept/restmail/browser/inline.txt

Modified: gocept.restmail/trunk/gocept/restmail/browser/inline.txt
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/inline.txt	(original)
+++ gocept.restmail/trunk/gocept/restmail/browser/inline.txt	Wed Feb 18
09:15:18 2009
(at)(at) -44,6 +44,7 (at)(at)
       <dt>Date:</dt>
       <dd>Thu, 25 Sep 2008 13:50:58 +0200</dd>
   </dl>
+  <div class="novisclear"></div>
 </div>
 
 >>> print r['body']
(at)(at) -82,6 +83,7 (at)(at)
       <dt>Date:</dt>
       <dd>Fri, 21 Nov 2008 10:42:12 +0100</dd>
   </dl>
+  <div class="novisclear"></div>
 </div>
 
 >>> print r['body']
(at)(at) -121,6 +123,7 (at)(at)
       <dt>Date:</dt>
       <dd>Fri, 21 Nov 2008 10:43:38 +0100</dd>
   </dl>
+  <div class="novisclear"></div>
 </div>
 
 >>> print r['body'].encode('utf-8')
(at)(at) -174,6 +177,7 (at)(at)
       <dt>Date:</dt>
       <dd>Fri, 21 Nov 2008 10:44:57 +0100</dd>
   </dl>
+  <div class="novisclear"></div>
 </div>
 
 >>> print r['body']
(at)(at) -254,6 +258,7 (at)(at)
       <dt>Date:</dt>
       <dd>Fri, 21 Nov 2008 12:10:38 +0100</dd>
   </dl>
+  <div class="novisclear"></div>
 </div>
 
 >>> print r['body']

SVN: r29222 - gocept.restmail/trunk/gocept/restmail/browser
Christian Theune <ct(at)gocept.com>
2009-02-18 09:50:41 [ FULL ]
Author: ctheune
Date: Wed Feb 18 09:50:39 2009
New Revision: 29222

Log:
Provide batching and sorting on the message list view.



Modified:
   gocept.restmail/trunk/gocept/restmail/browser/message.py

Modified: gocept.restmail/trunk/gocept/restmail/browser/message.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/message.py	(original)
+++ gocept.restmail/trunk/gocept/restmail/browser/message.py	Wed Feb 18
09:50:39 2009
(at)(at) -23,13 +23,34 (at)(at)
     (at)gocept.restmail.browser.json.view
     def list_messages(self):
         """Message listing."""
-        data = [{
-            'url': zope.app.zapi.absoluteURL(message, self.request),
-            'from': message.headers.get('From'),
-            'subject': message.headers.get('Subject'),
-            'date': message.isodate,
-            'flags': list(message.flags)
-            } for message in self.context.messages()]
+        # XXX How to let the Zope publisher map the arguments?
+        batch_size = int(self.request.get('batch_size', 10))
+        batch_start = int(self.request.get('batch_start', 0))
+        sort_dir = self.request.get('sort_dir', 'desc')
+        sort_key = self.request.get('sort_key', 'date')
+
+        all_messages = [{
+                'url': zope.app.zapi.absoluteURL(message, self.request),
+                'from': message.headers.get('From'),
+                'subject': message.headers.get('Subject'),
+                'date': message.isodate,
+                '_m': message
+                } for message in self.context.messages()]
+        all_messages.sort(key=lambda x:x[sort_key],
reverse=(sort_dir=='desc'))
+
+        current_messages = all_messages[batch_start:batch_start+batch_size]
+        for m in current_messages:
+            m['flags'] = list(m['_m'].flags)
+            del m['_m']
+
+        data = {
+            'messages': current_messages,
+            'total': len(all_messages),
+            'returned': len(current_messages),
+            'batch_start': batch_start,
+            'batch_size': batch_size,
+            'sort_dir': sort_dir,
+            'sort_key': sort_key}
         return data

SVN: r29223 - gocept.webmail/trunk/gocept/webmail/browser/resources
Christian Theune <ct(at)gocept.com>
2009-02-18 09:51:24 [ FULL ]
Author: ctheune
Date: Wed Feb 18 09:51:23 2009
New Revision: 29223

Log:
switch to server-based pagination and sorting of the message list



Modified:
   gocept.webmail/trunk/gocept/webmail/browser/resources/message.js
   gocept.webmail/trunk/gocept/webmail/browser/resources/utilities.js
   gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js

Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/message.js
==============================================================================
--- gocept.webmail/trunk/gocept/webmail/browser/resources/message.js	(original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/message.js	Wed Feb 18
09:51:23 2009
(at)(at) -70,9 +70,23 (at)(at)
                 config.columns,
                 config.source,
                 {formatRow: this.rowFormatter,
+                 initialRequest: 'batch_start=0&batch_size=10',
+                 sortedBy: {key: 'date', dir:
YAHOO.widget.DataTable.CLASS_DESC},
+                 generateRequest: function(oState, oSelf) {
+                    if (oState.sortedBy.dir ==
YAHOO.widget.DataTable.CLASS_DESC) {
+                        sort_dir = 'desc';
+                    } else {
+                        sort_dir = 'asc';
+                    };
+                    return 'batch_start=' + oState.pagination.recordOffset +
+                           '&batch_size=' + oState.pagination.rowsPerPage
+
+                           '&sort_key=' + oState.sortedBy.key +
+                           '&sort_dir=' + sort_dir},
+                 dynamicData: true,
                  paginator: new YAHOO.widget.Paginator({
                     containers: document.App.domNodes.message_list_paginator,
                     rowsPerPage: 10})});
+
             message_list.table = table;
             table.set("selectionMode", "standard");
             table.subscribe("rowClickEvent", table.onEventSelectRow);
(at)(at) -94,6 +108,10 (at)(at)
                 };
                 return document.App.preview_pane.load(message);
             });
+            table.handleDataReturnPayload = function(oRequest, oResponse,
oPayload) {
+                oPayload.totalRecords = oResponse.meta.totalRecords;
+                return oPayload;
+            };
             table.subscribe('cellMousedownEvent', function(event) {
                 var element =
table.getTrEl(YAHOO.util.Event.getTarget(event));
                 ddRow = new YAHOO.util.DDProxy(element.id);
(at)(at) -150,7 +168,13 (at)(at)
                    {key:"subject", label:"Betreff", sortable:true},
                    {key:"date", label:"Datum", sortable:true}];
 
-    var responseSchema = {resultsList: "",
+    var responseSchema = {resultsList: "result.messages",
+                          metaFields: {totalRecords: "result.total",
+                                       pageSize: "result.batch_size",
+                                       startIndex: "result.batch_start",
+                                       recordsReturned: "result.returned",
+                                       sort: "result.sort_key",
+                                       dir: "result.sort_dir"},
                           fields: [{key: "url"},
                                    {key: "flags"},
                                    {key: "from"},
(at)(at) -183,12 +207,12 (at)(at)
                    {key:"subject", label:"Betreff", sortable:true},
                    {key:"date", label:"Datum", sortable:true}];
 
-    var responseSchema = {resultsList: "",
+    var responseSchema = {resultsList: "messages",
                           fields: [{key: "url"},
                                    {key: "flags"},
                                    {key: "to"},
                                    {key: "subject"},
-                                   {key: "date"}]};
+                                   {key: "date", parser:"date"}]};
 
     YAHOO.gocept.webmailer['list-drafts'] = function(url) {
           data_source = YAHOO.gocept.webmailer.get_data_source(

Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/utilities.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/utilities.js	(original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/utilities.js	Wed Feb
18 09:51:23 2009
(at)(at) -61,7 +61,6 (at)(at)
         data_source.doBeforeParseData = function (oRequest, oFullResponse,
oCallback) {
             return {result:oFullResponse};
         };
-        data_source.responseSchema.resultsList = 'result';
         return data_source;
     };
 });

Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js	(original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js	Wed Feb
18 09:51:23 2009
(at)(at) -27,7 +27,7 (at)(at)
     YAHOO.gocept.webmailer.onFolderSelected = new
YAHOO.util.CustomEvent("onFolderSelected");
 
     var responseSchema = {
-            resultsList: "",
+            resultsList: "result",
             fields: [{key: "url"},
                      {key: "name"},
                      {key: "children"},

SVN: r29226 - gocept.restmail/trunk/gocept/restmail/www
Sebastian Wehrmann <sw(at)gocept.com>
2009-02-18 14:54:50 [ FULL ]
Author: sweh
Date: Wed Feb 18 14:54:48 2009
New Revision: 29226

Log:
update template for adding identities in ZMI



Modified:
   gocept.restmail/trunk/gocept/restmail/www/add_identity.pt

Modified: gocept.restmail/trunk/gocept/restmail/www/add_identity.pt
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/www/add_identity.pt	(original)
+++ gocept.restmail/trunk/gocept/restmail/www/add_identity.pt	Wed Feb 18
14:54:48 2009
(at)(at) -38,6 +38,16 (at)(at)
   <tr>
     <td align="left" valign="top">
     <div class="form-label">
+      <label for="address">Address</label>
+    </div>
+    </td>
+    <td align="left" valign="top">
+      <input type="text" id="address" name="address" size="100" />
+    </td>
+  </tr>
+  <tr>
+    <td align="left" valign="top">
+    <div class="form-label">
       <label for="sent_folder">Sent folder</label>
     </div>
     </td>

SVN: r29228 - gocept.webmail/trunk/gocept/webmail/browser/resources
Sebastian Wehrmann <sw(at)gocept.com>
2009-02-18 14:57:25 [ FULL ]
Author: sweh
Date: Wed Feb 18 14:57:23 2009
New Revision: 29228

Log:
- Add preference object with configuration for sort key and sort order.



Added:
   gocept.webmail/trunk/gocept/webmail/browser/resources/preferences.js
Modified:
   gocept.webmail/trunk/gocept/webmail/browser/resources/message.js
   gocept.webmail/trunk/gocept/webmail/browser/resources/runner.js
   gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js

Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/message.js
==============================================================================
--- gocept.webmail/trunk/gocept/webmail/browser/resources/message.js	(original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/message.js	Wed Feb 18
14:57:23 2009
(at)(at) -65,19 +65,20 (at)(at)
 
             config = YAHOO.gocept.webmailer['list-'+list_type](url);
 
+            init_sort = document.App.preferences.data['sort'];
+            if (!init_sort) {
+                init_sort = ['date', 'desc']
+            }
+
             table = new YAHOO.widget.DataTable(
                 document.App.domNodes.message_list,
                 config.columns,
                 config.source,
                 {formatRow: this.rowFormatter,
-                 initialRequest: 'batch_start=0&batch_size=10',
-                 sortedBy: {key: 'date', dir:
YAHOO.widget.DataTable.CLASS_DESC},
+                 initialRequest:
'batch_start=0&batch_size=10&sort_key=' + init_sort[0] +
'&sort_dir=' + init_sort[1],
+                 sortedBy: {key: init_sort[0], dir: init_sort[1]},
                  generateRequest: function(oState, oSelf) {
-                    if (oState.sortedBy.dir ==
YAHOO.widget.DataTable.CLASS_DESC) {
-                        sort_dir = 'desc';
-                    } else {
-                        sort_dir = 'asc';
-                    };
+                    sort_dir =
message_list.sortDirClassToString(oState.sortedBy.dir);
                     return 'batch_start=' + oState.pagination.recordOffset +
                            '&batch_size=' + oState.pagination.rowsPerPage
+
                            '&sort_key=' + oState.sortedBy.key +
(at)(at) -90,6 +91,11 (at)(at)
             message_list.table = table;
             table.set("selectionMode", "standard");
             table.subscribe("rowClickEvent", table.onEventSelectRow);
+            table.subscribe("columnSortEvent", function(event) {
+                sort_dir = message_list.sortDirClassToString(event.dir);
+                document.App.preferences.set("sort", [event.column.key,
+                                                      sort_dir]);
+            });
             table.subscribe("rowSelectEvent", function(event) {
                 // XXX Reading the capabilities from the style of the list
                 // is relatively wrong.
(at)(at) -156,6 +162,15 (at)(at)
             message_list.load(node);
             return true;
         },
+
+        sortDirClassToString: function(sort_class) {
+            sort_dir = 'asc';
+            if (sort_class == YAHOO.widget.DataTable.CLASS_DESC) {
+                sort_dir = 'desc';
+            }
+            return sort_dir
+        }
+
     });
 });
 

Added: gocept.webmail/trunk/gocept/webmail/browser/resources/preferences.js
==============================================================================
--- (empty file)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/preferences.js	Wed
Feb 18 14:57:23 2009
(at)(at) -0,0 +1,38 (at)(at)
+//
+// Preferences Object
+//
+Def(function(){
+
+    YAHOO.gocept.webmailer.Preferences = Class({
+        constructor: function() {
+            var preferences = this;
+            preferences.onLoadFinished = new YAHOO.util.CustomEvent(
+                "onLoadFinised", preferences);
+            preferences.data = new Object();
+            preferences.update();
+        },
+
+        update: function() {
+            var preferences = this;
+            document.Connection.get('(at)(at)preferences', function(result) {
+                var result = YAHOO.lang.JSON.parse(result.responseText);
+                if (result) {
+                    preferences.data = result;
+                }
+                preferences.onLoadFinished.fire();
+            });
+        },
+
+        set: function(key, value) {
+            var preferences = this;
+            preferences.data[key] = value;
+            preferences.save();
+        },
+
+        save: function() {
+            var preferences = this;
+            document.Connection.post(
+                '(at)(at)update-preferences', {config: preferences.data});
+        }
+    });
+});

Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/runner.js
==============================================================================
--- gocept.webmail/trunk/gocept/webmail/browser/resources/runner.js	(original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/runner.js	Wed Feb 18
14:57:23 2009
(at)(at) -42,7 +42,8 (at)(at)
         'uploader');
 
     var app_modules = new Array('connection', 'composer', 'message',
-                                'draft', 'webmailer', 'management');
+                                'draft', 'webmailer', 'management',
+                                'preferences');
 
     for (i=0;i<app_modules.length;i++) {
         base_name = app_modules[i];

Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js	(original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js	Wed
Feb 18 14:57:23 2009
(at)(at) -57,14 +57,17 (at)(at)
         setupStaticComponents: function() {
             // Fill the screen layout units with their components
             var app = this;
+            app.preferences = new YAHOO.gocept.webmailer.Preferences()
 
-            app.menu = new YAHOO.gocept.webmailer.Menu();
+            app.preferences.onLoadFinished.subscribe(function () { 
+                app.menu = new YAHOO.gocept.webmailer.Menu();
 
-            YAHOO.util.Event.onContentReady("webmailer-main-menu", function ()
{ 
-                app.preview_pane = new YAHOO.gocept.webmailer.PreviewPane();
-                app.message_list = new YAHOO.gocept.webmailer.MessageList();
-                app.tree = new YAHOO.gocept.webmailer.Tree(
-                    document.App.domNodes.tree);
+                YAHOO.util.Event.onContentReady("webmailer-main-menu",
function () { 
+                    app.preview_pane = new
YAHOO.gocept.webmailer.PreviewPane();
+                    app.message_list = new
YAHOO.gocept.webmailer.MessageList();
+                    app.tree = new YAHOO.gocept.webmailer.Tree(
+                        document.App.domNodes.tree);
+                });
             });
         }
     });

SVN: r29230 - gocept.webmail/trunk/gocept/webmail/browser/resources
Sebastian Wehrmann <sw(at)gocept.com>
2009-02-18 15:15:47 [ FULL ]
Author: sweh
Date: Wed Feb 18 15:15:46 2009
New Revision: 29230

Log:
- Fix management UI.



Modified:
   gocept.webmail/trunk/gocept/webmail/browser/resources/management-main.js

Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/management-main.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/management-main.js	(original)
+++
gocept.webmail/trunk/gocept/webmail/browser/resources/management-main.js	Wed
Feb 18 15:15:46 2009
(at)(at) -23,9 +23,9 (at)(at)
             app.layout.on('render', function() {
                 app.domNodes.menu = app.layout.getUnitByPosition('top').body;
                 app.menu = new YAHOO.gocept.webmailer.ManagementMenu();
+                app.domNodes.identity_edit_form =
app.layout.getUnitByPosition('bottom').body;
                 app.domNodes.identity_list =
app.layout.getUnitByPosition('center').body;
                 app.identity_list = new YAHOO.gocept.webmailer.IdentityList();
-                app.domNodes.identity_edit_form =
app.layout.getUnitByPosition('bottom').body;
             });
             app.layout.render();
         },
(at)(at) -65,7 +65,7 (at)(at)
     YAHOO.gocept.webmailer.ManagementMenu = Class({
         constructor: function() {
             var menu = this;
-            menu.menubar = new YAHOO.widget.MenuBar("management-main-menu");
+            menu.menubar = new YAHOO.widget.MenuBar("top");
             menu.menubar.render(document.App.domNodes.menu);
             menu.addMenuItem('New', document.App.loadIdentityEditForm);
             menu.delete_button = menu.addMenuItem('Delete', function() {

SVN: r29231 - gocept.webmail/trunk/gocept/webmail/browser/resources
Christian Theune <ct(at)gocept.com>
2009-02-18 15:18:45 [ FULL ]
Author: ctheune
Date: Wed Feb 18 15:18:44 2009
New Revision: 29231

Log:
fix typo



Modified:
   gocept.webmail/trunk/gocept/webmail/browser/resources/preferences.js

Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/preferences.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/preferences.js	(original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/preferences.js	Wed
Feb 18 15:18:44 2009
(at)(at) -7,7 +7,7 (at)(at)
         constructor: function() {
             var preferences = this;
             preferences.onLoadFinished = new YAHOO.util.CustomEvent(
-                "onLoadFinised", preferences);
+                "onLoadFinished", preferences);
             preferences.data = new Object();
             preferences.update();
         },

SVN: r29232 - gocept.webmail/trunk/gocept/webmail/browser/resources
Christian Theune <ct(at)gocept.com>
2009-02-18 15:19:04 [ FULL ]
Author: ctheune
Date: Wed Feb 18 15:19:03 2009
New Revision: 29232

Log:
Try again at making initialization code more readable. Document why the
order has to  be that way.



Modified:
   gocept.webmail/trunk/gocept/webmail/browser/resources/management-main.js

Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/management-main.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/management-main.js	(original)
+++
gocept.webmail/trunk/gocept/webmail/browser/resources/management-main.js	Wed
Feb 18 15:19:03 2009
(at)(at) -21,10 +21,13 (at)(at)
                     { position: 'bottom',
                           height: 250, resize: true, body: ''}]});
             app.layout.on('render', function() {
+                // Initialize DOM nodes first, as the business models
+                // rely on them.
                 app.domNodes.menu = app.layout.getUnitByPosition('top').body;
-                app.menu = new YAHOO.gocept.webmailer.ManagementMenu();
                 app.domNodes.identity_edit_form =
app.layout.getUnitByPosition('bottom').body;
                 app.domNodes.identity_list =
app.layout.getUnitByPosition('center').body;
+
+                app.menu = new YAHOO.gocept.webmailer.ManagementMenu();
                 app.identity_list = new YAHOO.gocept.webmailer.IdentityList();
             });
             app.layout.render();

SVN: r29233 - gocept.webmail/trunk/gocept/webmail/browser/resources
Christian Theune <ct(at)gocept.com>
2009-02-18 15:26:37 [ FULL ]
Author: ctheune
Date: Wed Feb 18 15:26:36 2009
New Revision: 29233

Log:
Stop using YUIs debug version by default.



Modified:
   gocept.webmail/trunk/gocept/webmail/browser/resources/runner.js

Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/runner.js
==============================================================================
--- gocept.webmail/trunk/gocept/webmail/browser/resources/runner.js	(original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/runner.js	Wed Feb 18
15:26:36 2009
(at)(at) -19,7 +19,6 (at)(at)
     var loader = new YAHOO.util.YUILoader({
         base: yui_base_url+'/',  
         loadOptional: true,
-        filter: 'DEBUG',
         allowRollup: false,
         onSuccess: function() {
             generic_init();

SVN: r29238 - gocept.webmail/trunk/gocept/webmail/browser/resources
Christian Theune <ct(at)gocept.com>
2009-02-18 17:26:16 [ FULL ]
Author: ctheune
Date: Wed Feb 18 17:26:15 2009
New Revision: 29238

Log:
more space for the header according to portal.mytum.de/header



Modified:
   gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js

Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js	(original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js	Wed
Feb 18 17:26:15 2009
(at)(at) -13,7 +13,7 (at)(at)
             app.outer_layout = new YAHOO.widget.Layout(
                 {units: [
                     {position: 'top',
-                        height: 100,
+                        height: 150,
                         body: '<iframe src="' + banner_url + '"
id="customization" />'},
                     {position: 'center',
                         body: ''}]});

SVN: r29244 - gocept.restmail/trunk/gocept/restmail/browser
Sebastian Wehrmann <sw(at)gocept.com>
2009-02-19 15:24:32 [ FULL ]
Author: sweh
Date: Thu Feb 19 15:24:25 2009
New Revision: 29244

Log:
- API changes for the new management UI.



Modified:
   gocept.restmail/trunk/gocept/restmail/browser/README.txt
   gocept.restmail/trunk/gocept/restmail/browser/account.py
   gocept.restmail/trunk/gocept/restmail/browser/inline.txt
   gocept.restmail/trunk/gocept/restmail/browser/profile.py

Modified: gocept.restmail/trunk/gocept/restmail/browser/README.txt
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/README.txt	(original)
+++ gocept.restmail/trunk/gocept/restmail/browser/README.txt	Thu Feb 19
15:24:25 2009
(at)(at) -98,19 +98,25 (at)(at)
 Creating new accounts
 ---------------------
 
-Accounts can be created using the ``add-account`` view:
+Before we can start, we should add a new identity:
 
 >>> from gocept.restmail.browser.tests import json_request
->>> json_request('http://localhost/profile/(at)(at)add-account',
+>>> json_request('http://localhost/profile/(at)(at)add-identity',
 ...              identity=dict(name='Ben Utzer',
 ...                            address='ben(at)example.com',
 ...                            sent_folder='Sent'),
-...              smtp_server='default-smtp',
+...              smtp_server='default-smtp')
+{'from': 'Ben Utzer &lt;ben(at)example.com&gt;', 'id':
'ben-example.com'}
+
+Accounts can be created using the ``add-account`` view:
+
+>>> json_request('http://localhost/profile/(at)(at)add-account',
 ...              imap_server=dict(host='localhost',
 ...                               port=10143,
 ...                               user='test',
-...                               password='bsdf'))
-{'url': 'http://localhost/profile/ben-example.com'}
+...                               password='bsdf'),
+...               default_identity='ben-example.com')
+{'url': 'http://localhost/profile/test-localhost'}
 
 XXX This needs to go to ``add-account``:
 
(at)(at) -129,6 +135,7 (at)(at)
   'fixed': False,
   'from': 'Ben Utzer &lt;ben(at)example.com&gt;',
   'host': 'localhost',
+  'ident_id': 'ben-example.com',
   'name': 'Ben Utzer',
   'password': 'bsdf',
   'port': 10143,
(at)(at) -136,7 +143,7 (at)(at)
   'smtp_server': 'default-smtp',
   'ssl': False,
   'status': 'ok',
-  'url': 'http://localhost/profile/ben-example.com',
+  'url': 'http://localhost/profile/test-localhost',
   'user': 'test'}]
 
 Traverse accounts
(at)(at) -150,55 +157,58 (at)(at)
 [{'children': 3,
   'name': 'test(at)localhost',
   'type': 'account',
-  'url': 'http://localhost/profile/ben-example.com'}]
+  'url': 'http://localhost/profile/test-localhost'}]
 
 Get a list of folders of the account `test(at)localhost`:
 
 >>> pprint.pprint(
-...     json_request('http://localhost/profile/ben-example.com/(at)(at)folders'))
+...     json_request('http://localhost/profile/test-localhost/(at)(at)folders'))
 [{'children': 0,
   'name': 'Bar',
   'type': 'inbox',
-  'url': 'http://localhost/profile/ben-example.com/+Bar'},
+  'url': 'http://localhost/profile/test-localhost/+Bar'},
  {'children': 1,
   'name': 'INBOX',
   'type': 'inbox',
-  'url': 'http://localhost/profile/ben-example.com/+INBOX'},
+  'url': 'http://localhost/profile/test-localhost/+INBOX'},
  {'children': 0,
   'name': 'Testmessages',
   'type': 'inbox',
-  'url': 'http://localhost/profile/ben-example.com/+Testmessages'}]
+  'url': 'http://localhost/profile/test-localhost/+Testmessages'}]
 
 The `INBOX` has one child:
 
 >>> pprint.pprint(
-...     json_request('http://localhost/profile/ben-example.com/+INBOX/(at)(at)folders'))
+...     json_request('http://localhost/profile/test-localhost/+INBOX/(at)(at)folders'))
 [{'children': 0,
   'name': 'Baz',
   'type': 'inbox',
-  'url': 'http://localhost/profile/ben-example.com/+INBOX/+Baz'}]
+  'url': 'http://localhost/profile/test-localhost/+INBOX/+Baz'}]
 
 
 Adding new identities
 ---------------------
 
-You can add new identities to accounts. Setting it to the default identity
will
-list it in the `accounts` view:
+You can add new identities. We need the account id here for the sent folder:
 
 >>> json_request('http://localhost/profile/(at)(at)add-identity',
-...              account_id='ben-example.com',
-...              identity_id='an-example.com-identity',
+...              account_id='test-localhost',
 ...              identity=dict(name='An Wender',
 ...                            address='an(at)example.com',
 ...                            sent_folder='+Sent'),
-...              smtp_server='default-smtp',
-...              default=True)
+...              smtp_server='default-smtp')
+{'from': 'An Wender &lt;an(at)example.com&gt;', 'id':
'an-example.com'}
+
+We set it now as the default identity:
+
+>>> profile['test-localhost'].default_identity = 'an-example.com'
 
 >>> pprint.pprint(json_request('http://localhost/profile/(at)(at)accounts'))
 [{'address': 'an(at)example.com',
   'fixed': False,
   'from': 'An Wender &lt;an(at)example.com&gt;',
   'host': 'localhost',
+  'ident_id': 'an-example.com',
   'name': 'An Wender',
   'password': 'bsdf',
   'port': 10143,
(at)(at) -206,10 +216,17 (at)(at)
   'smtp_server': 'default-smtp',
   'ssl': False,
   'status': 'ok',
-  'url': 'http://localhost/profile/ben-example.com',
+  'url': 'http://localhost/profile/test-localhost',
   'user': 'test'}]
 
->>> profile['ben-example.com'].default_identity =
'ben-example.com-identity'
+Change the default identity back:
+
+>>> profile['test-localhost'].default_identity = 'ben-example.com'
+>>> pprint.pprint(json_request('http://localhost/profile/(at)(at)accounts'))
+[{...
+  'from': 'Ben Utzer &lt;ben(at)example.com&gt;',
+  ...}]
+
 
 Reading and saving preferences
 -------------------------------
(at)(at) -243,19 +260,19 (at)(at)
 
 Accounts contain folders which can be browsed using the ``(at)(at)folders``
view:
 
->>> pprint.pprint(json_request('http://localhost/profile/ben-example.com/(at)(at)folders'))
+>>> pprint.pprint(json_request('http://localhost/profile/test-localhost/(at)(at)folders'))
 [{'children': 0,
   'name': 'Bar',
   'type': 'inbox',
-  'url': 'http://localhost/profile/ben-example.com/+Bar'},
+  'url': 'http://localhost/profile/test-localhost/+Bar'},
  {'children': 1,
   'name': 'INBOX',
   'type': 'inbox',
-  'url': 'http://localhost/profile/ben-example.com/+INBOX'},
+  'url': 'http://localhost/profile/test-localhost/+INBOX'},
  {'children': 0,
   'name': 'Testmessages',
   'type': 'inbox',
-  'url': 'http://localhost/profile/ben-example.com/+Testmessages'}]
+  'url': 'http://localhost/profile/test-localhost/+Testmessages'}]
 
 
 Create new folders
(at)(at) -263,9 +280,9 (at)(at)
 
 Folders can be created as children of accounts:
 
->>> json_request('http://localhost/profile/ben-example.com/(at)(at)create_folder',
+>>> json_request('http://localhost/profile/test-localhost/(at)(at)create_folder',
 ...              name=u'Sent')
-{'url': 'http://localhost/profile/ben-example.com/+Sent'}
+{'url': 'http://localhost/profile/test-localhost/+Sent'}
 
 
 Edit account data: (at)(at)edit
(at)(at) -273,11 +290,8 (at)(at)
 
 All data of an account can be edited using the `(at)(at)edit` view:
 
->>> json_request('http://localhost/profile/ben-example.com/(at)(at)edit',
-...              identity=dict(name='Ben Utzer',
-...                            address='ben(at)example.com',
-...                            sent_folder='+Sent'),
-...              smtp_server='default-smtp',
+>>> json_request('http://localhost/profile/test-localhost/(at)(at)edit',
+...              default_identity='ben-example.com',
 ...              imap_server=dict(host='localhost',
 ...                               port=10143,
 ...                               user='test',
(at)(at) -288,24 +302,21 (at)(at)
   'fixed': False,
   'from': 'Ben Utzer &lt;ben(at)example.com&gt;',
   'host': 'localhost',
+  'ident_id': 'ben-example.com',
   'name': 'Ben Utzer',
   'password': 'bsdf',
   'port': 10143,
-  'sent_folder': '+Sent',
+  'sent_folder': 'Sent',
   'smtp_server': 'default-smtp',
   'ssl': True,
   'status': 'failure',
-  'url': 'http://localhost/profile/ben-example.com',
+  'url': 'http://localhost/profile/test-localhost',
   'user': 'test'}]
 
-Switch SSL off again since the account will be used again later. We mark it as
-fixed right now to demonstrate accounts, whichs data can not be modified:
+Switch SSL off again since the account will be used again later.
 
->>> json_request('http://localhost/profile/ben-example.com/(at)(at)edit',
-...              identity=dict(name='Ben Utzer',
-...                            address='ben(at)example.com',
-...                            sent_folder='+Sent'),
-...              smtp_server='default-smtp',
+>>> json_request('http://localhost/profile/test-localhost/(at)(at)edit',
+...              default_identity='ben-example.com',
 ...              imap_server=dict(host='localhost',
 ...                               port=10143,
 ...                               user='test',
(at)(at) -326,26 +337,23 (at)(at)
 Create an additional account that can be deleted for demonstrational purposes:
 
 >>> json_request('http://localhost/profile/(at)(at)add-account',
-...              identity=dict(name='John Doe',
-...                            address='john.doe(at)example.com',
-...                            sent_folder='Sent'),
-...              smtp_server='default-smtp',
+...              default_identity='an-example.com',
 ...              imap_server=dict(host='localhost',
 ...                               port=10143,
-...                               user='test',
-...                               password='bsdf'))
-{'url': 'http://localhost/profile/john.doe-example.com'}
+...                               user='user',
+...                               password='asdf'))
+{'url': 'http://localhost/profile/user-localhost'}
 >>> accounts = json_request('http://localhost/profile/(at)(at)accounts')
 >>> [x['url'] for x in accounts]
-['http://localhost/profile/ben-example.com',
'http://localhost/profile/john.doe-example.com']
+['http://localhost/profile/test-localhost',
'http://localhost/profile/user-localhost']
 
 Then delete it right away:
 
->>> json_request('http://localhost/profile/john.doe-example.com/(at)(at)delete',
post=True)
+>>> json_request('http://localhost/profile/user-localhost/(at)(at)delete',
post=True)
 
 >>> accounts = json_request('http://localhost/profile/(at)(at)accounts')
 >>> [x['url'] for x in accounts]
-['http://localhost/profile/ben-example.com']
+['http://localhost/profile/test-localhost']
 
 
 Folder API
(at)(at) -357,11 +365,11 (at)(at)
 Just like accounts, folders have a ``(at)(at)folders`` view for browsing their
child
 folders:
 
->>> pprint.pprint(json_request('http://localhost/profile/ben-example.com/+INBOX/(at)(at)folders'))
+>>> pprint.pprint(json_request('http://localhost/profile/test-localhost/+INBOX/(at)(at)folders'))
 [{'children': 0,
   'name': 'Baz',
   'type': 'inbox',
-  'url': 'http://localhost/profile/ben-example.com/+INBOX/+Baz'}]
+  'url': 'http://localhost/profile/test-localhost/+INBOX/+Baz'}]
 
 
 Create folders
(at)(at) -370,16 +378,16 (at)(at)
 Folders can be created as children of folders. To demonstrate this, we use a
 folder name containing characters beyond the 7 bit ASCII set:
 
->>> json_request('http://localhost/profile/ben-example.com/+Sent/(at)(at)create_folder',
+>>> json_request('http://localhost/profile/test-localhost/+Sent/(at)(at)create_folder',
 ...              name=u"\xd6ld")
-{'url': 'http://localhost/profile/ben-example.com/+Sent/+%C3%96ld'}
+{'url': 'http://localhost/profile/test-localhost/+Sent/+%C3%96ld'}
 
 >>> pprint.pprint(json_request(
-...     'http://localhost/profile/ben-example.com/+Sent/(at)(at)folders'))
+...     'http://localhost/profile/test-localhost/+Sent/(at)(at)folders'))
 [{'children': 0,
   'name': u'\xd6ld',
   'type': 'inbox',
-  'url': 'http://localhost/profile/ben-example.com/+Sent/+%C3%96ld'}]
+  'url': 'http://localhost/profile/test-localhost/+Sent/+%C3%96ld'}]
 
 
 Retrieve a list of messages
(at)(at) -388,7 +396,7 (at)(at)
 Every folder provides the view `(at)(at)messages` which lists all messages of
 a folder:
 
->>> messages = json_request('http://localhost/profile/ben-example.com/+INBOX/(at)(at)messages')
+>>> messages = json_request('http://localhost/profile/test-localhost/+INBOX/(at)(at)messages')
 >>> pprint.pprint(messages)
 {'batch_size': 10,
  'batch_start': 0,
(at)(at) -396,12 +404,12 (at)(at)
                'flags': [],
                'from': 'test(at)localhost',
                'subject': 'Mail 1',
-               'url': 'http://localhost/profile/ben-example.com/+INBOX/*...'},
+               'url': 'http://localhost/profile/test-localhost/+INBOX/*...'},
               {'date': '2008-07-02 01:06:00+00:00',
                'flags': [],
                'from': 'test(at)localhost',
                'subject': 'Mail 2',
-               'url': 'http://localhost/profile/ben-example.com/+INBOX/*...'}],
+               'url': 'http://localhost/profile/test-localhost/+INBOX/*...'}],
  'returned': 2,
  'sort_dir': 'desc',
  'sort_key': 'date',
(at)(at) -436,7 +444,7 (at)(at)
              'X-Unknown-Encoding-Header': u'Text \ufffd\ufffd',
              'X-Wrong-Encoding-Header': u'Text \ufffd\ufffd'},
  'structure': {'content_type': 'text/plain',
-               'url': 'http://localhost/profile/ben-example.com/+INBOX/*.../*body'}}
+               'url': 'http://localhost/profile/test-localhost/+INBOX/*.../*body'}}
 
 
 Accessing MIME parts
(at)(at) -474,8 +482,8 (at)(at)
 
 When copying, the source message will not be deleted:
 
->>> INBOX_url = 'http://localhost/profile/ben-example.com/+INBOX'
->>> other_url = 'http://localhost/profile/ben-example.com/+Sent/+%C3%96ld'
+>>> INBOX_url = 'http://localhost/profile/test-localhost/+INBOX'
+>>> other_url = 'http://localhost/profile/test-localhost/+Sent/+%C3%96ld'
 >>> messages = json_request(INBOX_url + '/(at)(at)messages')
 >>> messages['total']
 2
(at)(at) -589,13 +597,13 (at)(at)
 
 >>> json_request(draft['url']+'/(at)(at)save',
 ...              to='ct(at)gocept.com',
-...              identity='ben-example.com-identity',
+...              identity='ben-example.com',
 ...              subject=u'asdf',
 ...              body=u'HelloHello')
 >>> pprint.pprint(json_request(draft['url']+'/(at)(at)data'))
 {'body': 'HelloHello',
  'date': '<ISO DATE>',
- 'identity': 'ben-example.com-identity',
+ 'identity': 'ben-example.com',
  'subject': 'asdf',
  'to': 'ct(at)gocept.com'}
 >>> pprint.pprint(json_request(draft['url']+'/(at)(at)raw'))
(at)(at) -603,13 +611,13 (at)(at)
 
 >>> json_request(draft['url']+'/(at)(at)save',
 ...              to='ct(at)gocept.com',
-...              identity='ben-example.com-identity',
+...              identity='ben-example.com',
 ...              subject=u'asdf',
 ...              body=u'HelloHello\xe4')
 >>> pprint.pprint(json_request(draft['url']+'/(at)(at)data'))
 {'body': u'HelloHello\xe4',
  'date': '<ISO DATE>',
- 'identity': 'ben-example.com-identity',
+ 'identity': 'ben-example.com',
  'subject': 'asdf',
  'to': 'ct(at)gocept.com'}
 >>> pprint.pprint(json_request(draft['url']+'/(at)(at)raw'))
(at)(at) -617,13 +625,13 (at)(at)
 
 >>> json_request(draft['url']+'/(at)(at)save',
 ...              to='ct(at)gocept.com',
-...              identity='ben-example.com-identity',
+...              identity='ben-example.com',
 ...              subject=u'asdf\xe4',
 ...              body=u'HelloHello')
 >>> pprint.pprint(json_request(draft['url']+'/(at)(at)data'))
 {'body': 'HelloHello',
  'date': '<ISO DATE>',
- 'identity': 'ben-example.com-identity',
+ 'identity': 'ben-example.com',
  'subject': u'asdf\xe4',
  'to': 'ct(at)gocept.com'}
 >>> pprint.pprint(json_request(draft['url']+'/(at)(at)raw'))
(at)(at) -631,13 +639,13 (at)(at)
 
 >>> json_request(draft['url']+'/(at)(at)save',
 ...              to='ct(at)gocept.com',
-...              identity='ben-example.com-identity',
+...              identity='ben-example.com',
 ...              subject=u'asdf\xe4',
 ...              body=u'HelloHello\xe4')
 >>> pprint.pprint(json_request(draft['url']+'/(at)(at)data'))
 {'body': u'HelloHello\xe4',
  'date': '<ISO DATE>',
- 'identity': 'ben-example.com-identity',
+ 'identity': 'ben-example.com',
  'subject': u'asdf\xe4',
  'to': 'ct(at)gocept.com'}
 >>> pprint.pprint(json_request(draft['url']+'/(at)(at)raw'))
(at)(at) -719,14 +727,14 (at)(at)
 Traceback (most recent call last):
 HTTPError: HTTP Error 404: Not Found
 
->>> pprint.pprint(json_request('http://localhost/profile/ben-example.com/+Sent/(at)(at)messages'))
+>>> pprint.pprint(json_request('http://localhost/profile/test-localhost/+Sent/(at)(at)messages'))
 {'batch_size': 10,
  'batch_start': 0,
  'messages': [{'date': '2009-02-16 14:46:46+00:00',
                'flags': ['\\Recent'],
                'from': 'Ben Utzer <ben(at)example.com>',
                'subject': u'asdf\xe4',
-               'url': 'http://localhost/profile/ben-example.com/+Sent/*...'}],
+               'url': 'http://localhost/profile/test-localhost/+Sent/*...'}],
  'returned': 1,
  'sort_dir': 'desc',
  'sort_key': 'date',
(at)(at) -737,7 +745,7 (at)(at)
 >>> draft = json_request('http://localhost/profile/(at)(at)new-draft',
post=True)
 >>> json_request(draft['url']+'/(at)(at)save',
 ...              to='ct(at)gocept.com',
-...              identity='ben-example.com-identity',
+...              identity='ben-example.com',
 ...              subject=u'asdf',
 ...              body='HelloHello')
 >>> upload_request(draft['url']+'/(at)(at)add_attachment',
(at)(at) -796,7 +804,7 (at)(at)
   prevents the \Answered flag from being set on an original message in such a
   folder.
 
->>> other_url = 'http://localhost/profile/ben-example.com/+Sent/+%C3%96ld'
+>>> other_url = 'http://localhost/profile/test-localhost/+Sent/+%C3%96ld'
 >>> json_request(messages['messages'][0]['url']+'/(at)(at)copy',
folder_url=other_url, post=True)
 {}
 >>> other_messages = json_request(other_url + '/(at)(at)messages')
(at)(at) -806,7 +814,7 (at)(at)
 >>> pprint.pprint(json_request(reply['url']+'/(at)(at)data'))
 {'body':
'<html>\n<head></head>\n<body>\n<p>test(at)localhost
wrote:</p>\n\n  <br />\n  <blockquote><pre>Everything
is ok!\n</pre></blockquote>\n\n</body>\n</html>\n',
  'date': '<ISO DATE>',
- 'identity': 'ben-example.com-identity',
+ 'identity': 'ben-example.com',
  'subject': 'Re: Mail 2',
  'to': 'test(at)localhost'}
 
(at)(at) -820,7 +828,7 (at)(at)
                'flags': ['\\Seen'],
                'from': 'test(at)localhost',
                'subject': 'Mail 2',
-               'url': 'http://localhost/profile/ben-example.com/+Sent/+%C3%96ld/*...'}],
+               'url': 'http://localhost/profile/test-localhost/+Sent/+%C3%96ld/*...'}],
  'returned': 1,
  'sort_dir': 'desc',
  'sort_key': 'date',
(at)(at) -857,7 +865,7 (at)(at)
                'flags': ['\\Seen', '\\Answered'],
                'from': 'test(at)localhost',
                'subject': 'Mail 2',
-               'url': 'http://localhost/profile/ben-example.com/+Sent/+%C3%96ld/*...'}],
+               'url': 'http://localhost/profile/test-localhost/+Sent/+%C3%96ld/*...'}],
  'returned': 1,
  'sort_dir': 'desc',
  'sort_key': 'date',
(at)(at) -869,9 +877,9 (at)(at)
 
 If the sent folder does not exist, it is created:
 
->>> profile['an-example.com-identity'].sent_folder = u'mySentFolder'
+>>> profile['an-example.com'].sent_folder = u'mySentFolder'
 >>> browser.open(
-...     'http://localhost/profile/ben-example.com/+mySentFolder/(at)(at)messages')
+...     'http://localhost/profile/test-localhost/+mySentFolder/(at)(at)messages')
 Traceback (most recent call last):
 HTTPError: HTTP Error 404: Not Found
 
(at)(at) -880,7 +888,7 (at)(at)
 {'url': 'http://localhost/profile/drafts/<GUID>'}
 >>> json_request(draft['url']+'/(at)(at)save',
 ...              to='ct(at)gocept.com',
-...              identity='an-example.com-identity',
+...              identity='an-example.com',
 ...              subject=u'Testmail incorrect sent folder',
 ...              body='HelloHello')
 
(at)(at) -901,14 +909,14 (at)(at)
 HTTPError: HTTP Error 404: Not Found
 
 >>> pprint.pprint(json_request(
-...     'http://localhost/profile/ben-example.com/+mySentFolder/(at)(at)messages'))
+...     'http://localhost/profile/test-localhost/+mySentFolder/(at)(at)messages'))
 {'batch_size': 10,
  'batch_start': 0,
  'messages': [{'date': '2009-02-16 14:46:46+00:00',
                'flags': ['\\Recent'],
                'from': 'An Wender <an(at)example.com>',
                'subject': 'Testmail incorrect sent folder',
-               'url': 'http://localhost/profile/ben-example.com/+mySentFolder/*...'}],
+               'url': 'http://localhost/profile/test-localhost/+mySentFolder/*...'}],
  'returned': 1,
  'sort_dir': 'desc',
  'sort_key': 'date',
(at)(at) -922,11 +930,9 (at)(at)
 
 >>> pprint.pprint(json_request('http://localhost/profile/(at)(at)identities'))
 [{'from': 'Ben Utzer &lt;ben(at)example.com&gt;',
-  'id': 'ben-example.com-identity'},
+  'id': 'ben-example.com'},
  {'from': 'An Wender &lt;an(at)example.com&gt;',
-  'id': 'an-example.com-identity'},
- {'from': 'John Doe &lt;john.doe(at)example.com&gt;',
-  'id': 'john.doe-example.com-identity'}]
+  'id': 'an-example.com'}]
 
 
 Fixed accounts
(at)(at) -934,11 +940,8 (at)(at)
 
 Mark an account as fixed:
 
->>> json_request('http://localhost/profile/ben-example.com/(at)(at)edit',
-...              identity=dict(name='Ben Utzer',
-...                            address='ben(at)example.com',
-...                            sent_folder='+Sent'),
-...              smtp_server='default-smtp',
+>>> json_request('http://localhost/profile/test-localhost/(at)(at)edit',
+...              default_identity='ben-example.com',
 ...              imap_server=dict(host='localhost',
 ...                               port=10143,
 ...                               user='test',
(at)(at) -948,11 +951,8 (at)(at)
 
 If the account is fixed, you are not allowed to edit the data:
 
->>> json_request('http://localhost/profile/ben-example.com/(at)(at)edit',
-...              identity=dict(name='Ben Atzer',
-...                            address='ben(at)example.com',
-...                            sent_folder='+Sent'),
-...              smtp_server='default-smtp',
+>>> json_request('http://localhost/profile/test-localhost/(at)(at)edit',
+...              default_identity='an-example.com',
 ...              imap_server=dict(host='localhost',
 ...                               port=10143,
 ...                               user='test',
(at)(at) -963,5 +963,3 (at)(at)
 [{...
   'name': 'Ben Utzer',
   ...}]
-
-

Modified: gocept.restmail/trunk/gocept/restmail/browser/account.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/account.py	(original)
+++ gocept.restmail/trunk/gocept/restmail/browser/account.py	Thu Feb 19
15:24:25 2009
(at)(at) -10,8 +10,7 (at)(at)
     """Web API for accounts."""
 
     (at)gocept.restmail.browser.json.view
-    def edit(self, identity, smtp_server, imap_server):
-        identity_obj = gocept.restmail.interfaces.IIdentity(self.context)
+    def edit(self, imap_server, default_identity):
         fixed = self.context.fixed
         if fixed:
             return
(at)(at) -21,10 +20,7 (at)(at)
         self.context.user = imap_server['user']
         self.context.password = imap_server['password']
         self.context.fixed = imap_server.get('fixed', False) 
-        identity_obj.name = identity['name']
-        identity_obj.address = identity['address']
-        identity_obj.sent_folder = identity['sent_folder']
-        identity_obj.smtp_server = smtp_server
+        self.context.default_identity = default_identity
 
     (at)gocept.restmail.browser.json.view
     def delete(self):

Modified: gocept.restmail/trunk/gocept/restmail/browser/inline.txt
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/inline.txt	(original)
+++ gocept.restmail/trunk/gocept/restmail/browser/inline.txt	Thu Feb 19
15:24:25 2009
(at)(at) -14,18 +14,21 (at)(at)
 >>> browser.getControl('Add').click()
 
 >>> from gocept.restmail.browser.tests import json_request,
render_message
->>> json_request('http://localhost/profile/(at)(at)add-account',
+>>> json_request('http://localhost/profile/(at)(at)add-identity',
 ...              identity=dict(name='Ben Utzer',
 ...                            address='ben(at)example.com',
-...                            sent_folder=''),
-...              smtp_server='default-smtp',
+...                            sent_folder='Sent'),
+...              smtp_server='default-smtp')
+{'from': 'Ben Utzer &lt;ben(at)example.com&gt;', 'id':
'ben-example.com'}
+>>> json_request('http://localhost/profile/(at)(at)add-account',
+...              default_identity='ben-example.com',
 ...              imap_server=dict(host='localhost',
 ...                               port=10143,
 ...                               user='test',
 ...                               password='bsdf'))
-{'url': 'http://localhost/profile/ben-example.com'}
+{'url': 'http://localhost/profile/test-localhost'}
 
->>> folder = 'http://localhost/profile/ben-example.com/+Testmessages'
+>>> folder = 'http://localhost/profile/test-localhost/+Testmessages'
 
 Various combined messages
 =========================
(at)(at) -49,7 +52,7 (at)(at)
 
 >>> print r['body']
 <div class="messagepart">
-...<img width="677" height="28" alt="" src="http://localhost/profile/ben-example.com/+Testmessages/*...-5/*body/1/2/2">...
+...<img width="677" height="28" alt="" src="http://localhost/profile/test-localhost/+Testmessages/*...-5/*body/1/2/2">...
 ...<img width="677" height="220"
src="cid:BA068E69-D7FA-4479-A3A4-FCFEFC9C9DE3/2/Photos">...
 ...<img width="622" height="27" alt=""
src="cid:BA068E69-D7FA-4479-A3A4-FCFEFC9C9DE3/bottom.jpg">...
 ...<img width="622" height="25" alt=""
src="cid:BA068E69-D7FA-4479-A3A4-FCFEFC9C9DE3/bbg.jpg">...
(at)(at) -61,7 +64,7 (at)(at)
 <h6>Attachments</h6>
 <ul>
   <li>
-    <a href="http://localhost/profile/ben-example.com/+Testmessages/*...-5/*body/1/2/2">tbg.jpg</a>
+    <a href="http://localhost/profile/test-localhost/+Testmessages/*...-5/*body/1/2/2">tbg.jpg</a>
       (<span>image/jpeg</span> <span>691</span>)
   </li>
 </ul>
(at)(at) -89,7 +92,7 (at)(at)
 
 >>> print r['body']
 <div class="messagepart">
-  <div><div>Daa <font class="Apple-style-span"
color="#FF3728">dudel</font> d&#246;<img height="240"
width="324" src="http://localhost/profile/ben-example.com/+Testmessages/*...-10/*body/2/2"><div><br></div><div><br></div><div><font
class="Apple-style-span">blasdjf&#160;</font><br><div>
<div><div><div>--&#160;</div><div>Christian
Zagrodnick &#183; <a
href="mailto:cz(at)gocept.com">cz(at)gocept.com</a></div><div>gocept
gmbh &amp; co. kg &#183; forsterstra&#223;e 29 &#183; 06112
halle (saale) &#183; germany</div><div><a href="http://gocept.com">http://gocept.com</a> &#183;
tel +49 345 1229889 0 &#183; fax +49 345 1229889
1</div><div>Zope and Plone consulting and
development</div><br></div></div><br></div><br></div></div></div>
+  <div><div>Daa <font class="Apple-style-span"
color="#FF3728">dudel</font> d&#246;<img height="240"
width="324" src="http://localhost/profile/test-localhost/+Testmessages/*...-10/*body/2/2"><div><br></div><div><br></div><div><font
class="Apple-style-span">blasdjf&#160;</font><br><div>
<div><div><div>--&#160;</div><div>Christian
Zagrodnick &#183; <a
href="mailto:cz(at)gocept.com">cz(at)gocept.com</a></div><div>gocept
gmbh &amp; co. kg &#183; forsterstra&#223;e 29 &#183; 06112
halle (saale) &#183; germany</div><div><a href="http://gocept.com">http://gocept.com</a> &#183;
tel +49 345 1229889 0 &#183; fax +49 345 1229889
1</div><div>Zope and Plone consulting and
development</div><br></div></div><br></div><br></div></div></div>
   <div><div class="footer">
 </div>
 </div>
(at)(at) -101,7 +104,7 (at)(at)
 <h6>Attachments</h6>
 <ul>
   <li>
-    <a href="http://localhost/profile/ben-example.com/+Testmessages/*...-10/*body/2/2">DSC03090.jpg</a>
+    <a href="http://localhost/profile/test-localhost/+Testmessages/*...-10/*body/2/2">DSC03090.jpg</a>
       (<span>image/jpeg</span> <span>213680</span>)
   </li>
 </ul>
(at)(at) -151,11 +154,11 (at)(at)
 <h6>Attachments</h6>
 <ul>
   <li>
-    <a href="http://localhost/profile/ben-example.com/+Testmessages/*...-11/*body/1/2">ez_setup.py</a>
+    <a href="http://localhost/profile/test-localhost/+Testmessages/*...-11/*body/1/2">ez_setup.py</a>
       (<span>text/x-python</span> <span>8509</span>)
   </li>
   <li>
-    <a href="http://localhost/profile/ben-example.com/+Testmessages/*...-11/*body/2">signature.asc</a>
+    <a href="http://localhost/profile/test-localhost/+Testmessages/*...-11/*body/2">signature.asc</a>
       (<span>application/pgp-signature</span>
<span>196</span>)
   </li>
 </ul>
(at)(at) -187,7 +190,7 (at)(at)
   <div><div>
 <div>
 <table width="753" class="email-body-wrap" id="email-body" align="center"
cellspacing="0" cellpadding="0" border="0"><tbody><tr><td
width="45" rowspan="2">&#160;</td>
-		<td width="663"><img width="663" height="148" alt="" src="http://localhost/profile/ben-example.com/+Testmessages/*...-12/*body/2/2"></td>
+		<td width="663"><img width="663" height="148" alt="" src="http://localhost/profile/test-localhost/+Testmessages/*...-12/*body/2/2"></td>
 		<td width="45" rowspan="2">&#160;</td>
 	</tr><tr><td width="663"><table width="663" height="289"
border="0" cellpadding="0" cellspacing="0"><tbody><tr><td
width="105">&#160;</td>
 				<td width="548"><font color="#4a4533">
(at)(at) -195,8 +198,8 (at)(at)
 				</font></td>
 				<td width="100">&#160;</td>
 		</tr></tbody></table></td>
-	</tr><tr><td width="753" colspan="3"><img width="753"
height="262" src="http://localhost/profile/ben-example.com/+Testmessages/*...-12/*body/2/3"></td>
-	</tr><tr><td width="753" colspan="3"><img width="753"
height="57" alt="" src="http://localhost/profile/ben-example.com/+Testmessages/*...-12/*body/2/4"></td>
+	</tr><tr><td width="753" colspan="3"><img width="753"
height="262" src="http://localhost/profile/test-localhost/+Testmessages/*...-12/*body/2/3"></td>
+	</tr><tr><td width="753" colspan="3"><img width="753"
height="57" alt="" src="http://localhost/profile/test-localhost/+Testmessages/*...-12/*body/2/4"></td>
 	</tr></tbody></table></div>
 </div></div>
   <div><div class="footer">
(at)(at) -210,31 +213,31 (at)(at)
 <h6>Attachments</h6>
 <ul>
   <li>
-    <a href="http://localhost/profile/ben-example.com/+Testmessages/*...-12/*body/2/2">top.jpg</a>
+    <a href="http://localhost/profile/test-localhost/+Testmessages/*...-12/*body/2/2">top.jpg</a>
       (<span>image/jpeg</span> <span>27412</span>)
   </li>
   <li>
-    <a href="http://localhost/profile/ben-example.com/+Testmessages/*...-12/*body/2/3">Photos.png</a>
+    <a href="http://localhost/profile/test-localhost/+Testmessages/*...-12/*body/2/3">Photos.png</a>
       (<span>image/png</span> <span>457106</span>)
   </li>
   <li>
-    <a href="http://localhost/profile/ben-example.com/+Testmessages/*...-12/*body/2/4">bottom.jpg</a>
+    <a href="http://localhost/profile/test-localhost/+Testmessages/*...-12/*body/2/4">bottom.jpg</a>
       (<span>image/jpeg</span> <span>19046</span>)
   </li>
   <li>
-    <a href="http://localhost/profile/ben-example.com/+Testmessages/*...-12/*body/2/5">bg_pattern.jpg</a>
+    <a href="http://localhost/profile/test-localhost/+Testmessages/*...-12/*body/2/5">bg_pattern.jpg</a>
       (<span>image/jpeg</span> <span>103782</span>)
   </li>
   <li>
-    <a href="http://localhost/profile/ben-example.com/+Testmessages/*...-12/*body/2/6">lbg.jpg</a>
+    <a href="http://localhost/profile/test-localhost/+Testmessages/*...-12/*body/2/6">lbg.jpg</a>
       (<span>image/jpeg</span> <span>9756</span>)
   </li>
   <li>
-    <a href="http://localhost/profile/ben-example.com/+Testmessages/*...-12/*body/2/7">rbg.jpg</a>
+    <a href="http://localhost/profile/test-localhost/+Testmessages/*...-12/*body/2/7">rbg.jpg</a>
       (<span>image/jpeg</span> <span>9816</span>)
   </li>
   <li>
-    <a href="http://localhost/profile/ben-example.com/+Testmessages/*...-12/*body/2/8">bg_letter.jpg</a>
+    <a href="http://localhost/profile/test-localhost/+Testmessages/*...-12/*body/2/8">bg_letter.jpg</a>
       (<span>image/jpeg</span> <span>36484</span>)
   </li>
 </ul>
(at)(at) -267,7 +270,7 (at)(at)
 >>> print r['body']
 <div class="messagepart">
   <div><div>
-Ich habe hier noch ein Bild beigefuegt.<br><img src="http://localhost/profile/ben-example.com/+Testmessages/*...-13/*body/1/2"
align="bottom" border="0"><br><br>
+Ich habe hier noch ein Bild beigefuegt.<br><img src="http://localhost/profile/test-localhost/+Testmessages/*...-13/*body/1/2"
align="bottom" border="0"><br><br>
 Viel Spass<br><br><table cellspacing="0" cellpadding="0"
width="100%"><tr><td>
 <pre>
 --
(at)(at) -289,11 +292,11 (at)(at)
 <h6>Attachments</h6>
 <ul>
   <li>
-    <a href="http://localhost/profile/ben-example.com/+Testmessages/*...-13/*body/1/2">drawing.png</a>
+    <a href="http://localhost/profile/test-localhost/+Testmessages/*...-13/*body/1/2">drawing.png</a>
       (<span>image/png</span> <span>110992</span>)
   </li>
   <li>
-    <a href="http://localhost/profile/ben-example.com/+Testmessages/*...-13/*body/2">random.zip</a>
+    <a href="http://localhost/profile/test-localhost/+Testmessages/*...-13/*body/2">random.zip</a>
       (<span>application/zip</span>
<span>104276</span>)
   </li>
 </ul>
(at)(at) -309,8 +312,7 (at)(at)
 >>> r = render_message(folder, 'something simple')
 >>> print r['body']
 <div class="messagepart">
-  <div><pre>This is a plain-text message.
-It has two lines.
+  <div><pre>I'm a message with no funny characters.
 </pre></div>
   <div><div class="footer">
 </div>
(at)(at) -477,7 +479,7 (at)(at)
 
 >>> json_request(draft['url']+'/(at)(at)save',
 ...              to='ct(at)gocept.com',
-...              identity='ben-example.com-identity',
+...              identity='ben-example.com',
 ...              subject=u'asdf',
 ...              body='HelloHello')
 >>> print json_request(draft['url'] + '/(at)(at)render')['body']
(at)(at) -493,7 +495,7 (at)(at)
 
 >>> json_request(draft['url']+'/(at)(at)save',
 ...              to='ct(at)gocept.com',
-...              identity='ben-example.com-identity',
+...              identity='ben-example.com',
 ...              subject=u'asdf',
 ...             
body='<html><body>HelloHello</body></html>')
 >>> print json_request(draft['url'] + '/(at)(at)render')['body']

Modified: gocept.restmail/trunk/gocept/restmail/browser/profile.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/profile.py	(original)
+++ gocept.restmail/trunk/gocept/restmail/browser/profile.py	Thu Feb 19
15:24:25 2009
(at)(at) -31,6 +31,7 (at)(at)
                  'ssl': account.ssl,
                  'user': account.user,
                  'password': account.password,
+                 'ident_id': account.default_identity,
                  'name': identity.name,
                  'address': identity.address,
                  'sent_folder': identity.sent_folder,
(at)(at) -61,30 +62,31 (at)(at)
         self.context.preferences = config
 
     (at)gocept.restmail.browser.json.view
-    def add_account(self, identity, smtp_server, imap_server):
+    def add_account(self, imap_server, default_identity):
         # XXX handle collision
-        account_id = identity['address'].replace('(at)', '-')
-        identity_id = '%s-identity' % account_id
+        account_id = '%s-%s' % (imap_server['user'], imap_server['host'])
 
         account = gocept.restmail.imapaccount.IMAPAccount(
-            account_id, identity_id=identity_id, **imap_server)
-        identity = gocept.restmail.identity.Identity(
-            identity_id, account_id=account_id, smtp_server=smtp_server,
-            **identity)
+            account_id, identity_id=default_identity, **imap_server)
 
         self.context._setObject(account_id, account)
-        self.context._setObject(identity_id, identity)
+
+        identity = self.context[default_identity]
+        if not identity.account_id:
+            identity.account_id = account_id
+
         return {'url': self.context[account_id].absolute_url()}
 
     (at)gocept.restmail.browser.json.view
-    def add_identity(self, account_id, identity_id, identity, smtp_server,
+    def add_identity(self, identity, smtp_server, account_id=None,
                      default=False):
+        identity_id = identity['address'].replace('(at)', '-')
         identity = gocept.restmail.identity.Identity(
             identity_id, account_id=account_id, smtp_server=smtp_server,
             **identity)
         self.context._setObject(identity_id, identity)
-        if default:
-            self.context[account_id].set_identity(identity_id)
+        return {'id': identity_id,
+                'from': xml.sax.saxutils.escape(identity.From())}
 
     def delete_account(self, id):
         identity = getattr(self.context, id)

SVN: r29251 - gocept.webmail-buildout/trunk/profiles
Wolfgang Schnerring <ws(at)gocept.com>
2009-02-20 14:16:12 [ FULL ]
Author: wosc
Date: Fri Feb 20 14:16:10 2009
New Revision: 29251

Log:
 - bump zc.selenium version to the current snapshot which has working
DemoStorage push/pop
 - install zc.selenium only in the selenium-instance



Modified:
   gocept.webmail-buildout/trunk/profiles/dev.cfg

Modified: gocept.webmail-buildout/trunk/profiles/dev.cfg
==============================================================================
--- gocept.webmail-buildout/trunk/profiles/dev.cfg	(original)
+++ gocept.webmail-buildout/trunk/profiles/dev.cfg	Fri Feb 20 14:16:10 2009
(at)(at) -24,7 +24,6 (at)(at)
     ${packages:names}
     lxml
     zc.testbrowser
-    zc.selenium
 
 versions = versions
 
(at)(at) -32,7 +31,7 (at)(at)
 lovely.recipe = 0.3.1b5
 lxml = 2.1.2
 zc.testbrowser = 1.0.0a5dev-r91664
-zc.selenium = 1.3.0dev-r96720
+zc.selenium = 1.3.0dev-r96813
 
 [packages]
 names =
(at)(at) -147,19 +146,22 (at)(at)
 
 [instance-selenium]
 recipe = plone.recipe.zope2instance
-# DemoStorage is the only difference to [instance]
 demo-storage = on
+eggs = ${buildout:eggs}
+    zc.selenium
+# will be overriden by selenium runner with random port
+http-address = 39858
+# the rest is identical to [instance]
 zope2-location = ${zope2:location}
 user = ${instance:user}
 debug-mode = on
 verbose-security = on
-eggs = ${buildout:eggs}
 zcml = ${instance:zcml}
 products = ${productdistros:location}
 
 [selenium]
 recipe = zc.recipe.egg:scripts
-eggs = ${instance:eggs}
+eggs = ${instance-selenium:eggs}
 extra-paths = ${zope2:location}/lib/python
             ${zope2:location}/lib/python/AccessControl
 scripts = selenium

SVN: r29260 - gocept.webmail-buildout/trunk/profiles
Wolfgang Schnerring <ws(at)gocept.com>
2009-02-23 09:44:08 [ FULL ]
Author: wosc
Date: Mon Feb 23 09:44:07 2009
New Revision: 29260

Log:
put zope2's var/ (especially: Data.fs) below its parts directory, where it
belongs



Modified:
   gocept.webmail-buildout/trunk/profiles/dev.cfg

Modified: gocept.webmail-buildout/trunk/profiles/dev.cfg
==============================================================================
--- gocept.webmail-buildout/trunk/profiles/dev.cfg	(original)
+++ gocept.webmail-buildout/trunk/profiles/dev.cfg	Mon Feb 23 09:44:07 2009
(at)(at) -65,6 +65,8 (at)(at)
 zope2-location = ${zope2:location}
 user = admin:admin
 http-address = 8080
+# XXX why does the recipe not use its parts-directory by default?
+var = ${buildout:parts-directory}/instance/var
 debug-mode = on
 verbose-security = on
 eggs = ${buildout:eggs}
(at)(at) -137,6 +139,7 (at)(at)
     ZODB3
     mechanize
     ClientForm
+    zope.traversing
 
 [test]
 recipe = collective.recipe.z2testrunner
(at)(at) -152,6 +155,7 (at)(at)
 # will be overriden by selenium runner with random port
 http-address = 39858
 # the rest is identical to [instance]
+var = ${buildout:parts-directory}/instance-location/var
 zope2-location = ${zope2:location}
 user = ${instance:user}
 debug-mode = on

SVN: r29261 - gocept.webmail-buildout/trunk/profiles
Wolfgang Schnerring <ws(at)gocept.com>
2009-02-23 10:04:31 [ FULL ]
Author: wosc
Date: Mon Feb 23 10:04:30 2009
New Revision: 29261

Log:
I typoed a little on the last commit.



Modified:
   gocept.webmail-buildout/trunk/profiles/dev.cfg

Modified: gocept.webmail-buildout/trunk/profiles/dev.cfg
==============================================================================
--- gocept.webmail-buildout/trunk/profiles/dev.cfg	(original)
+++ gocept.webmail-buildout/trunk/profiles/dev.cfg	Mon Feb 23 10:04:30 2009
(at)(at) -139,7 +139,6 (at)(at)
     ZODB3
     mechanize
     ClientForm
-    zope.traversing
 
 [test]
 recipe = collective.recipe.z2testrunner
(at)(at) -155,7 +154,7 (at)(at)
 # will be overriden by selenium runner with random port
 http-address = 39858
 # the rest is identical to [instance]
-var = ${buildout:parts-directory}/instance-location/var
+var = ${buildout:parts-directory}/instance-selenium/var
 zope2-location = ${zope2:location}
 user = ${instance:user}
 debug-mode = on

SVN: r29266 - in gocept.webmail-buildout/trunk: . profiles
Wolfgang Schnerring <ws(at)gocept.com>
2009-02-23 10:59:23 [ FULL ]
Author: wosc
Date: Mon Feb 23 10:59:22 2009
New Revision: 29266

Log:
the var/ for the "normal" instance should be outside of parts/ so it is not
killed by buildout, but the var/ for the selenium-instance should be separate
from that, so there is no interference.



Modified:
   gocept.webmail-buildout/trunk/   (props changed)
   gocept.webmail-buildout/trunk/profiles/dev.cfg

Modified: gocept.webmail-buildout/trunk/profiles/dev.cfg
==============================================================================
--- gocept.webmail-buildout/trunk/profiles/dev.cfg	(original)
+++ gocept.webmail-buildout/trunk/profiles/dev.cfg	Mon Feb 23 10:59:22 2009
(at)(at) -65,8 +65,6 (at)(at)
 zope2-location = ${zope2:location}
 user = admin:admin
 http-address = 8080
-# XXX why does the recipe not use its parts-directory by default?
-var = ${buildout:parts-directory}/instance/var
 debug-mode = on
 verbose-security = on
 eggs = ${buildout:eggs}
(at)(at) -151,10 +149,11 (at)(at)
 demo-storage = on
 eggs = ${buildout:eggs}
     zc.selenium
+# don't step on [instance]'s Data.fs
+var = ${buildout:parts-directory}/instance-selenium/var
 # will be overriden by selenium runner with random port
 http-address = 39858
 # the rest is identical to [instance]
-var = ${buildout:parts-directory}/instance-selenium/var
 zope2-location = ${zope2:location}
 user = ${instance:user}
 debug-mode = on

SVN: r29267 - mytum.webmail/trunk/mytum/webmail
Thomas Lotze <tl(at)gocept.com>
2009-02-23 11:13:06 [ FULL ]
Author: thomas
Date: Mon Feb 23 11:13:05 2009
New Revision: 29267

Log:
no more profiles for the normal webmailer


Modified:
   mytum.webmail/trunk/mytum/webmail/tests.py

Modified: mytum.webmail/trunk/mytum/webmail/tests.py
==============================================================================
--- mytum.webmail/trunk/mytum/webmail/tests.py	(original)
+++ mytum.webmail/trunk/mytum/webmail/tests.py	Mon Feb 23 11:13:05 2009
(at)(at) -28,8 +28,7 (at)(at)
 
 
     # add a CMF Site with the CMFWebmail product
-    addConfiguredSite(app, 'webmail', 'CMFDefault:default',
-                      extension_ids=('other:gocept.restmail', ))
+    addConfiguredSite(app, 'webmail', 'CMFDefault:default')
     cmfsite = test.app['webmail']
 
     # Add the 'tumLogin' property to the manager

SVN: r29268 - mytum.webmail/trunk/mytum/webmail
Thomas Lotze <tl(at)gocept.com>
2009-02-23 11:13:28 [ FULL ]
Author: thomas
Date: Mon Feb 23 11:13:27 2009
New Revision: 29268

Log:
folder names are now unicode


Modified:
   mytum.webmail/trunk/mytum/webmail/README.txt
   mytum.webmail/trunk/mytum/webmail/account.py

Modified: mytum.webmail/trunk/mytum/webmail/README.txt
==============================================================================
--- mytum.webmail/trunk/mytum/webmail/README.txt	(original)
+++ mytum.webmail/trunk/mytum/webmail/README.txt	Mon Feb 23 11:13:27 2009
(at)(at) -55,7 +55,7 (at)(at)
 >>> identity
 <Identity at /webmail/mgr/mytum-identity-sw-gocept.com>
 >>> identity.sent_folder
-'+Sent'
+u'+Sent'
 >>> identity.name
 'Admin'
 >>> identity.address

Modified: mytum.webmail/trunk/mytum/webmail/account.py
==============================================================================
--- mytum.webmail/trunk/mytum/webmail/account.py	(original)
+++ mytum.webmail/trunk/mytum/webmail/account.py	Mon Feb 23 11:13:27 2009
(at)(at) -109,7 +109,7 (at)(at)
     for address in addresses:
         id_ = 'mytum-identity-%s' % address.replace('(at)', '-')
         profile._setObject(id_,
-            Identity(id_, address, 'mytum', '+Sent'))
+            Identity(id_, address, 'mytum', u'+Sent'))
         identities.append(id_)
     account = Account('mytum', identities[0])
     profile._setObject('mytum', account)

SVN: r29270 - gocept.restmail/trunk/gocept/restmail/browser
Thomas Lotze <tl(at)gocept.com>
2009-02-23 13:51:59 [ FULL ]
Author: thomas
Date: Mon Feb 23 13:51:58 2009
New Revision: 29270

Log:
removed dead code, fixed imports


Modified:
   gocept.restmail/trunk/gocept/restmail/browser/profile.py

Modified: gocept.restmail/trunk/gocept/restmail/browser/profile.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/profile.py	(original)
+++ gocept.restmail/trunk/gocept/restmail/browser/profile.py	Mon Feb 23
13:51:58 2009
(at)(at) -5,6 +5,7 (at)(at)
 import cjson
 import gocept.restmail.identity
 import gocept.restmail.imapaccount
+import gocept.restmail.interfaces
 import gocept.restmail.browser.json
 import xml.sax.saxutils
 import zope.app.zapi
(at)(at) -88,12 +89,6 (at)(at)
         return {'id': identity_id,
                 'from': xml.sax.saxutils.escape(identity.From())}
 
-    def delete_account(self, id):
-        identity = getattr(self.context, id)
-        self.context.manage_delObjects(identity.account_id)
-        self.context.manage_delObjects(id)
-        return cjson.encode("Account deleted.")
-
     def new_draft(self, message=None):
         """Create a new draft message."""
         draft = self.context.new_draft(message)

SVN: r29273 - gocept.autocomplete/trunk
Wolfgang Schnerring <ws(at)gocept.com>
2009-02-23 15:36:43 [ FULL ]
Author: wosc
Date: Mon Feb 23 15:36:42 2009
New Revision: 29273

Log:
added missing dependency for running a server



Modified:
   gocept.autocomplete/trunk/buildout.cfg

Modified: gocept.autocomplete/trunk/buildout.cfg
==============================================================================
--- gocept.autocomplete/trunk/buildout.cfg	(original)
+++ gocept.autocomplete/trunk/buildout.cfg	Mon Feb 23 15:36:42 2009
(at)(at) -23,6 +23,7 (at)(at)
 servers = zserver
 eggs = ${test:eggs}
      zope.app.server
+     zope.app.zapi
 site.zcml =
     <include package="gocept.autocomplete" file="ftesting.zcml" />
     <include package="zope.app.server"/>
(at)(at) -49,4 +50,3 (at)(at)
 entry-points = selenium=zc.selenium.selenium:main
 initialization =
     sys.argv[1:1] = ['${demo:run-directory}/zope.conf', '-r']
-

SVN: r29274 - gocept.autocomplete/trunk
Wolfgang Schnerring <ws(at)gocept.com>
2009-02-23 15:38:06 [ FULL ]
Author: wosc
Date: Mon Feb 23 15:38:05 2009
New Revision: 29274

Log:
use infrae.subversions as_eggs feature instead of doing it manually



Modified:
   gocept.autocomplete/trunk/buildout.cfg

Modified: gocept.autocomplete/trunk/buildout.cfg
==============================================================================
--- gocept.autocomplete/trunk/buildout.cfg	(original)
+++ gocept.autocomplete/trunk/buildout.cfg	Mon Feb 23 15:38:05 2009
(at)(at) -1,6 +1,6 (at)(at)
 [buildout]
 develop = .
-parts = libxml2 libxslt lxml deveggsvn z3c.form test demo selenium
+parts = libxml2 libxslt lxml deveggsvn test demo selenium
 extends = http://svn.gocept.com/repos/gocept/zopeversions/zope-stable.cfg
           http://svn.gocept.com/repos/gocept/gocept.lxml/trunk/buildout-lxml.cfg
 
(at)(at) -11,10 +11,7 (at)(at)
 [deveggsvn]
 recipe = infrae.subversion
 urls = svn://svn.zope.org/repos/main/z3c.form/trunk z3c.form
-
-[z3c.form]
-recipe = zc.recipe.egg:develop
-setup = ${deveggsvn:location}/z3c.form
+as_eggs = True
 
 ### Selenium tests

SVN: r29275 - gocept.autocomplete/trunk
Wolfgang Schnerring <ws(at)gocept.com>
2009-02-23 15:38:28 [ FULL ]
Author: wosc
Date: Mon Feb 23 15:38:27 2009
New Revision: 29275

Log:
added missing test dependency



Modified:
   gocept.autocomplete/trunk/setup.py

Modified: gocept.autocomplete/trunk/setup.py
==============================================================================
--- gocept.autocomplete/trunk/setup.py	(original)
+++ gocept.autocomplete/trunk/setup.py	Mon Feb 23 15:38:27 2009
(at)(at) -38,8 +38,9 (at)(at)
         test=[
             'lxml',
             'zc.selenium',
-            'zope.app.testing',
             'zope.app.appsetup',
+            'zope.app.testing',
+            'zope.app.zcmlfiles',
             'zope.securitypolicy',
             'zope.testing',
             'zope.testbrowser>=3.4.3',

SVN: r29277 - gocept.autocomplete/trunk
Wolfgang Schnerring <ws(at)gocept.com>
2009-02-23 15:38:59 [ FULL ]
Author: wosc
Date: Mon Feb 23 15:38:58 2009
New Revision: 29277

Log:
changelog


Modified:
   gocept.autocomplete/trunk/CHANGES.txt

Modified: gocept.autocomplete/trunk/CHANGES.txt
==============================================================================
--- gocept.autocomplete/trunk/CHANGES.txt	(original)
+++ gocept.autocomplete/trunk/CHANGES.txt	Mon Feb 23 15:38:58 2009
(at)(at) -1,6 +1,14 (at)(at)
 Changes
 =======
 
+0.2 (unreleased)
+----------------
+
+- register the widget for IChoice fields with an ISearchableSource.
+  This functionality depends on z3c.form>=r96460 (will be included in
+  z3c.form-2.0).
+- improved documentation.
+
 0.1 (2009-02-06)
 ----------------

SVN: r29290 - gocept.webmail-buildout/trunk/profiles
Wolfgang Schnerring <ws(at)gocept.com>
2009-02-24 10:05:07 [ FULL ]
Author: wosc
Date: Tue Feb 24 10:05:05 2009
New Revision: 29290

Log:
since zope2 stores login data in the zodb, we were losing them all the time
because of the demostorage

here's an ugly hack to preserve the "inituser" file -- we should think of some
better way of achieving the goal of a) having a demostorage and b) still being
able to log in



Modified:
   gocept.webmail-buildout/trunk/profiles/dev.cfg

Modified: gocept.webmail-buildout/trunk/profiles/dev.cfg
==============================================================================
--- gocept.webmail-buildout/trunk/profiles/dev.cfg	(original)
+++ gocept.webmail-buildout/trunk/profiles/dev.cfg	Tue Feb 24 10:05:05 2009
(at)(at) -150,7 +150,7 (at)(at)
 eggs = ${buildout:eggs}
     zc.selenium
 # don't step on [instance]'s Data.fs
-var = ${buildout:parts-directory}/instance-selenium/var
+var = ${buildout:directory}/var/selenium
 # will be overriden by selenium runner with random port
 http-address = 39858
 # the rest is identical to [instance]
(at)(at) -169,4 +169,8 (at)(at)
 scripts = selenium
 entry-points = selenium=zc.selenium.selenium:main
 initialization =
+    import os.path, shutil
+    inituser = '${instance-selenium:location}/inituser'
+    if os.path.exists(inituser): shutil.copyfile(inituser, inituser + '.bak')
+    if os.path.exists(inituser + '.bak'): shutil.copyfile(inituser + '.bak',
inituser)
     sys.argv[1:1] = ['${instance-selenium:location}/etc/zope.conf', '-r',
'-z', 'zope2']

SVN: r29295 - gocept.restmail/trunk/gocept/restmail
Sebastian Wehrmann <sw(at)gocept.com>
2009-02-24 11:04:53 [ FULL ]
Author: sweh
Date: Tue Feb 24 11:04:52 2009
New Revision: 29295

Log:
- Better variable names.



Modified:
   gocept.restmail/trunk/gocept/restmail/imapaccount.py

Modified: gocept.restmail/trunk/gocept/restmail/imapaccount.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/imapaccount.py	(original)
+++ gocept.restmail/trunk/gocept/restmail/imapaccount.py	Tue Feb 24 11:04:52
2009
(at)(at) -74,11 +74,11 (at)(at)
         return account
 
     def folders(self, name=None):
-        connection = self.connect()
+        account = self.connect()
         if name is not None:
-            folders = [connection.folders[name]]
+            folders = [account.folders[name]]
         else:
-            folders = connection.folders.values()
+            folders = account.folders.values()
 
         # Apply Zope 2 wrap
         folders = [Folder(folder) for folder in folders]
(at)(at) -87,9 +87,9 (at)(at)
         return folders
 
     def create_folder(self, name):
-        connection = self.connect()
+        account = self.connect()
         new_folder = gocept.imapapi.folder.Folder()
-        connection.folders[name] = new_folder
+        account.folders[name] = new_folder
         return self.folders(name)[0]
 
     def set_identity(self, identity_id):

SVN: r29299 - gocept.restmail/trunk/gocept/restmail/testmessages
Thomas Lotze <tl(at)gocept.com>
2009-02-24 18:48:39 [ FULL ]
Author: thomas
Date: Tue Feb 24 18:48:38 2009
New Revision: 29299

Log:
disambiguated a test message subject


Modified:
   gocept.restmail/trunk/gocept/restmail/testmessages/24-ascii-with-dos-cr

Modified:
gocept.restmail/trunk/gocept/restmail/testmessages/24-ascii-with-dos-cr
==============================================================================
---
gocept.restmail/trunk/gocept/restmail/testmessages/24-ascii-with-dos-cr	(original)
+++ gocept.restmail/trunk/gocept/restmail/testmessages/24-ascii-with-dos-cr	Tue
Feb 24 18:48:38 2009
(at)(at) -1,6 +1,6 (at)(at)
 From: me(at)example.org
 To: you(at)example.org
-Subject: something simple
+Subject: 24 - text/plain, DOS CR
 
 This is a plain-text message.
 It has two lines.

SVN: r29303 - gocept.restmail/trunk/gocept/restmail
Sebastian Wehrmann <sw(at)gocept.com>
2009-02-25 09:36:59 [ FULL ]
Author: sweh
Date: Wed Feb 25 09:36:58 2009
New Revision: 29303

Log:
- Update interfaces.



Modified:
   gocept.restmail/trunk/gocept/restmail/interfaces.py

Modified: gocept.restmail/trunk/gocept/restmail/interfaces.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/interfaces.py	(original)
+++ gocept.restmail/trunk/gocept/restmail/interfaces.py	Wed Feb 25 09:36:58
2009
(at)(at) -27,8 +27,11 (at)(at)
 
     name = zope.schema.TextLine(title=u'Real name')
     address = zope.schema.TextLine(title=u'Mail address')
-    smtp_server = zope.schema.TextLine(title=u'Outgoing mail server')
     account_id = zope.schema.TextLine(title=u'Mailbox account')
+    smtp_server = zope.schema.TextLine(title=u'Outgoing mail server')
+
+    def From():
+        """An RfC 822 conformant `From` representation of this identity."""
 
 
 class IIMAPAccount(zope.interface.Interface):
(at)(at) -42,6 +45,7 (at)(at)
     port = zope.schema.Int(title=u'Server port')
     user = zope.schema.TextLine(title=u'User name')
     password = zope.schema.TextLine(title=u'Password')
+    ssl = zope.schema.Bool(title=u'SSL')
 
     fixed = zope.schema.Bool(
         title=u'Fixed account',
(at)(at) -55,6 +59,27 (at)(at)
         description=u'Tuple of folder names on the path to the "Sent" folder '
                     u'within the profile')
 
+    def connect():
+        """Return a gocept.imapapi.interfaces.IAccount object."""
+
+    def folders(name=None):
+        """Return a list of folders inside `name'.
+
+        If `name' is None, return a list of folders in the account.
+        """
+
+    def create_folder(name):
+        """Create a folder in the account."""
+
+    def check_connection():
+        """Check if a connection to the imap server is possible."""
+
+    def folder_by_names(names, create=False):
+        """Return the folder given by its path.
+
+        If `create' is True, create the folder if it does not exist.
+        """
+
     def get_sent_folder(create=False):
         """Return the "Sent" folder.
 
(at)(at) -62,9 +87,6 (at)(at)
 
         """
 
-    def connect():
-        """Return a gocept.imapapi.interfaces.IAccount object."""
-
 
 class IRendered(zope.interface.Interface):
     """A structured rendition of a message or body part."""

SVN: r29313 - gocept.restmail/trunk/gocept/restmail
Thomas Lotze <tl(at)gocept.com>
2009-02-25 14:07:00 [ FULL ]
Author: thomas
Date: Wed Feb 25 14:06:59 2009
New Revision: 29313

Log:
set INBOX as the sent folder by default


Modified:
   gocept.restmail/trunk/gocept/restmail/imapaccount.py

Modified: gocept.restmail/trunk/gocept/restmail/imapaccount.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/imapaccount.py	(original)
+++ gocept.restmail/trunk/gocept/restmail/imapaccount.py	Wed Feb 25 14:06:59
2009
(at)(at) -60,7 +60,7 (at)(at)
         self.port = port
         self.user = user
         self.password = password
-        self.sent_folder = sent_folder
+        self.sent_folder = sent_folder or (u'INBOX',)
         self.default_identity = identity_id
         self.ssl = ssl
         self.fixed = fixed

SVN: r29314 - gocept.restmail/trunk/gocept/restmail/browser
Thomas Lotze <tl(at)gocept.com>
2009-02-25 14:08:20 [ FULL ]
Author: thomas
Date: Wed Feb 25 14:08:19 2009
New Revision: 29314

Log:
set INBOX as the sent folder by default


Modified:
   gocept.restmail/trunk/gocept/restmail/browser/README.txt

Modified: gocept.restmail/trunk/gocept/restmail/browser/README.txt
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/README.txt	(original)
+++ gocept.restmail/trunk/gocept/restmail/browser/README.txt	Wed Feb 25
14:08:19 2009
(at)(at) -144,7 +144,7 (at)(at)
   'name': 'Ben Utzer',
   'password': 'bsdf',
   'port': 10143,
-  'sent_folder': [],
+  'sent_folder': ['INBOX'],
   'smtp_server': 'default-smtp',
   'ssl': False,
   'status': 'ok',
(at)(at) -157,7 +157,7 (at)(at)
   'name': 'Ben Utzer',
   'password': 'bsdf',
   'port': 10143,
-  'sent_folder': [],
+  'sent_folder': ['INBOX'],
   'smtp_server': 'default-smtp',
   'ssl': False,
   'status': 'ok',
(at)(at) -307,7 +307,7 (at)(at)
   'name': 'Ben Utzer',
   'password': 'bsdf',
   'port': 10143,
-  'sent_folder': [],
+  'sent_folder': ['INBOX'],
   'smtp_server': 'default-smtp',
   'ssl': False,
   'status': 'ok',

SVN: r29321 - gocept.restmail/trunk/gocept/restmail/browser
Thomas Lotze <tl(at)gocept.com>
2009-02-26 09:34:36 [ FULL ]
Author: thomas
Date: Thu Feb 26 09:34:35 2009
New Revision: 29321

Log:
no longer send the password to the UI when editing an account, fixes #4714


Modified:
   gocept.restmail/trunk/gocept/restmail/browser/account.py
   gocept.restmail/trunk/gocept/restmail/browser/profile.py

Modified: gocept.restmail/trunk/gocept/restmail/browser/account.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/account.py	(original)
+++ gocept.restmail/trunk/gocept/restmail/browser/account.py	Thu Feb 26
09:34:35 2009
(at)(at) -20,7 +20,8 (at)(at)
         self.context.port = port
         self.context.ssl = ssl
         self.context.user = user
-        self.context.password = password
+        if password is not None:
+            self.context.password = password
         self.context.sent_folder = tuple(
             unicode(name) for name in sent_folder)
         identity = gocept.restmail.interfaces.IIdentity(self.context)
(at)(at) -31,7 +32,8 (at)(at)
         mailhost.smtp_host = smtp_host
         mailhost.smtp_port = int(smtp_port)
         mailhost.smtp_uid = smtp_user
-        mailhost.smtp_pwd = smtp_password
+        if smtp_password is not None:
+            mailhost.smtp_pwd = smtp_password
 
     (at)gocept.restmail.browser.json.view
     def delete(self):

Modified: gocept.restmail/trunk/gocept/restmail/browser/profile.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/profile.py	(original)
+++ gocept.restmail/trunk/gocept/restmail/browser/profile.py	Thu Feb 26
09:34:35 2009
(at)(at) -34,14 +34,14 (at)(at)
                  'port': account.port,
                  'ssl': account.ssl,
                  'user': account.user,
-                 'password': account.password,
+                 'password': bool(account.password),
                  'name': identity.name,
                  'address': identity.address,
                  'sent_folder': account.sent_folder,
                  'smtp_host': mailhost.smtp_host,
                  'smtp_port': mailhost.smtp_port,
                  'smtp_user': mailhost.smtp_uid,
-                 'smtp_password': mailhost.smtp_pwd,
+                 'smtp_password': bool(mailhost.smtp_pwd),
                  'url': account.absolute_url(),
                  'fixed': account.fixed})
         return data

SVN: r29323 - gocept.restmail/trunk/gocept/restmail
Wolfgang Schnerring <ws(at)gocept.com>
2009-02-26 09:41:50 [ FULL ]
Author: wosc
Date: Thu Feb 26 09:41:49 2009
New Revision: 29323

Log:
Re #4705: signal rendering failure with a RenderError, not by returning None



Modified:
   gocept.restmail/trunk/gocept/restmail/render.py

Modified: gocept.restmail/trunk/gocept/restmail/render.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/render.py	(original)
+++ gocept.restmail/trunk/gocept/restmail/render.py	Thu Feb 26 09:41:49 2009
(at)(at) -7,6 +7,7 (at)(at)
 import lxml.html
 import lxml.html.clean
 
+from zope.component import ComponentLookupError
 import Acquisition
 import zope.component
 import zope.interface
(at)(at) -104,15 +105,21 (at)(at)
     if not content_type:
         return
     major, minor = content_type.split('/')
-    rendered = zope.component.queryAdapter(
-        part, gocept.restmail.interfaces.IRendered,
-        name='%s_%s' % (major, minor))
-    if not rendered:
-        rendered = zope.component.queryAdapter(
+
+    try:
+        return zope.component.getAdapter(
+            part, gocept.restmail.interfaces.IRendered,
+            name='%s_%s' % (major, minor))
+    except (ComponentLookupError, RenderError):
+        pass
+
+    try:
+        return zope.component.getAdapter(
             part, gocept.restmail.interfaces.IRendered, name=major)
-    if not rendered:
-        rendered = RenderedAttachment(part)
-    return rendered
+    except (ComponentLookupError, RenderError):
+        pass
+
+    return RenderedAttachment(part)
 
 
 (at)zope.interface.implementer(gocept.restmail.interfaces.IRendered)
(at)(at) -121,7 +128,10 (at)(at)
     """Provide a body representation for multipart/alternative."""
     subparts = []
     for candidate in reversed(part.parts()[:]):
-        rendered = gocept.restmail.interfaces.IRendered(candidate)
+        try:
+            rendered = gocept.restmail.interfaces.IRendered(candidate)
+        except RenderError:
+            continue
         subparts.append(rendered)
         if rendered.inline:
             break
(at)(at) -167,6 +177,10 (at)(at)
     return BodyTextHTML(part)()
 
 
+class RenderError(Exception):
+    pass
+
+
 class BodyTextHTML(object):
     """View helper for body parts of type text/html."""
 
(at)(at) -182,8 +196,8 (at)(at)
             body = tree.body
             body.tag = 'div'
             return RenderedInline(self.context, body)
-        except lxml.etree.ParseError:
-            return None
+        except lxml.etree.ParseError, e:
+            raise RenderError(e)
 
     def _parse(self, text, encoding):
         try:

SVN: r29327 - gocept.restmail/trunk/gocept/restmail
Wolfgang Schnerring <ws(at)gocept.com>
2009-02-26 11:17:15 [ FULL ]
Author: wosc
Date: Thu Feb 26 11:17:13 2009
New Revision: 29327

Log:
this profile.py belongs to r29326, whereas browser/profile.py belongs to the
next commit. sorry.



Modified:
   gocept.restmail/trunk/gocept/restmail/profile.py

Modified: gocept.restmail/trunk/gocept/restmail/profile.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/profile.py	(original)
+++ gocept.restmail/trunk/gocept/restmail/profile.py	Thu Feb 26 11:17:13 2009
(at)(at) -11,6 +11,8 (at)(at)
 from OFS.ObjectManager import ObjectManager
 from OFS.PropertyManager import PropertyManager
 
+import gocept.restmail.draft
+
 
 class Profile(Acquisition.Implicit,
               ObjectManager, PropertyManager, RoleManager, Item):
(at)(at) -34,13 +36,13 (at)(at)
         return self, ["index_html"]
 
     def manage_afterAdd(self, item, container):
-        self.manage_addProduct['OFSP'].manage_addFolder('drafts')
+        self.drafts = gocept.restmail.draft.DraftFolder('drafts')
         for permission in [
             'View', 'Access contents information', 'Use webmail']:
             self.manage_permission(permission, ['Manager', 'Owner'], False)
 
     def new_draft(self, message=None):
-        return gocept.restmail.draft.new_draft(self['drafts'], message)
+        return gocept.restmail.draft.new_draft(self.drafts, message)
 
     def manage_identities(self):
         return self.objectIds('Webmail Identity')

SVN: r29328 - gocept.restmail/trunk/gocept/restmail/browser
Wolfgang Schnerring <ws(at)gocept.com>
2009-02-26 11:18:54 [ FULL ]
Author: wosc
Date: Thu Feb 26 11:18:53 2009
New Revision: 29328

Log:
Re #4713: return draft list in batch-compatible format.

(browser/profile.py was accidentally commited in r29326 already)



Modified:
   gocept.restmail/trunk/gocept/restmail/browser/README.txt
   gocept.restmail/trunk/gocept/restmail/browser/zmi.txt

Modified: gocept.restmail/trunk/gocept/restmail/browser/README.txt
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/README.txt	(original)
+++ gocept.restmail/trunk/gocept/restmail/browser/README.txt	Thu Feb 26
11:18:53 2009
(at)(at) -591,10 +591,16 (at)(at)
 -----------------------------------------
 
 >>> pprint.pprint(json_request('http://localhost/profile/(at)(at)drafts'))
-[{'date': '<ISO DATE>',
-  'subject': '',
-  'to': '',
-  'url': 'http://localhost/profile/drafts/<GUID>'}]
+{'batch_size': 10,
+ 'batch_start': 0,
+ 'messages': [{'date': '<ISO DATE>',
+               'subject': '',
+               'to': '',
+               'url': 'http://localhost/profile/drafts/<GUID>'}],
+ 'returned': 1,
+ 'sort_dir': 'desc',
+ 'sort_key': 'date',
+ 'total': 1}
 
 
 Updating draft messages and retrieving raw data

Modified: gocept.restmail/trunk/gocept/restmail/browser/zmi.txt
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/zmi.txt	(original)
+++ gocept.restmail/trunk/gocept/restmail/browser/zmi.txt	Thu Feb 26 11:18:53
2009
(at)(at) -20,7 +20,7 (at)(at)
 Within the profile, there is an (empty) drafts folder:
 
 >>> getRootFolder()['profile']['drafts']
-<Folder at /profile/drafts>
+<DraftFolder at /profile/drafts>
 >>> getRootFolder()['profile']['drafts'].objectValues()
 []

SVN: r29331 - gocept.restmail/trunk/gocept/restmail/browser
Thomas Lotze <tl(at)gocept.com>
2009-02-26 11:22:00 [ FULL ]
Author: thomas
Date: Thu Feb 26 11:21:59 2009
New Revision: 29331

Log:
show sender info in account list


Modified:
   gocept.restmail/trunk/gocept/restmail/browser/README.txt
   gocept.restmail/trunk/gocept/restmail/browser/profile.py

Modified: gocept.restmail/trunk/gocept/restmail/browser/README.txt
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/README.txt	(original)
+++ gocept.restmail/trunk/gocept/restmail/browser/README.txt	Thu Feb 26
11:21:59 2009
(at)(at) -141,6 +141,7 (at)(at)
 >>> pprint.pprint(json_request('http://localhost/profile/(at)(at)accounts'))
 [{'address': 'ben(at)example.com',
   'fixed': False,
+  'from': 'Ben Utzer &lt;ben(at)example.com&gt;',
   'host': 'localhost',
   'name': 'Ben Utzer',
   'password': 'bsdf',
(at)(at) -156,6 +157,7 (at)(at)
   'user': 'test'},
  {'address': 'ben(at)example.com',
   'fixed': False,
+  'from': 'Ben Utzer &lt;ben(at)example.com&gt;',
   'host': 'localhost',
   'name': 'Ben Utzer',
   'password': 'bsdf',
(at)(at) -297,6 +299,7 (at)(at)
 >>> pprint.pprint(json_request('http://localhost/profile/(at)(at)accounts'))
 [{'address': 'ben(at)example.com',
   'fixed': False,
+  'from': 'Ben Utzer &lt;ben(at)example.com&gt;',
   'host': 'localhost',
   'name': 'Ben Utzer',
   'password': 'bsdf',
(at)(at) -312,6 +315,7 (at)(at)
   'user': 'test'},
  {'address': 'ben(at)example.com',
   'fixed': False,
+  'from': 'Ben Utzer &lt;ben(at)example.com&gt;',
   'host': 'localhost',
   'name': 'Ben Utzer',
   'password': 'bsdf',

Modified: gocept.restmail/trunk/gocept/restmail/browser/profile.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/profile.py	(original)
+++ gocept.restmail/trunk/gocept/restmail/browser/profile.py	Thu Feb 26
11:21:59 2009
(at)(at) -30,6 +30,7 (at)(at)
             #XXX:Remove identity informations
             data.append(
                 {'status': status,
+                 'from': xml.sax.saxutils.escape(identity.From() or u''),
                  'host': account.host,
                  'port': account.port,
                  'ssl': account.ssl,

SVN: r29333 - gocept.restmail/trunk/gocept/restmail/browser
Thomas Lotze <tl(at)gocept.com>
2009-02-26 11:26:28 [ FULL ]
Author: thomas
Date: Thu Feb 26 11:26:27 2009
New Revision: 29333

Log:
fixed tests after stopping export of passwords to the UI


Modified:
   gocept.restmail/trunk/gocept/restmail/browser/README.txt

Modified: gocept.restmail/trunk/gocept/restmail/browser/README.txt
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/README.txt	(original)
+++ gocept.restmail/trunk/gocept/restmail/browser/README.txt	Thu Feb 26
11:26:27 2009
(at)(at) -144,11 +144,11 (at)(at)
   'from': 'Ben Utzer &lt;ben(at)example.com&gt;',
   'host': 'localhost',
   'name': 'Ben Utzer',
-  'password': 'bsdf',
+  'password': True,
   'port': 10143,
   'sent_folder': ['INBOX'],
   'smtp_host': 'mail.localhost',
-  'smtp_password': None,
+  'smtp_password': False,
   'smtp_port': 25,
   'smtp_user': 'smtptest',
   'ssl': False,
(at)(at) -160,11 +160,11 (at)(at)
   'from': 'Ben Utzer &lt;ben(at)example.com&gt;',
   'host': 'localhost',
   'name': 'Ben Utzer',
-  'password': 'bsdf',
+  'password': True,
   'port': 10143,
   'sent_folder': ['INBOX'],
   'smtp_host': '',
-  'smtp_password': None,
+  'smtp_password': False,
   'smtp_port': 25,
   'smtp_user': None,
   'ssl': False,
(at)(at) -302,11 +302,11 (at)(at)
   'from': 'Ben Utzer &lt;ben(at)example.com&gt;',
   'host': 'localhost',
   'name': 'Ben Utzer',
-  'password': 'bsdf',
+  'password': True,
   'port': 10143,
   'sent_folder': ['Sent'],
   'smtp_host': 'mail.localhost',
-  'smtp_password': None,
+  'smtp_password': False,
   'smtp_port': 25,
   'smtp_user': 'smtptest',
   'ssl': True,
(at)(at) -318,11 +318,11 (at)(at)
   'from': 'Ben Utzer &lt;ben(at)example.com&gt;',
   'host': 'localhost',
   'name': 'Ben Utzer',
-  'password': 'bsdf',
+  'password': True,
   'port': 10143,
   'sent_folder': ['INBOX'],
   'smtp_host': '',
-  'smtp_password': None,
+  'smtp_password': False,
   'smtp_port': 25,
   'smtp_user': None,
   'ssl': False,

SVN: r29337 - gocept.testdb/trunk
Wolfgang Schnerring <ws(at)gocept.com>
2009-02-26 11:36:03 [ FULL ]
Author: wosc
Date: Thu Feb 26 11:36:02 2009
New Revision: 29337

Log:
vb


Modified:
   gocept.testdb/trunk/setup.py

Modified: gocept.testdb/trunk/setup.py
==============================================================================
--- gocept.testdb/trunk/setup.py	(original)
+++ gocept.testdb/trunk/setup.py	Thu Feb 26 11:36:02 2009
(at)(at) -7,7 +7,7 (at)(at)
 
 setup(
     name='gocept.testdb',
-    version='0.2dev',
+    version='0.3dev',
     author='gocept',
     author_email='mail(at)gocept.com',
     description='Creates and drops temporary databases for testing purposes.',

SVN: r29343 - gocept.restmail/trunk/gocept/restmail
Sebastian Wehrmann <sw(at)gocept.com>
2009-02-26 14:15:41 [ FULL ]
Author: sweh
Date: Thu Feb 26 14:15:40 2009
New Revision: 29343

Log:
- User correct schema type for imap password.



Modified:
   gocept.restmail/trunk/gocept/restmail/interfaces.py

Modified: gocept.restmail/trunk/gocept/restmail/interfaces.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/interfaces.py	(original)
+++ gocept.restmail/trunk/gocept/restmail/interfaces.py	Thu Feb 26 14:15:40
2009
(at)(at) -44,7 +44,7 (at)(at)
     host = zope.schema.TextLine(title=u'Host name')
     port = zope.schema.Int(title=u'Server port')
     user = zope.schema.TextLine(title=u'User name')
-    password = zope.schema.TextLine(title=u'Password')
+    password = zope.schema.Password(title=u'Password')
     ssl = zope.schema.Bool(title=u'SSL')
 
     fixed = zope.schema.Bool(

SVN: r29348 - gocept.restmail/trunk/gocept/restmail/browser
Thomas Lotze <tl(at)gocept.com>
2009-02-26 19:16:01 [ FULL ]
Author: thomas
Date: Thu Feb 26 19:15:59 2009
New Revision: 29348

Log:
query account status asynchronously, fixes #4617


Modified:
   gocept.restmail/trunk/gocept/restmail/browser/README.txt
   gocept.restmail/trunk/gocept/restmail/browser/account.py
   gocept.restmail/trunk/gocept/restmail/browser/configure.zcml
   gocept.restmail/trunk/gocept/restmail/browser/profile.py

Modified: gocept.restmail/trunk/gocept/restmail/browser/README.txt
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/README.txt	(original)
+++ gocept.restmail/trunk/gocept/restmail/browser/README.txt	Thu Feb 26
19:15:59 2009
(at)(at) -152,7 +152,6 (at)(at)
   'smtp_port': 25,
   'smtp_user': 'smtptest',
   'ssl': False,
-  'status': 'ok',
   'title': None,
   'url': 'http://localhost/profile/test-localhost',
   'user': 'test'},
(at)(at) -169,7 +168,6 (at)(at)
   'smtp_port': 25,
   'smtp_user': None,
   'ssl': False,
-  'status': 'ok',
   'title': None,
   'url': 'http://localhost/profile/test-localhost-1',
   'user': 'test'}]
(at)(at) -312,7 +310,6 (at)(at)
   'smtp_port': 25,
   'smtp_user': 'smtptest',
   'ssl': True,
-  'status': 'failure',
   'title': None,
   'url': 'http://localhost/profile/test-localhost',
   'user': 'test'},
(at)(at) -329,11 +326,15 (at)(at)
   'smtp_port': 25,
   'smtp_user': None,
   'ssl': False,
-  'status': 'ok',
   'title': None,
   'url': 'http://localhost/profile/test-localhost-1',
   'user': 'test'}]
 
+The edited account is no longer available now:
+
+>>> json_request('http://localhost/profile/test-localhost/(at)(at)status')
+'failure'
+
 Switch SSL off again since the account will be used again later.
 
 >>> json_request('http://localhost/profile/test-localhost/(at)(at)edit',
(at)(at) -348,8 +349,9 (at)(at)
 >>> pprint.pprint(json_request('http://localhost/profile/(at)(at)accounts'))
 [{...
   'ssl': False,
-  'status': 'ok',
   ...}]
+>>> json_request('http://localhost/profile/test-localhost/(at)(at)status')
+'ok'
 
 
 Delete an account: (at)(at)delete

Modified: gocept.restmail/trunk/gocept/restmail/browser/account.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/account.py	(original)
+++ gocept.restmail/trunk/gocept/restmail/browser/account.py	Thu Feb 26
19:15:59 2009
(at)(at) -46,3 +46,11 (at)(at)
         account.getParentNode().manage_delObjects(account.getId())
         identity.getParentNode().manage_delObjects(identity.getId())
         mailhost.getParentNode().manage_delObjects(mailhost.getId())
+
+    (at)gocept.restmail.browser.json.view
+    def status(self):
+        if self.context.check_connection():
+            return 'ok'
+        else:
+            import time; time.sleep(3);
+            return 'failure'

Modified: gocept.restmail/trunk/gocept/restmail/browser/configure.zcml
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/configure.zcml	(original)
+++ gocept.restmail/trunk/gocept/restmail/browser/configure.zcml	Thu Feb 26
19:15:59 2009
(at)(at) -395,5 +395,10 (at)(at)
       attribute="delete"
       />
 
+    <browser:page
+      name="status"
+      attribute="status"
+      />
+
   </browser:pages>
 </configure>

Modified: gocept.restmail/trunk/gocept/restmail/browser/profile.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/profile.py	(original)
+++ gocept.restmail/trunk/gocept/restmail/browser/profile.py	Thu Feb 26
19:15:59 2009
(at)(at) -24,12 +24,8 (at)(at)
         for account in self.context.objectValues('IMAP Account'):
             identity = gocept.restmail.interfaces.IIdentity(account)
             mailhost = self.context[identity.mailhost_id]
-            status = 'ok'
-            if not account.check_connection():
-                status = 'failure'
             #XXX:Remove identity informations
-            data.append(
-                {'status': status,
+            data.append({
                  'from': xml.sax.saxutils.escape(identity.From() or u''),
                  'host': account.host,
                  'port': account.port,

SVN: r29350 - gocept.restmail/trunk/gocept/restmail/browser
Thomas Lotze <tl(at)gocept.com>
2009-02-26 19:20:56 [ FULL ]
Author: thomas
Date: Thu Feb 26 19:20:55 2009
New Revision: 29350

Log:
removed debugging delay


Modified:
   gocept.restmail/trunk/gocept/restmail/browser/account.py

Modified: gocept.restmail/trunk/gocept/restmail/browser/account.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/account.py	(original)
+++ gocept.restmail/trunk/gocept/restmail/browser/account.py	Thu Feb 26
19:20:55 2009
(at)(at) -52,5 +52,4 (at)(at)
         if self.context.check_connection():
             return 'ok'
         else:
-            import time; time.sleep(3);
             return 'failure'

SVN: r29356 - gocept.restmail/trunk/gocept/restmail/browser
Wolfgang Schnerring <ws(at)gocept.com>
2009-02-27 11:46:06 [ FULL ]
Author: wosc
Date: Fri Feb 27 11:46:04 2009
New Revision: 29356

Log:
Re #4670: clarified comments



Modified:
   gocept.restmail/trunk/gocept/restmail/browser/draft.py

Modified: gocept.restmail/trunk/gocept/restmail/browser/draft.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/draft.py	(original)
+++ gocept.restmail/trunk/gocept/restmail/browser/draft.py	Fri Feb 27 11:46:04
2009
(at)(at) -38,8 +38,6 (at)(at)
     def delete(self):
         """Delete draft."""
         self.context.delete()
-        # XXX: YUI does not consider 204 a success
-        return 'OK'
 
     (at)gocept.restmail.browser.json.view
     def attachments(self):
(at)(at) -62,8 +60,8 (at)(at)
         attachment.filename = upload.filename
         attachment.content_type = upload.headers['Content-type']
         attachment.set_body(upload)
-        # XXX: YUI can't parse HTTP response for uploads, so just sending 204
-        # will not trigger its response handler
+        # XXX: YUI can't parse HTTP response for uploads, and somehow just
+        # sending 204 will not trigger its response handler
         return 'OK'

SVN: r29357 - gocept.restmail/trunk/gocept/restmail/browser
Wolfgang Schnerring <ws(at)gocept.com>
2009-02-27 12:23:17 [ FULL ]
Author: wosc
Date: Fri Feb 27 12:23:15 2009
New Revision: 29357

Log:
Close #4670: there is no way to work around browser limitations but to always
return *some* content after a fileupload.



Modified:
   gocept.restmail/trunk/gocept/restmail/browser/draft.py

Modified: gocept.restmail/trunk/gocept/restmail/browser/draft.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/draft.py	(original)
+++ gocept.restmail/trunk/gocept/restmail/browser/draft.py	Fri Feb 27 12:23:15
2009
(at)(at) -50,18 +50,23 (at)(at)
 
     def add_attachment(self):
         """Create an attachment from an uploaded file."""
+
+        # YUI uses an iframe for fileuploads, and calls the upload-callback
when
+        # the iframe fires its onload event. But this does not seem to happen
+        # when the browser does not receive any content (e. g. when we return
+        # None, Zope will send HTTP 204, but no content).
+        # There does not seem to be a way around this, so we need to return
+        # *something* from this method in any case.
+
         upload = self.request['file']
         has_content = upload.read(1)
         if not has_content:
-            # XXX YUI and HTTP, see below
             return 'BAD'
         upload.seek(0)
         attachment = self.context.add_attachment()
         attachment.filename = upload.filename
         attachment.content_type = upload.headers['Content-type']
         attachment.set_body(upload)
-        # XXX: YUI can't parse HTTP response for uploads, and somehow just
-        # sending 204 will not trigger its response handler
         return 'OK'

SVN: r29358 - gocept.webmail/trunk/gocept/webmail/browser/resources/images
Sebastian Wehrmann <sw(at)gocept.com>
2009-02-27 12:57:39 [ FULL ]
Author: sweh
Date: Fri Feb 27 12:57:38 2009
New Revision: 29358

Log:
- Add an icon for flagged messages.



Added:
  
gocept.webmail/trunk/gocept/webmail/browser/resources/images/mail-flagged.png  
(contents, props changed)

Added:
gocept.webmail/trunk/gocept/webmail/browser/resources/images/mail-flagged.png
==============================================================================
Binary file. No diff available.

MailBoxer