|
/
Zope
/
gocept svn checkins
/
Archive
/
2009
/
2009-02
/
SVN: r29187 - gocept.webmail-buildout/trunk/profiles
[
SVN: r29148 - in gocept.async: . branches tags ... ]
[
SVN: r29188 - AlphaFlow/branches/nilo-alf-plone32 ... ]
SVN: r29187 - gocept.webmail-buildout/trunk/profiles
Wolfgang Schnerring <ws(at)gocept.com> |
2009-02-13 10:10:11 |
[ FULL ]
|
Author: wosc
Date: Fri Feb 13 10:10:09 2009
New Revision: 29187
Log:
whitespace
Modified:
gocept.webmail-buildout/trunk/profiles/dev.cfg
Modified: gocept.webmail-buildout/trunk/profiles/dev.cfg
==============================================================================
--- gocept.webmail-buildout/trunk/profiles/dev.cfg (original)
+++ gocept.webmail-buildout/trunk/profiles/dev.cfg Fri Feb 13 10:10:09 2009
(at)(at) -55,7 +55,7 (at)(at)
http://www.zope.org/Products/CMF/CMF-1.5.4/CMF-1.5.4.tar.gz
http://codespeak.net/z3/five/release/Five-1.4.4.tgz
nested-packages = CMF-1.5.4.tar.gz
-version-suffix-packages =
+version-suffix-packages =
[instance]
recipe = plone.recipe.zope2instance
(at)(at) -69,7 +69,7 (at)(at)
gocept.restmail
gocept.webmail
-products = ${productdistros:location}
+products = ${productdistros:location}
[zopepy]
recipe = zc.recipe.egg
(at)(at) -117,7 +117,7 (at)(at)
prefix = ""
inbox = yes
}
-
+
mode = 664
[dovecotpasswd]
(at)(at) -131,7 +131,7 (at)(at)
[fakezope2eggs]
recipe = affinitic.recipe.fakezope2eggs
-additional-fake-eggs =
+additional-fake-eggs =
ZODB3
mechanize
ClientForm
|
SVN: r29197 - gocept.webmail/trunk/gocept/webmail/browser/resources
Sebastian Wehrmann <sw(at)gocept.com> |
2009-02-13 15:13:20 |
[ FULL ]
|
Author: sweh
Date: Fri Feb 13 15:13:17 2009
New Revision: 29197
Log:
- Regain compatability with Internet Explorer 7. (bug #4675)
Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/connection.js
gocept.webmail/trunk/gocept/webmail/browser/resources/management.js
gocept.webmail/trunk/gocept/webmail/browser/resources/message.js
gocept.webmail/trunk/gocept/webmail/browser/resources/runner.js
gocept.webmail/trunk/gocept/webmail/browser/resources/utilities.js
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js
Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/connection.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/connection.js (original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/connection.js Fri Feb
13 15:13:17 2009
(at)(at) -23,16 +23,19 (at)(at)
if (on_success) {
on_success(result);
}
- },
+ }
};
request.method = method;
request.url = url;
request.callbacks = callbacks;
request.file_upload = false;
- },
+ }
});
+});
+
+Def(function() {
YAHOO.gocept.webmailer.Connection = Class({
constructor: function() {
(at)(at) -63,10 +66,10 (at)(at)
};
for (var key in request.headers) {
YAHOO.util.Connect.initHeader(key, request.headers[key]);
- }
+ };
if (request.form) {
YAHOO.util.Connect.setForm(request.form,
request.file_upload)
- }
+ };
connection.tx_current = YAHOO.util.Connect.asyncRequest(
request.method, request.url, request.callbacks,
request.data);
(at)(at) -99,7 +102,7 (at)(at)
request.form = form;
request.file_upload = true;
this._schedule_request(request);
- },
- });
+ }
+ });
});
Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/management.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/management.js (original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/management.js Fri Feb
13 15:13:17 2009
(at)(at) -22,7 +22,7 (at)(at)
YAHOO.gocept.webmailer.open_manage_accounts = function() {
base_url = document.URL
if (base_url.match("/$")!="/") { // url doesn't end with "/"?
- base_url = base_url + "/"
+ base_url = base_url + "/";
}
document.App.lastwindow = window.open(
base_url + 'management', '',
Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/message.js
==============================================================================
--- gocept.webmail/trunk/gocept/webmail/browser/resources/message.js (original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/message.js Fri Feb 13
15:13:17 2009
(at)(at) -1,4 +1,16 (at)(at)
//
+// PATCH: Added to ensure only tasks with non-zero iterations are added
+// refer to http://yuilibrary.com/projects/yui2/ticket/2286608
+//
+YAHOO.util.Chain.prototype.add = function(c) {
+
+ if (c.iterations !== 0) {
+ this.q.push(c);
+ return this;
+ };
+};
+
+//
// List of messages
//
Def(function(){
(at)(at) -18,26 +30,24 (at)(at)
rowFormatter: function(elTr, oRecord) {
var flags = oRecord.getData('flags');
- if (!flags)
+ if (!flags) {
return true;
+ };
var seen = false;
for (i=0; i<flags.length; i++) {
if (flags[i] == '\\Seen') {
seen = true;
- }
- else if (flags[i] == '\\Recent') {
+ } else if (flags[i] == '\\Recent') {
YAHOO.util.Dom.addClass(elTr, 'recent');
- }
- else if (flags[i] == '\\Answered') {
+ } else if (flags[i] == '\\Answered') {
YAHOO.util.Dom.addClass(elTr, 'answered');
- }
- else if (flags[i] == '\\Flagged') {
+ } else if (flags[i] == '\\Flagged') {
YAHOO.util.Dom.addClass(elTr, 'flagged');
- }
- }
+ };
+ };
if (!seen) {
YAHOO.util.Dom.addClass(elTr, 'unseen');
- }
+ };
return true;
},
(at)(at) -53,8 +63,7 (at)(at)
document.App.preview_pane.reset();
config = YAHOO.gocept.webmailer['list-'+list_type](url);
-
- table = new YAHOO.widget.DataTable(
+ table = new YAHOO.widget.ScrollingDataTable(
document.App.units.message_list.body,
config.columns,
config.source,
(at)(at) -74,12 +83,13 (at)(at)
message.canDelete = config.canDelete;
message.canBeRaw = config.canBeRaw;
var classnames = event.el.className.split(" ");
- for (i=0; i<classnames.length; i++)
- if (classnames[i] == 'unseen')
+ for (i=0; i<classnames.length; i++) {
+ if (classnames[i] == 'unseen') {
YAHOO.util.Dom.removeClass(event.el, 'unseen');
+ };
+ };
return document.App.preview_pane.load(message);
});
- table.subscribe("cellMousedownEvent",table.onEventSelectRow);
table.subscribe('cellMousedownEvent', function(event) {
var element =
table.getTrEl(YAHOO.util.Event.getTarget(event));
ddRow = new YAHOO.util.DDProxy(element.id);
(at)(at) -88,12 +98,12 (at)(at)
ddRow.onDragOver = function(ev, id) {
element = YAHOO.util.Dom.getChildren(id);
YAHOO.util.Dom.addClass(element, 'DDOver');
- }
+ };
ddRow.onDragOut = function(ev, id) {
element = YAHOO.util.Dom.getChildren(id);
YAHOO.util.Dom.removeClass(element, 'DDOver');
- }
+ };
ddRow.onDragDrop = function(ev, id) {
var node = document.App.tree.id_to_node[id]
(at)(at) -102,7 +112,7 (at)(at)
if (ev.ctrlKey) {
method = '/(at)(at)copy';
reload = false;
- }
+ };
url = table.getRecord(this.id).getData().url + method;
document.Connection.post(
url, {folder_url: node.url}, function(result) {
(at)(at) -157,7 +167,8 (at)(at)
if (url) {
url = url + '/(at)(at)messages?';
}
- data_source = YAHOO.gocept.webmailer.get_data_source(url,
responseSchema);
+ data_source = YAHOO.gocept.webmailer.get_data_source(url,
+
responseSchema);
config = new Object();
config.source = data_source;
config.columns = columns;
(at)(at) -211,20 +222,24 (at)(at)
//
// Register the message-context menu items
//
- preview_pane.reply_button = document.App.menu.addMenuItem('Reply',
function() {
-
document.Connection.post(preview_pane.message.url+'/(at)(at)reply', null,
function(result) {
- var message = YAHOO.lang.JSON.parse(result.responseText);
- YAHOO.gocept.webmailer.open_composer(message['url']);
+ preview_pane.reply_button = document.App.menu.addMenuItem('Reply',
+ function() {
+
document.Connection.post(preview_pane.message.url+'/(at)(at)reply',
+ null, function(result) {
+ var message =
YAHOO.lang.JSON.parse(result.responseText);
+
YAHOO.gocept.webmailer.open_composer(message['url']);
+ });
});
- });
- preview_pane.reply_button.cfg.setProperty('disabled', true);
- preview_pane.edit_button = document.App.menu.addMenuItem('Edit',
function() {
-
YAHOO.gocept.webmailer.open_composer(preview_pane.message.url);
- });
- preview_pane.edit_button.cfg.setProperty('disabled', true);
- preview_pane.delete_button =
document.App.menu.addMenuItem('Delete', function() {
-
document.Connection.post(preview_pane.message.url+'/(at)(at)delete', null,
function(result) {
- document.App.message_list.reload()
+ preview_pane.reply_button.cfg.setProperty('disabled', true);
+ preview_pane.edit_button =
document.App.menu.addMenuItem('Edit',
+ function() {
+
YAHOO.gocept.webmailer.open_composer(preview_pane.message.url);
+ });
+ preview_pane.edit_button.cfg.setProperty('disabled', true);
+ preview_pane.delete_button =
document.App.menu.addMenuItem('Delete',
+ function() {
+
document.Connection.post(preview_pane.message.url+'/(at)(at)delete', null,
function(result) {
+ document.App.message_list.reload()
});
});
preview_pane.delete_button.cfg.setProperty('disabled', true);
Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/runner.js
==============================================================================
--- gocept.webmail/trunk/gocept/webmail/browser/resources/runner.js (original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/runner.js Fri Feb 13
15:13:17 2009
(at)(at) -12,8 +12,6 (at)(at)
//
function generic_init() {
- YAHOO.util.Event.throwErrors = true;
- // YAHOO.widget.Logger.enableBrowserConsole();
document.Connection = new YAHOO.gocept.webmailer.Connection();
document.App = new YAHOO.gocept.webmailer.App();
};
(at)(at) -58,6 +56,7 (at)(at)
require_modules.push(module_name);
};
+
loader.require(require_modules);
loader.insert();
});
Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/utilities.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/utilities.js (original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/utilities.js Fri Feb
13 15:13:17 2009
(at)(at) -46,6 +46,7 (at)(at)
scope();
};
+
Def(function() {
YAHOO.gocept.webmailer.get_data_source = function(url, schema) {
if (!url) {
(at)(at) -62,5 +63,6 (at)(at)
};
data_source.responseSchema.resultsList = 'result';
return data_source;
- }
+ };
});
+
Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js (original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js Fri
Feb 13 15:13:17 2009
(at)(at) -76,7 +76,6 (at)(at)
app.tree = new YAHOO.gocept.webmailer.Tree(
document.App.units.tree.body);
});
- },
-
+ }
});
});
Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js (original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js Fri Feb
13 15:13:17 2009
(at)(at) -24,8 +24,7 (at)(at)
//
Def(function() {
- YAHOO.gocept.webmailer.onFolderSelected = new YAHOO.util.CustomEvent(
- "onFolderSelected");
+ YAHOO.gocept.webmailer.onFolderSelected = new
YAHOO.util.CustomEvent("onFolderSelected");
var responseSchema = {
resultsList: "",
(at)(at) -38,7 +37,7 (at)(at)
YAHOO.gocept.webmailer.Tree = Class({
constructor: function(treebody) {
var tree = this;
- tree.id_to_node = new Array();
+ tree.id_to_node = [];
tree.treeview = new YAHOO.widget.TreeView(treebody);
tree.treeview.setDynamicLoad(function(node)
{tree.loadNodeData(node);});
var root = tree.treeview.getRoot();
(at)(at) -78,7 +77,7 (at)(at)
}
this.fillFolders(node, subfolders);
node.loadComplete();
- this.setDragDropTargets()
+ this.setDragDropTargets();
// We actually would like to automate this, but don't know
// how right now:
},
(at)(at) -89,7 +88,7 (at)(at)
},
scope: this,
argument: encodeURI(node.label)
- }
+ };
if (node == this.treeview.getRoot()) {
// The root node loads the list of accounts, not folders.
var url = "(at)(at)children";
(at)(at) -97,8 +96,7 (at)(at)
var url = node.url + "(at)(at)folders";
};
- YAHOO.gocept.webmailer.get_data_source(url, responseSchema).
- sendRequest('', callback);
+ YAHOO.gocept.webmailer.get_data_source(url,
responseSchema).sendRequest('', callback);
},
fillFolders: function(node, children) {
(at)(at) -115,17 +113,12 (at)(at)
},
setDragDropTargets: function() {
- var q = "//td[contains((at)class, 'ygtvcontent')]";
- iterator = document.evaluate(q, document, null,
- XPathResult.UNORDERED_NODE_ITERATOR_TYPE,
- null);
- var thisNode = iterator.iterateNext();
- while (thisNode) {
- if (this.id_to_node[thisNode.id].list_type == 'inbox') {
- new YAHOO.util.DDTarget(thisNode);
- }
- thisNode = iterator.iterateNext();
- }
+ for (var key in this.id_to_node) {
+ var thisNode = this.id_to_node[key];
+ if (thisNode.list_type == 'inbox') {
+ new YAHOO.util.DDTarget(key);
+ };
+ };
}
});
});
|
SVN: r29205 - gocept.webmail/trunk/gocept/webmail/browser/resources
Sebastian Wehrmann <sw(at)gocept.com> |
2009-02-16 11:52:56 |
[ FULL ]
|
Author: sweh
Date: Mon Feb 16 11:52:55 2009
New Revision: 29205
Log:
- Enable tree toggle for accounts.
Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js
Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js (original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js Mon Feb
16 11:52:55 2009
(at)(at) -53,9 +53,12 (at)(at)
// Load dynamic tree entries
root.foldersUrl = '';
tree.loadNodeData(root);
- tree.treeview.subscribe('clickEvent', function(node) {
+ tree.treeview.subscribe('clickEvent', function(event) {
// do not expand the node
- return false;
+ if (event.node.list_type == "inbox") {
+ return false;
+ }
+ return true;
});
tree.treeview.subscribe('labelClick', function(node) {
tree.selected_node = node;
|
SVN: r29206 - gocept.webmail/trunk/gocept/webmail/browser/resources/styles
Thomas Lotze <tl(at)gocept.com> |
2009-02-16 14:25:32 |
[ FULL ]
|
Author: thomas
Date: Mon Feb 16 14:25:31 2009
New Revision: 29206
Log:
don't break YUI's width calculation, sort of fixes horizontal scrolling issue
Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/styles/webmail.css
Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/styles/webmail.css
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/styles/webmail.css (original)
+++
gocept.webmail/trunk/gocept/webmail/browser/resources/styles/webmail.css Mon
Feb 16 14:25:31 2009
(at)(at) -18,11 +18,6 (at)(at)
cursor: pointer;
}
-.yui-skin-sam .yui-dt-hd table,
-.yui-skin-sam .yui-dt-bd table {
- width: 100%;
-}
-
html.webmailer .yui-layout-bd dl dt,
html.webmailer .yui-layout-bd dl dd {
display: block;
|
SVN: r29207 - in gocept.lms/trunk: . profiles
Christian Theune <ct(at)gocept.com> |
2009-02-16 15:05:46 |
[ FULL ]
|
Author: ctheune
Date: Mon Feb 16 15:05:45 2009
New Revision: 29207
Log:
move to released version of gocept.reference. fix all versions.
Modified:
gocept.lms/trunk/ (props changed)
gocept.lms/trunk/profiles/base.cfg
gocept.lms/trunk/profiles/versions.cfg
Modified: gocept.lms/trunk/profiles/base.cfg
==============================================================================
--- gocept.lms/trunk/profiles/base.cfg (original)
+++ gocept.lms/trunk/profiles/base.cfg Mon Feb 16 15:05:45 2009
(at)(at) -1,5 +1,5 (at)(at)
[buildout]
-develop = . gocept.reference/
+develop = .
parts = eggbasket app data zodb zeo lms test
runners scheduler checker notifier syncer
ctl
(at)(at) -7,7 +7,7 (at)(at)
# eggs will be installed in the default buildout location
# (see .buildout/default.cfg in your home directory)
# unless you specify an eggs-directory option here.
-
+allow-picked-versions = false
versions = versions
[app]
Modified: gocept.lms/trunk/profiles/versions.cfg
==============================================================================
--- gocept.lms/trunk/profiles/versions.cfg (original)
+++ gocept.lms/trunk/profiles/versions.cfg Mon Feb 16 15:05:45 2009
(at)(at) -110,7 +110,22 (at)(at)
zope.thread = 3.4
zope.traversing = 3.4.0
zope.viewlet = 3.4.2
-
+setuptools = 0.6c9
+zc.zdaemonrecipe = 0.2
+gocept.ctl = 0.9.1
+zope.sendmail = 3.5.1
+zc.sourcefactory = 0.4.0
+zc.relation = 1.0
+zc.queue = 1.1
+z3c.schema = 0.6.0
+hurry.query = 0.9.2
+decorator = 3.0.1
+zope.browser = 0.5.0
+zope.site = 3.6.0
+zope.container = 3.7.1
+transaction = 1.0a1
+zope.broken = 3.5.0
+gocept.reference = 0.5.2
# Here we pin the recipes used in the buildout.cfg
lovely.recipe = 0.3.1b5
|
SVN: r29217 - gocept.webmail/trunk/gocept/webmail/browser/resources/styles
Christian Theune <ct(at)gocept.com> |
2009-02-17 13:42:45 |
[ FULL ]
|
Author: ctheune
Date: Tue Feb 17 13:42:44 2009
New Revision: 29217
Log:
Clean up formatting of header block (float clearing and padding).
Reset font color.
Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/styles/webmail.css
Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/styles/webmail.css
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/styles/webmail.css (original)
+++
gocept.webmail/trunk/gocept/webmail/browser/resources/styles/webmail.css Tue
Feb 17 13:42:44 2009
(at)(at) -1,8 +1,7 (at)(at)
body {
- background-color: #ffffff;
- font-family: Verdana, "Bitstream Vera Sans", sans-serif;
- font-size: 11px;
- color: #265b72;
+ background-color: #ffffff;
+ font-family: Verdana, "Bitstream Vera Sans", sans-serif;
+ font-size: 11px;
}
#customization {
(at)(at) -10,41 +9,34 (at)(at)
}
html.webmailer {
- position:absolute;
- width:100%;
+ position: absolute;
+ width: 100%;
}
#maillisting li {
- cursor: pointer;
-}
-
-html.webmailer .yui-layout-bd dl dt,
-html.webmailer .yui-layout-bd dl dd {
- display: block;
- color: black;
+ cursor: pointer;
}
html.webmailer .yui-layout-bd dl dt {
- width:7em;
- padding-right:0.5em;
- font-weight:bold;
- text-align:right;
- float:left;
- clear:both;
+ width: 7em;
+ padding-right: 0.5em;
+ font-weight: bold;
+ text-align: right;
+ float: left;
+ clear: left;
}
html.webmailer .yui-layout-bd dl dd {
+ float:left;
}
html.webmailer .yui-layout-bd dl {
padding:1em;
- height:12ex;
}
html.webmailer .yui-layout-bd div.messagepart {
clear:both;
background-color: white;
- color: black;
margin:1em;
padding:1em;
border:1px solid #BBB;
(at)(at) -104,4 +96,10 (at)(at)
.yui-layout-content {
display: none;
-}
\ No newline at end of file
+}
+
+/* Helpers */
+
+.novisclear {
+ clear: both;
+}
|
SVN: r29219 - gocept.webmail/trunk/gocept/webmail/browser/resources
Christian Theune <ct(at)gocept.com> |
2009-02-17 15:27:33 |
[ FULL ]
|
Author: ctheune
Date: Tue Feb 17 15:27:31 2009
New Revision: 29219
Log:
- Instead of holding references to layout units on the application, hold
references to the DOM nodes.
- Make the mail list batched and paginated (client side sorting and
batching).
Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/composer-main.js
gocept.webmail/trunk/gocept/webmail/browser/resources/management-main.js
gocept.webmail/trunk/gocept/webmail/browser/resources/message.js
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js
Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/composer-main.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/composer-main.js (original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/composer-main.js Tue
Feb 17 15:27:31 2009
(at)(at) -3,17 +3,18 (at)(at)
//
Def(function() {
-
YAHOO.gocept.webmailer.App = Class({
constructor: function() {
var app = this;
// Bind early.
document.App = app;
- app.units = new Object();
- //
+ // Hold DOM nodes with well-known names for specific
+ // purposes within the app. E.g. the element containing the
+ // message list.
+ app.domNodes = new Object();
+
// Setup the static screen layouts
- //
app.layout = new YAHOO.widget.Layout({
units: [
{ position: 'top', height: 23,
(at)(at) -24,19 +25,18 (at)(at)
scroll: true,
body: 'composer-bottom'}]});
app.layout.on('render', function() {
- app.units.attachments = app.layout.getUnitByPosition(
+ app.domNodes.attachments = app.layout.getUnitByPosition(
'bottom').body;
- app.units.composer = app.layout.getUnitByPosition(
+ app.domNodes.composer = app.layout.getUnitByPosition(
'center').body;
app.composer = new YAHOO.gocept.webmailer.Composer(
draft_url, profile_url);
- app.units.menu = app.layout.getUnitByPosition('top');
+ app.domNodes.menu = app.layout.getUnitByPosition('top').body;
app.menu = new YAHOO.gocept.webmailer.ComposerMenu();
});
app.layout.render();
}
});
-
});
Def(function() {
(at)(at) -45,7 +45,7 (at)(at)
constructor: function() {
var menu = this;
menu.menubar = new YAHOO.widget.MenuBar("composer-main-menu");
- menu.menubar.render(document.App.units.menu.body);
+ menu.menubar.render(document.App.domNodes.menu);
menu.addMenuItem('Save', function () {
document.App.composer.save_draft();
});
(at)(at) -60,7 +60,7 (at)(at)
text: label,
onclick: { fn: callback }
});
- this.menubar.render(document.App.units.menu.body);
+ this.menubar.render(document.App.domNodes.menu);
return new_item;
}
Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/management-main.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/management-main.js (original)
+++
gocept.webmail/trunk/gocept/webmail/browser/resources/management-main.js Tue
Feb 17 15:27:31 2009
(at)(at) -9,11 +9,9 (at)(at)
var app = this;
// Bind early.
document.App = app;
- app.units = new Object();
+ app.domNodes = new Object();
- //
// Setup the static screen layouts
- //
app.layout = new YAHOO.widget.Layout({
units: [
{ position: 'top',
(at)(at) -23,12 +21,11 (at)(at)
{ position: 'bottom',
height: 250, resize: true, body: ''}]});
app.layout.on('render', function() {
- app.units = new Object();
- app.units.menu = app.layout.getUnitByPosition('top');
- app.units.identity_list =
app.layout.getUnitByPosition('center').body;
- app.units.identity_edit_form =
app.layout.getUnitByPosition('bottom').body;
+ app.domNodes.menu = app.layout.getUnitByPosition('top').body;
app.menu = new YAHOO.gocept.webmailer.ManagementMenu();
+ app.domNodes.identity_list =
app.layout.getUnitByPosition('center').body;
app.identity_list = new YAHOO.gocept.webmailer.IdentityList();
+ app.domNodes.identity_edit_form =
app.layout.getUnitByPosition('bottom').body;
});
app.layout.render();
},
(at)(at) -55,7 +52,7 (at)(at)
},
reset: function() {
- document.App.units.identity_edit_form.innerHTML = "";
+ document.App.domNodes.identity_edit_form.innerHTML = "";
document.App.menu.delete_button.cfg.setProperty('disabled', true);
document.App.selected_identity = null;
}
(at)(at) -69,7 +66,7 (at)(at)
constructor: function() {
var menu = this;
menu.menubar = new YAHOO.widget.MenuBar("management-main-menu");
- menu.menubar.render(document.App.units.menu.body);
+ menu.menubar.render(document.App.domNodes.menu);
menu.addMenuItem('New', document.App.loadIdentityEditForm);
menu.delete_button = menu.addMenuItem('Delete', function() {
var url = document.App.selected_identity.url +
'/(at)(at)delete';
(at)(at) -90,7 +87,7 (at)(at)
text: label,
onclick: { fn: callback }
});
- this.menubar.render(document.App.units.menu.body);
+ this.menubar.render(document.App.domNodes.menu);
return new_item;
}
(at)(at) -141,11 +138,11 (at)(at)
data_source.responseSchema = responseSchema;
// Workaround for YUI bug # 214964
data_source.doBeforeParseData = function (oRequest, oFullResponse,
oCallback) {
- return {result:oFullResponse};
+ return {result:oFullResponse};
};
data_source.responseSchema.resultsList = 'result';
table = new YAHOO.widget.DataTable(
- document.App.units.identity_list,
+ document.App.domNodes.identity_list,
columns,
data_source,
{scrollable: true, height:"200px"});
(at)(at) -188,7 +185,7 (at)(at)
YAHOO.gocept.webmailer.IdentityEditForm = Class({
constructor: function() {
var editform = this;
- document.App.units.identity_edit_form.innerHTML = editform_html;
+ document.App.domNodes.identity_edit_form.innerHTML =
editform_html;
YAHOO.util.Event.addListener(
editform.getControl('identitySave'), 'click',
editform.save_identity, editform, true);
},
Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/message.js
==============================================================================
--- gocept.webmail/trunk/gocept/webmail/browser/resources/message.js (original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/message.js Tue Feb 17
15:27:31 2009
(at)(at) -18,11 +18,12 (at)(at)
YAHOO.gocept.webmailer.MessageList = Class({
constructor: function() {
var message_list = this;
- message_list.load({foldersUrl: '', list_type: 'inbox'});
- document.App.units.message_list.on('resize', function(event) {
- message_list.adjust_size();
- });
+ var paginator_node = document.createElement('div');
+ document.App.domNodes.message_list_paginator = paginator_node;
+
document.App.domNodes.message_list.parentNode.insertBefore(paginator_node,
document.App.domNodes.message_list);
+
+ message_list.load({foldersUrl: '', list_type: 'inbox'});
YAHOO.gocept.webmailer.onFolderSelected.subscribe(
function(type, arg){ message_list.load(arg[0]); });
(at)(at) -63,12 +64,15 (at)(at)
document.App.preview_pane.reset();
config = YAHOO.gocept.webmailer['list-'+list_type](url);
- table = new YAHOO.widget.ScrollingDataTable(
- document.App.units.message_list.body,
+
+ table = new YAHOO.widget.DataTable(
+ document.App.domNodes.message_list,
config.columns,
config.source,
- {scrollable: true, renderLoopSize: 10, height:"200px",
- formatRow: this.rowFormatter});
+ {formatRow: this.rowFormatter,
+ paginator: new YAHOO.widget.Paginator({
+ containers: document.App.domNodes.message_list_paginator,
+ rowsPerPage: 10})});
message_list.table = table;
table.set("selectionMode", "standard");
table.subscribe("rowClickEvent", table.onEventSelectRow);
(at)(at) -126,7 +130,6 (at)(at)
};
});
- message_list.adjust_size();
},
reload: function() {
(at)(at) -135,16 +138,7 (at)(at)
message_list.load(node);
return true;
},
-
- adjust_size: function(){
- // XXX magic number
- target =
(document.App.units.message_list.getSizes().body.h-30)+'px';
- table.set('height', target);
- target = (document.App.units.message_list.getSizes().body.w)+'px';
- table.set('width', target);
- }
});
-
});
//
(at)(at) -256,7 +250,7 (at)(at)
// Load the message content and display it
document.Connection.get(message.url+'/(at)(at)render',
function(result) {
var message_parts =
YAHOO.lang.JSON.parse(result.responseText);
- document.App.units.preview_pane.body.innerHTML = (
+ document.App.domNodes.preview_pane.innerHTML = (
message_parts['header'] +
message_parts['body'] +
message_parts['footer']);
(at)(at) -286,7 +280,7 (at)(at)
preview_pane.loading();
document.Connection.get(message.url+'/(at)(at)raw',
function(result) {
var result = YAHOO.lang.JSON.parse(result.responseText);
- document.App.units.preview_pane.body.innerHTML =
result['raw'];
+ document.App.domNodes.preview_pane.innerHTML = result['raw'];
preview_pane.raw_button.cfg.setProperty('text', 'View
normal');
preview_pane.raw_button.cfg.setProperty('disabled', false);
document.App.preview_pane.raw_button.cfg.setProperty(
(at)(at) -297,13 +291,12 (at)(at)
loading: function() {
var preview_pane = this;
- document.App.units.preview_pane.body.innerHTML = '<img
src="++resource++gocept.webmail/images/loading.gif" style="position: relative;
left: 48%; top: 40%;" />';
+ document.App.domNodes.preview_pane.innerHTML = '<img
src="++resource++gocept.webmail/images/loading.gif" style="position: relative;
left: 48%; top: 40%;" />';
},
reset: function() {
var preview_pane = this;
preview_pane.message = null;
- document.App.units.preview_pane.body.innerHTML = '<div
align="center">Um eine Vorschau in diesem Fenster zu erhalten, klicken Sie
auf die entsprechende Mail in der obigen Liste.</div>';
// Deactivate message-context menu items.
preview_pane.reply_button.cfg.setProperty('disabled', true);
Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js (original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js Tue
Feb 17 15:27:31 2009
(at)(at) -7,9 +7,9 (at)(at)
constructor: function() {
var app = this;
document.App = app;
- //
+ app.domNodes = new Object();
+
// Setup the static screen layouts
- //
app.outer_layout = new YAHOO.widget.Layout(
{units: [
{position: 'top',
(at)(at) -23,34 +23,26 (at)(at)
app.outer_layout.getUnitByPosition('center').body,
{units: [
{ position: 'top',
- height: 45, body: ''},
+ height: 30, body: ''},
{ position: 'left',
width: 200, resize: true, body: '',
scroll: true},
- { position: 'center',
+ { position: 'center', scroll: true,
body: ''}]});
app.layout.on('render', function() {
- app.center_layout = new YAHOO.widget.Layout(
- app.layout.getUnitByPosition('center').body,
- {units: [
- {position: 'top',
- height: 200,
- resize: true, body: ''},
- {position: 'center', scroll: true,
- body: 'message preview pane'}]});
-
- app.center_layout.on('render', function() {
- // Bind the slots to readable names
- app.units = new Object();
- app.units.menu = app.layout.getUnitByPosition('top');
- app.units.tree = app.layout.getUnitByPosition('left');
- app.units.preview_pane =
app.center_layout.getUnitByPosition('center');
- app.units.message_list =
app.center_layout.getUnitByPosition('top');
-
- app.setupStaticComponents();
- });
- app.center_layout.render();
+ // Bind the slots to readable names
+ app.domNodes.menu =
app.layout.getUnitByPosition('top').body;
+ app.domNodes.tree =
app.layout.getUnitByPosition('left').body;
+
+ app.domNodes.preview_pane = document.createElement('div');
+ app.domNodes.message_list = document.createElement('div');
+
+ var center = app.layout.getUnitByPosition('center').body;
+ center.appendChild(app.domNodes.message_list);
+ center.appendChild(app.domNodes.preview_pane);
+
+ app.setupStaticComponents();
});
app.layout.render();
});
(at)(at) -59,13 +51,11 (at)(at)
reload_tree: function() {
document.App.tree = new YAHOO.gocept.webmailer.Tree(
- document.App.units.tree.body);
+ document.App.domNodes.tree);
},
setupStaticComponents: function() {
- //
// Fill the screen layout units with their components
- //
var app = this;
app.menu = new YAHOO.gocept.webmailer.Menu();
(at)(at) -74,7 +64,7 (at)(at)
app.preview_pane = new YAHOO.gocept.webmailer.PreviewPane();
app.message_list = new YAHOO.gocept.webmailer.MessageList();
app.tree = new YAHOO.gocept.webmailer.Tree(
- document.App.units.tree.body);
+ document.App.domNodes.tree);
});
}
});
Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js (original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js Tue Feb
17 15:27:31 2009
(at)(at) -4,7 +4,7 (at)(at)
constructor: function() {
var menu = this;
menu.menubar = new YAHOO.widget.MenuBar("webmailer-main-menu");
- menu.menubar.render(document.App.units.menu.body);
+ menu.menubar.render(document.App.domNodes.menu);
menu.menubar.show();
},
(at)(at) -13,7 +13,7 (at)(at)
text: label,
onclick: { fn: callback }
});
- this.menubar.render(document.App.units.menu.body);
+ this.menubar.render(document.App.domNodes.menu);
return new_item;
}
});
|
SVN: r29220 - gocept.webmail/trunk/gocept/webmail/browser/resources
Wolfgang Schnerring <ws(at)gocept.com> |
2009-02-17 16:44:46 |
[ FULL ]
|
Author: wosc
Date: Tue Feb 17 16:44:45 2009
New Revision: 29220
Log:
Close #4682: removed akward passing around of 'this' to
YAHOO.gocept.webmailer.Composer.list_attachments().
I don't really understand what caused us to put this in in the first place, but
I distinctly remember that it did not work otherwise -- but it works just fine
without it now.
Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/composer.js
Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/composer.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/composer.js (original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/composer.js Tue Feb
17 16:44:45 2009
(at)(at) -253,19 +253,16 (at)(at)
composer.getControl('AttachmentsUploading').style.display =
'inline';
document.Connection.upload(
composer.draft_url+'/(at)(at)add_attachment',
'composeAttachments',
- // XXX: need to understand JS scoping/this rules
function () {
composer.getControl('AttachmentsUploading').style.display
= 'none';
- composer.list_attachments(composer);
+ composer.list_attachments();
composer.getControl('AttachmentsFile').value = '';
}
);
},
list_attachments: function(composer) {
- if (composer == null) {
- composer = this;
- }
+ var composer = this;
document.Connection.get(composer.draft_url+'/(at)(at)attachments',
function (result) {
(at)(at) -303,8 +300,7 (at)(at)
var composer = this;
document.Connection.post(
attachment['url']+'/(at)(at)delete', null,
- // XXX: need to understand JS scoping/this rules
- function () { composer.list_attachments(composer); }
+ function () { composer.list_attachments(); }
);
},
|
SVN: r29221 - gocept.restmail/trunk/gocept/restmail/browser
Sebastian Wehrmann <sw(at)gocept.com> |
2009-02-18 09:15:19 |
[ FULL ]
|
Author: sweh
Date: Wed Feb 18 09:15:18 2009
New Revision: 29221
Log:
- Fix tests.
Modified:
gocept.restmail/trunk/gocept/restmail/browser/inline.txt
Modified: gocept.restmail/trunk/gocept/restmail/browser/inline.txt
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/inline.txt (original)
+++ gocept.restmail/trunk/gocept/restmail/browser/inline.txt Wed Feb 18
09:15:18 2009
(at)(at) -44,6 +44,7 (at)(at)
<dt>Date:</dt>
<dd>Thu, 25 Sep 2008 13:50:58 +0200</dd>
</dl>
+ <div class="novisclear"></div>
</div>
>>> print r['body']
(at)(at) -82,6 +83,7 (at)(at)
<dt>Date:</dt>
<dd>Fri, 21 Nov 2008 10:42:12 +0100</dd>
</dl>
+ <div class="novisclear"></div>
</div>
>>> print r['body']
(at)(at) -121,6 +123,7 (at)(at)
<dt>Date:</dt>
<dd>Fri, 21 Nov 2008 10:43:38 +0100</dd>
</dl>
+ <div class="novisclear"></div>
</div>
>>> print r['body'].encode('utf-8')
(at)(at) -174,6 +177,7 (at)(at)
<dt>Date:</dt>
<dd>Fri, 21 Nov 2008 10:44:57 +0100</dd>
</dl>
+ <div class="novisclear"></div>
</div>
>>> print r['body']
(at)(at) -254,6 +258,7 (at)(at)
<dt>Date:</dt>
<dd>Fri, 21 Nov 2008 12:10:38 +0100</dd>
</dl>
+ <div class="novisclear"></div>
</div>
>>> print r['body']
|
SVN: r29222 - gocept.restmail/trunk/gocept/restmail/browser
Christian Theune <ct(at)gocept.com> |
2009-02-18 09:50:41 |
[ FULL ]
|
Author: ctheune
Date: Wed Feb 18 09:50:39 2009
New Revision: 29222
Log:
Provide batching and sorting on the message list view.
Modified:
gocept.restmail/trunk/gocept/restmail/browser/message.py
Modified: gocept.restmail/trunk/gocept/restmail/browser/message.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/message.py (original)
+++ gocept.restmail/trunk/gocept/restmail/browser/message.py Wed Feb 18
09:50:39 2009
(at)(at) -23,13 +23,34 (at)(at)
(at)gocept.restmail.browser.json.view
def list_messages(self):
"""Message listing."""
- data = [{
- 'url': zope.app.zapi.absoluteURL(message, self.request),
- 'from': message.headers.get('From'),
- 'subject': message.headers.get('Subject'),
- 'date': message.isodate,
- 'flags': list(message.flags)
- } for message in self.context.messages()]
+ # XXX How to let the Zope publisher map the arguments?
+ batch_size = int(self.request.get('batch_size', 10))
+ batch_start = int(self.request.get('batch_start', 0))
+ sort_dir = self.request.get('sort_dir', 'desc')
+ sort_key = self.request.get('sort_key', 'date')
+
+ all_messages = [{
+ 'url': zope.app.zapi.absoluteURL(message, self.request),
+ 'from': message.headers.get('From'),
+ 'subject': message.headers.get('Subject'),
+ 'date': message.isodate,
+ '_m': message
+ } for message in self.context.messages()]
+ all_messages.sort(key=lambda x:x[sort_key],
reverse=(sort_dir=='desc'))
+
+ current_messages = all_messages[batch_start:batch_start+batch_size]
+ for m in current_messages:
+ m['flags'] = list(m['_m'].flags)
+ del m['_m']
+
+ data = {
+ 'messages': current_messages,
+ 'total': len(all_messages),
+ 'returned': len(current_messages),
+ 'batch_start': batch_start,
+ 'batch_size': batch_size,
+ 'sort_dir': sort_dir,
+ 'sort_key': sort_key}
return data
|
SVN: r29223 - gocept.webmail/trunk/gocept/webmail/browser/resources
Christian Theune <ct(at)gocept.com> |
2009-02-18 09:51:24 |
[ FULL ]
|
Author: ctheune
Date: Wed Feb 18 09:51:23 2009
New Revision: 29223
Log:
switch to server-based pagination and sorting of the message list
Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/message.js
gocept.webmail/trunk/gocept/webmail/browser/resources/utilities.js
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js
Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/message.js
==============================================================================
--- gocept.webmail/trunk/gocept/webmail/browser/resources/message.js (original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/message.js Wed Feb 18
09:51:23 2009
(at)(at) -70,9 +70,23 (at)(at)
config.columns,
config.source,
{formatRow: this.rowFormatter,
+ initialRequest: 'batch_start=0&batch_size=10',
+ sortedBy: {key: 'date', dir:
YAHOO.widget.DataTable.CLASS_DESC},
+ generateRequest: function(oState, oSelf) {
+ if (oState.sortedBy.dir ==
YAHOO.widget.DataTable.CLASS_DESC) {
+ sort_dir = 'desc';
+ } else {
+ sort_dir = 'asc';
+ };
+ return 'batch_start=' + oState.pagination.recordOffset +
+ '&batch_size=' + oState.pagination.rowsPerPage
+
+ '&sort_key=' + oState.sortedBy.key +
+ '&sort_dir=' + sort_dir},
+ dynamicData: true,
paginator: new YAHOO.widget.Paginator({
containers: document.App.domNodes.message_list_paginator,
rowsPerPage: 10})});
+
message_list.table = table;
table.set("selectionMode", "standard");
table.subscribe("rowClickEvent", table.onEventSelectRow);
(at)(at) -94,6 +108,10 (at)(at)
};
return document.App.preview_pane.load(message);
});
+ table.handleDataReturnPayload = function(oRequest, oResponse,
oPayload) {
+ oPayload.totalRecords = oResponse.meta.totalRecords;
+ return oPayload;
+ };
table.subscribe('cellMousedownEvent', function(event) {
var element =
table.getTrEl(YAHOO.util.Event.getTarget(event));
ddRow = new YAHOO.util.DDProxy(element.id);
(at)(at) -150,7 +168,13 (at)(at)
{key:"subject", label:"Betreff", sortable:true},
{key:"date", label:"Datum", sortable:true}];
- var responseSchema = {resultsList: "",
+ var responseSchema = {resultsList: "result.messages",
+ metaFields: {totalRecords: "result.total",
+ pageSize: "result.batch_size",
+ startIndex: "result.batch_start",
+ recordsReturned: "result.returned",
+ sort: "result.sort_key",
+ dir: "result.sort_dir"},
fields: [{key: "url"},
{key: "flags"},
{key: "from"},
(at)(at) -183,12 +207,12 (at)(at)
{key:"subject", label:"Betreff", sortable:true},
{key:"date", label:"Datum", sortable:true}];
- var responseSchema = {resultsList: "",
+ var responseSchema = {resultsList: "messages",
fields: [{key: "url"},
{key: "flags"},
{key: "to"},
{key: "subject"},
- {key: "date"}]};
+ {key: "date", parser:"date"}]};
YAHOO.gocept.webmailer['list-drafts'] = function(url) {
data_source = YAHOO.gocept.webmailer.get_data_source(
Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/utilities.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/utilities.js (original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/utilities.js Wed Feb
18 09:51:23 2009
(at)(at) -61,7 +61,6 (at)(at)
data_source.doBeforeParseData = function (oRequest, oFullResponse,
oCallback) {
return {result:oFullResponse};
};
- data_source.responseSchema.resultsList = 'result';
return data_source;
};
});
Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js (original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer.js Wed Feb
18 09:51:23 2009
(at)(at) -27,7 +27,7 (at)(at)
YAHOO.gocept.webmailer.onFolderSelected = new
YAHOO.util.CustomEvent("onFolderSelected");
var responseSchema = {
- resultsList: "",
+ resultsList: "result",
fields: [{key: "url"},
{key: "name"},
{key: "children"},
|
SVN: r29226 - gocept.restmail/trunk/gocept/restmail/www
Sebastian Wehrmann <sw(at)gocept.com> |
2009-02-18 14:54:50 |
[ FULL ]
|
Author: sweh
Date: Wed Feb 18 14:54:48 2009
New Revision: 29226
Log:
update template for adding identities in ZMI
Modified:
gocept.restmail/trunk/gocept/restmail/www/add_identity.pt
Modified: gocept.restmail/trunk/gocept/restmail/www/add_identity.pt
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/www/add_identity.pt (original)
+++ gocept.restmail/trunk/gocept/restmail/www/add_identity.pt Wed Feb 18
14:54:48 2009
(at)(at) -38,6 +38,16 (at)(at)
<tr>
<td align="left" valign="top">
<div class="form-label">
+ <label for="address">Address</label>
+ </div>
+ </td>
+ <td align="left" valign="top">
+ <input type="text" id="address" name="address" size="100" />
+ </td>
+ </tr>
+ <tr>
+ <td align="left" valign="top">
+ <div class="form-label">
<label for="sent_folder">Sent folder</label>
</div>
</td>
|
SVN: r29228 - gocept.webmail/trunk/gocept/webmail/browser/resources
Sebastian Wehrmann <sw(at)gocept.com> |
2009-02-18 14:57:25 |
[ FULL ]
|
Author: sweh
Date: Wed Feb 18 14:57:23 2009
New Revision: 29228
Log:
- Add preference object with configuration for sort key and sort order.
Added:
gocept.webmail/trunk/gocept/webmail/browser/resources/preferences.js
Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/message.js
gocept.webmail/trunk/gocept/webmail/browser/resources/runner.js
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js
Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/message.js
==============================================================================
--- gocept.webmail/trunk/gocept/webmail/browser/resources/message.js (original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/message.js Wed Feb 18
14:57:23 2009
(at)(at) -65,19 +65,20 (at)(at)
config = YAHOO.gocept.webmailer['list-'+list_type](url);
+ init_sort = document.App.preferences.data['sort'];
+ if (!init_sort) {
+ init_sort = ['date', 'desc']
+ }
+
table = new YAHOO.widget.DataTable(
document.App.domNodes.message_list,
config.columns,
config.source,
{formatRow: this.rowFormatter,
- initialRequest: 'batch_start=0&batch_size=10',
- sortedBy: {key: 'date', dir:
YAHOO.widget.DataTable.CLASS_DESC},
+ initialRequest:
'batch_start=0&batch_size=10&sort_key=' + init_sort[0] +
'&sort_dir=' + init_sort[1],
+ sortedBy: {key: init_sort[0], dir: init_sort[1]},
generateRequest: function(oState, oSelf) {
- if (oState.sortedBy.dir ==
YAHOO.widget.DataTable.CLASS_DESC) {
- sort_dir = 'desc';
- } else {
- sort_dir = 'asc';
- };
+ sort_dir =
message_list.sortDirClassToString(oState.sortedBy.dir);
return 'batch_start=' + oState.pagination.recordOffset +
'&batch_size=' + oState.pagination.rowsPerPage
+
'&sort_key=' + oState.sortedBy.key +
(at)(at) -90,6 +91,11 (at)(at)
message_list.table = table;
table.set("selectionMode", "standard");
table.subscribe("rowClickEvent", table.onEventSelectRow);
+ table.subscribe("columnSortEvent", function(event) {
+ sort_dir = message_list.sortDirClassToString(event.dir);
+ document.App.preferences.set("sort", [event.column.key,
+ sort_dir]);
+ });
table.subscribe("rowSelectEvent", function(event) {
// XXX Reading the capabilities from the style of the list
// is relatively wrong.
(at)(at) -156,6 +162,15 (at)(at)
message_list.load(node);
return true;
},
+
+ sortDirClassToString: function(sort_class) {
+ sort_dir = 'asc';
+ if (sort_class == YAHOO.widget.DataTable.CLASS_DESC) {
+ sort_dir = 'desc';
+ }
+ return sort_dir
+ }
+
});
});
Added: gocept.webmail/trunk/gocept/webmail/browser/resources/preferences.js
==============================================================================
--- (empty file)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/preferences.js Wed
Feb 18 14:57:23 2009
(at)(at) -0,0 +1,38 (at)(at)
+//
+// Preferences Object
+//
+Def(function(){
+
+ YAHOO.gocept.webmailer.Preferences = Class({
+ constructor: function() {
+ var preferences = this;
+ preferences.onLoadFinished = new YAHOO.util.CustomEvent(
+ "onLoadFinised", preferences);
+ preferences.data = new Object();
+ preferences.update();
+ },
+
+ update: function() {
+ var preferences = this;
+ document.Connection.get('(at)(at)preferences', function(result) {
+ var result = YAHOO.lang.JSON.parse(result.responseText);
+ if (result) {
+ preferences.data = result;
+ }
+ preferences.onLoadFinished.fire();
+ });
+ },
+
+ set: function(key, value) {
+ var preferences = this;
+ preferences.data[key] = value;
+ preferences.save();
+ },
+
+ save: function() {
+ var preferences = this;
+ document.Connection.post(
+ '(at)(at)update-preferences', {config: preferences.data});
+ }
+ });
+});
Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/runner.js
==============================================================================
--- gocept.webmail/trunk/gocept/webmail/browser/resources/runner.js (original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/runner.js Wed Feb 18
14:57:23 2009
(at)(at) -42,7 +42,8 (at)(at)
'uploader');
var app_modules = new Array('connection', 'composer', 'message',
- 'draft', 'webmailer', 'management');
+ 'draft', 'webmailer', 'management',
+ 'preferences');
for (i=0;i<app_modules.length;i++) {
base_name = app_modules[i];
Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js (original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js Wed
Feb 18 14:57:23 2009
(at)(at) -57,14 +57,17 (at)(at)
setupStaticComponents: function() {
// Fill the screen layout units with their components
var app = this;
+ app.preferences = new YAHOO.gocept.webmailer.Preferences()
- app.menu = new YAHOO.gocept.webmailer.Menu();
+ app.preferences.onLoadFinished.subscribe(function () {
+ app.menu = new YAHOO.gocept.webmailer.Menu();
- YAHOO.util.Event.onContentReady("webmailer-main-menu", function ()
{
- app.preview_pane = new YAHOO.gocept.webmailer.PreviewPane();
- app.message_list = new YAHOO.gocept.webmailer.MessageList();
- app.tree = new YAHOO.gocept.webmailer.Tree(
- document.App.domNodes.tree);
+ YAHOO.util.Event.onContentReady("webmailer-main-menu",
function () {
+ app.preview_pane = new
YAHOO.gocept.webmailer.PreviewPane();
+ app.message_list = new
YAHOO.gocept.webmailer.MessageList();
+ app.tree = new YAHOO.gocept.webmailer.Tree(
+ document.App.domNodes.tree);
+ });
});
}
});
|
SVN: r29230 - gocept.webmail/trunk/gocept/webmail/browser/resources
Sebastian Wehrmann <sw(at)gocept.com> |
2009-02-18 15:15:47 |
[ FULL ]
|
Author: sweh
Date: Wed Feb 18 15:15:46 2009
New Revision: 29230
Log:
- Fix management UI.
Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/management-main.js
Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/management-main.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/management-main.js (original)
+++
gocept.webmail/trunk/gocept/webmail/browser/resources/management-main.js Wed
Feb 18 15:15:46 2009
(at)(at) -23,9 +23,9 (at)(at)
app.layout.on('render', function() {
app.domNodes.menu = app.layout.getUnitByPosition('top').body;
app.menu = new YAHOO.gocept.webmailer.ManagementMenu();
+ app.domNodes.identity_edit_form =
app.layout.getUnitByPosition('bottom').body;
app.domNodes.identity_list =
app.layout.getUnitByPosition('center').body;
app.identity_list = new YAHOO.gocept.webmailer.IdentityList();
- app.domNodes.identity_edit_form =
app.layout.getUnitByPosition('bottom').body;
});
app.layout.render();
},
(at)(at) -65,7 +65,7 (at)(at)
YAHOO.gocept.webmailer.ManagementMenu = Class({
constructor: function() {
var menu = this;
- menu.menubar = new YAHOO.widget.MenuBar("management-main-menu");
+ menu.menubar = new YAHOO.widget.MenuBar("top");
menu.menubar.render(document.App.domNodes.menu);
menu.addMenuItem('New', document.App.loadIdentityEditForm);
menu.delete_button = menu.addMenuItem('Delete', function() {
|
SVN: r29231 - gocept.webmail/trunk/gocept/webmail/browser/resources
Christian Theune <ct(at)gocept.com> |
2009-02-18 15:18:45 |
[ FULL ]
|
Author: ctheune
Date: Wed Feb 18 15:18:44 2009
New Revision: 29231
Log:
fix typo
Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/preferences.js
Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/preferences.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/preferences.js (original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/preferences.js Wed
Feb 18 15:18:44 2009
(at)(at) -7,7 +7,7 (at)(at)
constructor: function() {
var preferences = this;
preferences.onLoadFinished = new YAHOO.util.CustomEvent(
- "onLoadFinised", preferences);
+ "onLoadFinished", preferences);
preferences.data = new Object();
preferences.update();
},
|
SVN: r29232 - gocept.webmail/trunk/gocept/webmail/browser/resources
Christian Theune <ct(at)gocept.com> |
2009-02-18 15:19:04 |
[ FULL ]
|
Author: ctheune
Date: Wed Feb 18 15:19:03 2009
New Revision: 29232
Log:
Try again at making initialization code more readable. Document why the
order has to be that way.
Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/management-main.js
Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/management-main.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/management-main.js (original)
+++
gocept.webmail/trunk/gocept/webmail/browser/resources/management-main.js Wed
Feb 18 15:19:03 2009
(at)(at) -21,10 +21,13 (at)(at)
{ position: 'bottom',
height: 250, resize: true, body: ''}]});
app.layout.on('render', function() {
+ // Initialize DOM nodes first, as the business models
+ // rely on them.
app.domNodes.menu = app.layout.getUnitByPosition('top').body;
- app.menu = new YAHOO.gocept.webmailer.ManagementMenu();
app.domNodes.identity_edit_form =
app.layout.getUnitByPosition('bottom').body;
app.domNodes.identity_list =
app.layout.getUnitByPosition('center').body;
+
+ app.menu = new YAHOO.gocept.webmailer.ManagementMenu();
app.identity_list = new YAHOO.gocept.webmailer.IdentityList();
});
app.layout.render();
|
SVN: r29233 - gocept.webmail/trunk/gocept/webmail/browser/resources
Christian Theune <ct(at)gocept.com> |
2009-02-18 15:26:37 |
[ FULL ]
|
Author: ctheune
Date: Wed Feb 18 15:26:36 2009
New Revision: 29233
Log:
Stop using YUIs debug version by default.
Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/runner.js
Modified: gocept.webmail/trunk/gocept/webmail/browser/resources/runner.js
==============================================================================
--- gocept.webmail/trunk/gocept/webmail/browser/resources/runner.js (original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/runner.js Wed Feb 18
15:26:36 2009
(at)(at) -19,7 +19,6 (at)(at)
var loader = new YAHOO.util.YUILoader({
base: yui_base_url+'/',
loadOptional: true,
- filter: 'DEBUG',
allowRollup: false,
onSuccess: function() {
generic_init();
|
SVN: r29238 - gocept.webmail/trunk/gocept/webmail/browser/resources
Christian Theune <ct(at)gocept.com> |
2009-02-18 17:26:16 |
[ FULL ]
|
Author: ctheune
Date: Wed Feb 18 17:26:15 2009
New Revision: 29238
Log:
more space for the header according to portal.mytum.de/header
Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js
Modified:
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js
==============================================================================
---
gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js (original)
+++ gocept.webmail/trunk/gocept/webmail/browser/resources/webmailer-main.js Wed
Feb 18 17:26:15 2009
(at)(at) -13,7 +13,7 (at)(at)
app.outer_layout = new YAHOO.widget.Layout(
{units: [
{position: 'top',
- height: 100,
+ height: 150,
body: '<iframe src="' + banner_url + '"
id="customization" />'},
{position: 'center',
body: ''}]});
|
SVN: r29244 - gocept.restmail/trunk/gocept/restmail/browser
Sebastian Wehrmann <sw(at)gocept.com> |
2009-02-19 15:24:32 |
[ FULL ]
|
Author: sweh
Date: Thu Feb 19 15:24:25 2009
New Revision: 29244
Log:
- API changes for the new management UI.
Modified:
gocept.restmail/trunk/gocept/restmail/browser/README.txt
gocept.restmail/trunk/gocept/restmail/browser/account.py
gocept.restmail/trunk/gocept/restmail/browser/inline.txt
gocept.restmail/trunk/gocept/restmail/browser/profile.py
Modified: gocept.restmail/trunk/gocept/restmail/browser/README.txt
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/README.txt (original)
+++ gocept.restmail/trunk/gocept/restmail/browser/README.txt Thu Feb 19
15:24:25 2009
(at)(at) -98,19 +98,25 (at)(at)
Creating new accounts
---------------------
-Accounts can be created using the ``add-account`` view:
+Before we can start, we should add a new identity:
>>> from gocept.restmail.browser.tests import json_request
->>> json_request('http://localhost/profile/(at)(at)add-account',
+>>> json_request('http://localhost/profile/(at)(at)add-identity',
... identity=dict(name='Ben Utzer',
... address='ben(at)example.com',
... sent_folder='Sent'),
-... smtp_server='default-smtp',
+... smtp_server='default-smtp')
+{'from': 'Ben Utzer <ben(at)example.com>', 'id':
'ben-example.com'}
+
+Accounts can be created using the ``add-account`` view:
+
+>>> json_request('http://localhost/profile/(at)(at)add-account',
... imap_server=dict(host='localhost',
... port=10143,
... user='test',
-... password='bsdf'))
-{'url': 'http://localhost/profile/ben-example.com'}
+... password='bsdf'),
+... default_identity='ben-example.com')
+{'url': 'http://localhost/profile/test-localhost'}
XXX This needs to go to ``add-account``:
(at)(at) -129,6 +135,7 (at)(at)
'fixed': False,
'from': 'Ben Utzer <ben(at)example.com>',
'host': 'localhost',
+ 'ident_id': 'ben-example.com',
'name': 'Ben Utzer',
'password': 'bsdf',
'port': 10143,
(at)(at) -136,7 +143,7 (at)(at)
'smtp_server': 'default-smtp',
'ssl': False,
'status': 'ok',
- 'url': 'http://localhost/profile/ben-example.com',
+ 'url': 'http://localhost/profile/test-localhost',
'user': 'test'}]
Traverse accounts
(at)(at) -150,55 +157,58 (at)(at)
[{'children': 3,
'name': 'test(at)localhost',
'type': 'account',
- 'url': 'http://localhost/profile/ben-example.com'}]
+ 'url': 'http://localhost/profile/test-localhost'}]
Get a list of folders of the account `test(at)localhost`:
>>> pprint.pprint(
-... json_request('http://localhost/profile/ben-example.com/(at)(at)folders'))
+... json_request('http://localhost/profile/test-localhost/(at)(at)folders'))
[{'children': 0,
'name': 'Bar',
'type': 'inbox',
- 'url': 'http://localhost/profile/ben-example.com/+Bar'},
+ 'url': 'http://localhost/profile/test-localhost/+Bar'},
{'children': 1,
'name': 'INBOX',
'type': 'inbox',
- 'url': 'http://localhost/profile/ben-example.com/+INBOX'},
+ 'url': 'http://localhost/profile/test-localhost/+INBOX'},
{'children': 0,
'name': 'Testmessages',
'type': 'inbox',
- 'url': 'http://localhost/profile/ben-example.com/+Testmessages'}]
+ 'url': 'http://localhost/profile/test-localhost/+Testmessages'}]
The `INBOX` has one child:
>>> pprint.pprint(
-... json_request('http://localhost/profile/ben-example.com/+INBOX/(at)(at)folders'))
+... json_request('http://localhost/profile/test-localhost/+INBOX/(at)(at)folders'))
[{'children': 0,
'name': 'Baz',
'type': 'inbox',
- 'url': 'http://localhost/profile/ben-example.com/+INBOX/+Baz'}]
+ 'url': 'http://localhost/profile/test-localhost/+INBOX/+Baz'}]
Adding new identities
---------------------
-You can add new identities to accounts. Setting it to the default identity
will
-list it in the `accounts` view:
+You can add new identities. We need the account id here for the sent folder:
>>> json_request('http://localhost/profile/(at)(at)add-identity',
-... account_id='ben-example.com',
-... identity_id='an-example.com-identity',
+... account_id='test-localhost',
... identity=dict(name='An Wender',
... address='an(at)example.com',
... sent_folder='+Sent'),
-... smtp_server='default-smtp',
-... default=True)
+... smtp_server='default-smtp')
+{'from': 'An Wender <an(at)example.com>', 'id':
'an-example.com'}
+
+We set it now as the default identity:
+
+>>> profile['test-localhost'].default_identity = 'an-example.com'
>>> pprint.pprint(json_request('http://localhost/profile/(at)(at)accounts'))
[{'address': 'an(at)example.com',
'fixed': False,
'from': 'An Wender <an(at)example.com>',
'host': 'localhost',
+ 'ident_id': 'an-example.com',
'name': 'An Wender',
'password': 'bsdf',
'port': 10143,
(at)(at) -206,10 +216,17 (at)(at)
'smtp_server': 'default-smtp',
'ssl': False,
'status': 'ok',
- 'url': 'http://localhost/profile/ben-example.com',
+ 'url': 'http://localhost/profile/test-localhost',
'user': 'test'}]
->>> profile['ben-example.com'].default_identity =
'ben-example.com-identity'
+Change the default identity back:
+
+>>> profile['test-localhost'].default_identity = 'ben-example.com'
+>>> pprint.pprint(json_request('http://localhost/profile/(at)(at)accounts'))
+[{...
+ 'from': 'Ben Utzer <ben(at)example.com>',
+ ...}]
+
Reading and saving preferences
-------------------------------
(at)(at) -243,19 +260,19 (at)(at)
Accounts contain folders which can be browsed using the ``(at)(at)folders``
view:
->>> pprint.pprint(json_request('http://localhost/profile/ben-example.com/(at)(at)folders'))
+>>> pprint.pprint(json_request('http://localhost/profile/test-localhost/(at)(at)folders'))
[{'children': 0,
'name': 'Bar',
'type': 'inbox',
- 'url': 'http://localhost/profile/ben-example.com/+Bar'},
+ 'url': 'http://localhost/profile/test-localhost/+Bar'},
{'children': 1,
'name': 'INBOX',
'type': 'inbox',
- 'url': 'http://localhost/profile/ben-example.com/+INBOX'},
+ 'url': 'http://localhost/profile/test-localhost/+INBOX'},
{'children': 0,
'name': 'Testmessages',
'type': 'inbox',
- 'url': 'http://localhost/profile/ben-example.com/+Testmessages'}]
+ 'url': 'http://localhost/profile/test-localhost/+Testmessages'}]
Create new folders
(at)(at) -263,9 +280,9 (at)(at)
Folders can be created as children of accounts:
->>> json_request('http://localhost/profile/ben-example.com/(at)(at)create_folder',
+>>> json_request('http://localhost/profile/test-localhost/(at)(at)create_folder',
... name=u'Sent')
-{'url': 'http://localhost/profile/ben-example.com/+Sent'}
+{'url': 'http://localhost/profile/test-localhost/+Sent'}
Edit account data: (at)(at)edit
(at)(at) -273,11 +290,8 (at)(at)
All data of an account can be edited using the `(at)(at)edit` view:
->>> json_request('http://localhost/profile/ben-example.com/(at)(at)edit',
-... identity=dict(name='Ben Utzer',
-... address='ben(at)example.com',
-... sent_folder='+Sent'),
-... smtp_server='default-smtp',
+>>> json_request('http://localhost/profile/test-localhost/(at)(at)edit',
+... default_identity='ben-example.com',
... imap_server=dict(host='localhost',
... port=10143,
... user='test',
(at)(at) -288,24 +302,21 (at)(at)
'fixed': False,
'from': 'Ben Utzer <ben(at)example.com>',
'host': 'localhost',
+ 'ident_id': 'ben-example.com',
'name': 'Ben Utzer',
'password': 'bsdf',
'port': 10143,
- 'sent_folder': '+Sent',
+ 'sent_folder': 'Sent',
'smtp_server': 'default-smtp',
'ssl': True,
'status': 'failure',
- 'url': 'http://localhost/profile/ben-example.com',
+ 'url': 'http://localhost/profile/test-localhost',
'user': 'test'}]
-Switch SSL off again since the account will be used again later. We mark it as
-fixed right now to demonstrate accounts, whichs data can not be modified:
+Switch SSL off again since the account will be used again later.
->>> json_request('http://localhost/profile/ben-example.com/(at)(at)edit',
-... identity=dict(name='Ben Utzer',
-... address='ben(at)example.com',
-... sent_folder='+Sent'),
-... smtp_server='default-smtp',
+>>> json_request('http://localhost/profile/test-localhost/(at)(at)edit',
+... default_identity='ben-example.com',
... imap_server=dict(host='localhost',
... port=10143,
... user='test',
(at)(at) -326,26 +337,23 (at)(at)
Create an additional account that can be deleted for demonstrational purposes:
>>> json_request('http://localhost/profile/(at)(at)add-account',
-... identity=dict(name='John Doe',
-... address='john.doe(at)example.com',
-... sent_folder='Sent'),
-... smtp_server='default-smtp',
+... default_identity='an-example.com',
... imap_server=dict(host='localhost',
... port=10143,
-... user='test',
-... password='bsdf'))
-{'url': 'http://localhost/profile/john.doe-example.com'}
+... user='user',
+... password='asdf'))
+{'url': 'http://localhost/profile/user-localhost'}
>>> accounts = json_request('http://localhost/profile/(at)(at)accounts')
>>> [x['url'] for x in accounts]
-['http://localhost/profile/ben-example.com',
'http://localhost/profile/john.doe-example.com']
+['http://localhost/profile/test-localhost',
'http://localhost/profile/user-localhost']
Then delete it right away:
->>> json_request('http://localhost/profile/john.doe-example.com/(at)(at)delete',
post=True)
+>>> json_request('http://localhost/profile/user-localhost/(at)(at)delete',
post=True)
>>> accounts = json_request('http://localhost/profile/(at)(at)accounts')
>>> [x['url'] for x in accounts]
-['http://localhost/profile/ben-example.com']
+['http://localhost/profile/test-localhost']
Folder API
(at)(at) -357,11 +365,11 (at)(at)
Just like accounts, folders have a ``(at)(at)folders`` view for browsing their
child
folders:
->>> pprint.pprint(json_request('http://localhost/profile/ben-example.com/+INBOX/(at)(at)folders'))
+>>> pprint.pprint(json_request('http://localhost/profile/test-localhost/+INBOX/(at)(at)folders'))
[{'children': 0,
'name': 'Baz',
'type': 'inbox',
- 'url': 'http://localhost/profile/ben-example.com/+INBOX/+Baz'}]
+ 'url': 'http://localhost/profile/test-localhost/+INBOX/+Baz'}]
Create folders
(at)(at) -370,16 +378,16 (at)(at)
Folders can be created as children of folders. To demonstrate this, we use a
folder name containing characters beyond the 7 bit ASCII set:
->>> json_request('http://localhost/profile/ben-example.com/+Sent/(at)(at)create_folder',
+>>> json_request('http://localhost/profile/test-localhost/+Sent/(at)(at)create_folder',
... name=u"\xd6ld")
-{'url': 'http://localhost/profile/ben-example.com/+Sent/+%C3%96ld'}
+{'url': 'http://localhost/profile/test-localhost/+Sent/+%C3%96ld'}
>>> pprint.pprint(json_request(
-... 'http://localhost/profile/ben-example.com/+Sent/(at)(at)folders'))
+... 'http://localhost/profile/test-localhost/+Sent/(at)(at)folders'))
[{'children': 0,
'name': u'\xd6ld',
'type': 'inbox',
- 'url': 'http://localhost/profile/ben-example.com/+Sent/+%C3%96ld'}]
+ 'url': 'http://localhost/profile/test-localhost/+Sent/+%C3%96ld'}]
Retrieve a list of messages
(at)(at) -388,7 +396,7 (at)(at)
Every folder provides the view `(at)(at)messages` which lists all messages of
a folder:
->>> messages = json_request('http://localhost/profile/ben-example.com/+INBOX/(at)(at)messages')
+>>> messages = json_request('http://localhost/profile/test-localhost/+INBOX/(at)(at)messages')
>>> pprint.pprint(messages)
{'batch_size': 10,
'batch_start': 0,
(at)(at) -396,12 +404,12 (at)(at)
'flags': [],
'from': 'test(at)localhost',
'subject': 'Mail 1',
- 'url': 'http://localhost/profile/ben-example.com/+INBOX/*...'},
+ 'url': 'http://localhost/profile/test-localhost/+INBOX/*...'},
{'date': '2008-07-02 01:06:00+00:00',
'flags': [],
'from': 'test(at)localhost',
'subject': 'Mail 2',
- 'url': 'http://localhost/profile/ben-example.com/+INBOX/*...'}],
+ 'url': 'http://localhost/profile/test-localhost/+INBOX/*...'}],
'returned': 2,
'sort_dir': 'desc',
'sort_key': 'date',
(at)(at) -436,7 +444,7 (at)(at)
'X-Unknown-Encoding-Header': u'Text \ufffd\ufffd',
'X-Wrong-Encoding-Header': u'Text \ufffd\ufffd'},
'structure': {'content_type': 'text/plain',
- 'url': 'http://localhost/profile/ben-example.com/+INBOX/*.../*body'}}
+ 'url': 'http://localhost/profile/test-localhost/+INBOX/*.../*body'}}
Accessing MIME parts
(at)(at) -474,8 +482,8 (at)(at)
When copying, the source message will not be deleted:
->>> INBOX_url = 'http://localhost/profile/ben-example.com/+INBOX'
->>> other_url = 'http://localhost/profile/ben-example.com/+Sent/+%C3%96ld'
+>>> INBOX_url = 'http://localhost/profile/test-localhost/+INBOX'
+>>> other_url = 'http://localhost/profile/test-localhost/+Sent/+%C3%96ld'
>>> messages = json_request(INBOX_url + '/(at)(at)messages')
>>> messages['total']
2
(at)(at) -589,13 +597,13 (at)(at)
>>> json_request(draft['url']+'/(at)(at)save',
... to='ct(at)gocept.com',
-... identity='ben-example.com-identity',
+... identity='ben-example.com',
... subject=u'asdf',
... body=u'HelloHello')
>>> pprint.pprint(json_request(draft['url']+'/(at)(at)data'))
{'body': 'HelloHello',
'date': '<ISO DATE>',
- 'identity': 'ben-example.com-identity',
+ 'identity': 'ben-example.com',
'subject': 'asdf',
'to': 'ct(at)gocept.com'}
>>> pprint.pprint(json_request(draft['url']+'/(at)(at)raw'))
(at)(at) -603,13 +611,13 (at)(at)
>>> json_request(draft['url']+'/(at)(at)save',
... to='ct(at)gocept.com',
-... identity='ben-example.com-identity',
+... identity='ben-example.com',
... subject=u'asdf',
... body=u'HelloHello\xe4')
>>> pprint.pprint(json_request(draft['url']+'/(at)(at)data'))
{'body': u'HelloHello\xe4',
'date': '<ISO DATE>',
- 'identity': 'ben-example.com-identity',
+ 'identity': 'ben-example.com',
'subject': 'asdf',
'to': 'ct(at)gocept.com'}
>>> pprint.pprint(json_request(draft['url']+'/(at)(at)raw'))
(at)(at) -617,13 +625,13 (at)(at)
>>> json_request(draft['url']+'/(at)(at)save',
... to='ct(at)gocept.com',
-... identity='ben-example.com-identity',
+... identity='ben-example.com',
... subject=u'asdf\xe4',
... body=u'HelloHello')
>>> pprint.pprint(json_request(draft['url']+'/(at)(at)data'))
{'body': 'HelloHello',
'date': '<ISO DATE>',
- 'identity': 'ben-example.com-identity',
+ 'identity': 'ben-example.com',
'subject': u'asdf\xe4',
'to': 'ct(at)gocept.com'}
>>> pprint.pprint(json_request(draft['url']+'/(at)(at)raw'))
(at)(at) -631,13 +639,13 (at)(at)
>>> json_request(draft['url']+'/(at)(at)save',
... to='ct(at)gocept.com',
-... identity='ben-example.com-identity',
+... identity='ben-example.com',
... subject=u'asdf\xe4',
... body=u'HelloHello\xe4')
>>> pprint.pprint(json_request(draft['url']+'/(at)(at)data'))
{'body': u'HelloHello\xe4',
'date': '<ISO DATE>',
- 'identity': 'ben-example.com-identity',
+ 'identity': 'ben-example.com',
'subject': u'asdf\xe4',
'to': 'ct(at)gocept.com'}
>>> pprint.pprint(json_request(draft['url']+'/(at)(at)raw'))
(at)(at) -719,14 +727,14 (at)(at)
Traceback (most recent call last):
HTTPError: HTTP Error 404: Not Found
->>> pprint.pprint(json_request('http://localhost/profile/ben-example.com/+Sent/(at)(at)messages'))
+>>> pprint.pprint(json_request('http://localhost/profile/test-localhost/+Sent/(at)(at)messages'))
{'batch_size': 10,
'batch_start': 0,
'messages': [{'date': '2009-02-16 14:46:46+00:00',
'flags': ['\\Recent'],
'from': 'Ben Utzer <ben(at)example.com>',
'subject': u'asdf\xe4',
- 'url': 'http://localhost/profile/ben-example.com/+Sent/*...'}],
+ 'url': 'http://localhost/profile/test-localhost/+Sent/*...'}],
'returned': 1,
'sort_dir': 'desc',
'sort_key': 'date',
(at)(at) -737,7 +745,7 (at)(at)
>>> draft = json_request('http://localhost/profile/(at)(at)new-draft',
post=True)
>>> json_request(draft['url']+'/(at)(at)save',
... to='ct(at)gocept.com',
-... identity='ben-example.com-identity',
+... identity='ben-example.com',
... subject=u'asdf',
... body='HelloHello')
>>> upload_request(draft['url']+'/(at)(at)add_attachment',
(at)(at) -796,7 +804,7 (at)(at)
prevents the \Answered flag from being set on an original message in such a
folder.
->>> other_url = 'http://localhost/profile/ben-example.com/+Sent/+%C3%96ld'
+>>> other_url = 'http://localhost/profile/test-localhost/+Sent/+%C3%96ld'
>>> json_request(messages['messages'][0]['url']+'/(at)(at)copy',
folder_url=other_url, post=True)
{}
>>> other_messages = json_request(other_url + '/(at)(at)messages')
(at)(at) -806,7 +814,7 (at)(at)
>>> pprint.pprint(json_request(reply['url']+'/(at)(at)data'))
{'body':
'<html>\n<head></head>\n<body>\n<p>test(at)localhost
wrote:</p>\n\n <br />\n <blockquote><pre>Everything
is ok!\n</pre></blockquote>\n\n</body>\n</html>\n',
'date': '<ISO DATE>',
- 'identity': 'ben-example.com-identity',
+ 'identity': 'ben-example.com',
'subject': 'Re: Mail 2',
'to': 'test(at)localhost'}
(at)(at) -820,7 +828,7 (at)(at)
'flags': ['\\Seen'],
'from': 'test(at)localhost',
'subject': 'Mail 2',
- 'url': 'http://localhost/profile/ben-example.com/+Sent/+%C3%96ld/*...'}],
+ 'url': 'http://localhost/profile/test-localhost/+Sent/+%C3%96ld/*...'}],
'returned': 1,
'sort_dir': 'desc',
'sort_key': 'date',
(at)(at) -857,7 +865,7 (at)(at)
'flags': ['\\Seen', '\\Answered'],
'from': 'test(at)localhost',
'subject': 'Mail 2',
- 'url': 'http://localhost/profile/ben-example.com/+Sent/+%C3%96ld/*...'}],
+ 'url': 'http://localhost/profile/test-localhost/+Sent/+%C3%96ld/*...'}],
'returned': 1,
'sort_dir': 'desc',
'sort_key': 'date',
(at)(at) -869,9 +877,9 (at)(at)
If the sent folder does not exist, it is created:
->>> profile['an-example.com-identity'].sent_folder = u'mySentFolder'
+>>> profile['an-example.com'].sent_folder = u'mySentFolder'
>>> browser.open(
-... 'http://localhost/profile/ben-example.com/+mySentFolder/(at)(at)messages')
+... 'http://localhost/profile/test-localhost/+mySentFolder/(at)(at)messages')
Traceback (most recent call last):
HTTPError: HTTP Error 404: Not Found
(at)(at) -880,7 +888,7 (at)(at)
{'url': 'http://localhost/profile/drafts/<GUID>'}
>>> json_request(draft['url']+'/(at)(at)save',
... to='ct(at)gocept.com',
-... identity='an-example.com-identity',
+... identity='an-example.com',
... subject=u'Testmail incorrect sent folder',
... body='HelloHello')
(at)(at) -901,14 +909,14 (at)(at)
HTTPError: HTTP Error 404: Not Found
>>> pprint.pprint(json_request(
-... 'http://localhost/profile/ben-example.com/+mySentFolder/(at)(at)messages'))
+... 'http://localhost/profile/test-localhost/+mySentFolder/(at)(at)messages'))
{'batch_size': 10,
'batch_start': 0,
'messages': [{'date': '2009-02-16 14:46:46+00:00',
'flags': ['\\Recent'],
'from': 'An Wender <an(at)example.com>',
'subject': 'Testmail incorrect sent folder',
- 'url': 'http://localhost/profile/ben-example.com/+mySentFolder/*...'}],
+ 'url': 'http://localhost/profile/test-localhost/+mySentFolder/*...'}],
'returned': 1,
'sort_dir': 'desc',
'sort_key': 'date',
(at)(at) -922,11 +930,9 (at)(at)
>>> pprint.pprint(json_request('http://localhost/profile/(at)(at)identities'))
[{'from': 'Ben Utzer <ben(at)example.com>',
- 'id': 'ben-example.com-identity'},
+ 'id': 'ben-example.com'},
{'from': 'An Wender <an(at)example.com>',
- 'id': 'an-example.com-identity'},
- {'from': 'John Doe <john.doe(at)example.com>',
- 'id': 'john.doe-example.com-identity'}]
+ 'id': 'an-example.com'}]
Fixed accounts
(at)(at) -934,11 +940,8 (at)(at)
Mark an account as fixed:
->>> json_request('http://localhost/profile/ben-example.com/(at)(at)edit',
-... identity=dict(name='Ben Utzer',
-... address='ben(at)example.com',
-... sent_folder='+Sent'),
-... smtp_server='default-smtp',
+>>> json_request('http://localhost/profile/test-localhost/(at)(at)edit',
+... default_identity='ben-example.com',
... imap_server=dict(host='localhost',
... port=10143,
... user='test',
(at)(at) -948,11 +951,8 (at)(at)
If the account is fixed, you are not allowed to edit the data:
->>> json_request('http://localhost/profile/ben-example.com/(at)(at)edit',
-... identity=dict(name='Ben Atzer',
-... address='ben(at)example.com',
-... sent_folder='+Sent'),
-... smtp_server='default-smtp',
+>>> json_request('http://localhost/profile/test-localhost/(at)(at)edit',
+... default_identity='an-example.com',
... imap_server=dict(host='localhost',
... port=10143,
... user='test',
(at)(at) -963,5 +963,3 (at)(at)
[{...
'name': 'Ben Utzer',
...}]
-
-
Modified: gocept.restmail/trunk/gocept/restmail/browser/account.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/account.py (original)
+++ gocept.restmail/trunk/gocept/restmail/browser/account.py Thu Feb 19
15:24:25 2009
(at)(at) -10,8 +10,7 (at)(at)
"""Web API for accounts."""
(at)gocept.restmail.browser.json.view
- def edit(self, identity, smtp_server, imap_server):
- identity_obj = gocept.restmail.interfaces.IIdentity(self.context)
+ def edit(self, imap_server, default_identity):
fixed = self.context.fixed
if fixed:
return
(at)(at) -21,10 +20,7 (at)(at)
self.context.user = imap_server['user']
self.context.password = imap_server['password']
self.context.fixed = imap_server.get('fixed', False)
- identity_obj.name = identity['name']
- identity_obj.address = identity['address']
- identity_obj.sent_folder = identity['sent_folder']
- identity_obj.smtp_server = smtp_server
+ self.context.default_identity = default_identity
(at)gocept.restmail.browser.json.view
def delete(self):
Modified: gocept.restmail/trunk/gocept/restmail/browser/inline.txt
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/inline.txt (original)
+++ gocept.restmail/trunk/gocept/restmail/browser/inline.txt Thu Feb 19
15:24:25 2009
(at)(at) -14,18 +14,21 (at)(at)
>>> browser.getControl('Add').click()
>>> from gocept.restmail.browser.tests import json_request,
render_message
->>> json_request('http://localhost/profile/(at)(at)add-account',
+>>> json_request('http://localhost/profile/(at)(at)add-identity',
... identity=dict(name='Ben Utzer',
... address='ben(at)example.com',
-... sent_folder=''),
-... smtp_server='default-smtp',
+... sent_folder='Sent'),
+... smtp_server='default-smtp')
+{'from': 'Ben Utzer <ben(at)example.com>', 'id':
'ben-example.com'}
+>>> json_request('http://localhost/profile/(at)(at)add-account',
+... default_identity='ben-example.com',
... imap_server=dict(host='localhost',
... port=10143,
... user='test',
... password='bsdf'))
-{'url': 'http://localhost/profile/ben-example.com'}
+{'url': 'http://localhost/profile/test-localhost'}
->>> folder = 'http://localhost/profile/ben-example.com/+Testmessages'
+>>> folder = 'http://localhost/profile/test-localhost/+Testmessages'
Various combined messages
=========================
(at)(at) -49,7 +52,7 (at)(at)
>>> print r['body']
<div class="messagepart">
-...<img width="677" height="28" alt="" src="http://localhost/profile/ben-example.com/+Testmessages/*...-5/*body/1/2/2">...
+...<img width="677" height="28" alt="" src="http://localhost/profile/test-localhost/+Testmessages/*...-5/*body/1/2/2">...
...<img width="677" height="220"
src="cid:BA068E69-D7FA-4479-A3A4-FCFEFC9C9DE3/2/Photos">...
...<img width="622" height="27" alt=""
src="cid:BA068E69-D7FA-4479-A3A4-FCFEFC9C9DE3/bottom.jpg">...
...<img width="622" height="25" alt=""
src="cid:BA068E69-D7FA-4479-A3A4-FCFEFC9C9DE3/bbg.jpg">...
(at)(at) -61,7 +64,7 (at)(at)
<h6>Attachments</h6>
<ul>
<li>
- <a href="http://localhost/profile/ben-example.com/+Testmessages/*...-5/*body/1/2/2">tbg.jpg</a>
+ <a href="http://localhost/profile/test-localhost/+Testmessages/*...-5/*body/1/2/2">tbg.jpg</a>
(<span>image/jpeg</span> <span>691</span>)
</li>
</ul>
(at)(at) -89,7 +92,7 (at)(at)
>>> print r['body']
<div class="messagepart">
- <div><div>Daa <font class="Apple-style-span"
color="#FF3728">dudel</font> dö<img height="240"
width="324" src="http://localhost/profile/ben-example.com/+Testmessages/*...-10/*body/2/2"><div><br></div><div><br></div><div><font
class="Apple-style-span">blasdjf </font><br><div>
<div><div><div>-- </div><div>Christian
Zagrodnick · <a
href="mailto:cz(at)gocept.com">cz(at)gocept.com</a></div><div>gocept
gmbh & co. kg · forsterstraße 29 · 06112
halle (saale) · germany</div><div><a href="http://gocept.com">http://gocept.com</a> ·
tel +49 345 1229889 0 · fax +49 345 1229889
1</div><div>Zope and Plone consulting and
development</div><br></div></div><br></div><br></div></div></div>
+ <div><div>Daa <font class="Apple-style-span"
color="#FF3728">dudel</font> dö<img height="240"
width="324" src="http://localhost/profile/test-localhost/+Testmessages/*...-10/*body/2/2"><div><br></div><div><br></div><div><font
class="Apple-style-span">blasdjf </font><br><div>
<div><div><div>-- </div><div>Christian
Zagrodnick · <a
href="mailto:cz(at)gocept.com">cz(at)gocept.com</a></div><div>gocept
gmbh & co. kg · forsterstraße 29 · 06112
halle (saale) · germany</div><div><a href="http://gocept.com">http://gocept.com</a> ·
tel +49 345 1229889 0 · fax +49 345 1229889
1</div><div>Zope and Plone consulting and
development</div><br></div></div><br></div><br></div></div></div>
<div><div class="footer">
</div>
</div>
(at)(at) -101,7 +104,7 (at)(at)
<h6>Attachments</h6>
<ul>
<li>
- <a href="http://localhost/profile/ben-example.com/+Testmessages/*...-10/*body/2/2">DSC03090.jpg</a>
+ <a href="http://localhost/profile/test-localhost/+Testmessages/*...-10/*body/2/2">DSC03090.jpg</a>
(<span>image/jpeg</span> <span>213680</span>)
</li>
</ul>
(at)(at) -151,11 +154,11 (at)(at)
<h6>Attachments</h6>
<ul>
<li>
- <a href="http://localhost/profile/ben-example.com/+Testmessages/*...-11/*body/1/2">ez_setup.py</a>
+ <a href="http://localhost/profile/test-localhost/+Testmessages/*...-11/*body/1/2">ez_setup.py</a>
(<span>text/x-python</span> <span>8509</span>)
</li>
<li>
- <a href="http://localhost/profile/ben-example.com/+Testmessages/*...-11/*body/2">signature.asc</a>
+ <a href="http://localhost/profile/test-localhost/+Testmessages/*...-11/*body/2">signature.asc</a>
(<span>application/pgp-signature</span>
<span>196</span>)
</li>
</ul>
(at)(at) -187,7 +190,7 (at)(at)
<div><div>
<div>
<table width="753" class="email-body-wrap" id="email-body" align="center"
cellspacing="0" cellpadding="0" border="0"><tbody><tr><td
width="45" rowspan="2"> </td>
- <td width="663"><img width="663" height="148" alt="" src="http://localhost/profile/ben-example.com/+Testmessages/*...-12/*body/2/2"></td>
+ <td width="663"><img width="663" height="148" alt="" src="http://localhost/profile/test-localhost/+Testmessages/*...-12/*body/2/2"></td>
<td width="45" rowspan="2"> </td>
</tr><tr><td width="663"><table width="663" height="289"
border="0" cellpadding="0" cellspacing="0"><tbody><tr><td
width="105"> </td>
<td width="548"><font color="#4a4533">
(at)(at) -195,8 +198,8 (at)(at)
</font></td>
<td width="100"> </td>
</tr></tbody></table></td>
- </tr><tr><td width="753" colspan="3"><img width="753"
height="262" src="http://localhost/profile/ben-example.com/+Testmessages/*...-12/*body/2/3"></td>
- </tr><tr><td width="753" colspan="3"><img width="753"
height="57" alt="" src="http://localhost/profile/ben-example.com/+Testmessages/*...-12/*body/2/4"></td>
+ </tr><tr><td width="753" colspan="3"><img width="753"
height="262" src="http://localhost/profile/test-localhost/+Testmessages/*...-12/*body/2/3"></td>
+ </tr><tr><td width="753" colspan="3"><img width="753"
height="57" alt="" src="http://localhost/profile/test-localhost/+Testmessages/*...-12/*body/2/4"></td>
</tr></tbody></table></div>
</div></div>
<div><div class="footer">
(at)(at) -210,31 +213,31 (at)(at)
<h6>Attachments</h6>
<ul>
<li>
- <a href="http://localhost/profile/ben-example.com/+Testmessages/*...-12/*body/2/2">top.jpg</a>
+ <a href="http://localhost/profile/test-localhost/+Testmessages/*...-12/*body/2/2">top.jpg</a>
(<span>image/jpeg</span> <span>27412</span>)
</li>
<li>
- <a href="http://localhost/profile/ben-example.com/+Testmessages/*...-12/*body/2/3">Photos.png</a>
+ <a href="http://localhost/profile/test-localhost/+Testmessages/*...-12/*body/2/3">Photos.png</a>
(<span>image/png</span> <span>457106</span>)
</li>
<li>
- <a href="http://localhost/profile/ben-example.com/+Testmessages/*...-12/*body/2/4">bottom.jpg</a>
+ <a href="http://localhost/profile/test-localhost/+Testmessages/*...-12/*body/2/4">bottom.jpg</a>
(<span>image/jpeg</span> <span>19046</span>)
</li>
<li>
- <a href="http://localhost/profile/ben-example.com/+Testmessages/*...-12/*body/2/5">bg_pattern.jpg</a>
+ <a href="http://localhost/profile/test-localhost/+Testmessages/*...-12/*body/2/5">bg_pattern.jpg</a>
(<span>image/jpeg</span> <span>103782</span>)
</li>
<li>
- <a href="http://localhost/profile/ben-example.com/+Testmessages/*...-12/*body/2/6">lbg.jpg</a>
+ <a href="http://localhost/profile/test-localhost/+Testmessages/*...-12/*body/2/6">lbg.jpg</a>
(<span>image/jpeg</span> <span>9756</span>)
</li>
<li>
- <a href="http://localhost/profile/ben-example.com/+Testmessages/*...-12/*body/2/7">rbg.jpg</a>
+ <a href="http://localhost/profile/test-localhost/+Testmessages/*...-12/*body/2/7">rbg.jpg</a>
(<span>image/jpeg</span> <span>9816</span>)
</li>
<li>
- <a href="http://localhost/profile/ben-example.com/+Testmessages/*...-12/*body/2/8">bg_letter.jpg</a>
+ <a href="http://localhost/profile/test-localhost/+Testmessages/*...-12/*body/2/8">bg_letter.jpg</a>
(<span>image/jpeg</span> <span>36484</span>)
</li>
</ul>
(at)(at) -267,7 +270,7 (at)(at)
>>> print r['body']
<div class="messagepart">
<div><div>
-Ich habe hier noch ein Bild beigefuegt.<br><img src="http://localhost/profile/ben-example.com/+Testmessages/*...-13/*body/1/2"
align="bottom" border="0"><br><br>
+Ich habe hier noch ein Bild beigefuegt.<br><img src="http://localhost/profile/test-localhost/+Testmessages/*...-13/*body/1/2"
align="bottom" border="0"><br><br>
Viel Spass<br><br><table cellspacing="0" cellpadding="0"
width="100%"><tr><td>
<pre>
--
(at)(at) -289,11 +292,11 (at)(at)
<h6>Attachments</h6>
<ul>
<li>
- <a href="http://localhost/profile/ben-example.com/+Testmessages/*...-13/*body/1/2">drawing.png</a>
+ <a href="http://localhost/profile/test-localhost/+Testmessages/*...-13/*body/1/2">drawing.png</a>
(<span>image/png</span> <span>110992</span>)
</li>
<li>
- <a href="http://localhost/profile/ben-example.com/+Testmessages/*...-13/*body/2">random.zip</a>
+ <a href="http://localhost/profile/test-localhost/+Testmessages/*...-13/*body/2">random.zip</a>
(<span>application/zip</span>
<span>104276</span>)
</li>
</ul>
(at)(at) -309,8 +312,7 (at)(at)
>>> r = render_message(folder, 'something simple')
>>> print r['body']
<div class="messagepart">
- <div><pre>This is a plain-text message.
-It has two lines.
+ <div><pre>I'm a message with no funny characters.
</pre></div>
<div><div class="footer">
</div>
(at)(at) -477,7 +479,7 (at)(at)
>>> json_request(draft['url']+'/(at)(at)save',
... to='ct(at)gocept.com',
-... identity='ben-example.com-identity',
+... identity='ben-example.com',
... subject=u'asdf',
... body='HelloHello')
>>> print json_request(draft['url'] + '/(at)(at)render')['body']
(at)(at) -493,7 +495,7 (at)(at)
>>> json_request(draft['url']+'/(at)(at)save',
... to='ct(at)gocept.com',
-... identity='ben-example.com-identity',
+... identity='ben-example.com',
... subject=u'asdf',
...
body='<html><body>HelloHello</body></html>')
>>> print json_request(draft['url'] + '/(at)(at)render')['body']
Modified: gocept.restmail/trunk/gocept/restmail/browser/profile.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/profile.py (original)
+++ gocept.restmail/trunk/gocept/restmail/browser/profile.py Thu Feb 19
15:24:25 2009
(at)(at) -31,6 +31,7 (at)(at)
'ssl': account.ssl,
'user': account.user,
'password': account.password,
+ 'ident_id': account.default_identity,
'name': identity.name,
'address': identity.address,
'sent_folder': identity.sent_folder,
(at)(at) -61,30 +62,31 (at)(at)
self.context.preferences = config
(at)gocept.restmail.browser.json.view
- def add_account(self, identity, smtp_server, imap_server):
+ def add_account(self, imap_server, default_identity):
# XXX handle collision
- account_id = identity['address'].replace('(at)', '-')
- identity_id = '%s-identity' % account_id
+ account_id = '%s-%s' % (imap_server['user'], imap_server['host'])
account = gocept.restmail.imapaccount.IMAPAccount(
- account_id, identity_id=identity_id, **imap_server)
- identity = gocept.restmail.identity.Identity(
- identity_id, account_id=account_id, smtp_server=smtp_server,
- **identity)
+ account_id, identity_id=default_identity, **imap_server)
self.context._setObject(account_id, account)
- self.context._setObject(identity_id, identity)
+
+ identity = self.context[default_identity]
+ if not identity.account_id:
+ identity.account_id = account_id
+
return {'url': self.context[account_id].absolute_url()}
(at)gocept.restmail.browser.json.view
- def add_identity(self, account_id, identity_id, identity, smtp_server,
+ def add_identity(self, identity, smtp_server, account_id=None,
default=False):
+ identity_id = identity['address'].replace('(at)', '-')
identity = gocept.restmail.identity.Identity(
identity_id, account_id=account_id, smtp_server=smtp_server,
**identity)
self.context._setObject(identity_id, identity)
- if default:
- self.context[account_id].set_identity(identity_id)
+ return {'id': identity_id,
+ 'from': xml.sax.saxutils.escape(identity.From())}
def delete_account(self, id):
identity = getattr(self.context, id)
|
SVN: r29251 - gocept.webmail-buildout/trunk/profiles
Wolfgang Schnerring <ws(at)gocept.com> |
2009-02-20 14:16:12 |
[ FULL ]
|
Author: wosc
Date: Fri Feb 20 14:16:10 2009
New Revision: 29251
Log:
- bump zc.selenium version to the current snapshot which has working
DemoStorage push/pop
- install zc.selenium only in the selenium-instance
Modified:
gocept.webmail-buildout/trunk/profiles/dev.cfg
Modified: gocept.webmail-buildout/trunk/profiles/dev.cfg
==============================================================================
--- gocept.webmail-buildout/trunk/profiles/dev.cfg (original)
+++ gocept.webmail-buildout/trunk/profiles/dev.cfg Fri Feb 20 14:16:10 2009
(at)(at) -24,7 +24,6 (at)(at)
${packages:names}
lxml
zc.testbrowser
- zc.selenium
versions = versions
(at)(at) -32,7 +31,7 (at)(at)
lovely.recipe = 0.3.1b5
lxml = 2.1.2
zc.testbrowser = 1.0.0a5dev-r91664
-zc.selenium = 1.3.0dev-r96720
+zc.selenium = 1.3.0dev-r96813
[packages]
names =
(at)(at) -147,19 +146,22 (at)(at)
[instance-selenium]
recipe = plone.recipe.zope2instance
-# DemoStorage is the only difference to [instance]
demo-storage = on
+eggs = ${buildout:eggs}
+ zc.selenium
+# will be overriden by selenium runner with random port
+http-address = 39858
+# the rest is identical to [instance]
zope2-location = ${zope2:location}
user = ${instance:user}
debug-mode = on
verbose-security = on
-eggs = ${buildout:eggs}
zcml = ${instance:zcml}
products = ${productdistros:location}
[selenium]
recipe = zc.recipe.egg:scripts
-eggs = ${instance:eggs}
+eggs = ${instance-selenium:eggs}
extra-paths = ${zope2:location}/lib/python
${zope2:location}/lib/python/AccessControl
scripts = selenium
|
SVN: r29260 - gocept.webmail-buildout/trunk/profiles
Wolfgang Schnerring <ws(at)gocept.com> |
2009-02-23 09:44:08 |
[ FULL ]
|
Author: wosc
Date: Mon Feb 23 09:44:07 2009
New Revision: 29260
Log:
put zope2's var/ (especially: Data.fs) below its parts directory, where it
belongs
Modified:
gocept.webmail-buildout/trunk/profiles/dev.cfg
Modified: gocept.webmail-buildout/trunk/profiles/dev.cfg
==============================================================================
--- gocept.webmail-buildout/trunk/profiles/dev.cfg (original)
+++ gocept.webmail-buildout/trunk/profiles/dev.cfg Mon Feb 23 09:44:07 2009
(at)(at) -65,6 +65,8 (at)(at)
zope2-location = ${zope2:location}
user = admin:admin
http-address = 8080
+# XXX why does the recipe not use its parts-directory by default?
+var = ${buildout:parts-directory}/instance/var
debug-mode = on
verbose-security = on
eggs = ${buildout:eggs}
(at)(at) -137,6 +139,7 (at)(at)
ZODB3
mechanize
ClientForm
+ zope.traversing
[test]
recipe = collective.recipe.z2testrunner
(at)(at) -152,6 +155,7 (at)(at)
# will be overriden by selenium runner with random port
http-address = 39858
# the rest is identical to [instance]
+var = ${buildout:parts-directory}/instance-location/var
zope2-location = ${zope2:location}
user = ${instance:user}
debug-mode = on
|
SVN: r29261 - gocept.webmail-buildout/trunk/profiles
Wolfgang Schnerring <ws(at)gocept.com> |
2009-02-23 10:04:31 |
[ FULL ]
|
Author: wosc
Date: Mon Feb 23 10:04:30 2009
New Revision: 29261
Log:
I typoed a little on the last commit.
Modified:
gocept.webmail-buildout/trunk/profiles/dev.cfg
Modified: gocept.webmail-buildout/trunk/profiles/dev.cfg
==============================================================================
--- gocept.webmail-buildout/trunk/profiles/dev.cfg (original)
+++ gocept.webmail-buildout/trunk/profiles/dev.cfg Mon Feb 23 10:04:30 2009
(at)(at) -139,7 +139,6 (at)(at)
ZODB3
mechanize
ClientForm
- zope.traversing
[test]
recipe = collective.recipe.z2testrunner
(at)(at) -155,7 +154,7 (at)(at)
# will be overriden by selenium runner with random port
http-address = 39858
# the rest is identical to [instance]
-var = ${buildout:parts-directory}/instance-location/var
+var = ${buildout:parts-directory}/instance-selenium/var
zope2-location = ${zope2:location}
user = ${instance:user}
debug-mode = on
|
SVN: r29266 - in gocept.webmail-buildout/trunk: . profiles
Wolfgang Schnerring <ws(at)gocept.com> |
2009-02-23 10:59:23 |
[ FULL ]
|
Author: wosc
Date: Mon Feb 23 10:59:22 2009
New Revision: 29266
Log:
the var/ for the "normal" instance should be outside of parts/ so it is not
killed by buildout, but the var/ for the selenium-instance should be separate
from that, so there is no interference.
Modified:
gocept.webmail-buildout/trunk/ (props changed)
gocept.webmail-buildout/trunk/profiles/dev.cfg
Modified: gocept.webmail-buildout/trunk/profiles/dev.cfg
==============================================================================
--- gocept.webmail-buildout/trunk/profiles/dev.cfg (original)
+++ gocept.webmail-buildout/trunk/profiles/dev.cfg Mon Feb 23 10:59:22 2009
(at)(at) -65,8 +65,6 (at)(at)
zope2-location = ${zope2:location}
user = admin:admin
http-address = 8080
-# XXX why does the recipe not use its parts-directory by default?
-var = ${buildout:parts-directory}/instance/var
debug-mode = on
verbose-security = on
eggs = ${buildout:eggs}
(at)(at) -151,10 +149,11 (at)(at)
demo-storage = on
eggs = ${buildout:eggs}
zc.selenium
+# don't step on [instance]'s Data.fs
+var = ${buildout:parts-directory}/instance-selenium/var
# will be overriden by selenium runner with random port
http-address = 39858
# the rest is identical to [instance]
-var = ${buildout:parts-directory}/instance-selenium/var
zope2-location = ${zope2:location}
user = ${instance:user}
debug-mode = on
|
SVN: r29267 - mytum.webmail/trunk/mytum/webmail
Thomas Lotze <tl(at)gocept.com> |
2009-02-23 11:13:06 |
[ FULL ]
|
Author: thomas
Date: Mon Feb 23 11:13:05 2009
New Revision: 29267
Log:
no more profiles for the normal webmailer
Modified:
mytum.webmail/trunk/mytum/webmail/tests.py
Modified: mytum.webmail/trunk/mytum/webmail/tests.py
==============================================================================
--- mytum.webmail/trunk/mytum/webmail/tests.py (original)
+++ mytum.webmail/trunk/mytum/webmail/tests.py Mon Feb 23 11:13:05 2009
(at)(at) -28,8 +28,7 (at)(at)
# add a CMF Site with the CMFWebmail product
- addConfiguredSite(app, 'webmail', 'CMFDefault:default',
- extension_ids=('other:gocept.restmail', ))
+ addConfiguredSite(app, 'webmail', 'CMFDefault:default')
cmfsite = test.app['webmail']
# Add the 'tumLogin' property to the manager
|
SVN: r29268 - mytum.webmail/trunk/mytum/webmail
Thomas Lotze <tl(at)gocept.com> |
2009-02-23 11:13:28 |
[ FULL ]
|
Author: thomas
Date: Mon Feb 23 11:13:27 2009
New Revision: 29268
Log:
folder names are now unicode
Modified:
mytum.webmail/trunk/mytum/webmail/README.txt
mytum.webmail/trunk/mytum/webmail/account.py
Modified: mytum.webmail/trunk/mytum/webmail/README.txt
==============================================================================
--- mytum.webmail/trunk/mytum/webmail/README.txt (original)
+++ mytum.webmail/trunk/mytum/webmail/README.txt Mon Feb 23 11:13:27 2009
(at)(at) -55,7 +55,7 (at)(at)
>>> identity
<Identity at /webmail/mgr/mytum-identity-sw-gocept.com>
>>> identity.sent_folder
-'+Sent'
+u'+Sent'
>>> identity.name
'Admin'
>>> identity.address
Modified: mytum.webmail/trunk/mytum/webmail/account.py
==============================================================================
--- mytum.webmail/trunk/mytum/webmail/account.py (original)
+++ mytum.webmail/trunk/mytum/webmail/account.py Mon Feb 23 11:13:27 2009
(at)(at) -109,7 +109,7 (at)(at)
for address in addresses:
id_ = 'mytum-identity-%s' % address.replace('(at)', '-')
profile._setObject(id_,
- Identity(id_, address, 'mytum', '+Sent'))
+ Identity(id_, address, 'mytum', u'+Sent'))
identities.append(id_)
account = Account('mytum', identities[0])
profile._setObject('mytum', account)
|
SVN: r29270 - gocept.restmail/trunk/gocept/restmail/browser
Thomas Lotze <tl(at)gocept.com> |
2009-02-23 13:51:59 |
[ FULL ]
|
Author: thomas
Date: Mon Feb 23 13:51:58 2009
New Revision: 29270
Log:
removed dead code, fixed imports
Modified:
gocept.restmail/trunk/gocept/restmail/browser/profile.py
Modified: gocept.restmail/trunk/gocept/restmail/browser/profile.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/profile.py (original)
+++ gocept.restmail/trunk/gocept/restmail/browser/profile.py Mon Feb 23
13:51:58 2009
(at)(at) -5,6 +5,7 (at)(at)
import cjson
import gocept.restmail.identity
import gocept.restmail.imapaccount
+import gocept.restmail.interfaces
import gocept.restmail.browser.json
import xml.sax.saxutils
import zope.app.zapi
(at)(at) -88,12 +89,6 (at)(at)
return {'id': identity_id,
'from': xml.sax.saxutils.escape(identity.From())}
- def delete_account(self, id):
- identity = getattr(self.context, id)
- self.context.manage_delObjects(identity.account_id)
- self.context.manage_delObjects(id)
- return cjson.encode("Account deleted.")
-
def new_draft(self, message=None):
"""Create a new draft message."""
draft = self.context.new_draft(message)
|
SVN: r29273 - gocept.autocomplete/trunk
Wolfgang Schnerring <ws(at)gocept.com> |
2009-02-23 15:36:43 |
[ FULL ]
|
Author: wosc
Date: Mon Feb 23 15:36:42 2009
New Revision: 29273
Log:
added missing dependency for running a server
Modified:
gocept.autocomplete/trunk/buildout.cfg
Modified: gocept.autocomplete/trunk/buildout.cfg
==============================================================================
--- gocept.autocomplete/trunk/buildout.cfg (original)
+++ gocept.autocomplete/trunk/buildout.cfg Mon Feb 23 15:36:42 2009
(at)(at) -23,6 +23,7 (at)(at)
servers = zserver
eggs = ${test:eggs}
zope.app.server
+ zope.app.zapi
site.zcml =
<include package="gocept.autocomplete" file="ftesting.zcml" />
<include package="zope.app.server"/>
(at)(at) -49,4 +50,3 (at)(at)
entry-points = selenium=zc.selenium.selenium:main
initialization =
sys.argv[1:1] = ['${demo:run-directory}/zope.conf', '-r']
-
|
SVN: r29274 - gocept.autocomplete/trunk
Wolfgang Schnerring <ws(at)gocept.com> |
2009-02-23 15:38:06 |
[ FULL ]
|
Author: wosc
Date: Mon Feb 23 15:38:05 2009
New Revision: 29274
Log:
use infrae.subversions as_eggs feature instead of doing it manually
Modified:
gocept.autocomplete/trunk/buildout.cfg
Modified: gocept.autocomplete/trunk/buildout.cfg
==============================================================================
--- gocept.autocomplete/trunk/buildout.cfg (original)
+++ gocept.autocomplete/trunk/buildout.cfg Mon Feb 23 15:38:05 2009
(at)(at) -1,6 +1,6 (at)(at)
[buildout]
develop = .
-parts = libxml2 libxslt lxml deveggsvn z3c.form test demo selenium
+parts = libxml2 libxslt lxml deveggsvn test demo selenium
extends = http://svn.gocept.com/repos/gocept/zopeversions/zope-stable.cfg
http://svn.gocept.com/repos/gocept/gocept.lxml/trunk/buildout-lxml.cfg
(at)(at) -11,10 +11,7 (at)(at)
[deveggsvn]
recipe = infrae.subversion
urls = svn://svn.zope.org/repos/main/z3c.form/trunk z3c.form
-
-[z3c.form]
-recipe = zc.recipe.egg:develop
-setup = ${deveggsvn:location}/z3c.form
+as_eggs = True
### Selenium tests
|
SVN: r29275 - gocept.autocomplete/trunk
Wolfgang Schnerring <ws(at)gocept.com> |
2009-02-23 15:38:28 |
[ FULL ]
|
Author: wosc
Date: Mon Feb 23 15:38:27 2009
New Revision: 29275
Log:
added missing test dependency
Modified:
gocept.autocomplete/trunk/setup.py
Modified: gocept.autocomplete/trunk/setup.py
==============================================================================
--- gocept.autocomplete/trunk/setup.py (original)
+++ gocept.autocomplete/trunk/setup.py Mon Feb 23 15:38:27 2009
(at)(at) -38,8 +38,9 (at)(at)
test=[
'lxml',
'zc.selenium',
- 'zope.app.testing',
'zope.app.appsetup',
+ 'zope.app.testing',
+ 'zope.app.zcmlfiles',
'zope.securitypolicy',
'zope.testing',
'zope.testbrowser>=3.4.3',
|
SVN: r29277 - gocept.autocomplete/trunk
Wolfgang Schnerring <ws(at)gocept.com> |
2009-02-23 15:38:59 |
[ FULL ]
|
Author: wosc
Date: Mon Feb 23 15:38:58 2009
New Revision: 29277
Log:
changelog
Modified:
gocept.autocomplete/trunk/CHANGES.txt
Modified: gocept.autocomplete/trunk/CHANGES.txt
==============================================================================
--- gocept.autocomplete/trunk/CHANGES.txt (original)
+++ gocept.autocomplete/trunk/CHANGES.txt Mon Feb 23 15:38:58 2009
(at)(at) -1,6 +1,14 (at)(at)
Changes
=======
+0.2 (unreleased)
+----------------
+
+- register the widget for IChoice fields with an ISearchableSource.
+ This functionality depends on z3c.form>=r96460 (will be included in
+ z3c.form-2.0).
+- improved documentation.
+
0.1 (2009-02-06)
----------------
|
SVN: r29290 - gocept.webmail-buildout/trunk/profiles
Wolfgang Schnerring <ws(at)gocept.com> |
2009-02-24 10:05:07 |
[ FULL ]
|
Author: wosc
Date: Tue Feb 24 10:05:05 2009
New Revision: 29290
Log:
since zope2 stores login data in the zodb, we were losing them all the time
because of the demostorage
here's an ugly hack to preserve the "inituser" file -- we should think of some
better way of achieving the goal of a) having a demostorage and b) still being
able to log in
Modified:
gocept.webmail-buildout/trunk/profiles/dev.cfg
Modified: gocept.webmail-buildout/trunk/profiles/dev.cfg
==============================================================================
--- gocept.webmail-buildout/trunk/profiles/dev.cfg (original)
+++ gocept.webmail-buildout/trunk/profiles/dev.cfg Tue Feb 24 10:05:05 2009
(at)(at) -150,7 +150,7 (at)(at)
eggs = ${buildout:eggs}
zc.selenium
# don't step on [instance]'s Data.fs
-var = ${buildout:parts-directory}/instance-selenium/var
+var = ${buildout:directory}/var/selenium
# will be overriden by selenium runner with random port
http-address = 39858
# the rest is identical to [instance]
(at)(at) -169,4 +169,8 (at)(at)
scripts = selenium
entry-points = selenium=zc.selenium.selenium:main
initialization =
+ import os.path, shutil
+ inituser = '${instance-selenium:location}/inituser'
+ if os.path.exists(inituser): shutil.copyfile(inituser, inituser + '.bak')
+ if os.path.exists(inituser + '.bak'): shutil.copyfile(inituser + '.bak',
inituser)
sys.argv[1:1] = ['${instance-selenium:location}/etc/zope.conf', '-r',
'-z', 'zope2']
|
SVN: r29295 - gocept.restmail/trunk/gocept/restmail
Sebastian Wehrmann <sw(at)gocept.com> |
2009-02-24 11:04:53 |
[ FULL ]
|
Author: sweh
Date: Tue Feb 24 11:04:52 2009
New Revision: 29295
Log:
- Better variable names.
Modified:
gocept.restmail/trunk/gocept/restmail/imapaccount.py
Modified: gocept.restmail/trunk/gocept/restmail/imapaccount.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/imapaccount.py (original)
+++ gocept.restmail/trunk/gocept/restmail/imapaccount.py Tue Feb 24 11:04:52
2009
(at)(at) -74,11 +74,11 (at)(at)
return account
def folders(self, name=None):
- connection = self.connect()
+ account = self.connect()
if name is not None:
- folders = [connection.folders[name]]
+ folders = [account.folders[name]]
else:
- folders = connection.folders.values()
+ folders = account.folders.values()
# Apply Zope 2 wrap
folders = [Folder(folder) for folder in folders]
(at)(at) -87,9 +87,9 (at)(at)
return folders
def create_folder(self, name):
- connection = self.connect()
+ account = self.connect()
new_folder = gocept.imapapi.folder.Folder()
- connection.folders[name] = new_folder
+ account.folders[name] = new_folder
return self.folders(name)[0]
def set_identity(self, identity_id):
|
SVN: r29299 - gocept.restmail/trunk/gocept/restmail/testmessages
Thomas Lotze <tl(at)gocept.com> |
2009-02-24 18:48:39 |
[ FULL ]
|
Author: thomas
Date: Tue Feb 24 18:48:38 2009
New Revision: 29299
Log:
disambiguated a test message subject
Modified:
gocept.restmail/trunk/gocept/restmail/testmessages/24-ascii-with-dos-cr
Modified:
gocept.restmail/trunk/gocept/restmail/testmessages/24-ascii-with-dos-cr
==============================================================================
---
gocept.restmail/trunk/gocept/restmail/testmessages/24-ascii-with-dos-cr (original)
+++ gocept.restmail/trunk/gocept/restmail/testmessages/24-ascii-with-dos-cr Tue
Feb 24 18:48:38 2009
(at)(at) -1,6 +1,6 (at)(at)
From: me(at)example.org
To: you(at)example.org
-Subject: something simple
+Subject: 24 - text/plain, DOS CR
This is a plain-text message.
It has two lines.
|
SVN: r29303 - gocept.restmail/trunk/gocept/restmail
Sebastian Wehrmann <sw(at)gocept.com> |
2009-02-25 09:36:59 |
[ FULL ]
|
Author: sweh
Date: Wed Feb 25 09:36:58 2009
New Revision: 29303
Log:
- Update interfaces.
Modified:
gocept.restmail/trunk/gocept/restmail/interfaces.py
Modified: gocept.restmail/trunk/gocept/restmail/interfaces.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/interfaces.py (original)
+++ gocept.restmail/trunk/gocept/restmail/interfaces.py Wed Feb 25 09:36:58
2009
(at)(at) -27,8 +27,11 (at)(at)
name = zope.schema.TextLine(title=u'Real name')
address = zope.schema.TextLine(title=u'Mail address')
- smtp_server = zope.schema.TextLine(title=u'Outgoing mail server')
account_id = zope.schema.TextLine(title=u'Mailbox account')
+ smtp_server = zope.schema.TextLine(title=u'Outgoing mail server')
+
+ def From():
+ """An RfC 822 conformant `From` representation of this identity."""
class IIMAPAccount(zope.interface.Interface):
(at)(at) -42,6 +45,7 (at)(at)
port = zope.schema.Int(title=u'Server port')
user = zope.schema.TextLine(title=u'User name')
password = zope.schema.TextLine(title=u'Password')
+ ssl = zope.schema.Bool(title=u'SSL')
fixed = zope.schema.Bool(
title=u'Fixed account',
(at)(at) -55,6 +59,27 (at)(at)
description=u'Tuple of folder names on the path to the "Sent" folder '
u'within the profile')
+ def connect():
+ """Return a gocept.imapapi.interfaces.IAccount object."""
+
+ def folders(name=None):
+ """Return a list of folders inside `name'.
+
+ If `name' is None, return a list of folders in the account.
+ """
+
+ def create_folder(name):
+ """Create a folder in the account."""
+
+ def check_connection():
+ """Check if a connection to the imap server is possible."""
+
+ def folder_by_names(names, create=False):
+ """Return the folder given by its path.
+
+ If `create' is True, create the folder if it does not exist.
+ """
+
def get_sent_folder(create=False):
"""Return the "Sent" folder.
(at)(at) -62,9 +87,6 (at)(at)
"""
- def connect():
- """Return a gocept.imapapi.interfaces.IAccount object."""
-
class IRendered(zope.interface.Interface):
"""A structured rendition of a message or body part."""
|
SVN: r29313 - gocept.restmail/trunk/gocept/restmail
Thomas Lotze <tl(at)gocept.com> |
2009-02-25 14:07:00 |
[ FULL ]
|
Author: thomas
Date: Wed Feb 25 14:06:59 2009
New Revision: 29313
Log:
set INBOX as the sent folder by default
Modified:
gocept.restmail/trunk/gocept/restmail/imapaccount.py
Modified: gocept.restmail/trunk/gocept/restmail/imapaccount.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/imapaccount.py (original)
+++ gocept.restmail/trunk/gocept/restmail/imapaccount.py Wed Feb 25 14:06:59
2009
(at)(at) -60,7 +60,7 (at)(at)
self.port = port
self.user = user
self.password = password
- self.sent_folder = sent_folder
+ self.sent_folder = sent_folder or (u'INBOX',)
self.default_identity = identity_id
self.ssl = ssl
self.fixed = fixed
|
SVN: r29314 - gocept.restmail/trunk/gocept/restmail/browser
Thomas Lotze <tl(at)gocept.com> |
2009-02-25 14:08:20 |
[ FULL ]
|
Author: thomas
Date: Wed Feb 25 14:08:19 2009
New Revision: 29314
Log:
set INBOX as the sent folder by default
Modified:
gocept.restmail/trunk/gocept/restmail/browser/README.txt
Modified: gocept.restmail/trunk/gocept/restmail/browser/README.txt
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/README.txt (original)
+++ gocept.restmail/trunk/gocept/restmail/browser/README.txt Wed Feb 25
14:08:19 2009
(at)(at) -144,7 +144,7 (at)(at)
'name': 'Ben Utzer',
'password': 'bsdf',
'port': 10143,
- 'sent_folder': [],
+ 'sent_folder': ['INBOX'],
'smtp_server': 'default-smtp',
'ssl': False,
'status': 'ok',
(at)(at) -157,7 +157,7 (at)(at)
'name': 'Ben Utzer',
'password': 'bsdf',
'port': 10143,
- 'sent_folder': [],
+ 'sent_folder': ['INBOX'],
'smtp_server': 'default-smtp',
'ssl': False,
'status': 'ok',
(at)(at) -307,7 +307,7 (at)(at)
'name': 'Ben Utzer',
'password': 'bsdf',
'port': 10143,
- 'sent_folder': [],
+ 'sent_folder': ['INBOX'],
'smtp_server': 'default-smtp',
'ssl': False,
'status': 'ok',
|
SVN: r29321 - gocept.restmail/trunk/gocept/restmail/browser
Thomas Lotze <tl(at)gocept.com> |
2009-02-26 09:34:36 |
[ FULL ]
|
Author: thomas
Date: Thu Feb 26 09:34:35 2009
New Revision: 29321
Log:
no longer send the password to the UI when editing an account, fixes #4714
Modified:
gocept.restmail/trunk/gocept/restmail/browser/account.py
gocept.restmail/trunk/gocept/restmail/browser/profile.py
Modified: gocept.restmail/trunk/gocept/restmail/browser/account.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/account.py (original)
+++ gocept.restmail/trunk/gocept/restmail/browser/account.py Thu Feb 26
09:34:35 2009
(at)(at) -20,7 +20,8 (at)(at)
self.context.port = port
self.context.ssl = ssl
self.context.user = user
- self.context.password = password
+ if password is not None:
+ self.context.password = password
self.context.sent_folder = tuple(
unicode(name) for name in sent_folder)
identity = gocept.restmail.interfaces.IIdentity(self.context)
(at)(at) -31,7 +32,8 (at)(at)
mailhost.smtp_host = smtp_host
mailhost.smtp_port = int(smtp_port)
mailhost.smtp_uid = smtp_user
- mailhost.smtp_pwd = smtp_password
+ if smtp_password is not None:
+ mailhost.smtp_pwd = smtp_password
(at)gocept.restmail.browser.json.view
def delete(self):
Modified: gocept.restmail/trunk/gocept/restmail/browser/profile.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/profile.py (original)
+++ gocept.restmail/trunk/gocept/restmail/browser/profile.py Thu Feb 26
09:34:35 2009
(at)(at) -34,14 +34,14 (at)(at)
'port': account.port,
'ssl': account.ssl,
'user': account.user,
- 'password': account.password,
+ 'password': bool(account.password),
'name': identity.name,
'address': identity.address,
'sent_folder': account.sent_folder,
'smtp_host': mailhost.smtp_host,
'smtp_port': mailhost.smtp_port,
'smtp_user': mailhost.smtp_uid,
- 'smtp_password': mailhost.smtp_pwd,
+ 'smtp_password': bool(mailhost.smtp_pwd),
'url': account.absolute_url(),
'fixed': account.fixed})
return data
|
SVN: r29323 - gocept.restmail/trunk/gocept/restmail
Wolfgang Schnerring <ws(at)gocept.com> |
2009-02-26 09:41:50 |
[ FULL ]
|
Author: wosc
Date: Thu Feb 26 09:41:49 2009
New Revision: 29323
Log:
Re #4705: signal rendering failure with a RenderError, not by returning None
Modified:
gocept.restmail/trunk/gocept/restmail/render.py
Modified: gocept.restmail/trunk/gocept/restmail/render.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/render.py (original)
+++ gocept.restmail/trunk/gocept/restmail/render.py Thu Feb 26 09:41:49 2009
(at)(at) -7,6 +7,7 (at)(at)
import lxml.html
import lxml.html.clean
+from zope.component import ComponentLookupError
import Acquisition
import zope.component
import zope.interface
(at)(at) -104,15 +105,21 (at)(at)
if not content_type:
return
major, minor = content_type.split('/')
- rendered = zope.component.queryAdapter(
- part, gocept.restmail.interfaces.IRendered,
- name='%s_%s' % (major, minor))
- if not rendered:
- rendered = zope.component.queryAdapter(
+
+ try:
+ return zope.component.getAdapter(
+ part, gocept.restmail.interfaces.IRendered,
+ name='%s_%s' % (major, minor))
+ except (ComponentLookupError, RenderError):
+ pass
+
+ try:
+ return zope.component.getAdapter(
part, gocept.restmail.interfaces.IRendered, name=major)
- if not rendered:
- rendered = RenderedAttachment(part)
- return rendered
+ except (ComponentLookupError, RenderError):
+ pass
+
+ return RenderedAttachment(part)
(at)zope.interface.implementer(gocept.restmail.interfaces.IRendered)
(at)(at) -121,7 +128,10 (at)(at)
"""Provide a body representation for multipart/alternative."""
subparts = []
for candidate in reversed(part.parts()[:]):
- rendered = gocept.restmail.interfaces.IRendered(candidate)
+ try:
+ rendered = gocept.restmail.interfaces.IRendered(candidate)
+ except RenderError:
+ continue
subparts.append(rendered)
if rendered.inline:
break
(at)(at) -167,6 +177,10 (at)(at)
return BodyTextHTML(part)()
+class RenderError(Exception):
+ pass
+
+
class BodyTextHTML(object):
"""View helper for body parts of type text/html."""
(at)(at) -182,8 +196,8 (at)(at)
body = tree.body
body.tag = 'div'
return RenderedInline(self.context, body)
- except lxml.etree.ParseError:
- return None
+ except lxml.etree.ParseError, e:
+ raise RenderError(e)
def _parse(self, text, encoding):
try:
|
SVN: r29327 - gocept.restmail/trunk/gocept/restmail
Wolfgang Schnerring <ws(at)gocept.com> |
2009-02-26 11:17:15 |
[ FULL ]
|
Author: wosc
Date: Thu Feb 26 11:17:13 2009
New Revision: 29327
Log:
this profile.py belongs to r29326, whereas browser/profile.py belongs to the
next commit. sorry.
Modified:
gocept.restmail/trunk/gocept/restmail/profile.py
Modified: gocept.restmail/trunk/gocept/restmail/profile.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/profile.py (original)
+++ gocept.restmail/trunk/gocept/restmail/profile.py Thu Feb 26 11:17:13 2009
(at)(at) -11,6 +11,8 (at)(at)
from OFS.ObjectManager import ObjectManager
from OFS.PropertyManager import PropertyManager
+import gocept.restmail.draft
+
class Profile(Acquisition.Implicit,
ObjectManager, PropertyManager, RoleManager, Item):
(at)(at) -34,13 +36,13 (at)(at)
return self, ["index_html"]
def manage_afterAdd(self, item, container):
- self.manage_addProduct['OFSP'].manage_addFolder('drafts')
+ self.drafts = gocept.restmail.draft.DraftFolder('drafts')
for permission in [
'View', 'Access contents information', 'Use webmail']:
self.manage_permission(permission, ['Manager', 'Owner'], False)
def new_draft(self, message=None):
- return gocept.restmail.draft.new_draft(self['drafts'], message)
+ return gocept.restmail.draft.new_draft(self.drafts, message)
def manage_identities(self):
return self.objectIds('Webmail Identity')
|
SVN: r29328 - gocept.restmail/trunk/gocept/restmail/browser
Wolfgang Schnerring <ws(at)gocept.com> |
2009-02-26 11:18:54 |
[ FULL ]
|
Author: wosc
Date: Thu Feb 26 11:18:53 2009
New Revision: 29328
Log:
Re #4713: return draft list in batch-compatible format.
(browser/profile.py was accidentally commited in r29326 already)
Modified:
gocept.restmail/trunk/gocept/restmail/browser/README.txt
gocept.restmail/trunk/gocept/restmail/browser/zmi.txt
Modified: gocept.restmail/trunk/gocept/restmail/browser/README.txt
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/README.txt (original)
+++ gocept.restmail/trunk/gocept/restmail/browser/README.txt Thu Feb 26
11:18:53 2009
(at)(at) -591,10 +591,16 (at)(at)
-----------------------------------------
>>> pprint.pprint(json_request('http://localhost/profile/(at)(at)drafts'))
-[{'date': '<ISO DATE>',
- 'subject': '',
- 'to': '',
- 'url': 'http://localhost/profile/drafts/<GUID>'}]
+{'batch_size': 10,
+ 'batch_start': 0,
+ 'messages': [{'date': '<ISO DATE>',
+ 'subject': '',
+ 'to': '',
+ 'url': 'http://localhost/profile/drafts/<GUID>'}],
+ 'returned': 1,
+ 'sort_dir': 'desc',
+ 'sort_key': 'date',
+ 'total': 1}
Updating draft messages and retrieving raw data
Modified: gocept.restmail/trunk/gocept/restmail/browser/zmi.txt
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/zmi.txt (original)
+++ gocept.restmail/trunk/gocept/restmail/browser/zmi.txt Thu Feb 26 11:18:53
2009
(at)(at) -20,7 +20,7 (at)(at)
Within the profile, there is an (empty) drafts folder:
>>> getRootFolder()['profile']['drafts']
-<Folder at /profile/drafts>
+<DraftFolder at /profile/drafts>
>>> getRootFolder()['profile']['drafts'].objectValues()
[]
|
SVN: r29331 - gocept.restmail/trunk/gocept/restmail/browser
Thomas Lotze <tl(at)gocept.com> |
2009-02-26 11:22:00 |
[ FULL ]
|
Author: thomas
Date: Thu Feb 26 11:21:59 2009
New Revision: 29331
Log:
show sender info in account list
Modified:
gocept.restmail/trunk/gocept/restmail/browser/README.txt
gocept.restmail/trunk/gocept/restmail/browser/profile.py
Modified: gocept.restmail/trunk/gocept/restmail/browser/README.txt
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/README.txt (original)
+++ gocept.restmail/trunk/gocept/restmail/browser/README.txt Thu Feb 26
11:21:59 2009
(at)(at) -141,6 +141,7 (at)(at)
>>> pprint.pprint(json_request('http://localhost/profile/(at)(at)accounts'))
[{'address': 'ben(at)example.com',
'fixed': False,
+ 'from': 'Ben Utzer <ben(at)example.com>',
'host': 'localhost',
'name': 'Ben Utzer',
'password': 'bsdf',
(at)(at) -156,6 +157,7 (at)(at)
'user': 'test'},
{'address': 'ben(at)example.com',
'fixed': False,
+ 'from': 'Ben Utzer <ben(at)example.com>',
'host': 'localhost',
'name': 'Ben Utzer',
'password': 'bsdf',
(at)(at) -297,6 +299,7 (at)(at)
>>> pprint.pprint(json_request('http://localhost/profile/(at)(at)accounts'))
[{'address': 'ben(at)example.com',
'fixed': False,
+ 'from': 'Ben Utzer <ben(at)example.com>',
'host': 'localhost',
'name': 'Ben Utzer',
'password': 'bsdf',
(at)(at) -312,6 +315,7 (at)(at)
'user': 'test'},
{'address': 'ben(at)example.com',
'fixed': False,
+ 'from': 'Ben Utzer <ben(at)example.com>',
'host': 'localhost',
'name': 'Ben Utzer',
'password': 'bsdf',
Modified: gocept.restmail/trunk/gocept/restmail/browser/profile.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/profile.py (original)
+++ gocept.restmail/trunk/gocept/restmail/browser/profile.py Thu Feb 26
11:21:59 2009
(at)(at) -30,6 +30,7 (at)(at)
#XXX:Remove identity informations
data.append(
{'status': status,
+ 'from': xml.sax.saxutils.escape(identity.From() or u''),
'host': account.host,
'port': account.port,
'ssl': account.ssl,
|
SVN: r29333 - gocept.restmail/trunk/gocept/restmail/browser
Thomas Lotze <tl(at)gocept.com> |
2009-02-26 11:26:28 |
[ FULL ]
|
Author: thomas
Date: Thu Feb 26 11:26:27 2009
New Revision: 29333
Log:
fixed tests after stopping export of passwords to the UI
Modified:
gocept.restmail/trunk/gocept/restmail/browser/README.txt
Modified: gocept.restmail/trunk/gocept/restmail/browser/README.txt
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/README.txt (original)
+++ gocept.restmail/trunk/gocept/restmail/browser/README.txt Thu Feb 26
11:26:27 2009
(at)(at) -144,11 +144,11 (at)(at)
'from': 'Ben Utzer <ben(at)example.com>',
'host': 'localhost',
'name': 'Ben Utzer',
- 'password': 'bsdf',
+ 'password': True,
'port': 10143,
'sent_folder': ['INBOX'],
'smtp_host': 'mail.localhost',
- 'smtp_password': None,
+ 'smtp_password': False,
'smtp_port': 25,
'smtp_user': 'smtptest',
'ssl': False,
(at)(at) -160,11 +160,11 (at)(at)
'from': 'Ben Utzer <ben(at)example.com>',
'host': 'localhost',
'name': 'Ben Utzer',
- 'password': 'bsdf',
+ 'password': True,
'port': 10143,
'sent_folder': ['INBOX'],
'smtp_host': '',
- 'smtp_password': None,
+ 'smtp_password': False,
'smtp_port': 25,
'smtp_user': None,
'ssl': False,
(at)(at) -302,11 +302,11 (at)(at)
'from': 'Ben Utzer <ben(at)example.com>',
'host': 'localhost',
'name': 'Ben Utzer',
- 'password': 'bsdf',
+ 'password': True,
'port': 10143,
'sent_folder': ['Sent'],
'smtp_host': 'mail.localhost',
- 'smtp_password': None,
+ 'smtp_password': False,
'smtp_port': 25,
'smtp_user': 'smtptest',
'ssl': True,
(at)(at) -318,11 +318,11 (at)(at)
'from': 'Ben Utzer <ben(at)example.com>',
'host': 'localhost',
'name': 'Ben Utzer',
- 'password': 'bsdf',
+ 'password': True,
'port': 10143,
'sent_folder': ['INBOX'],
'smtp_host': '',
- 'smtp_password': None,
+ 'smtp_password': False,
'smtp_port': 25,
'smtp_user': None,
'ssl': False,
|
SVN: r29337 - gocept.testdb/trunk
Wolfgang Schnerring <ws(at)gocept.com> |
2009-02-26 11:36:03 |
[ FULL ]
|
Author: wosc
Date: Thu Feb 26 11:36:02 2009
New Revision: 29337
Log:
vb
Modified:
gocept.testdb/trunk/setup.py
Modified: gocept.testdb/trunk/setup.py
==============================================================================
--- gocept.testdb/trunk/setup.py (original)
+++ gocept.testdb/trunk/setup.py Thu Feb 26 11:36:02 2009
(at)(at) -7,7 +7,7 (at)(at)
setup(
name='gocept.testdb',
- version='0.2dev',
+ version='0.3dev',
author='gocept',
author_email='mail(at)gocept.com',
description='Creates and drops temporary databases for testing purposes.',
|
SVN: r29343 - gocept.restmail/trunk/gocept/restmail
Sebastian Wehrmann <sw(at)gocept.com> |
2009-02-26 14:15:41 |
[ FULL ]
|
Author: sweh
Date: Thu Feb 26 14:15:40 2009
New Revision: 29343
Log:
- User correct schema type for imap password.
Modified:
gocept.restmail/trunk/gocept/restmail/interfaces.py
Modified: gocept.restmail/trunk/gocept/restmail/interfaces.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/interfaces.py (original)
+++ gocept.restmail/trunk/gocept/restmail/interfaces.py Thu Feb 26 14:15:40
2009
(at)(at) -44,7 +44,7 (at)(at)
host = zope.schema.TextLine(title=u'Host name')
port = zope.schema.Int(title=u'Server port')
user = zope.schema.TextLine(title=u'User name')
- password = zope.schema.TextLine(title=u'Password')
+ password = zope.schema.Password(title=u'Password')
ssl = zope.schema.Bool(title=u'SSL')
fixed = zope.schema.Bool(
|
SVN: r29348 - gocept.restmail/trunk/gocept/restmail/browser
Thomas Lotze <tl(at)gocept.com> |
2009-02-26 19:16:01 |
[ FULL ]
|
Author: thomas
Date: Thu Feb 26 19:15:59 2009
New Revision: 29348
Log:
query account status asynchronously, fixes #4617
Modified:
gocept.restmail/trunk/gocept/restmail/browser/README.txt
gocept.restmail/trunk/gocept/restmail/browser/account.py
gocept.restmail/trunk/gocept/restmail/browser/configure.zcml
gocept.restmail/trunk/gocept/restmail/browser/profile.py
Modified: gocept.restmail/trunk/gocept/restmail/browser/README.txt
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/README.txt (original)
+++ gocept.restmail/trunk/gocept/restmail/browser/README.txt Thu Feb 26
19:15:59 2009
(at)(at) -152,7 +152,6 (at)(at)
'smtp_port': 25,
'smtp_user': 'smtptest',
'ssl': False,
- 'status': 'ok',
'title': None,
'url': 'http://localhost/profile/test-localhost',
'user': 'test'},
(at)(at) -169,7 +168,6 (at)(at)
'smtp_port': 25,
'smtp_user': None,
'ssl': False,
- 'status': 'ok',
'title': None,
'url': 'http://localhost/profile/test-localhost-1',
'user': 'test'}]
(at)(at) -312,7 +310,6 (at)(at)
'smtp_port': 25,
'smtp_user': 'smtptest',
'ssl': True,
- 'status': 'failure',
'title': None,
'url': 'http://localhost/profile/test-localhost',
'user': 'test'},
(at)(at) -329,11 +326,15 (at)(at)
'smtp_port': 25,
'smtp_user': None,
'ssl': False,
- 'status': 'ok',
'title': None,
'url': 'http://localhost/profile/test-localhost-1',
'user': 'test'}]
+The edited account is no longer available now:
+
+>>> json_request('http://localhost/profile/test-localhost/(at)(at)status')
+'failure'
+
Switch SSL off again since the account will be used again later.
>>> json_request('http://localhost/profile/test-localhost/(at)(at)edit',
(at)(at) -348,8 +349,9 (at)(at)
>>> pprint.pprint(json_request('http://localhost/profile/(at)(at)accounts'))
[{...
'ssl': False,
- 'status': 'ok',
...}]
+>>> json_request('http://localhost/profile/test-localhost/(at)(at)status')
+'ok'
Delete an account: (at)(at)delete
Modified: gocept.restmail/trunk/gocept/restmail/browser/account.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/account.py (original)
+++ gocept.restmail/trunk/gocept/restmail/browser/account.py Thu Feb 26
19:15:59 2009
(at)(at) -46,3 +46,11 (at)(at)
account.getParentNode().manage_delObjects(account.getId())
identity.getParentNode().manage_delObjects(identity.getId())
mailhost.getParentNode().manage_delObjects(mailhost.getId())
+
+ (at)gocept.restmail.browser.json.view
+ def status(self):
+ if self.context.check_connection():
+ return 'ok'
+ else:
+ import time; time.sleep(3);
+ return 'failure'
Modified: gocept.restmail/trunk/gocept/restmail/browser/configure.zcml
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/configure.zcml (original)
+++ gocept.restmail/trunk/gocept/restmail/browser/configure.zcml Thu Feb 26
19:15:59 2009
(at)(at) -395,5 +395,10 (at)(at)
attribute="delete"
/>
+ <browser:page
+ name="status"
+ attribute="status"
+ />
+
</browser:pages>
</configure>
Modified: gocept.restmail/trunk/gocept/restmail/browser/profile.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/profile.py (original)
+++ gocept.restmail/trunk/gocept/restmail/browser/profile.py Thu Feb 26
19:15:59 2009
(at)(at) -24,12 +24,8 (at)(at)
for account in self.context.objectValues('IMAP Account'):
identity = gocept.restmail.interfaces.IIdentity(account)
mailhost = self.context[identity.mailhost_id]
- status = 'ok'
- if not account.check_connection():
- status = 'failure'
#XXX:Remove identity informations
- data.append(
- {'status': status,
+ data.append({
'from': xml.sax.saxutils.escape(identity.From() or u''),
'host': account.host,
'port': account.port,
|
SVN: r29350 - gocept.restmail/trunk/gocept/restmail/browser
Thomas Lotze <tl(at)gocept.com> |
2009-02-26 19:20:56 |
[ FULL ]
|
Author: thomas
Date: Thu Feb 26 19:20:55 2009
New Revision: 29350
Log:
removed debugging delay
Modified:
gocept.restmail/trunk/gocept/restmail/browser/account.py
Modified: gocept.restmail/trunk/gocept/restmail/browser/account.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/account.py (original)
+++ gocept.restmail/trunk/gocept/restmail/browser/account.py Thu Feb 26
19:20:55 2009
(at)(at) -52,5 +52,4 (at)(at)
if self.context.check_connection():
return 'ok'
else:
- import time; time.sleep(3);
return 'failure'
|
SVN: r29356 - gocept.restmail/trunk/gocept/restmail/browser
Wolfgang Schnerring <ws(at)gocept.com> |
2009-02-27 11:46:06 |
[ FULL ]
|
Author: wosc
Date: Fri Feb 27 11:46:04 2009
New Revision: 29356
Log:
Re #4670: clarified comments
Modified:
gocept.restmail/trunk/gocept/restmail/browser/draft.py
Modified: gocept.restmail/trunk/gocept/restmail/browser/draft.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/draft.py (original)
+++ gocept.restmail/trunk/gocept/restmail/browser/draft.py Fri Feb 27 11:46:04
2009
(at)(at) -38,8 +38,6 (at)(at)
def delete(self):
"""Delete draft."""
self.context.delete()
- # XXX: YUI does not consider 204 a success
- return 'OK'
(at)gocept.restmail.browser.json.view
def attachments(self):
(at)(at) -62,8 +60,8 (at)(at)
attachment.filename = upload.filename
attachment.content_type = upload.headers['Content-type']
attachment.set_body(upload)
- # XXX: YUI can't parse HTTP response for uploads, so just sending 204
- # will not trigger its response handler
+ # XXX: YUI can't parse HTTP response for uploads, and somehow just
+ # sending 204 will not trigger its response handler
return 'OK'
|
SVN: r29357 - gocept.restmail/trunk/gocept/restmail/browser
Wolfgang Schnerring <ws(at)gocept.com> |
2009-02-27 12:23:17 |
[ FULL ]
|
Author: wosc
Date: Fri Feb 27 12:23:15 2009
New Revision: 29357
Log:
Close #4670: there is no way to work around browser limitations but to always
return *some* content after a fileupload.
Modified:
gocept.restmail/trunk/gocept/restmail/browser/draft.py
Modified: gocept.restmail/trunk/gocept/restmail/browser/draft.py
==============================================================================
--- gocept.restmail/trunk/gocept/restmail/browser/draft.py (original)
+++ gocept.restmail/trunk/gocept/restmail/browser/draft.py Fri Feb 27 12:23:15
2009
(at)(at) -50,18 +50,23 (at)(at)
def add_attachment(self):
"""Create an attachment from an uploaded file."""
+
+ # YUI uses an iframe for fileuploads, and calls the upload-callback
when
+ # the iframe fires its onload event. But this does not seem to happen
+ # when the browser does not receive any content (e. g. when we return
+ # None, Zope will send HTTP 204, but no content).
+ # There does not seem to be a way around this, so we need to return
+ # *something* from this method in any case.
+
upload = self.request['file']
has_content = upload.read(1)
if not has_content:
- # XXX YUI and HTTP, see below
return 'BAD'
upload.seek(0)
attachment = self.context.add_attachment()
attachment.filename = upload.filename
attachment.content_type = upload.headers['Content-type']
attachment.set_body(upload)
- # XXX: YUI can't parse HTTP response for uploads, and somehow just
- # sending 204 will not trigger its response handler
return 'OK'
|
SVN: r29358 - gocept.webmail/trunk/gocept/webmail/browser/resources/images
Sebastian Wehrmann <sw(at)gocept.com> |
2009-02-27 12:57:39 |
[ FULL ]
|
Author: sweh
Date: Fri Feb 27 12:57:38 2009
New Revision: 29358
Log:
- Add an icon for flagged messages.
Added:
gocept.webmail/trunk/gocept/webmail/browser/resources/images/mail-flagged.png
(contents, props changed)
Added:
gocept.webmail/trunk/gocept/webmail/browser/resources/images/mail-flagged.png
==============================================================================
Binary file. No diff available.
|
|