Changeset 117:46e0f085f4ef
- Timestamp:
- 09/03/2010 15:39:43 (5 months ago)
- Branch:
- default
- Files:
-
- 7 edited
-
extensions/webmail/imap_listing.py (modified) (6 diffs)
-
extensions/webmail/main.py (modified) (7 diffs)
-
extensions/webmail/templates/compose.html (modified) (1 diff)
-
extensions/webmail/templates/index.html (modified) (3 diffs)
-
extensions/webmail/templatetags/webextras.py (modified) (1 diff)
-
extensions/webmail/urls.py (modified) (1 diff)
-
static/stylesheets/default.css (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
extensions/webmail/imap_listing.py
r116 r117 57 57 self.fulladdress = "%s <%s>" % (self.name, self.address) 58 58 59 def __str__(self): 60 return self.fulladdress 61 59 62 class IMAPheader(object): 60 63 @staticmethod 61 def parse_address(value ):64 def parse_address(value, **kwargs): 62 65 addr = EmailAddress(value) 66 if "full" in kwargs.keys() and kwargs["full"]: 67 return addr.fulladdress 63 68 return addr.name and addr.name or value 64 69 65 70 @staticmethod 66 def parse_address_list(values ):71 def parse_address_list(values, **kwargs): 67 72 lst = values.split(",") 68 73 result = "" … … 70 75 if result != "": 71 76 result += ", " 72 result += IMAPheader.parse_address(addr )77 result += IMAPheader.parse_address(addr, **kwargs) 73 78 return result 74 79 75 80 @staticmethod 76 def parse_from(value): 77 return IMAPheader.parse_address(value) 78 79 @staticmethod 80 def parse_to(value): 81 return IMAPheader.parse_address_list(value) 82 83 @staticmethod 84 def parse_cc(value): 85 return IMAPheader.parse_address_list(value) 86 87 @staticmethod 88 def parse_date(value): 81 def parse_from(value, **kwargs): 82 return IMAPheader.parse_address(value, **kwargs) 83 84 @staticmethod 85 def parse_to(value, **kwargs): 86 return IMAPheader.parse_address_list(value, **kwargs) 87 88 @staticmethod 89 def parse_cc(value, **kwargs): 90 return IMAPheader.parse_address_list(value, **kwargs) 91 92 @staticmethod 93 def parse_reply_to(value, **kwargs): 94 return IMAPheader.parse_address_list(value, **kwargs) 95 96 @staticmethod 97 def parse_date(value, **kwargs): 89 98 tmp = email.utils.parsedate_tz(value) 90 99 if not tmp: … … 97 106 98 107 @staticmethod 99 def parse_subject(value ):108 def parse_subject(value, **kwargs): 100 109 res = "" 101 110 dcd = decode_header(value) … … 186 195 folder, id = imapid.split("/") 187 196 self.m.store(id, "+FLAGS", "\\Seen") 197 198 def msgforwarded(self, folder, imapid): 199 self.m.select(self._encodefolder(folder), True) 200 self.m.store(imapid, "+FLAGS", "$Forwarded") 188 201 189 202 def move(self, msgset, oldfolder, newfolder): … … 255 268 256 269 class ImapEmail(Email): 257 def __init__(self, msg, **kwargs):270 def __init__(self, msg, addrfull=False, **kwargs): 258 271 Email.__init__(self, msg, **kwargs) 259 272 … … 266 279 continue 267 280 try: 268 self.headers += [{"name" : label, "value" : getattr(IMAPheader, "parse_%s" % f.lower())(msg[f])}] 281 key = re.sub("-", "_", f).lower() 282 value = getattr(IMAPheader, "parse_%s" % key)(msg[f], full=addrfull) 283 self.headers += [{"name" : label, "value" : value}] 269 284 except AttributeError: 270 285 self.headers += [{"name" : label, "value" : msg[f]}] 271 286 try: 287 label = re.sub("-", "_", label) 288 setattr(self, label, value) 289 except: 290 pass 291 -
extensions/webmail/main.py
r116 r117 181 181 return folder(request, name, False) 182 182 183 def render_compose(request, form, bodyheader=None, body=None):183 def render_compose(request, form, posturl, bodyheader=None, body=None): 184 184 menu = compose_menu("", request.session, request.user.get_all_permissions()) 185 185 content = render_to_string("webmail/compose.html", { 186 "form" : form, "bodyheader" : bodyheader, "body" : body 186 "form" : form, "bodyheader" : bodyheader, "body" : body, 187 "posturl" : posturl 187 188 }) 188 189 ctx = getctx("ok", level=2, menu=menu, listing=content) 189 190 return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") 190 191 191 def send_mail(request ):192 def send_mail(request, withctx=False): 192 193 form = ComposeMailForm(request.POST) 193 194 if form.is_valid(): … … 210 211 except (smtplib.SMTPException, ssl.SSLError), error: 211 212 print error 213 # Prévoir la remontée de cette erreur au niveau du client!! 212 214 213 215 if parameters.get("webmail", "SMTP_AUTHENTICATION") == "yes": … … 217 219 ctx = getctx("ok", url="%s?page=%s" % (request.session["folder"], 218 220 request.session["page"])) 221 else: 222 ctx = getctx("ko", level=2, listing=render_to_string("webmail/compose.html", 223 {"form" : form})) 224 if not withctx: 219 225 return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") 226 return ctx, HttpResponse(simplejson.dumps(ctx), mimetype="application/json") 220 227 221 228 @login_required … … 226 233 form = ComposeMailForm() 227 234 form.fields["from_"].initial = request.user.username 228 return render_compose(request, form )235 return render_compose(request, form, reverse(compose)) 229 236 230 237 @login_required … … 233 240 return send_mail(request) 234 241 msg = fetchmail(request, folder, mail_id, True) 235 email = ImapEmail(msg )242 email = ImapEmail(msg, True) 236 243 lines = email.body.split('\n') 237 244 body = "" … … 243 250 form.fields["from_"].initial = request.user.username 244 251 if not "Reply-To" in msg.keys(): 245 form.fields["to"].initial = msg["From"]246 else: 247 form.fields["to"].initial = msg["Reply-To"]252 form.fields["to"].initial = email.From 253 else: 254 form.fields["to"].initial = email.Reply_To 248 255 if request.GET.has_key("all"): 249 256 form.fields["cc"].initial = "" … … 258 265 form.fields["cc"].initial += ", " 259 266 form.fields["cc"].initial += tmp.fulladdress 260 subject = IMAPheader.parse_subject(msg["Subject"]) 261 m = re.match("re\s*:\s*.+", subject.lower()) 267 m = re.match("re\s*:\s*.+", email.Subject.lower()) 262 268 if m: 263 form.fields["subject"].initial = subject 264 else: 265 form.fields["subject"].initial = "Re: %s" % subject 266 textheader = EmailAddress(msg["From"]).fulladdress + " " + _("wrote:") 267 return render_compose(request, form, textheader, body) 269 form.fields["subject"].initial = email.Subject 270 else: 271 form.fields["subject"].initial = "Re: %s" % email.Subject 272 textheader = "%s %s" % (email.From, _("wrote:")) 273 return render_compose(request, form, reverse(reply, args[folder, mail_id]), 274 textheader, body) 275 276 @login_required 277 def forward(request, folder, mail_id): 278 if request.method == "POST": 279 ctx, response = send_mail(request, True) 280 if ctx["status"] == "ok": 281 IMAPconnector(request).msgforwarded(folder, mail_id) 282 return response 283 284 msg = fetchmail(request, folder, mail_id, True) 285 email = ImapEmail(msg, True) 286 textheader = "----- %s -----" % _("Original message") 287 textheader += "\n%s: %s" % (_("Subject"), email.Subject) 288 textheader += "\n%s: %s" % (_("Date"), msg["Date"]) 289 for hdr in ["From", "To", "Reply-To"]: 290 try: 291 key = re.sub("-", "_", hdr) 292 value = getattr(email, key) 293 textheader += "\n%s: %s" % (_(hdr), value) 294 except: 295 pass 296 textheader += "\n" 297 298 form = ComposeMailForm() 299 form.fields["from_"].initial = request.user.username 300 form.fields["subject"].initial = "Fwd: %s" % email.Subject 301 return render_compose(request, form, reverse(forward, args=[folder, mail_id]), 302 textheader, email.body) -
extensions/webmail/templates/compose.html
r116 r117 38 38 </style> 39 39 40 {% url extensions.webmail.main.compose as compurl %} 41 <form method="POST" action="{{ compurl }}" id="composemail"> 40 <form method="POST" action="{{ posturl }}" id="composemail"> 42 41 <div id="compose-container"> 43 42 <div id="mailheader"> -
extensions/webmail/templates/index.html
r116 r117 162 162 $$("a[name=reply]").addEvent("click", reply); 163 163 $$("a[name=replyall]").addEvent("click", replyall); 164 $$("a[name=forward]").addEvent("click", forward); 164 165 $$("a[name=delete]").addEvent("click", function(event) { 165 166 var lnk = event.target; … … 183 184 onSuccess: function(resp) { 184 185 resp = JSON.decode(resp); 186 if (resp.status == "ko") { 187 updatelisting(resp); 188 window.fireEvent("resize"); 189 return; 190 } 185 191 current_anchor.parse_string(resp.url, true).setparams(navparams); 186 192 current_anchor.update(); … … 208 214 } 209 215 register_callback("replyall", compose_callback); 216 forward = function(event) { 217 event.stop(); 218 location.hash += event.target.get("href"); 219 } 220 register_callback("forward", compose_callback); 210 221 211 222 loadFolder = function(event, obj) { -
extensions/webmail/templatetags/webextras.py
r116 r117 40 40 "label" : _("Reply all")}, 41 41 {"name" : "forward", 42 "url" : " ",42 "url" : "forward/", 43 43 "img" : "/static/pics/alias.png", 44 44 "label" : _("Forward")}, -
extensions/webmail/urls.py
r115 r117 9 9 (r'^(?P<fdname>.+)/(?P<mail_id>[\w\-\+]+)/delete/$', 'delete'), 10 10 (r'^(?P<folder>.+)/(?P<mail_id>[\w\-\+]+)/content/$', 'getmailcontent'), 11 (r'^(?P<folder>.+)/(?P<mail_id>[\w\-\+]+)/forward/$', 'forward'), 11 12 (r'^(?P<folder>.+)/(?P<mail_id>[\w\-\+]+)/reply/$', 'reply'), 12 13 (r'^(?P<folder>.+)/(?P<mail_id>[\w\-\+]+)/$', 'viewmail'), -
static/stylesheets/default.css
r113 r117 348 348 color: #FF2A00; 349 349 } 350 351 .errorlist ul { 352 float: left; 353 list-style: none; 354 } 355 356 .errorlist li { 357 margin-left: 10px; 358 float: left; 359 display: inline; 360 color: red; 361 }
Note: See TracChangeset
for help on using the changeset viewer.
