Changeset 105:87a0409582f7
- Timestamp:
- 05/02/2010 19:07:51 (7 months ago)
- Branch:
- default
- Files:
-
- 1 added
- 13 edited
-
admin/templatetags/admin_extras.py (modified) (1 diff)
-
admin/views.py (modified) (1 diff)
-
extensions/webmail/imap_listing.py (modified) (5 diffs)
-
extensions/webmail/main.py (modified) (4 diffs)
-
extensions/webmail/templates/index.html (modified) (2 diffs)
-
lib/__init__.py (modified) (1 diff)
-
lib/email_listing.py (modified) (1 diff)
-
lib/parameters.py (modified) (1 diff)
-
static/js/common.js (modified) (1 diff)
-
static/js/domains.js (modified) (1 diff)
-
static/js/settings.js (modified) (1 diff)
-
static/stylesheets/default.css (modified) (2 diffs)
-
templates/common/error.html (added)
-
templates/common/tables.html (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
admin/templatetags/admin_extras.py
r104 r105 91 91 @register.simple_tag 92 92 def param(app, definition): 93 print definition94 93 result = """<div class='row'> 95 94 <label>%s</label>""" % definition["name"] 95 name = "%s.%s" % (app, definition["name"]) 96 96 if definition["type"] in ["string", "int"]: 97 97 value = definition.has_key("value") \ 98 98 and definition["value"] or definition["default"] 99 name = "%s.%s" % (app, definition["name"])100 99 result += """ 101 100 <input type='text' name='%s' id='%s' value='%s' />""" % (name, name, value) 102 if definition["type"] in ["list" ]:101 if definition["type"] in ["list", "list_yesno"]: 103 102 result += """ 104 <select name='' id=''>""" 105 103 <select name='%s' id='%s'>""" % (name, name) 104 values = [] 105 if definition["type"] == "list_yesno": 106 values = [("yes", _("Yes")), ("no", _("No"))] 107 else: 108 if definition.has_key("values"): 109 values = definition["values"] 110 value = definition.has_key("value") \ 111 and definition["value"] or definition["default"] 112 for v in values: 113 selected = "" 114 if value == v[0]: 115 selected = " selected='selected'" 116 result += "<option value='%s'%s>%s</option>\n" % (v[0], selected, v[1]) 106 117 result += """ 107 118 </select> -
admin/views.py
r104 r105 414 414 tmp = {"name" : app, "params" : []} 415 415 for p in sorted(parameters._params[app]): 416 tmp["params"] += [{"name" : p, "value" : parameters.get(app, p), 416 tmp["params"] += [{"name" : p, 417 "value" : parameters.get(app, p), 417 418 "help" : parameters._params[app][p]["help"], 419 "default" : parameters._params[app][p]["default"], 418 420 "type" : parameters._params[app][p]["type"]}] 419 421 gparams += [tmp] -
extensions/webmail/imap_listing.py
r103 r105 4 4 import time 5 5 import imaplib 6 import ssl 6 7 from datetime import datetime, timedelta 7 8 from email.header import decode_header … … 70 71 @staticmethod 71 72 def parse_date(value): 72 ndate = datetime(*(email.utils.parsedate_tz(value))[:7]) 73 tmp = email.utils.parsedate_tz(value) 74 if not tmp: 75 return value 76 ndate = datetime(*(tmp)[:7]) 73 77 now = datetime.now() 74 78 if now - ndate > timedelta(7): … … 91 95 def __init__(self, request=None, user=None, password=None): 92 96 self.address = parameters.get("webmail", "IMAP_SERVER") 97 self.port = int(parameters.get("webmail", "IMAP_PORT")) 93 98 if request: 94 99 status, msg = self.login(request.user.username, … … 97 102 status, msg = self.login(user, password) 98 103 if not status: 99 # Gestion d'erreur 100 pass 104 raise Exception(msg) 101 105 102 106 def login(self, user, passwd): 103 107 import imaplib 104 108 try: 105 self.m = imaplib.IMAP4_SSL(self.address) 109 secured = parameters.get("webmail", "IMAP_SECURED") 110 if secured == "yes": 111 self.m = imaplib.IMAP4_SSL(self.address, self.port) 112 else: 113 self.m = imaplib.IMAP4(self.address, self.port) 114 except (imaplib.IMAP4.error, ssl.SSLError), error: 115 return False, _("Connection to IMAP server failed, check your configuration") 116 try: 106 117 self.m.login(user, passwd) 107 except imaplib.IMAP4.error, test: 108 return False, test 118 except (imaplib.IMAP4.error, ssl.SSLError), error: 119 return False, _("Authentication failed, check your configuration") 120 109 121 return True, None 110 122 … … 114 126 return folder.encode("imap4-utf-7") 115 127 116 def messages_count(self, folder=None): 128 def messages_count(self, folder=None, order=None): 129 if order: 130 sign = order[:1] 131 criterion = order[1:].upper() 132 if sign == '-': 133 criterion = "REVERSE %s" % criterion 134 else: 135 criterion = "REVERSE DATE" 136 print criterion 137 117 138 (status, data) = self.m.select(self._encodefolder(folder)) 118 (status, data) = self.m.sort("( REVERSE DATE)", "UTF-8", "(NOT DELETED)")139 (status, data) = self.m.sort("(%s)" % criterion, "UTF-8", "(NOT DELETED)") 119 140 self.messages = data[0].split() 120 141 return len(self.messages) -
extensions/webmail/main.py
r104 r105 10 10 from django.contrib.auth.decorators import login_required 11 11 from mailng.admin.models import Mailbox 12 from mailng.lib import events, parameters, _render 12 from mailng.lib import events, parameters, _render, _render_error 13 13 from mailng.lib.email_listing import Email 14 14 from imap_listing import * … … 21 21 parameters.register("webmail", "IMAP_SERVER", "string", "127.0.0.1", 22 22 help=_("Address of your IMAP server")) 23 parameters.register("webmail", "IMAP_SECURED", "list ", "No",23 parameters.register("webmail", "IMAP_SECURED", "list_yesno", "no", 24 24 help=_("Use a secure connexion to access IMAP server")) 25 25 parameters.register("webmail", "IMAP_PORT", "int", "143", … … 61 61 request.session["folder"] = name 62 62 request.session["page"] = pageid 63 order = request.GET.has_key("order") and request.GET["order"] or None 63 64 lst = ImapListing(request.user.username, request.session["password"], 64 name, folder=name )65 name, folder=name, order=order) 65 66 page = lst.paginator.getpage(request.session["page"]) 66 67 if page: … … 76 77 @login_required 77 78 def index(request): 78 lst = ImapListing(request.user.username, request.session["password"], 79 "INBOX", folder="INBOX") 79 try: 80 lst = ImapListing(request.user.username, request.session["password"], 81 "INBOX", folder="INBOX") 82 except Exception as exp: 83 return _render_error(request, {"error" : exp}) 80 84 return lst.render(request, empty=True) 81 85 -
extensions/webmail/templates/index.html
r102 r105 208 208 }); 209 209 $$("tr").addEvent("dblclick", viewmail); 210 var sortOrder = ""; 211 $$("th[class=sortable]").addEvent("click", function(evt) { 212 var tmp = "?"; 213 214 if (sortOrder == "") { 215 test = /order=([\+\-]\w+$|&)/.exec(location.hash); 216 if (test) { 217 sortOrder = test[1]; 218 } 219 } 220 if (sortOrder.substring(1) == evt.target.id) { 221 var sign = (sortOrder.charAt(0) == '+') ? '-' : '+'; 222 sortOrder = sign + evt.target.id; 223 } else { 224 sortOrder = "-" + evt.target.id; 225 } 226 if (location.hash.indexOf("?") != -1) { 227 if (location.hash.indexOf("order") != -1) { 228 location.hash = location.hash.replace(/order=[\+\-]\w+$|&/, 229 "order=" + sortOrder); 230 return; 231 } 232 tmp = "&"; 233 } 234 location.hash += tmp + "order=" + sortOrder; 235 }); 210 236 }); 211 237 … … 225 251 {% endblock %} 226 252 {% block middletitle %}{% trans "Webmail" %}{% endblock %} 227 {% block menu %}228 {% load webextras %}229 {% listing_menu "" "INBOX" perms %}230 {% endblock %}231 253 {% block leftcol %} 232 254 <div id="leftcol" class="box"> -
lib/__init__.py
r101 r105 51 51 context_instance=RequestContext(request)) 52 52 53 def _render_error(request, user_context): 54 return render_to_response("common/error.html", user_context, 55 context_instance=RequestContext(request)) 56 53 57 def exec_as_vuser(cmd): 54 58 code, output = exec_pipe("sudo -u %s %s" % (settings.VIRTUAL_UID, cmd)) -
lib/email_listing.py
r100 r105 81 81 self.folder = folder 82 82 self.elems_per_page = elems_per_page 83 self.paginator = Paginator(self.mbc.messages_count(self.folder), 83 order = "order" in kwargs.keys() and kwargs["order"] or None 84 self.paginator = Paginator(self.mbc.messages_count(self.folder, order), 84 85 elems_per_page) 85 86 -
lib/parameters.py
r90 r105 25 25 self.name) 26 26 27 def register(app, name, type="string", deflt=None, help=None ):27 def register(app, name, type="string", deflt=None, help=None, **kwargs): 28 28 """Register a new parameter. 29 29 -
static/js/common.js
r100 r105 24 24 } else { 25 25 var splits = current_anchor.substring(1).split('?'); 26 var section = splits[0];26 var section = (splits[0] != "") ? splits[0] : "INBOX"; 27 27 delete splits[0]; 28 28 var params = splits.join('&'); -
static/js/domains.js
r90 r105 67 67 } 68 68 }); 69 setDivHeight("content", 20, 0); 69 70 }); 70 71 -
static/js/settings.js
r103 r105 4 4 5 5 }); 6 setDivHeight("content", 20, 0); 6 7 7 8 if ($$("a[name=deletePerm]")) -
static/stylesheets/default.css
r103 r105 263 263 264 264 .toggler { 265 color: #222; 266 margin: 0; 265 margin: 5px auto; 267 266 padding: 2px 5px; 268 background: #eee; 269 border-bottom: 1px solid #ddd; 270 border-right: 1px solid #ddd; 271 border-top: 1px solid #f5f5f5; 272 border-left: 1px solid #f5f5f5; 273 font-size: small; 274 font-weight: normal; 267 background: #CEDBEC; 268 -moz-border-radius: 5px; 269 -webkit-border-radius: 5px; 270 /*border: 1px solid #CCC;*/ 271 font-size: 1.1em; 275 272 } 276 273 … … 288 285 padding: 3px 0; 289 286 } 287 288 .error { 289 margin: 0 auto; 290 padding: 5px; 291 background: red; 292 width: 500px; 293 text-align: center; 294 background-color: #F9D2D2; 295 border: 3px solid #FF2A2A; 296 color: #FF2A00; 297 } -
templates/common/tables.html
r100 r105 3 3 <tr> 4 4 {% for c in table.columns %} 5 <th width="{{ c.width }}">{{ c|safe }}</th>5 <th id="{{ c.name }}" class="sortable" width="{{ c.width }}">{{ c|safe }}</th> 6 6 {% endfor %} 7 7 </tr>
Note: See TracChangeset
for help on using the changeset viewer.
