Skip to content

/ Zope / gocept svn checkins / Archive / 2009 / 2009-03 / SVN: r29405 - mytum.webmail/trunk/mytum/webmail

[ << ] [ >> ]

[ SVN: r29395 - in gocept.timetable/trunk: . ... ] [ SVN: r29407 - in redmine_quips: . trunk trunk/app ... ]

SVN: r29405 - mytum.webmail/trunk/mytum/webmail
Thomas Lotze <tl(at)gocept.com>
2009-03-10 14:12:09 [ FULL ]
Author: thomas
Date: Tue Mar 10 14:12:08 2009
New Revision: 29405

Log:
provided an adapter to determine a mytum account's mail host


Modified:
   mytum.webmail/trunk/mytum/webmail/account.py
   mytum.webmail/trunk/mytum/webmail/configure.zcml

Modified: mytum.webmail/trunk/mytum/webmail/account.py
==============================================================================
--- mytum.webmail/trunk/mytum/webmail/account.py	(original)
+++ mytum.webmail/trunk/mytum/webmail/account.py	Tue Mar 10 14:12:08 2009
(at)(at) -1,4 +1,4 (at)(at)
-# Copyright (c) 2008 gocept gmbh & co. kg
+# Copyright (c) 2009 gocept gmbh & co. kg
 # See also LICENSE.txt
 
 import zope.app.container.interfaces
(at)(at) -8,6 +8,7 (at)(at)
 import OFS.PropertyManager
 import OFS.SimpleItem
 import Products.CMFCore.utils
+import Products.MailHost.interfaces
 
 import gocept.restmail.interfaces
 import gocept.restmail.identity
(at)(at) -87,12 +88,7 (at)(at)
     def getName(self):
         return self.displayName()
 
-    def getSMTPServer(self):
-        data = Products.CMFCore.utils.getToolByName(self, 'webmail_data')
-        return data.MailHost
-
     name = ComputedAttribute.ComputedAttribute(getName, True)
-    smtp_server = ComputedAttribute.ComputedAttribute(getSMTPServer, True)
 
 
 (at)zope.component.adapter(gocept.restmail.interfaces.IProfile,
(at)(at) -114,3 +110,10 (at)(at)
         identities.append(id_)
     account = Account('mytum', identities[0])
     profile._setObject('mytum', account)
+
+
+(at)zope.component.adapter(Identity)
+(at)zope.interface.implementer(Products.MailHost.interfaces.IMailHost)
+def identity_to_mailhost(identity):
+    data = Products.CMFCore.utils.getToolByName(self, 'webmail_data')
+    return identity.restrictedTraverse(data.MailHost)

Modified: mytum.webmail/trunk/mytum/webmail/configure.zcml
==============================================================================
--- mytum.webmail/trunk/mytum/webmail/configure.zcml	(original)
+++ mytum.webmail/trunk/mytum/webmail/configure.zcml	Tue Mar 10 14:12:08 2009
(at)(at) -5,4 +5,6 (at)(at)
 
   <subscriber handler=".account.create_account" />
 
+  <adapter factory=".account.identity_to_mailhost" />
+
 </configure>

SVN: r29406 - mytum.webmail/trunk/mytum/webmail
Thomas Lotze <tl(at)gocept.com>
2009-03-10 14:16:04 [ FULL ]
Author: thomas
Date: Tue Mar 10 14:16:03 2009
New Revision: 29406

Log:
fixed the mail host adapter


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

Modified: mytum.webmail/trunk/mytum/webmail/account.py
==============================================================================
--- mytum.webmail/trunk/mytum/webmail/account.py	(original)
+++ mytum.webmail/trunk/mytum/webmail/account.py	Tue Mar 10 14:16:03 2009
(at)(at) -115,5 +115,5 (at)(at)
 (at)zope.component.adapter(Identity)
 (at)zope.interface.implementer(Products.MailHost.interfaces.IMailHost)
 def identity_to_mailhost(identity):
-    data = Products.CMFCore.utils.getToolByName(self, 'webmail_data')
+    data = Products.CMFCore.utils.getToolByName(identity, 'webmail_data')
     return identity.restrictedTraverse(data.MailHost)

SVN: r29408 - gocept.webmail-buildout/trunk/profiles
Wolfgang Schnerring <ws(at)gocept.com>
2009-03-10 17:09:24 [ FULL ]
Author: wosc
Date: Tue Mar 10 17:09:23 2009
New Revision: 29408

Log:
fix fake-egg setup that a new version of plone.recipe.zope2install (3.0)
brought with it without asking. We might want to 'allow-picked-versions =
false' to avoid these kind of surprises...



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 Mar 10 17:09:23 2009
(at)(at) -3,7 +3,6 (at)(at)
 parts =
     lxml
     zope2
-    fakezope2eggs
     productdistros
     instance
     zopepy
(at)(at) -51,6 +50,13 (at)(at)
 [zope2]
 recipe = plone.recipe.zope2install
 url = http://www.zope.org/Products/Zope/2.9.9/Zope-2.9.9-final.tgz
+fake-zope-eggs = true
+fake-eggs-folder = ${buildout:parts-directory}/fake-eggs
+# [dovecot] needs these and can't get them from the [zope2]-location
+skip-fake-eggs =
+    zdaemon
+    ZConfig
+
 
 [productdistros]
 recipe = plone.recipe.distros
(at)(at) -131,13 +137,6 (at)(at)
 mode = 664
 createpath = true
 
-[fakezope2eggs]
-recipe = affinitic.recipe.fakezope2eggs
-additional-fake-eggs =
-    ZODB3
-    mechanize
-    ClientForm
-
 [test]
 recipe = collective.recipe.z2testrunner
 packages = ${packages:names}

SVN: r29421 - mytum.webmail/trunk
Thomas Lotze <tl(at)gocept.com>
2009-03-11 09:23:16 [ FULL ]
Author: thomas
Date: Wed Mar 11 09:23:15 2009
New Revision: 29421

Log:
started documentation for installing the webmailer into the myTUM portal


Added:
   mytum.webmail/trunk/INSTALL.txt   (contents, props changed)

Added: mytum.webmail/trunk/INSTALL.txt
==============================================================================
--- (empty file)
+++ mytum.webmail/trunk/INSTALL.txt	Wed Mar 11 09:23:15 2009
(at)(at) -0,0 +1,2 (at)(at)
+- GenericSetup: mytum-Profil laden, importieren
+- Webmailer-Objekt: Properties setzen (banner_url='/header',
banner_height=154)

SVN: r29422 - in gocept.webmail/trunk/gocept/webmail/browser: . resources
Thomas Lotze <tl(at)gocept.com>
2009-03-11 09:55:46 [ FULL ]
Author: thomas
Date: Wed Mar 11 09:55:44 2009
New Revision: 29422

Log:
moved 'manage accounts' button below the folder tree


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

Modified: gocept.webmail/trunk/gocept/webmail/browser/layout.pt
==============================================================================
--- gocept.webmail/trunk/gocept/webmail/browser/layout.pt	(original)
+++ gocept.webmail/trunk/gocept/webmail/browser/layout.pt	Wed Mar 11 09:55:44
2009
(at)(at) -43,6 +43,10 (at)(at)
 
     <div id="yui-layout">
       <metal:block define-slot="layout" />
+
+      <div class="menubar" id="menubar-account-tree">
+        <button id="menuitem-manage-accounts">Manage
accounts</button>
+      </div>
     </div>
   </body>
 

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	Wed Mar
11 09:55:44 2009
(at)(at) -3,17 +3,6 (at)(at)
 //
 
 //
-// Set up menu items
-//
-Def(function() {
-   YAHOO.util.Event.onContentReady("webmailer-main-menu", function () {
-        document.App.menu.addMenuItem('Manage accounts', function() {
-            YAHOO.gocept.webmailer.open_manage_accounts();
-        });
-    });
-});
-
-//
 // The account management
 //
 

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
Mar 11 09:55:44 2009
(at)(at) -32,18 +32,30 (at)(at)
                           body: ''}]});
 
                 app.layout.on('render', function() {
-                    // 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.account_layout = new YAHOO.widget.Layout(
+                        app.layout.getUnitByPosition('left').body,
+                        {parent: app.layout,
+                         units: [
+                             { position: 'center', scroll: true,
+                               body: ''},
+                             { position: 'bottom', height: 44,
+                               body: 'menubar-account-tree'}
+                                 ]});
+                    app.account_layout.on('render', function() {
+                        // Bind the slots to readable names
+                        app.domNodes.menu =
app.layout.getUnitByPosition('top').body;
+                        app.domNodes.tree =
app.account_layout.getUnitByPosition('center').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.account_layout.render();
                 });
                 app.layout.render();
             });
(at)(at) -70,6 +82,10 (at)(at)
                         document.App.domNodes.tree);
                 });
             });
+
+            YAHOO.gocept.webmailer.util.bind_menu_item("manage-accounts",
function () {
+                YAHOO.gocept.webmailer.open_manage_accounts();
+            });
         }
     });
 });

SVN: r29423 - gocept.restmail/trunk/gocept/restmail
Thomas Lotze <tl(at)gocept.com>
2009-03-11 18:24:17 [ FULL ]
Author: thomas
Date: Wed Mar 11 18:24:16 2009
New Revision: 29423

Log:
the password is always a string; if no password was given, it's the empty
string


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 Mar 11 18:24:16
2009
(at)(at) -73,7 +73,8 (at)(at)
             account = self._v_account
         except AttributeError:
             account = gocept.imapapi.account.Account(
-                self.host, self.port, self.user, self.password, self.ssl)
+                self.host, self.port, self.user, self.password or '',
+                self.ssl)
             self._v_account = account
             dm = IMAPConnectionDataManager(account, self)
             transaction.get().register(dm)

SVN: r29428 - mytum.webmail/trunk
Thomas Lotze <tl(at)gocept.com>
2009-03-12 09:55:27 [ FULL ]
Author: thomas
Date: Thu Mar 12 09:55:26 2009
New Revision: 29428

Log:
listed dependencies and components of the web mailer


Modified:
   mytum.webmail/trunk/INSTALL.txt

Modified: mytum.webmail/trunk/INSTALL.txt
==============================================================================
--- mytum.webmail/trunk/INSTALL.txt	(original)
+++ mytum.webmail/trunk/INSTALL.txt	Thu Mar 12 09:55:26 2009
(at)(at) -1,2 +1,15 (at)(at)
+- Voraussetzungen außer Zope:
+  setuptools
+  lxml
+  python-cjson
+  uuid
+
+- Pakete des Webmailers:
+  gocept.imapapi
+  gocept.restmail
+  gocept.webmail
+  mytum.webmail
+
 - GenericSetup: mytum-Profil laden, importieren
+
 - Webmailer-Objekt: Properties setzen (banner_url='/header',
banner_height=154)

SVN: r29435 - in gocept.webmail/trunk/gocept/webmail/browser: resources tests
Wolfgang Schnerring <ws(at)gocept.com>
2009-03-13 17:36:36 [ FULL ]
Author: wosc
Date: Fri Mar 13 17:36:32 2009
New Revision: 29435

Log:
Close #4680: use self=this.



