|
/
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):
|
|