Modified:
   gocept.webmail/trunk/gocept/webmail/browser/resources/composer-main.js
   gocept.webmail/trunk/gocept/webmail/browser/resources/composer.js
   gocept.webmail/trunk/gocept/webmail/browser/resources/connection.js
   gocept.webmail/trunk/gocept/webmail/browser/resources/draft.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/preferences.js
   gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js
   gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js
   gocept.webmail/trunk/gocept/webmail/browser/tests/connection.pt

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	Fri
Mar 13 17:36:32 2009
(at)(at) -5,12 +5,12 (at)(at)
 Def(function() {
     YAHOO.gocept.webmailer.App = Class({
         constructor: function() {
-            var app = this;
+            var self = this;
             // Bind early.
-            document.App = app;
+            document.App = self;
 
             // Setup the static screen layouts
-            app.layout = new YAHOO.widget.Layout({
+            self.layout = new YAHOO.widget.Layout({
                 units: [
                     { position: 'bottom', height: 43,
                       body: 'menubar-composer'},
(at)(at) -18,15 +18,15 (at)(at)
                       body: 'yui-layout-center',
                       scroll: true},
                 ]});
-            app.layout.on('render', function() {
+            self.layout.on('render', function() {
                 YAHOO.gocept.webmailer.util.hide('yui-layout-loading');
-                app.compose_bar = new
YAHOO.widget.TabView('yui-layout-center');
-                app.tab_attachments =
document.getElementById("composeBarTabAttachments");
-                app.composer = new YAHOO.gocept.webmailer.Composer(
+                self.compose_bar = new
YAHOO.widget.TabView('yui-layout-center');
+                self.tab_attachments =
document.getElementById("composeBarTabAttachments");
+                self.composer = new YAHOO.gocept.webmailer.Composer(
                     draft_url, profile_url);
-                app.bind_menu_items();
+                self.bind_menu_items();
             });
-            app.layout.render();
+            self.layout.render();
         },
 
         bind_menu_items: function() {

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	Fri Mar
13 17:36:32 2009
(at)(at) -55,12 +55,12 (at)(at)
 
     YAHOO.gocept.webmailer.Composer = Class({
         constructor: function(draft_url, profile_url) {
-            var composer = this;
+            var self = this;
             YAHOO.util.Event.addListener(window, "unload", function () {
                 document.App.composer.save_draft();
             }); 
-            composer.draft_url = draft_url;
-            composer.profile_url = profile_url;
+            self.draft_url = draft_url;
+            self.profile_url = profile_url;
 
             // Query the identities to compose with
             document.Connection.get(profile_url+'/(at)(at)identities',
function(result) {
(at)(at) -69,37 +69,37 (at)(at)
                     var identity = document.createElement('option');
                     identity.value = identities[i]['id'];
                     identity.innerHTML = identities[i]['from'];
-                    composer.getControl('From').appendChild(identity);
+                    self.getControl('From').appendChild(identity);
                 };
             });
 
             // Initialize the rich text editor for the body.
-            composer.editor = new YAHOO.widget.SimpleEditor(
-                composer.getControl('Body').id, {
+            self.editor = new YAHOO.widget.SimpleEditor(
+                self.getControl('Body').id, {
                     css: '(at)import url(' + editor_style_url + ');'});
-            composer.editor._defaultToolbar.titlebar = false;
-            composer.editor.autosave_counter = 0;
-            composer.editor.on('editorKeyPress', composer.handleEditorKey,
composer, true);
-            composer.editor.on('editorContentLoaded', function() {
+            self.editor._defaultToolbar.titlebar = false;
+            self.editor.autosave_counter = 0;
+            self.editor.on('editorKeyPress', self.handleEditorKey, self,
true);
+            self.editor.on('editorContentLoaded', function() {
                 // Load content from server.
-                composer.load_draft();
+                self.load_draft();
             });
-            composer.editor.on('afterRender', composer.resize_editor,
-                composer.editor, true); 
+            self.editor.on('afterRender', self.resize_editor,
+                self.editor, true); 
 
-            composer.editor.render();
+            self.editor.render();
 
             document.App.layout.on(
-                "resize", composer.resize_editor, composer, true);
+                "resize", self.resize_editor, self, true);
             document.App.compose_bar.on(
-                "activeTabChange", composer.resize_editor, composer, true);
+                "activeTabChange", self.resize_editor, self, true);
 
             // Initialize attachment widgets
-            composer.tab_attachments_text = document.App.tab_attachments.text;
+            self.tab_attachments_text = document.App.tab_attachments.text;
             YAHOO.util.Event.addListener(
-                composer.getControl('AttachmentsFile'), 'change',
-                composer.attach, composer, true);
-            composer.list_attachments();
+                self.getControl('AttachmentsFile'), 'change',
+                self.attach, self, true);
+            self.list_attachments();
         },
 
         resize_editor: function() {
(at)(at) -108,8 +108,8 (at)(at)
                 // editor was drawn.
                 return;
             };
-            var composer = this;
-            var editor = composer.editor;
+            var self = this;
+            var editor = self.editor;
             if (!editor) {
                 return;
             }
(at)(at) -206,34 +206,34 (at)(at)
         },
 
         load_draft: function() {
-            var composer = this;
-            document.Connection.get(composer.draft_url+'/(at)(at)data',
function(result) {
+            var self = this;
+            document.Connection.get(self.draft_url+'/(at)(at)data',
function(result) {
                     var draft = YAHOO.lang.JSON.parse(result.responseText);
-                    composer.getControl('To').value = draft['to'];
-                    composer.getControl('Subject').value = draft['subject'];
+                    self.getControl('To').value = draft['to'];
+                    self.getControl('Subject').value = draft['subject'];
                     if (draft['identity']) {
                         var identities = YAHOO.util.Dom.getChildren(
-                            composer.getControl('From'));
+                            self.getControl('From'));
                         for (i=0;i<identities.length;i++) {
                             identities[i].selected = (
                                 identities[i].value == draft['identity']);
                         };
                     };
                     var body = draft['body'];
-                    composer.getControl('Body').value = body;
-                    composer.editor.setEditorHTML(body);
-                    composer.reload_draft_folder();
+                    self.getControl('Body').value = body;
+                    self.editor.setEditorHTML(body);
+                    self.reload_draft_folder();
             });
         },
 
         _prepare_data: function() {
-            var composer = this;
-            composer.editor.saveHTML();
-            var body = composer.get('Body');
+            var self = this;
+            self.editor.saveHTML();
+            var body = self.get('Body');
             body = '<html><body>' + body +
'</body></html>';
-            var data = {identity: composer.get('From'),
-                        to: composer.get('To'),
-                        subject: composer.get('Subject'),
+            var data = {identity: self.get('From'),
+                        to: self.get('To'),
+                        subject: self.get('Subject'),
                         body: body};
             return data
         },
(at)(at) -253,34 +253,34 (at)(at)
         },
 
         save_draft: function(autosave) {
-            var composer = this;
+            var self = this;
             document.Connection.post(
-                composer.draft_url+'/(at)(at)save', composer._prepare_data(),
+                self.draft_url+'/(at)(at)save', self._prepare_data(),
                 function () {
-                   if (!autosave) { composer.reload_draft_folder(); }
+                   if (!autosave) { self.reload_draft_folder(); }
                 }
             );
         },
 
         attach: function() {
-            var composer = this;
-            composer.getControl('AttachmentsUploading').style.display =
'inline';
+            var self = this;
+            self.getControl('AttachmentsUploading').style.display = 'inline';
             document.Connection.upload(
-                composer.draft_url+'/(at)(at)add_attachment',
'composeAttachments',
+                self.draft_url+'/(at)(at)add_attachment',
'composeAttachments',
                 function () {
-                    composer.getControl('AttachmentsUploading').style.display
= 'none';
-                    composer.list_attachments();
-                    composer.getControl('AttachmentsFile').value = '';
+                    self.getControl('AttachmentsUploading').style.display =
'none';
+                    self.list_attachments();
+                    self.getControl('AttachmentsFile').value = '';
                 }
             );
         },
 
-        list_attachments: function(composer) {
-            var composer = this;
+        list_attachments: function() {
+            var self = this;
 
-            document.Connection.get(composer.draft_url+'/(at)(at)attachments',
+            document.Connection.get(self.draft_url+'/(at)(at)attachments',
                 function (result) {
-                    var attachmentsList =
composer.getControl('AttachmentsList');
+                    var attachmentsList = self.getControl('AttachmentsList');
                     while (attachmentsList.firstChild) {
                        
attachmentsList.removeChild(attachmentsList.firstChild);
                     }
(at)(at) -296,9 +296,9 (at)(at)
                         var closure = function(attachment) {
                             YAHOO.util.Event.addListener(
                                 delete_button, 'click',
-                                function () {
-                                    composer.delete_attachment(attachment);
-                                }, composer, true);
+                                function() {
+                                    self.delete_attachment(attachment);
+                                }, true);
                         };
                         closure(attachment);
                         item.appendChild(document.createTextNode(
(at)(at) -308,28 +308,28 (at)(at)
                         attachmentsList.appendChild(item);
                     }
 
-                    text = composer.tab_attachments_text;
+                    text = self.tab_attachments_text;
                     if (attachments.length) {
                         text += " (" + attachments.length + ")";
                     };
                     document.App.tab_attachments.innerHTML = text;
-                    composer.resize_editor();
+                    self.resize_editor();
             });
         },
 
         delete_attachment: function(attachment) {
-            var composer = this;
+            var self = this;
             document.Connection.post(
                 attachment['url']+'/(at)(at)delete', null,
-                function () { composer.list_attachments(); }
+                function () { self.list_attachments(); }
             );
         },
 
         send_message: function(ev) {
-            var composer = this;
-            composer.save_draft();
-            document.Connection.post(composer.draft_url+'/(at)(at)send', null,
function(result) {
-                composer.close_draft();
+            var self = this;
+            self.save_draft();
+            document.Connection.post(self.draft_url+'/(at)(at)send', null,
function(result) {
+                self.close_draft();
             });
         },
 
(at)(at) -338,13 +338,13 (at)(at)
         },
 
         getControl: function(name) {
-            var composer = this;
+            var self = this;
             return document.getElementById('compose'+name);
         },
 
         get: function(name){
-            var composer = this;
-            return composer.getControl(name).value;
+            var self = this;
+            return self.getControl(name).value;
         }
     });
 });

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 Mar
13 17:36:32 2009
(at)(at) -9,8 +9,8 (at)(at)
 Def(function() {
     YAHOO.gocept.webmailer.Request = Class({
         constructor: function(method, url, on_success) {
-            var request = this;
-            request.headers = [];
+            var self = this;
+            self.headers = [];
 
             // Define the callback handler structure
             var callbacks = {
(at)(at) -26,10 +26,10 (at)(at)
                 }
             };
 
-            request.method = method;
-            request.url = url;
-            request.callbacks = callbacks;
-            request.file_upload = false;
+            self.method = method;
+            self.url = url;
+            self.callbacks = callbacks;
+            self.file_upload = false;
         }
     });
 });
(at)(at) -39,29 +39,29 (at)(at)
     
     YAHOO.gocept.webmailer.Connection = Class({
         constructor: function() {
-            var connection = this;
-            connection.tx_queue = new Array();
+            var self = this;
+            self.tx_queue = new Array();
             YAHOO.util.Connect.setDefaultPostHeader(false);
         },
 
         // XXX test serialization
         _schedule_request: function(request) {
-            var connection = this;
-            connection.tx_queue.push(request);
-            if (!connection.tx_working) {
-                connection.tx_working = true;
+            var self = this;
+            self.tx_queue.push(request);
+            if (!self.tx_working) {
+                self.tx_working = true;
                 window.setTimeout(function() {
-                  connection._handle_queue.apply(connection);
+                  self._handle_queue.apply(self);
                 }, 10);
             };
         },
 
         _handle_queue: function(p) {
-            var connection = this;
-            if (!YAHOO.util.Connect.isCallInProgress(connection.tx_current)) {
-                request = connection.tx_queue.shift();
+            var self = this;
+            if (!YAHOO.util.Connect.isCallInProgress(self.tx_current)) {
+                request = self.tx_queue.shift();
                 if (request == null) {
-                    connection.tx_working = false;
+                    self.tx_working = false;
                     return
                 };
                 for (var key in request.headers) {
(at)(at) -70,22 +70,24 (at)(at)
                 if (request.form) {
                     YAHOO.util.Connect.setForm(request.form,
request.file_upload)
                 };
-                connection.tx_current = YAHOO.util.Connect.asyncRequest(
+                self.tx_current = YAHOO.util.Connect.asyncRequest(
                     request.method, request.url, request.callbacks,
                     request.data);
             };
             window.setTimeout(function() {
-                connection._handle_queue.apply(connection);
+                self._handle_queue.apply(self);
             }, 10);
         },
     
         get: function(url, on_success) {
+            var self = this;
             var request = new YAHOO.gocept.webmailer.Request(
                 'GET', url, on_success);
-            this._schedule_request(request);
+            self._schedule_request(request);
         },
 
         post: function(url, data, on_success) {
+            var self = this;
             var request = new YAHOO.gocept.webmailer.Request(
                 'POST', url, on_success);
             request.headers['Content-type'] = 'text/json';
(at)(at) -93,15 +95,16 (at)(at)
                 data = {};
             };
             request.data = YAHOO.lang.JSON.stringify(data);
-            this._schedule_request(request);
+            self._schedule_request(request);
         },
         
         upload: function(url, form, on_success) {
+            var self = this;
             var request = new YAHOO.gocept.webmailer.Request(
                 'POST', url, on_success);
             request.form = form;
             request.file_upload = true;
-            this._schedule_request(request);
+            self._schedule_request(request);
         }
     });
 

Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/draft.js
==============================================================================
--- gocept.webmail/trunk/gocept/webmail/browser/resources/draft.js	(original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/draft.js	Fri Mar 13
17:36:32 2009
(at)(at) -6,13 +6,13 (at)(at)
 Def(function() {
     YAHOO.gocept.webmailer.Drafts = Class({
         constructor: function(layout_element) {
-            var drafts = this;
+            var self = this;
             this.layout = new YAHOO.widget.Layout(layout_element, {
                 units: [{position: 'center', scroll: true, body: ''}]
             });
             this.layout.on("render", function() {
-                var element = drafts.layout.getUnitByPosition('center');
-                drafts.drafts_list = new YAHOO.gocept.webmailer.DraftsList(
+                var element = self.layout.getUnitByPosition('center');
+                self.drafts_list = new YAHOO.gocept.webmailer.DraftsList(
                     element.get('id'));
             });
             this.layout.render();
(at)(at) -39,8 +39,8 (at)(at)
 
     YAHOO.gocept.webmailer.DraftsList = Class({
         constructor: function(container) {
-            var drafts_list = this;
-            drafts_list.container = container;
+            var self = this;
+            self.container = container;
             var dataSource = YAHOO.gocept.webmailer.get_data_source(
                 '(at)(at)drafts?', responseSchema);
             this.table = new YAHOO.widget.DataTable(

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	Fri
Mar 13 17:36:32 2009
(at)(at) -6,44 +6,44 (at)(at)
 
     YAHOO.gocept.webmailer.App = Class({
         constructor: function() {
-            var app = this;
+            var self = this;
             // Bind early.
-            document.App = app;
-            app.domNodes = new Object();
+            document.App = self;
+            self.domNodes = new Object();
 
             // Setup the static screen layouts
-            app.layout = new YAHOO.widget.Layout({
+            self.layout = new YAHOO.widget.Layout({
                 units: [
                     { position: 'center',
                       scroll: true,
                       body: 'yui-layout-center'},
                 ]});
-            app.layout.on('render', function() {
+            self.layout.on('render', function() {
                 YAHOO.gocept.webmailer.util.hide('yui-layout-loading');
                 // Initialize DOM nodes first, as the business models
                 // rely on them.
-                app.domNodes.account_list =
document.getElementById('accountList');
-                app.domNodes.account_edit_form =
document.getElementById('accountEditForm');
-                app.domNodes.sent_folder_tree =
document.getElementById('sentFolderTree');
-                app.domNodes.sent_folder_selection =
document.getElementById('sentFolderSelection');
-
-                app.account_list = new YAHOO.gocept.webmailer.AccountList();
-                app.account_edit_form = new
YAHOO.gocept.webmailer.AccountEditForm();
-                app.bind_menu_items();
+                self.domNodes.account_list =
document.getElementById('accountList');
+                self.domNodes.account_edit_form =
document.getElementById('accountEditForm');
+                self.domNodes.sent_folder_tree =
document.getElementById('sentFolderTree');
+                self.domNodes.sent_folder_selection =
document.getElementById('sentFolderSelection');
+
+                self.account_list = new YAHOO.gocept.webmailer.AccountList();
+                self.account_edit_form = new
YAHOO.gocept.webmailer.AccountEditForm();
+                self.bind_menu_items();
             });
-            app.layout.render();
+            self.layout.render();
         },
 
         bind_menu_items: function() {
-            var app = this;
+            var self = this;
             YAHOO.gocept.webmailer.util.bind_menu_item("new", function () {
-                app.reset();
-                app.loadAccountEditForm();
+                self.reset();
+                self.loadAccountEditForm();
             });
             YAHOO.gocept.webmailer.util.bind_menu_item("delete", function () {
-                var url = app.selected_account.url + '/(at)(at)delete';
+                var url = self.selected_account.url + '/(at)(at)delete';
                 document.Connection.post(url, null, function(result) {
-                    app.account_list = new
YAHOO.gocept.webmailer.AccountList();
+                    self.account_list = new
YAHOO.gocept.webmailer.AccountList();
 
                     // reload the tree in the main window
                     var parent = window.opener;
(at)(at) -104,16 +104,16 (at)(at)
 
     YAHOO.gocept.webmailer.AccountList = Class({
         constructor: function() {
-            var account_list = this;
-            account_list.load();
+            var self = this;
+            self.load();
             document.App.reset();
         },
 
         load: function() {
-            var account_list = this;
+            var self = this;
             var columns = [
                 {key:"title", label:"Account", sortable:true},
-                {key:"status", label:"Status", sortable:true,
formatter:account_list.format_status},
+                {key:"status", label:"Status", sortable:true,
formatter:self.format_status},
                 {key:"from", label:"Sender", sortable:true},
                 {key:"imap", label:"IMAP", sortable:true},
                 {key:"smtp", label:"SMTP", sortable:true}]
(at)(at) -175,9 +175,9 (at)(at)
             table.subscribe("rowUnselectEvent", function(event) {
                 document.App.reset();
             });
-            table.doBeforeLoadData = account_list.prepare_data;
+            table.doBeforeLoadData = self.prepare_data;
             table.render();
-            account_list.table = table;
+            self.table = table;
         },
 
         prepare_data: function (request, response, payload) {
(at)(at) -309,24 +309,24 (at)(at)
 
     YAHOO.gocept.webmailer.SentFolderTree = Class({
         constructor: function(treebody) {
-            var tree = this;
-            tree.treeview = new YAHOO.widget.TreeView(treebody);
-            tree.treeview.setDynamicLoad(function(node)
{tree.loadNodeData(node);});
-            var root = tree.treeview.getRoot();
-            tree.selected_node = root;
+            var self = this;
+            self.treeview = new YAHOO.widget.TreeView(treebody);
+            self.treeview.setDynamicLoad(function(node)
{self.loadNodeData(node);});
+            var root = self.treeview.getRoot();
+            self.selected_node = root;
 
             // Load dynamic tree entries
             var account = document.App.selected_account
             root.url = account.url;
-            tree.loadNodeData(root);
-            tree.treeview.subscribe('clickEvent', function(event) {
+            self.loadNodeData(root);
+            self.treeview.subscribe('clickEvent', function(event) {
                 // do not expand the node
                 if (event.node.list_type == "inbox") {
                     return false;
                 }
                 return true;
             });
-            tree.treeview.subscribe('labelClick', function(node) {
+            self.treeview.subscribe('labelClick', function(node) {
                 document.getElementById('accountSentFolderDisplay').value =
node.data.label;
                 document.App.account_edit_form.sent_folder = node.names;
             });

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 Mar 13
17:36:32 2009
(at)(at) -17,16 +17,16 (at)(at)
 
     YAHOO.gocept.webmailer.MessageList = Class({
         constructor: function() {
-            var message_list = this;
+            var self = this;
 
             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'});
+            self.load({foldersUrl: '', list_type: 'inbox'});
 
             YAHOO.gocept.webmailer.onFolderSelected.subscribe(
-                function(type, arg){ message_list.load(arg[0]); });
+                function(type, arg){ self.load(arg[0]); });
         },
 
         format_flags: function (el, oRecord, oColumn, oData) {
(at)(at) -67,7 +67,7 (at)(at)
             // XXX: This is messy. Creating many datatables that are still
             // referenced from the event system will make the memory usage of
             // the webmailer go haywire.
-            var message_list = this;
+            var self = this;
 
             url = folder.url;
             list_type = folder.list_type;
(at)(at) -102,7 +102,7 (at)(at)
                 {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) {
-                    sort_dir =
message_list.sortDirClassToString(oState.sortedBy.dir);
+                    sort_dir = self.sortDirClassToString(oState.sortedBy.dir);
                     return 'batch_start=' + oState.pagination.recordOffset +
                            '&batch_size=' + oState.pagination.rowsPerPage
+
                            '&sort_key=' + oState.sortedBy.key +
(at)(at) -112,11 +112,11 (at)(at)
                     containers: document.App.domNodes.message_list_paginator,
                     rowsPerPage: 10})});
 
-            message_list.table = table;
+            self.table = table;
             table.set("selectionMode", "standard");
             table.subscribe("rowClickEvent", table.onEventSelectRow);
             table.subscribe("columnSortEvent", function(event) {
-                sort_dir = message_list.sortDirClassToString(event.dir);
+                sort_dir = self.sortDirClassToString(event.dir);
                 document.App.preferences.set("sort", [event.column.key,
                                                       sort_dir]);
             });
(at)(at) -172,7 +172,7 (at)(at)
                             element = YAHOO.util.Dom.getChildren(id)
                             YAHOO.util.Dom.removeClass(element, 'DDOver');
                             if (reload) {
-                                message_list.reload();
+                                self.reload();
                             }
                         });
                 };
(at)(at) -181,9 +181,9 (at)(at)
         },
 
         reload: function() {
-            var message_list = this;
+            var self = this;
             var node = document.App.tree.selected_node;
-            message_list.load(node);
+            self.load(node);
             return true;
         },
 
(at)(at) -290,40 +290,40 (at)(at)
 
     YAHOO.gocept.webmailer.PreviewPane = Class({
         constructor: function() {
-            var preview_pane = this;
+            var self = this;
             //
             // Register the message-context menu items
             //
-            preview_pane.reply_button = document.App.menu.addMenuItem('Reply',
+            self.reply_button = document.App.menu.addMenuItem('Reply',
                 function() {
-                   
document.Connection.post(preview_pane.message.url+'/(at)(at)reply',
+                   
document.Connection.post(self.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',
+                self.reply_button.cfg.setProperty('disabled', true);
+                self.edit_button = document.App.menu.addMenuItem('Edit',
                     function() {
-                       
YAHOO.gocept.webmailer.open_composer(preview_pane.message.url);
+                       
YAHOO.gocept.webmailer.open_composer(self.message.url);
                 });
-                preview_pane.edit_button.cfg.setProperty('disabled', true);
-                preview_pane.delete_button =
document.App.menu.addMenuItem('Delete',
+                self.edit_button.cfg.setProperty('disabled', true);
+                self.delete_button = document.App.menu.addMenuItem('Delete',
                     function() {
-                       
document.Connection.post(preview_pane.message.url+'/(at)(at)delete', null,
function(result) {
+                       
document.Connection.post(self.message.url+'/(at)(at)delete', null,
function(result) {
                         document.App.message_list.reload()
                 });
             });
-            preview_pane.delete_button.cfg.setProperty('disabled', true);
-            preview_pane.raw_button = document.App.menu.addMenuItem('View
raw', function() {
+            self.delete_button.cfg.setProperty('disabled', true);
+            self.raw_button = document.App.menu.addMenuItem('View raw',
function() {
                 document.App.preview_pane.load_raw(message);
             });
-            preview_pane.raw_button.cfg.setProperty('disabled', true);
+            self.raw_button.cfg.setProperty('disabled', true);
         },
 
         load: function(message) {
-            var preview_pane = document.App.preview_pane;
-            preview_pane.message = message;
+            var self = document.App.preview_pane;
+            self.message = message;
 
             // Load the message content and display it
             document.Connection.get(message.url+'/(at)(at)render',
function(result) {
(at)(at) -332,35 +332,35 (at)(at)
                     message_parts['header'] +
                     message_parts['body'] +
                     message_parts['footer']);
-                preview_pane.raw_button.cfg.setProperty('text', 'View raw');
-                preview_pane.raw_button.cfg.setProperty(
+                self.raw_button.cfg.setProperty('text', 'View raw');
+                self.raw_button.cfg.setProperty(
                     'onclick', {fn: function() {
document.App.preview_pane.load_raw(message); }}
                     );
             });
 
             // Activate menu entries depending on the message's capabilities
             if (message.canReply) {
-                preview_pane.reply_button.cfg.setProperty('disabled', false);
+                self.reply_button.cfg.setProperty('disabled', false);
             };
             if (message.canEdit) {
-                preview_pane.edit_button.cfg.setProperty('disabled', false);
+                self.edit_button.cfg.setProperty('disabled', false);
             };
             if (message.canDelete) {
-                preview_pane.delete_button.cfg.setProperty('disabled', false);
+                self.delete_button.cfg.setProperty('disabled', false);
             };
             if (message.canBeRaw) {
-                preview_pane.raw_button.cfg.setProperty('disabled', false);
+                self.raw_button.cfg.setProperty('disabled', false);
             };
         },
 
         load_raw: function(message) {
-            var preview_pane = document.App.preview_pane;
-            preview_pane.loading();
+            var self = document.App.preview_pane;
+            self.loading();
             document.Connection.get(message.url+'/(at)(at)raw',
function(result) {
                 var result = YAHOO.lang.JSON.parse(result.responseText);
                 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);
+                self.raw_button.cfg.setProperty('text', 'View normal');
+                self.raw_button.cfg.setProperty('disabled', false);
                 document.App.preview_pane.raw_button.cfg.setProperty(
                     'onclick', {fn: function() {
document.App.preview_pane.load(message); }}
                     );
(at)(at) -368,20 +368,20 (at)(at)
         },
 
         loading: function() {
-            var preview_pane = this;
+            var self = this;
             document.App.domNodes.preview_pane.innerHTML = '<img
src="++resource++gocept.webmail/images/mail-loading.gif" style="position:
relative; left: 48%; top: 40%;" />';
         },
 
         reset: function() {
-            var preview_pane = this;
-            preview_pane.message = null;
+            var self = this;
+            self.message = null;
             document.App.domNodes.preview_pane.innerHTML = '';
 
             // Deactivate message-context menu items.
-            preview_pane.reply_button.cfg.setProperty('disabled', true);
-            preview_pane.edit_button.cfg.setProperty('disabled', true);
-            preview_pane.delete_button.cfg.setProperty('disabled', true);
-            preview_pane.raw_button.cfg.setProperty('disabled', true);
+            self.reply_button.cfg.setProperty('disabled', true);
+            self.edit_button.cfg.setProperty('disabled', true);
+            self.delete_button.cfg.setProperty('disabled', true);
+            self.raw_button.cfg.setProperty('disabled', true);
         }
     });
 

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	Fri
Mar 13 17:36:32 2009
(at)(at) -5,34 +5,34 (at)(at)
 
     YAHOO.gocept.webmailer.Preferences = Class({
         constructor: function() {
-            var preferences = this;
-            preferences.onLoadFinished = new YAHOO.util.CustomEvent(
-                "onLoadFinished", preferences);
-            preferences.data = new Object();
-            preferences.update();
+            var self = this;
+            self.onLoadFinished = new YAHOO.util.CustomEvent(
+                "onLoadFinished", self);
+            self.data = new Object();
+            self.update();
         },
 
         update: function() {
-            var preferences = this;
+            var self = this;
             document.Connection.get('(at)(at)preferences', function(result) {
                 var result = YAHOO.lang.JSON.parse(result.responseText);
                 if (result) {
-                    preferences.data = result;
+                    self.data = result;
                 }
-                preferences.onLoadFinished.fire();
+                self.onLoadFinished.fire();
             });
         },
 
         set: function(key, value) {
-            var preferences = this;
-            preferences.data[key] = value;
-            preferences.save();
+            var self = this;
+            self.data[key] = value;
+            self.save();
         },
 
         save: function() {
-            var preferences = this;
+            var self = this;
             document.Connection.post(
-                '(at)(at)update-preferences', {config: preferences.data});
+                '(at)(at)update-preferences', {config: self.data});
         }
     });
 });

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
Mar 13 17:36:32 2009
(at)(at) -5,12 +5,12 (at)(at)
 
     YAHOO.gocept.webmailer.App = Class({
         constructor: function() {
-            var app = this;
-            document.App = app;
-            app.domNodes = new Object();
+            var self = this;
+            document.App = self;
+            self.domNodes = new Object();
 
             // Setup the static screen layouts
-            app.outer_layout = new YAHOO.widget.Layout(
+            self.outer_layout = new YAHOO.widget.Layout(
                 {units: [
                     {position: 'top',
                         height: banner_height,
(at)(at) -18,10 +18,10 (at)(at)
                     {position: 'center',
                         body: ''}]});
             // XXX make src and height configurable on the server
-            app.outer_layout.on('render', function() {
-                app.layout = new YAHOO.widget.Layout(
-                    app.outer_layout.getUnitByPosition('center').body,
-                    {parent: app.outer_layout,
+            self.outer_layout.on('render', function() {
+                self.layout = new YAHOO.widget.Layout(
+                    self.outer_layout.getUnitByPosition('center').body,
+                    {parent: self.outer_layout,
                      units: [
                         { position: 'top',
                               height: 24, body: ''},
(at)(at) -31,35 +31,35 (at)(at)
                         { position: 'center', scroll: true,
                           body: ''}]});
 
-                app.layout.on('render', function() {
-                    app.account_layout = new YAHOO.widget.Layout(
-                        app.layout.getUnitByPosition('left').body,
-                        {parent: app.layout,
+                self.layout.on('render', function() {
+                    self.account_layout = new YAHOO.widget.Layout(
+                        self.layout.getUnitByPosition('left').body,
+                        {parent: self.layout,
                          units: [
                              { position: 'center', scroll: true,
                                body: ''},
                              { position: 'bottom', height: 44,
                                body: 'menubar-account-tree'}
                                  ]});
-                    app.account_layout.on('render', function() {
+                    self.account_layout.on('render', function() {
                         // Bind the slots to readable names
-                        app.domNodes.menu =
app.layout.getUnitByPosition('top').body;
-                        app.domNodes.tree =
app.account_layout.getUnitByPosition('center').body;
+                        self.domNodes.menu =
self.layout.getUnitByPosition('top').body;
+                        self.domNodes.tree =
self.account_layout.getUnitByPosition('center').body;
 
-                        app.domNodes.preview_pane =
document.createElement('div');
-                        app.domNodes.message_list =
document.createElement('div');
+                        self.domNodes.preview_pane =
document.createElement('div');
+                        self.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);
+                        var center =
self.layout.getUnitByPosition('center').body;
+                        center.appendChild(self.domNodes.message_list);
+                        center.appendChild(self.domNodes.preview_pane);
 
-                        app.setupStaticComponents();
+                        self.setupStaticComponents();
                     });
-                    app.account_layout.render();
+                    self.account_layout.render();
                 });
-                app.layout.render();
+                self.layout.render();
             });
-            app.outer_layout.render();
+            self.outer_layout.render();
         },
 
         reload_tree: function() {
(at)(at) -69,16 +69,16 (at)(at)
 
         setupStaticComponents: function() {
             // Fill the screen layout units with their components
-            var app = this;
-            app.preferences = new YAHOO.gocept.webmailer.Preferences()
+            var self = this;
+            self.preferences = new YAHOO.gocept.webmailer.Preferences()
 
-            app.preferences.onLoadFinished.subscribe(function () { 
-                app.menu = new YAHOO.gocept.webmailer.Menu();
+            self.preferences.onLoadFinished.subscribe(function () { 
+                self.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(
+                    self.preview_pane = new
YAHOO.gocept.webmailer.PreviewPane();
+                    self.message_list = new
YAHOO.gocept.webmailer.MessageList();
+                    self.tree = new YAHOO.gocept.webmailer.Tree(
                         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	Fri Mar
13 17:36:32 2009
(at)(at) -2,18 +2,19 (at)(at)
 Def(function() {
     YAHOO.gocept.webmailer.Menu = Class({
         constructor: function() {
-            var menu = this;
-            menu.menubar = new YAHOO.widget.MenuBar("webmailer-main-menu");
-            menu.menubar.render(document.App.domNodes.menu);
-            menu.menubar.show();
+            var self = this;
+            self.menubar = new YAHOO.widget.MenuBar("webmailer-main-menu");
+            self.menubar.render(document.App.domNodes.menu);
+            self.menubar.show();
         },
 
         addMenuItem: function(label, callback) {
+            var self = this;
             new_item = this.menubar.addItem({
                 text: label, 
                 onclick: { fn: callback }
                 });
-            this.menubar.render(document.App.domNodes.menu);
+            self.menubar.render(document.App.domNodes.menu);
             return new_item;
         }
     });
(at)(at) -36,32 +37,32 (at)(at)
 
     YAHOO.gocept.webmailer.Tree = Class({
         constructor: function(treebody) {
-            var tree = this;
-            tree.id_to_node = [];
-            tree.treeview = new YAHOO.widget.TreeView(treebody);
-            tree.treeview.setDynamicLoad(function(node)
{tree.loadNodeData(node);});
-            var root = tree.treeview.getRoot();
-            tree.selected_node = root;
+            var self = this;
+            self.id_to_node = [];
+            self.treeview = new YAHOO.widget.TreeView(treebody);
+            self.treeview.setDynamicLoad(function(node)
{self.loadNodeData(node);});
+            var root = self.treeview.getRoot();
+            self.selected_node = root;
 
             // Set up static tree entries
             drafts_node = new YAHOO.widget.TextNode('Drafts', root, false);
             drafts_node.isLeaf = true;
             drafts_node.url = profile_url;
             drafts_node.list_type = 'drafts';
-            tree.id_to_node[drafts_node.contentElId] = drafts_node;
+            self.id_to_node[drafts_node.contentElId] = drafts_node;
 
             // Load dynamic tree entries
             root.foldersUrl = '';
-            tree.loadNodeData(root);
-            tree.treeview.subscribe('clickEvent', function(event) {
+            self.loadNodeData(root);
+            self.treeview.subscribe('clickEvent', function(event) {
                 // do not expand the node
                 if (event.node.list_type == "inbox") {
                     return false;
                 }
                 return true;
             });
-            tree.treeview.subscribe('labelClick', function(node) {
-                tree.selected_node = node;
+            self.treeview.subscribe('labelClick', function(node) {
+                self.selected_node = node;
                 YAHOO.gocept.webmailer.onFolderSelected.fire(node);
             });
         },

Modified: gocept.webmail/trunk/gocept/webmail/browser/tests/connection.pt
==============================================================================
--- gocept.webmail/trunk/gocept/webmail/browser/tests/connection.pt	(original)
+++ gocept.webmail/trunk/gocept/webmail/browser/tests/connection.pt	Fri Mar 13
17:36:32 2009
(at)(at) -12,21 +12,21 (at)(at)
     <script type="text/javascript">
       TestCase({
         test_json_request: function() {
-            var testrunner = this;
+            var self = this;
             var conn = new YAHOO.gocept.webmailer.Connection();
             conn.post(profile_url + '/(at)(at)echo.html', {foo: 42},
                 function(o) {
                     var result = YAHOO.lang.JSON.parse(o.responseText)
-                    testrunner.resume(function() {
+                    self.resume(function() {
                         YAHOO.util.Assert.areEqual(
                             0, result['content-type'].indexOf('text/json'));
                     })
                 });
-            testrunner.wait();
+            self.wait();
         },
 
         test_upload_request: function() {
-            var testrunner = this;
+            var self = this;
 
             var conn = new YAHOO.gocept.webmailer.Connection();
             conn.upload(profile_url + '/(at)(at)echo.html', 'testform',
(at)(at) -34,12 +34,12 (at)(at)
                     // work around browser-smarts
                     var result = o.responseText.replace(/<\/?pre>/g, '')
                     result = YAHOO.lang.JSON.parse(result)
-                    testrunner.resume(function() {
+                    self.resume(function() {
                         YAHOO.util.Assert.areEqual(
                             0,
result['content-type'].indexOf('multipart/form-data'));
                     })
                 });
-            testrunner.wait();
+            self.wait();
         },
       });
     </script>

SVN: r29445 - gocept.restmail/trunk/gocept/restmail
Thomas Lotze <tl(at)gocept.com>
2009-03-18 11:53:46 [ FULL ]
Author: thomas
Date: Wed Mar 18 11:53:45 2009
New Revision: 29445

Log:
actually use the identity-to-mailhost adapters


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

Modified: gocept.restmail/trunk/gocept/restmail/draft.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/draft.py	(original)
+++ gocept.restmail/trunk/gocept/restmail/draft.py	Wed Mar 18 11:53:45 2009
(at)(at) -19,6 +19,7 (at)(at)
 
 from OFS.Folder import Folder
 from OFS.SimpleItem import SimpleItem
+import Products.MailHost.interfaces
 
 import gocept.imapapi.interfaces
 import gocept.restmail.interfaces
(at)(at) -170,7 +171,7 (at)(at)
                             'Message-ID': email.Utils.make_msgid()})
 
         # 2. Send via MailHost
-        mh = account.restrictedTraverse(identity.mailhost_id)
+        mh = Products.MailHost.interfaces.IMailHost(identity)
         mh.send(message)
 
         # 2.a On success, mark the original message answered.

SVN: r29446 - mytum.webmail/trunk/mytum/webmail
Thomas Lotze <tl(at)gocept.com>
2009-03-18 11:54:24 [ FULL ]
Author: thomas
Date: Wed Mar 18 11:54:23 2009
New Revision: 29446

Log:
identities don't have a sent folder anymore


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

Modified: mytum.webmail/trunk/mytum/webmail/account.py
==============================================================================
--- mytum.webmail/trunk/mytum/webmail/account.py	(original)
+++ mytum.webmail/trunk/mytum/webmail/account.py	Wed Mar 18 11:54:23 2009
(at)(at) -83,7 +83,6 (at)(at)
         self.id = id_
         self.address = address
         self.account_id = account_id
-        self.sent_folder = sent_folder
 
     def getName(self):
         return self.displayName()

SVN: r29447 - gocept.webmail/trunk/gocept/webmail/browser/resources
Thomas Lotze <tl(at)gocept.com>
2009-03-18 16:32:35 [ FULL ]
Author: thomas
Date: Wed Mar 18 16:32:34 2009
New Revision: 29447

Log:
reuse the account management window


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

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	Wed Mar
18 16:32:34 2009
(at)(at) -13,8 +13,9 (at)(at)
         if (base_url.match("/$")!="/") { // url doesn't end with "/"?
             base_url = base_url + "/";
         }
+        management_url = base_url + 'management';
         document.App.lastwindow = window.open(
-            base_url + 'management', '',
+            management_url, management_url,
            
'dependent=yes,location=no,menubar=no,toolbar=no,width=650,height=480');
     };

SVN: r29448 - mytum.webmail/trunk
Thomas Lotze <tl(at)gocept.com>
2009-03-18 16:36:01 [ FULL ]
Author: thomas
Date: Wed Mar 18 16:36:00 2009
New Revision: 29448

Log:
added some stuff to the installation directions


Modified:
   mytum.webmail/trunk/INSTALL.txt

Modified: mytum.webmail/trunk/INSTALL.txt
==============================================================================
--- mytum.webmail/trunk/INSTALL.txt	(original)
+++ mytum.webmail/trunk/INSTALL.txt	Wed Mar 18 16:36:00 2009
(at)(at) -12,4 +12,8 (at)(at)
 
 - GenericSetup: mytum-Profil laden, importieren
 
+- webmail_data-Tool: ggf. Properties anpassen
+
+- Webmailer anlegen
+
 - Webmailer-Objekt: Properties setzen (banner_url='/header',
banner_height=154)

SVN: r29457 - in gocept.restmail/trunk/gocept/restmail: . browser
Sebastian Wehrmann <sw(at)gocept.com>
2009-03-23 16:36:13 [ FULL ]
Author: sweh
Date: Mon Mar 23 16:36:11 2009
New Revision: 29457

Log:
- Add CC and BCC headers.
  Fixed #4838



Modified:
   gocept.restmail/trunk/gocept/restmail/browser/README.txt
   gocept.restmail/trunk/gocept/restmail/browser/draft.py
   gocept.restmail/trunk/gocept/restmail/browser/draft_snippet_header.pt
   gocept.restmail/trunk/gocept/restmail/browser/inline.txt
   gocept.restmail/trunk/gocept/restmail/draft.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	Mon Mar 23
16:36:11 2009
(at)(at) -590,7 +590,9 (at)(at)
 After a message was created, its data is empty:
 
 >>> pprint.pprint(json_request(draft['url']+'/(at)(at)data'))
-{'body': '',
+{'bcc': '',
+ 'body': '',
+ 'cc': '',
  'date': '<ISO DATE>',
  'identity': '',
  'subject': '',
(at)(at) -621,59 +623,75 (at)(at)
 
 >>> json_request(draft['url']+'/(at)(at)save',
 ...              to='ct(at)gocept.com',
+...              cc='',
+...              bcc='ct+geheim(at)gocept.com',
 ...              identity='ben-example.com',
 ...              subject=u'asdf',
 ...              body=u'HelloHello')
 >>> pprint.pprint(json_request(draft['url']+'/(at)(at)data'))
-{'body': 'HelloHello',
+{'bcc': 'ct+geheim(at)gocept.com',
+ 'body': 'HelloHello',
+ 'cc': '',
  'date': '<ISO DATE>',
  'identity': 'ben-example.com',
  'subject': 'asdf',
  'to': 'ct(at)gocept.com'}
 >>> pprint.pprint(json_request(draft['url']+'/(at)(at)raw'))
-{'raw': '<pre>MIME-Version: 1.0\nContent-Type: text/html;
charset="us-ascii"\nContent-Transfer-Encoding: 7bit\nFrom: Ben Utzer
<ben(at)example.com>\nTo: ct(at)gocept.com\nSubject:
asdf\n\nHelloHello</pre>'}
+{'raw': '<pre>MIME-Version: 1.0\nContent-Type: text/html;
charset="us-ascii"\nContent-Transfer-Encoding: 7bit\nFrom: Ben Utzer
<ben(at)example.com>\nTo: ct(at)gocept.com\nCC: \nBCC:
ct+geheim(at)gocept.com\nSubject: asdf\n\nHelloHello</pre>'}
 
 >>> json_request(draft['url']+'/(at)(at)save',
 ...              to='ct(at)gocept.com',
+...              cc='sw(at)gocept.com',
+...              bcc='tl(at)gocept.com',
 ...              identity='ben-example.com',
 ...              subject=u'asdf',
 ...              body=u'HelloHello\xe4')
 >>> pprint.pprint(json_request(draft['url']+'/(at)(at)data'))
-{'body': u'HelloHello\xe4',
+{'bcc': 'tl(at)gocept.com',
+ 'body': u'HelloHello\xe4',
+ 'cc': 'sw(at)gocept.com',
  'date': '<ISO DATE>',
  'identity': 'ben-example.com',
  'subject': 'asdf',
  'to': 'ct(at)gocept.com'}
 >>> pprint.pprint(json_request(draft['url']+'/(at)(at)raw'))
-{'raw': '<pre>MIME-Version: 1.0\nContent-Type: text/html;
charset="utf-8"\nContent-Transfer-Encoding: quoted-printable\nFrom: Ben Utzer
<ben(at)example.com>\nTo: ct(at)gocept.com\nSubject:
asdf\n\nHelloHello=C3=A4</pre>'}
+{'raw': '<pre>MIME-Version: 1.0\nContent-Type: text/html;
charset="utf-8"\nContent-Transfer-Encoding: quoted-printable\nFrom: Ben Utzer
<ben(at)example.com>\nTo: ct(at)gocept.com\nCC: sw(at)gocept.com\nBCC:
tl(at)gocept.com\nSubject: asdf\n\nHelloHello=C3=A4</pre>'}
 
 >>> json_request(draft['url']+'/(at)(at)save',
 ...              to='ct(at)gocept.com',
+...              cc='sw(at)gocept.com',
+...              bcc='tl(at)gocept.com',
 ...              identity='ben-example.com',
 ...              subject=u'asdf\xe4',
 ...              body=u'HelloHello')
 >>> pprint.pprint(json_request(draft['url']+'/(at)(at)data'))
-{'body': 'HelloHello',
+{'bcc': 'tl(at)gocept.com',
+ 'body': 'HelloHello',
+ 'cc': 'sw(at)gocept.com',
  'date': '<ISO DATE>',
  'identity': 'ben-example.com',
  'subject': u'asdf\xe4',
  'to': 'ct(at)gocept.com'}
 >>> pprint.pprint(json_request(draft['url']+'/(at)(at)raw'))
-{'raw': '<pre>MIME-Version: 1.0\nContent-Type: text/html;
charset="us-ascii"\nContent-Transfer-Encoding: 7bit\nFrom: Ben Utzer
<ben(at)example.com>\nTo: ct(at)gocept.com\nSubject:
=?utf-8?q?asdf=C3=A4?=\n\nHelloHello</pre>'}
+{'raw': '<pre>MIME-Version: 1.0\nContent-Type: text/html;
charset="us-ascii"\nContent-Transfer-Encoding: 7bit\nFrom: Ben Utzer
<ben(at)example.com>\nTo: ct(at)gocept.com\nCC: sw(at)gocept.com\nBCC:
tl(at)gocept.com\nSubject: =?utf-8?q?asdf=C3=A4?=\n\nHelloHello</pre>'}
 
 >>> json_request(draft['url']+'/(at)(at)save',
 ...              to='ct(at)gocept.com',
+...              cc='sw(at)gocept.com',
+...              bcc='tl(at)gocept.com',
 ...              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',
+{'bcc': 'tl(at)gocept.com',
+ 'body': u'HelloHello\xe4',
+ 'cc': 'sw(at)gocept.com',
  'date': '<ISO DATE>',
  'identity': 'ben-example.com',
  'subject': u'asdf\xe4',
  'to': 'ct(at)gocept.com'}
 >>> pprint.pprint(json_request(draft['url']+'/(at)(at)raw'))
-{'raw': '<pre>MIME-Version: 1.0\nContent-Type: text/html;
charset="utf-8"\nContent-Transfer-Encoding: quoted-printable\nFrom: Ben Utzer
<ben(at)example.com>\nTo: ct(at)gocept.com\nSubject:
=?utf-8?q?asdf=C3=A4?=\n\nHelloHello=C3=A4</pre>'}
+{'raw': '<pre>MIME-Version: 1.0\nContent-Type: text/html;
charset="utf-8"\nContent-Transfer-Encoding: quoted-printable\nFrom: Ben Utzer
<ben(at)example.com>\nTo: ct(at)gocept.com\nCC: sw(at)gocept.com\nBCC:
tl(at)gocept.com\nSubject:
=?utf-8?q?asdf=C3=A4?=\n\nHelloHello=C3=A4</pre>'}
 
 
 Editing attachments
(at)(at) -738,6 +756,8 (at)(at)
 Content-Transfer-Encoding: quoted-printable
 From: Ben Utzer <ben(at)example.com>
 To: ct(at)gocept.com
+CC: sw(at)gocept.com
+BCC: tl(at)gocept.com
 Subject: =?utf-8?q?asdf=C3=A4?=
 Date: Thu, 22 Jan 2009 13:00:09 -0000
 Message-ID: <20090122134209.28637.30662(at)krusty.whq.gocept.com>
(at)(at) -769,6 +789,8 (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',
+...              cc='',
+...              bcc='',
 ...              identity='ben-example.com',
 ...              subject=u'asdf',
 ...              body='HelloHello')
(at)(at) -782,6 +804,8 (at)(at)
 MIME-Version: 1.0
 From: Ben Utzer <ben(at)example.com>
 To: ct(at)gocept.com
+CC: 
+BCC: 
 Subject: asdf
 Date: Thu, 22 Jan 2009 13:00:09 -0000
 Message-ID: <20090122134209.28637.30662(at)krusty.whq.gocept.com>
(at)(at) -836,7 +860,9 (at)(at)
 >>> pprint.pprint(reply)
 {'url': 'http://localhost/profile/drafts/<GUID>'}
 >>> 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',
+{'bcc': '',
+ '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',
+ 'cc': '',
  'date': '<ISO DATE>',
  'identity': 'ben-example.com',
  'subject': 'Re: Mail 2',
(at)(at) -867,6 +893,8 (at)(at)
 Content-Transfer-Encoding: 7bit
 From: Ben Utzer <ben(at)example.com>
 To: test(at)localhost
+CC: 
+BCC: 
 Subject: Re: Mail 2
 Date: Thu, 22 Jan 2009 13:00:10 -0000
 Message-ID: <20090122134209.28637.41773(at)krusty.whq.gocept.com>
(at)(at) -919,6 +947,8 (at)(at)
 {'url': 'http://localhost/profile/drafts/<GUID>'}
 >>> json_request(draft['url']+'/(at)(at)save',
 ...              to='ct(at)gocept.com',
+...              cc='',
+...              bcc='',
 ...              identity='ben-example.com',
 ...              subject=u'Testmail incorrect sent folder',
 ...              body='HelloHello')
(at)(at) -929,6 +959,8 (at)(at)
 Content-Transfer-Encoding: 7bit
 From: Ben Utzer <ben(at)example.com>
 To: ct(at)gocept.com
+CC: 
+BCC: 
 Subject: Testmail incorrect sent folder
 Date: Tue, 27 Jan 2009 09:17:50 -0000
 Message-ID: <20090127091750.68069.31342(at)zoidberg.ws.whq.gocept.com>

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	Mon Mar 23 16:36:11
2009
(at)(at) -15,14 +15,18 (at)(at)
         return {'identity': self.context.identity,
                 'date': self.context.date.isoformat(' '),
                 'to': self.context.to,
+                'cc': self.context.cc,
+                'bcc': self.context.bcc,
                 'subject': self.context.subject,
                 'body': self.context.body}
 
     (at)gocept.restmail.browser.json.view
-    def save(self, identity, to, subject, body):
+    def save(self, identity, to, cc, bcc, subject, body):
         """Update the draft."""
         self.context.identity = identity
         self.context.to = to
+        self.context.cc = cc
+        self.context.bcc = bcc
         self.context.subject = subject
         self.context.body = body
 

Modified: gocept.restmail/trunk/gocept/restmail/browser/draft_snippet_header.pt
==============================================================================
---
gocept.restmail/trunk/gocept/restmail/browser/draft_snippet_header.pt	(original)
+++ gocept.restmail/trunk/gocept/restmail/browser/draft_snippet_header.pt	Mon
Mar 23 16:36:11 2009
(at)(at) -5,6 +5,16 (at)(at)
     <dt>To:</dt>
     <dd tal:content="draft/to"></dd>
 
+    <tal:block condition="draft/cc">
+      <dt>CC:</dt>
+      <dd tal:content="draft/cc"></dd>
+    </tal:block>
+
+    <tal:block condition="draft/bcc">
+      <dt>BCC:</dt>
+      <dd tal:content="draft/bcc"></dd>
+    </tal:block>
+
     <dt>Date:</dt>
     <dd tal:content="draft/date"></dd>
 </dl>

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	Mon Mar 23
16:36:11 2009
(at)(at) -486,6 +486,8 (at)(at)
 
 >>> json_request(draft['url']+'/(at)(at)save',
 ...              to='ct(at)gocept.com',
+...              cc='sw(at)gocept.com',
+...              bcc='',
 ...              identity='ben-example.com',
 ...              subject=u'asdf',
 ...              body='HelloHello')
(at)(at) -502,6 +504,8 (at)(at)
 
 >>> json_request(draft['url']+'/(at)(at)save',
 ...              to='ct(at)gocept.com',
+...              cc='',
+...              bcc='',
 ...              identity='ben-example.com',
 ...              subject=u'asdf',
 ...             
body='<html><body>HelloHello</body></html>')

Modified: gocept.restmail/trunk/gocept/restmail/draft.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/draft.py	(original)
+++ gocept.restmail/trunk/gocept/restmail/draft.py	Mon Mar 23 16:36:11 2009
(at)(at) -56,12 +56,16 (at)(at)
 
     _properties = (dict(id='identity', type='string', mode='w'),
                    dict(id='to', type='string', mode='w'),
+                   dict(id='cc', type='string', mode='w'),
+                   dict(id='bcc', type='string', mode='w'),
                    dict(id='subject', type='string', mode='w'),
                    dict(id='body', type='text', mode='w'))
 
     identity = u''
     date = None
     to = u''
+    cc = u''
+    bcc = u''
     subject = u''
     in_reply_to = None
     references = None
(at)(at) -132,6 +136,8 (at)(at)
 
         message['From'] = identity.From()
         message['To'] = self.to
+        message['CC'] = self.cc
+        message['BCC'] = self.bcc
         message['Subject'] = self.subject
         if self.in_reply_to:
             message['In-reply-to'] = self.in_reply_to

SVN: r29458 - in gocept.webmail/trunk/gocept/webmail/browser: . resources
Sebastian Wehrmann <sw(at)gocept.com>
2009-03-23 16:37:46 [ FULL ]
Author: sweh
Date: Mon Mar 23 16:37:45 2009
New Revision: 29458

Log:
- Add CC and BCC input boxes to composer.
- Add CC and BCC output to drafts header.

  Fixed #4834



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

Modified: gocept.webmail/trunk/gocept/webmail/browser/composer.pt
==============================================================================
--- gocept.webmail/trunk/gocept/webmail/browser/composer.pt	(original)
+++ gocept.webmail/trunk/gocept/webmail/browser/composer.pt	Mon Mar 23 16:37:45
2009
(at)(at) -31,6 +31,14 (at)(at)
                   <input type="text" name="composeTo" id="composeTo"/>
                 </div>
                 <div>
+                  <label for="composeCC">CC:</label>
+                  <input type="text" name="composeCC" id="composeCC"/>
+                </div>
+                <div>
+                  <label for="composeBCC">BCC:</label>
+                  <input type="text" name="composeBCC" id="composeBCC"/>
+                </div>
+                <div>
                   <label for="composeSubject">Subject:</label>
                   <input type="text" name="composeSubject"
id="composeSubject"/>
                 </div>

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	Mon Mar
23 16:37:45 2009
(at)(at) -210,6 +210,8 (at)(at)
             document.Connection.get(self.draft_url+'/(at)(at)data',
function(result) {
                     var draft = YAHOO.lang.JSON.parse(result.responseText);
                     self.getControl('To').value = draft['to'];
+                    self.getControl('CC').value = draft['cc'];
+                    self.getControl('BCC').value = draft['bcc'];
                     self.getControl('Subject').value = draft['subject'];
                     if (draft['identity']) {
                         var identities = YAHOO.util.Dom.getChildren(
(at)(at) -233,6 +235,8 (at)(at)
             body = '<html><body>' + body +
'</body></html>';
             var data = {identity: self.get('From'),
                         to: self.get('To'),
+                        cc: self.get('CC'),
+                        bcc: self.get('BCC'),
                         subject: self.get('Subject'),
                         body: body};
             return data

SVN: r29488 - gocept.imapapi/trunk/gocept/imapapi
Thomas Lotze <tl(at)gocept.com>
2009-03-30 10:26:48 [ FULL ]
Author: thomas
Date: Mon Mar 30 10:26:46 2009
New Revision: 29488

Log:
don't break anymore if a wrongly encoded folder name is returned by the server,
re 4881


Modified:
   gocept.imapapi/trunk/gocept/imapapi/account.txt
   gocept.imapapi/trunk/gocept/imapapi/folder.py
   gocept.imapapi/trunk/gocept/imapapi/folder.txt
   gocept.imapapi/trunk/gocept/imapapi/tests.py

Modified: gocept.imapapi/trunk/gocept/imapapi/account.txt
==============================================================================
--- gocept.imapapi/trunk/gocept/imapapi/account.txt	(original)
+++ gocept.imapapi/trunk/gocept/imapapi/account.txt	Mon Mar 30 10:26:46 2009
(at)(at) -37,8 +37,8 (at)(at)
 >>> pprint(dict(account.folders))
 {u'Bar': <gocept.imapapi.folder.Folder object u'Bar' at 0x2615309>,
  u'F\xf6': <gocept.imapapi.folder.Folder object u'F\xf6' at 0x2623456>,
- u'INBOX': <gocept.imapapi.folder.Folder object u'INBOX' at 0x2631278>}
-
+ u'INBOX': <gocept.imapapi.folder.Folder object u'INBOX' at 0x2631278>,
+ u'\ufffd': <gocept.imapapi.folder.Folder object u'\ufffd' at
0x2631567>}
 >>> account.messages
 Traceback (most recent call last):
 AttributeError: 'Account' object has no attribute 'messages'

Modified: gocept.imapapi/trunk/gocept/imapapi/folder.py
==============================================================================
--- gocept.imapapi/trunk/gocept/imapapi/folder.py	(original)
+++ gocept.imapapi/trunk/gocept/imapapi/folder.py	Mon Mar 30 10:26:46 2009
(at)(at) -245,5 +245,5 (at)(at)
         else:
             text += decode_buffer(bytes[start:stop])
         bytes = bytes[stop:]
-    text += bytes.decode('ascii')
+    text += bytes.decode('ascii', 'replace')
     return text

Modified: gocept.imapapi/trunk/gocept/imapapi/folder.txt
==============================================================================
--- gocept.imapapi/trunk/gocept/imapapi/folder.txt	(original)
+++ gocept.imapapi/trunk/gocept/imapapi/folder.txt	Mon Mar 30 10:26:46 2009
(at)(at) -14,7 +14,8 (at)(at)
 >>> pprint(dict(account.folders))
 {u'Bar': <gocept.imapapi.folder.Folder object u'Bar' at 0x2612732>,
  u'F\xf6': <gocept.imapapi.folder.Folder object u'F\xf6' at 0x2612732>,
- u'INBOX': <gocept.imapapi.folder.Folder object u'INBOX' at 0x2134232>}
+ u'INBOX': <gocept.imapapi.folder.Folder object u'INBOX' at 0x2134232>,
+ u'\ufffd': <gocept.imapapi.folder.Folder object u'\ufffd' at
0x2631567>}
 
 A folder knows about its name, path, separator, and depth in the hierarchy:
 
(at)(at) -57,7 +58,8 (at)(at)
 {u'Bar': <gocept.imapapi.folder.Folder object u'Bar' at 0x2142346>,
  u'F\xf6': <gocept.imapapi.folder.Folder object u'F\xf6' at 0x2612732>,
  u'INBOX': <gocept.imapapi.folder.Folder object u'INBOX' at 0x2762352>,
- u'Top level': <gocept.imapapi.folder.Folder object u'Top level' at
0x2123423>}
+ u'Top level': <gocept.imapapi.folder.Folder object u'Top level' at
0x2123423>,
+ u'\ufffd': <gocept.imapapi.folder.Folder object u'\ufffd' at
0x2631567>}
 >>> top_level = account.folders[u'Top level']
 >>> top_level.name
 u'Top level'

Modified: gocept.imapapi/trunk/gocept/imapapi/tests.py
==============================================================================
--- gocept.imapapi/trunk/gocept/imapapi/tests.py	(original)
+++ gocept.imapapi/trunk/gocept/imapapi/tests.py	Mon Mar 30 10:26:46 2009
(at)(at) -86,6 +86,7 (at)(at)
     callIMAP(server, 'create', 'INBOX/Baz')
     callIMAP(server, 'create', 'Bar')
     callIMAP(server, 'create', 'F&APY-')
+    callIMAP(server, 'create', '\xef')
     status, data = server.logout()
     assert status == 'BYE'

SVN: r29489 - gocept.imapapi/trunk/gocept/imapapi
Thomas Lotze <tl(at)gocept.com>
2009-03-30 10:47:41 [ FULL ]
Author: thomas
Date: Mon Mar 30 10:47:40 2009
New Revision: 29489

Log:
changed the fix re #4881 to avoid decoding differnt junk to the same names
containing undefined chars


Modified:
   gocept.imapapi/trunk/gocept/imapapi/account.txt
   gocept.imapapi/trunk/gocept/imapapi/folder.py
   gocept.imapapi/trunk/gocept/imapapi/folder.txt
   gocept.imapapi/trunk/gocept/imapapi/tests.py

Modified: gocept.imapapi/trunk/gocept/imapapi/account.txt
==============================================================================
--- gocept.imapapi/trunk/gocept/imapapi/account.txt	(original)
+++ gocept.imapapi/trunk/gocept/imapapi/account.txt	Mon Mar 30 10:47:40 2009
(at)(at) -37,8 +37,8 (at)(at)
 >>> pprint(dict(account.folders))
 {u'Bar': <gocept.imapapi.folder.Folder object u'Bar' at 0x2615309>,
  u'F\xf6': <gocept.imapapi.folder.Folder object u'F\xf6' at 0x2623456>,
- u'INBOX': <gocept.imapapi.folder.Folder object u'INBOX' at 0x2631278>,
- u'\ufffd': <gocept.imapapi.folder.Folder object u'\ufffd' at
0x2631567>}
+ u'INBOX': <gocept.imapapi.folder.Folder object u'INBOX' at 0x2631278>}
+
 >>> account.messages
 Traceback (most recent call last):
 AttributeError: 'Account' object has no attribute 'messages'

Modified: gocept.imapapi/trunk/gocept/imapapi/folder.py
==============================================================================
--- gocept.imapapi/trunk/gocept/imapapi/folder.py	(original)
+++ gocept.imapapi/trunk/gocept/imapapi/folder.py	Mon Mar 30 10:47:40 2009
(at)(at) -227,23 +227,41 (at)(at)
 def decode_modified_utf7(bytes):
     r"""Modified UTF-7 decoding as specified in RfC 3501, section 5.1.3.
 
+    We can decode correctly encoded Unicode:
+
     >>> decode_modified_utf7('&AOQA9gD8-')
     u'\xe4\xf6\xfc'
 
+    We don't break on junk:
+
+    >>> decode_modified_utf7('\xef')
+    u'\\xef'
+
+    As a convenience, we try to interpret junk as UTF-8:
+
+    >>> decode_modified_utf7(u'\xe4'.encode('utf-8'))
+    u'\xe4'
+
     """
-    def decode_buffer(buffer):
+    def decode_utf7(buffer):
         return buffer.replace('&', '+').replace(',', '/').decode('utf7')
 
+    def decode_ascii(buffer):
+        try:
+            return buffer.decode('utf-8')
+        except UnicodeDecodeError:
+            return unicode(repr(buffer)[1:-1])
+
     text = u''
     while '&' in bytes:
         start = bytes.index('&')
-        text += bytes[:start].decode('ascii')
+        text += decode_ascii(bytes[:start])
 
         stop = bytes.index('-') + 1
         if stop == start + 2:
             text += u'&'
         else:
-            text += decode_buffer(bytes[start:stop])
+            text += decode_utf7(bytes[start:stop])
         bytes = bytes[stop:]
-    text += bytes.decode('ascii', 'replace')
+    text += decode_ascii(bytes)
     return text

Modified: gocept.imapapi/trunk/gocept/imapapi/folder.txt
==============================================================================
--- gocept.imapapi/trunk/gocept/imapapi/folder.txt	(original)
+++ gocept.imapapi/trunk/gocept/imapapi/folder.txt	Mon Mar 30 10:47:40 2009
(at)(at) -14,8 +14,7 (at)(at)
 >>> pprint(dict(account.folders))
 {u'Bar': <gocept.imapapi.folder.Folder object u'Bar' at 0x2612732>,
  u'F\xf6': <gocept.imapapi.folder.Folder object u'F\xf6' at 0x2612732>,
- u'INBOX': <gocept.imapapi.folder.Folder object u'INBOX' at 0x2134232>,
- u'\ufffd': <gocept.imapapi.folder.Folder object u'\ufffd' at
0x2631567>}
+ u'INBOX': <gocept.imapapi.folder.Folder object u'INBOX' at 0x2134232>}
 
 A folder knows about its name, path, separator, and depth in the hierarchy:
 
(at)(at) -58,8 +57,7 (at)(at)
 {u'Bar': <gocept.imapapi.folder.Folder object u'Bar' at 0x2142346>,
  u'F\xf6': <gocept.imapapi.folder.Folder object u'F\xf6' at 0x2612732>,
  u'INBOX': <gocept.imapapi.folder.Folder object u'INBOX' at 0x2762352>,
- u'Top level': <gocept.imapapi.folder.Folder object u'Top level' at
0x2123423>,
- u'\ufffd': <gocept.imapapi.folder.Folder object u'\ufffd' at
0x2631567>}
+ u'Top level': <gocept.imapapi.folder.Folder object u'Top level' at
0x2123423>}
 >>> top_level = account.folders[u'Top level']
 >>> top_level.name
 u'Top level'

Modified: gocept.imapapi/trunk/gocept/imapapi/tests.py
==============================================================================
--- gocept.imapapi/trunk/gocept/imapapi/tests.py	(original)
+++ gocept.imapapi/trunk/gocept/imapapi/tests.py	Mon Mar 30 10:47:40 2009
(at)(at) -86,7 +86,6 (at)(at)
     callIMAP(server, 'create', 'INBOX/Baz')
     callIMAP(server, 'create', 'Bar')
     callIMAP(server, 'create', 'F&APY-')
-    callIMAP(server, 'create', '\xef')
     status, data = server.logout()
     assert status == 'BYE'

SVN: r29490 - gocept.imapapi/trunk/gocept/imapapi
Thomas Lotze <tl(at)gocept.com>
2009-03-30 10:52:30 [ FULL ]
Author: thomas
Date: Mon Mar 30 10:52:29 2009
New Revision: 29490

Log:
re #4881: removed the convenience UTF-8 decoding to avoid more ambiguities


Modified:
   gocept.imapapi/trunk/gocept/imapapi/folder.py

Modified: gocept.imapapi/trunk/gocept/imapapi/folder.py
==============================================================================
--- gocept.imapapi/trunk/gocept/imapapi/folder.py	(original)
+++ gocept.imapapi/trunk/gocept/imapapi/folder.py	Mon Mar 30 10:52:29 2009
(at)(at) -237,18 +237,13 (at)(at)
     >>> decode_modified_utf7('\xef')
     u'\\xef'
 
-    As a convenience, we try to interpret junk as UTF-8:
-
-    >>> decode_modified_utf7(u'\xe4'.encode('utf-8'))
-    u'\xe4'
-
     """
     def decode_utf7(buffer):
         return buffer.replace('&', '+').replace(',', '/').decode('utf7')
 
     def decode_ascii(buffer):
         try:
-            return buffer.decode('utf-8')
+            return buffer.decode('ascii')
         except UnicodeDecodeError:
             return unicode(repr(buffer)[1:-1])

SVN: r29491 - gocept.imapapi/trunk/gocept/imapapi
Thomas Lotze <tl(at)gocept.com>
2009-03-30 11:31:39 [ FULL ]
Author: thomas
Date: Mon Mar 30 11:31:37 2009
New Revision: 29491

Log:
avoid modified-utf7 encoding/decoding cycles to fix accessing folders with
broken encoded names


Modified:
   gocept.imapapi/trunk/gocept/imapapi/folder.py

Modified: gocept.imapapi/trunk/gocept/imapapi/folder.py
==============================================================================
--- gocept.imapapi/trunk/gocept/imapapi/folder.py	(original)
+++ gocept.imapapi/trunk/gocept/imapapi/folder.py	Mon Mar 30 11:31:37 2009
(at)(at) -18,9 +18,9 (at)(at)
                  encoded_name=None):
         self.name = name
         self.encoded_name = encoded_name
-        if name is not None:
+        if encoded_name is None and name is not None:
             self.encoded_name = encode_modified_utf7(name)
-        elif encoded_name is not None:
+        if name is None and encoded_name is not None:
             self.name = decode_modified_utf7(encoded_name)
         self.parent = parent
         self._separator = separator
(at)(at) -62,7 +62,11 (at)(at)
 
     (at)property
     def encoded_path(self):
-        return encode_modified_utf7(self.path)
+        if self.is_subfolder:
+            return (self.parent.encoded_path + self.separator
+                    + self.encoded_name)
+        else:
+            return self.encoded_name
 
     (at)property
     def folders(self):

SVN: r29495 - gocept.webmail/trunk/gocept/webmail/browser/resources
Sebastian Wehrmann <sw(at)gocept.com>
2009-03-30 14:58:46 [ FULL ]
Author: sweh
Date: Mon Mar 30 14:58:45 2009
New Revision: 29495

Log:
Re #4838
- Add button to forward a message.



Modified:
   gocept.webmail/trunk/gocept/webmail/browser/resources/message.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	Mon Mar 30
14:58:45 2009
(at)(at) -127,6 +127,7 (at)(at)
                 message = new Object();
                 message.url = event.record.getData().url;
                 message.canReply = config.canReply;
+                message.canForward = config.canForward;
                 message.canEdit = config.canEdit;
                 message.canDelete = config.canDelete;
                 message.canBeRaw = config.canBeRaw;
(at)(at) -235,6 +236,7 (at)(at)
           config.columns = columns;
           config.canEdit = false;
           config.canReply = true;
+          config.canForward = true;
           config.canDelete = true;
           config.canBeRaw = true;
           return config;
(at)(at) -276,6 +278,7 (at)(at)
           config.columns = columns;
           config.canEdit = true;
           config.canReply = false;
+          config.canForward = false;
           config.canDelete = true;
           config.canBeRaw = true;
           return config;
(at)(at) -300,18 +303,28 (at)(at)
                         null, function(result) {
                             var message =
YAHOO.lang.JSON.parse(result.responseText);
                            
YAHOO.gocept.webmailer.open_composer(message['url']);
-                    });
                 });
-                self.reply_button.cfg.setProperty('disabled', true);
-                self.edit_button = document.App.menu.addMenuItem('Edit',
-                    function() {
-                       
YAHOO.gocept.webmailer.open_composer(self.message.url);
+            });
+            self.reply_button.cfg.setProperty('disabled', true);
+            self.forward_button = document.App.menu.addMenuItem('Forward',
+                function() {
+                   
document.Connection.post(self.message.url+'/(at)(at)forward',
+                        null, function(result) {
+                            var message =
YAHOO.lang.JSON.parse(result.responseText);
+                           
YAHOO.gocept.webmailer.open_composer(message['url']);
                 });
-                self.edit_button.cfg.setProperty('disabled', true);
-                self.delete_button = document.App.menu.addMenuItem('Delete',
-                    function() {
-                       
document.Connection.post(self.message.url+'/(at)(at)delete', null,
function(result) {
-                        document.App.message_list.reload()
+            });
+            self.forward_button.cfg.setProperty('disabled', true);
+            self.edit_button = document.App.menu.addMenuItem('Edit',
+                function() {
+                    YAHOO.gocept.webmailer.open_composer(self.message.url);
+            });
+            self.edit_button.cfg.setProperty('disabled', true);
+            self.delete_button = document.App.menu.addMenuItem('Delete',
+                function() {
+                   
document.Connection.post(self.message.url+'/(at)(at)delete',
+                        null, function(result) {
+                            document.App.message_list.reload()
                 });
             });
             self.delete_button.cfg.setProperty('disabled', true);
(at)(at) -342,6 +355,9 (at)(at)
             if (message.canReply) {
                 self.reply_button.cfg.setProperty('disabled', false);
             };
+            if (message.canForward) {
+                self.forward_button.cfg.setProperty('disabled', false);
+            };
             if (message.canEdit) {
                 self.edit_button.cfg.setProperty('disabled', false);
             };

SVN: r29498 - gocept.webmail/trunk/gocept/webmail/browser/resources
Sebastian Wehrmann <sw(at)gocept.com>
2009-03-30 15:55:23 [ FULL ]
Author: sweh
Date: Mon Mar 30 15:55:22 2009
New Revision: 29498

Log:
- Add a forwarded flag.



Modified:
   gocept.webmail/trunk/gocept/webmail/browser/resources/message.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	Mon Mar 30
15:55:22 2009
(at)(at) -47,6 +47,10 (at)(at)
                     el.innerHTML = el.innerHTML +
                         '<img
src="++resource++gocept.webmail/images/mail-flagged.png"
class="message_flagged" />';
                 };
+                if (flags[i] == '$Forwarded') {
+                    el.innerHTML = el.innerHTML +
+                        '<img
src="++resource++gocept.webmail/images/mail-forward.png"
class="message_flagged" />';
+                };
                 if (flags[i] == '$Junk') {
                     el.innerHTML = el.innerHTML +
                         '<img
src="++resource++gocept.webmail/images/mail-mark-junk.png"
class="message_flagged" />';

SVN: r29500 - gocept.webmail/trunk/gocept/webmail/browser/resources
Sebastian Wehrmann <sw(at)gocept.com>
2009-03-31 10:10:11 [ FULL ]
Author: sweh
Date: Tue Mar 31 10:10:10 2009
New Revision: 29500

Log:
- Add error handling when sending messages.



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 Mar
31 10:10:10 2009
(at)(at) -333,7 +333,12 (at)(at)
             var self = this;
             self.save_draft();
             document.Connection.post(self.draft_url+'/(at)(at)send', null,
function(result) {
-                self.close_draft();
+                var response = YAHOO.lang.JSON.parse(result.responseText);
+                if (response['status'] != 'OK') {
+                    alert(response['message']);
+                } else {
+                    self.close_draft();
+                }
             });
         },

SVN: r29501 - gocept.restmail/trunk/gocept/restmail/browser
Sebastian Wehrmann <sw(at)gocept.com>
2009-03-31 10:20:48 [ FULL ]
Author: sweh
Date: Tue Mar 31 10:20:47 2009
New Revision: 29501

Log:
- Fix tests from changes in r29499.



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	Tue Mar 31
10:20:47 2009
(at)(at) -763,6 +763,7 (at)(at)
 Message-ID: <20090122134209.28637.30662(at)krusty.whq.gocept.com>
 <BLANKLINE>
 HelloHello=C3=A4
+{'status': 'OK'}
 
 After successfully sending a message, its draft will be deleted, but the sent
 message will be in the account's `Sent` folder:
(at)(at) -833,6 +834,7 (at)(at)
 SGVsbG8gd29ybGQgMg==
 <BLANKLINE>
 --===============1892468372==--
+{'status': 'OK'}
 
 
 Replying to messages
(at)(at) -909,6 +911,7 (at)(at)
 </pre></blockquote>
 </body>
 </html>
+{'status': 'OK'}
 
 >>> pprint.pprint(json_request(other_url + '/(at)(at)messages'))
 {'batch_size': 10,
(at)(at) -944,10 +947,21 (at)(at)
   'size': 113,
   'url': 'http://localhost/profile/drafts/<GUID>/<GUID>'}]
 >>> json_request(fwd['url']+'/(at)(at)send')
+{'status': 'ValidationError', 'message': u'Bitte Empf\xe4nger angeben.'}
+
+>>> json_request(fwd['url']+'/(at)(at)save',
+...              to='ct(at)gocept.com',
+...              cc='',
+...              bcc='',
+...              identity='ben-example.com',
+...              subject='Fwd: Mail 2',
+...              body='')
+
+>>> json_request(fwd['url']+'/(at)(at)send')
 Content-Type: multipart/mixed; boundary="===============1846946469=="
 MIME-Version: 1.0
 From: Ben Utzer <ben(at)example.com>
-To: 
+To: ct(at)gocept.com
 CC: 
 BCC: 
 Subject: Fwd: Mail 2
(at)(at) -972,6 +986,7 (at)(at)
 Everything is ok!
 <BLANKLINE>
 --===============1846946469==--
+{'status': 'OK'}
 
 
 Sending messages with an incorrect sent folder
(at)(at) -1015,7 +1030,7 (at)(at)
 Date: Tue, 27 Jan 2009 09:17:50 -0000
 Message-ID: <20090127091750.68069.31342(at)zoidberg.ws.whq.gocept.com>
 HelloHello
-
+{'status': 'OK'}
 
 >>> browser.open(draft['url']+'/(at)(at)data')
 Traceback (most recent call last):

SVN: r29502 - gocept.webmail/trunk/gocept/webmail/browser/resources
Sebastian Wehrmann <sw(at)gocept.com>
2009-03-31 11:04:55 [ FULL ]
Author: sweh
Date: Tue Mar 31 11:04:53 2009
New Revision: 29502

Log:
- Calculate the management URL correctly.



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

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	Tue Mar
31 11:04:53 2009
(at)(at) -9,7 +9,9 (at)(at)
 Def(function() {
 
     YAHOO.gocept.webmailer.open_manage_accounts = function() {
-        base_url = document.URL
+        //XXX The # should not appear in the document.URL, this is an atrifact
+        //from YUI which might be fixed in newer versions.
+        base_url = document.URL.replace(/#$/,"")
         if (base_url.match("/$")!="/") { // url doesn't end with "/"?
             base_url = base_url + "/";
         }

SVN: r29513 - gocept.imapapi/trunk/gocept/imapapi
Thomas Lotze <tl(at)gocept.com>
2009-03-31 21:11:26 [ FULL ]
Author: thomas
Date: Tue Mar 31 21:11:25 2009
New Revision: 29513

Log:
made the parser produce AttributeSpecs instead of syntax errors for stuff like
BODY[HEADER.FIELDS (FROM)]


Modified:
   gocept.imapapi/trunk/gocept/imapapi/parser.py

Modified: gocept.imapapi/trunk/gocept/imapapi/parser.py
==============================================================================
--- gocept.imapapi/trunk/gocept/imapapi/parser.py	(original)
+++ gocept.imapapi/trunk/gocept/imapapi/parser.py	Tue Mar 31 21:11:25 2009
(at)(at) -14,7 +14,7 (at)(at)
 def dict_from_sequence(sequence):
     result = {}
     for key, value in iterate_pairs(sequence):
-        assert type(key) == Atom
+        assert type(key) in (Atom, AttributeSpec)
         result[str(key)] = value
     return result
 
(at)(at) -65,11 +65,20 (at)(at)
     return status
 
 
-def fetch(line):
+def fetch(line, fetch_all=False):
     """Parse an IMAP `fetch` response.
     """
-    if not isinstance(line, basestring):
-        line = unsplit(line).next()
+    if isinstance(line, basestring):
+        lines = iter([line])
+    else:
+        lines = unsplit(line)
+    if fetch_all:
+        return [fetch_one(line) for line in lines]
+    else:
+        return fetch_one(lines.next())
+
+
+def fetch_one(line):
     msg_number, response = parse(line)
     data = dict_from_sequence(response)
     if 'UID' in data:
(at)(at) -172,7 +181,7 (at)(at)
     return data
 
 
-ATOM_CHARS = [chr(i) for i in xrange(32, 256) if chr(i) not in r'(){%*"\ ']
+ATOM_CHARS = [chr(i) for i in xrange(32, 256) if chr(i) not in r'(){%*"\ ]']
 
 
 class ParseError(Exception):
(at)(at) -335,6 +344,33 (at)(at)
         return '\\' + self.value
 
 
+class AttributeSpec(object):
+    """A message attribute specifier: UID, BODY[HEADER.FIELDS (FROM)] etc.
+    """
+
+    def __init__(self, primary, msgtext=None, header_list=None, range=None):
+        self.primary = primary
+        self.msgtext = msgtext
+        self.header_list = header_list
+        self.range = range
+
+    def __repr__(self):
+        return '<AttributeSpec %s>' % self
+
+    def __str__(self):
+        result = str(self.primary)
+        if self.msgtext is not None:
+            if self.header_list is None:
+                result += '[%s]' % self.msgtext
+            else:
+                result += '[%s (%s)]' % (
+                    self.msgtext,
+                    ' '.join(str(atom) for atom in self.header_list))
+        if self.range is not None:
+            result += self.range.value
+        return result
+
+
 def read_quoted(data):
     """Read a quoted string from an IMAP response.
 
(at)(at) -410,7 +446,7 (at)(at)
 
 
 def read_atom(data):
-    """Read an atom from an IMAP response.
+    """Read an atom or attribute specification from an IMAP response.
 
     Like atoms, this internal function of the parser does not care about NIL
     and integer literals.
(at)(at) -427,12 +463,47 (at)(at)
     >>> read_atom(_('123'))
     <IMAP atom 123>
 
+    >>> read_atom(_('BODY[]'))
+    <AttributeSpec BODY[]>
+
+    >>> read_atom(_('BODY[HEADER]'))
+    <AttributeSpec BODY[HEADER]>
+
+    >>> read_atom(_('BODY[HEADER.FIELDS (FROM)]'))
+    <AttributeSpec BODY[HEADER.FIELDS (FROM)]>
+
+    >>> read_atom(_('BODY[HEADER.FIELDS (FROM)]<0>'))
+    <AttributeSpec BODY[HEADER.FIELDS (FROM)]<0>>
+
     """
     assert data.ahead in ATOM_CHARS
     result = ''
     while data.ahead in ATOM_CHARS:
-        result += data.next()
-    return Atom(result)
+        c = data.next()
+        if c == '[':
+            break
+        else:
+            result += c
+    else:
+        return Atom(result)
+
+    if data.ahead == ']':
+        msgtext = ''
+    else:
+        msgtext = read_atom(data)
+    if data.ahead == ' ':
+        data.next()
+        header_list = read_list(data)
+    else:
+        header_list = None
+    if data.ahead != ']':
+        raise ParseError('Unexpected end of header list', data)
+    data.next()
+    if data.ahead == '<':
+        range = read_atom(data)
+    else:
+        range = None
+    return AttributeSpec(result, msgtext, header_list, range)
 
 
 def read_flag(data):

MailBoxer