def attachments(request, tplname="webmail/attachments.html"): if request.method == "POST": csuploader = AttachmentUploadHandler() request.upload_handlers.insert(0, csuploader) error = None form = AttachmentForm(request.POST, request.FILES) if form.is_valid(): try: fobj = request.FILES["attachment"] tmpname = save_attachment(fobj) request.session["compose_mail"]["attachments"] \ += [{"fname" : str(fobj), "content-type" : fobj.content_type, "size" : fobj.size, "tmpname" : os.path.basename(tmpname)}] request.session.modified = True return _render(request, "webmail/upload_done.html", { "status" : "ok", "fname" : request.FILES["attachment"], "tmpname" : os.path.basename(tmpname) }) except WebmailError, inst: error = _("Failed to save attachment: ") + str(inst) if csuploader.toobig: error = _("Attachment is too big (limit: %s)" \ % parameters.get_admin("MAX_ATTACHMENT_SIZE")) return _render(request, "webmail/upload_done.html", { "status" : "ko", "error" : error })
def attachments(request, tplname="webmail/attachments.html"): if request.method == "POST": csuploader = AttachmentUploadHandler() request.upload_handlers.insert(0, csuploader) error = None form = AttachmentForm(request.POST, request.FILES) if form.is_valid(): try: fobj = request.FILES["attachment"] tmpname = save_attachment(fobj) request.session["compose_mail"]["attachments"] \ += [{"fname" : str(fobj), "content-type" : fobj.content_type, "size" : fobj.size, "tmpname" : os.path.basename(tmpname)}] request.session.modified = True return _render( request, "webmail/upload_done.html", { "status": "ok", "fname": request.FILES["attachment"], "tmpname": os.path.basename(tmpname) }) except WebmailError, inst: error = _("Failed to save attachment: ") + str(inst) if csuploader.toobig: error = _("Attachment is too big (limit: %s)" \ % parameters.get_admin("MAX_ATTACHMENT_SIZE")) return _render(request, "webmail/upload_done.html", { "status": "ko", "error": error })
def newfolder(request, tplname="webmail/folder.html"): mbc = IMAPconnector(user=request.user.username, password=request.session["password"]) ctx = { "title": _("Create a new mailbox"), "formid": "mboxform", "action": reverse(newfolder), "action_label": _("Create"), "action_classes": "submit", "withunseen": False, "selectonly": True, "mboxes": mbc.getmboxes(request.user) } if request.method == "POST": form = FolderForm(request.POST) if form.is_valid(): pf = request.POST.get("parent_folder", None) mbc.create_folder(form.cleaned_data["name"], pf) return ajax_simple_response( dict(status="ok", respmsg=_("Mailbox created"), newmb=form.cleaned_data["name"], parent=pf)) ctx["form"] = form ctx["selected"] = None return ajax_response(request, status="ko", template=tplname, **ctx) ctx["form"] = FolderForm() ctx["selected"] = None return _render(request, tplname, ctx)
def newfolder(request, tplname="webmail/folder.html"): mbc = IMAPconnector(user=request.user.username, password=request.session["password"]) ctx = {"title": _("Create a new mailbox"), "formid": "mboxform", "action": reverse(newfolder), "action_label": _("Create"), "action_classes": "submit", "withunseen": False, "selectonly": True, "mboxes": mbc.getmboxes(request.user), "hdelimiter": mbc.hdelimiter} if request.method == "POST": form = FolderForm(request.POST) if form.is_valid(): pf = request.POST.get("parent_folder", None) mbc.create_folder(form.cleaned_data["name"], pf) return ajax_simple_response(dict( status="ok", respmsg=_("Mailbox created"), newmb=form.cleaned_data["name"], parent=pf )) ctx["form"] = form ctx["selected"] = None return ajax_response(request, status="ko", template=tplname, **ctx) ctx["form"] = FolderForm() ctx["selected"] = None return _render(request, tplname, ctx)
def viewheaders(request, mail_id): content = "" for qm in get_wrapper().get_mail_content(mail_id): content += qm.mail_text msg = email.message_from_string(content) return _render(request, 'amavis/viewheader.html', { "headers": msg.items() })
def getmailcontent(request): mbox = request.GET.get("mbox", None) mailid = request.GET.get("mailid", None) if mbox is None or mailid is None: raise WebmailError(_("Invalid request")) email = ImapEmail(mbox, mailid, request, links=int(request.GET["links"])) return _render(request, "common/viewmail.html", { "headers" : email.render_headers(folder=mbox, mail_id=mailid), "folder" : mbox, "imapid" : mailid, "mailbody" : email.body if email.body else "" })
def viewmail_selfservice(request, mail_id, tplname="amavis/viewmail_selfservice.html"): rcpt = request.GET.get("rcpt", None) secret_id = request.GET.get("secret_id", "") if rcpt is None: raise Http404 content = Template("""{% load url from future %} <iframe src="{% url 'modoboa.extensions.amavis.views.getmailcontent' mail_id %}" id="mailcontent"></iframe> """).render(Context(dict(mail_id=mail_id))) return _render(request, tplname, dict( mail_id=mail_id, rcpt=rcpt, secret_id=secret_id, content=content ))
def getmailcontent(request, mail_id): from sql_listing import SQLemail qmails = get_wrapper().get_mail_content(mail_id) content = "" for qm in qmails: content += qm.mail_text msg = email.message_from_string(content) mail = SQLemail(msg, mformat="plain", links="0") return _render(request, "common/viewmail.html", { "headers": mail.render_headers(), "mailbody": mail.body })
def getmailcontent(request): mbox = request.GET.get("mbox", None) mailid = request.GET.get("mailid", None) if mbox is None or mailid is None: raise WebmailError(_("Invalid request")) email = ImapEmail(mbox, mailid, request, links=int(request.GET["links"])) return _render( request, "common/viewmail.html", { "headers": email.render_headers(folder=mbox, mail_id=mailid), "folder": mbox, "imapid": mailid, "mailbody": email.body if email.body else "" })
def viewmail_selfservice(request, mail_id, tplname="amavis/viewmail_selfservice.html"): rcpt = request.GET.get("rcpt", None) secret_id = request.GET.get("secret_id", "") if rcpt is None: raise Http404 content = Template("""{% load url from future %} <iframe src="{% url 'modoboa.extensions.amavis.views.getmailcontent' mail_id %}" id="mailcontent"></iframe> """).render(Context(dict(mail_id=mail_id))) return _render( request, tplname, dict(mail_id=mail_id, rcpt=rcpt, secret_id=secret_id, content=content))
def newfilter(request, setname, tplname="sievefilters/filter.html"): ctx = dict( title=_("New filter"), formid="filterform", action=reverse(newfilter, args=[setname]), action_label=_("Create"), action_classes="submit" ) if request.method == "POST": return submitfilter(request, setname, _("Filter created"), tplname, ctx) conds = [("Subject", "contains", "")] actions = [("fileinto", "")] form = FilterForm(conds, actions, request) ctx = build_filter_ctx(ctx, form) return _render(request, tplname, ctx)
def editfolder(request, tplname="webmail/folder.html"): mbc = IMAPconnector(user=request.user.username, password=request.session["password"]) ctx = { "title": _("Edit mailbox"), "formid": "mboxform", "action": reverse(editfolder), "action_label": _("Update"), "action_classes": "submit", "withunseen": False, "selectonly": True } if request.method == "POST": form = FolderForm(request.POST) if form.is_valid(): pf = request.POST.get("parent_folder", None) ctx["selected"] = pf oldname, oldparent = separate_mailbox(request.POST["oldname"]) res = dict(status="ok", respmsg=_("Mailbox updated")) if form.cleaned_data["name"] != oldname \ or (pf != oldparent): newname = form.cleaned_data["name"] if pf is None \ else "%s.%s" % (pf, form.cleaned_data["name"]) mbc.rename_folder(request.POST["oldname"], newname) res["oldmb"] = oldname res["newmb"] = form.cleaned_data["name"] res["oldparent"] = oldparent res["newparent"] = pf if "mbox" in request.session: del request.session["mbox"] return ajax_simple_response(res) ctx["mboxes"] = mbc.getmboxes(request.user) ctx["form"] = form return ajax_response(request, status="ko", template=tplname, **ctx) name = request.GET.get("name", None) if name is None: raise WebmailError(_("Invalid request")) shortname, parent = separate_mailbox(name) ctx["mboxes"] = mbc.getmboxes(request.user, until_mailbox=parent) ctx["form"] = FolderForm() ctx["form"].fields["oldname"].initial = name ctx["form"].fields["name"].initial = shortname ctx["selected"] = parent return _render(request, tplname, ctx)
def editfolder(request, tplname="webmail/folder.html"): mbc = IMAPconnector(user=request.user.username, password=request.session["password"]) ctx = {"title" : _("Edit mailbox"), "formid" : "mboxform", "action" : reverse(editfolder), "action_label" : _("Update"), "action_classes" : "submit", "withunseen" : False, "selectonly" : True, "hdelimiter": mbc.hdelimiter} if request.method == "POST": form = FolderForm(request.POST) if form.is_valid(): pf = request.POST.get("parent_folder", None) ctx["selected"] = pf oldname, oldparent = separate_mailbox(request.POST["oldname"], sep=mbc.hdelimiter) res = dict(status="ok", respmsg=_("Mailbox updated")) if form.cleaned_data["name"] != oldname \ or (pf != oldparent): newname = form.cleaned_data["name"] if pf is None \ else "%s.%s" % (pf, form.cleaned_data["name"]) mbc.rename_folder(request.POST["oldname"], newname) res["oldmb"] = oldname res["newmb"] = form.cleaned_data["name"] res["oldparent"] = oldparent res["newparent"] = pf if "mbox" in request.session: del request.session["mbox"] return ajax_simple_response(res) ctx["mboxes"] = mbc.getmboxes(request.user) ctx["form"] = form return ajax_response(request, status="ko", template=tplname, **ctx) name = request.GET.get("name", None) if name is None: raise WebmailError(_("Invalid request")) shortname, parent = separate_mailbox(name, sep=mbc.hdelimiter) ctx["mboxes"] = mbc.getmboxes(request.user, until_mailbox=parent) ctx["form"] = FolderForm() ctx["form"].fields["oldname"].initial = name ctx["form"].fields["name"].initial = shortname ctx["selected"] = parent return _render(request, tplname, ctx)
def index(request): """ FIXME: how to select a default graph set ? """ deflocation = "graphs/?gset=mailtraffic" if not request.user.is_superuser: if not len(request.user.get_domains()): raise ModoboaException(_("No statistics available")) period = request.GET.get("period", "day") graph_sets = events.raiseDictEvent('GetGraphSets') return _render(request, 'stats/index.html', { "periods" : periods, "period" : period, "selection" : "stats", "deflocation" : deflocation, "graph_sets" : graph_sets })
def index(request): """ FIXME: how to select a default graph set ? """ deflocation = "graphs/?gset=mailtraffic" if not request.user.is_superuser: if not len(request.user.get_domains()): raise ModoboaException(_("No statistics available")) period = request.GET.get("period", "day") graph_sets = events.raiseDictEvent("GetGraphSets") return _render( request, "stats/index.html", { "periods": periods, "period": period, "selection": "stats", "deflocation": deflocation, "graph_sets": graph_sets, }, )
def editfilter(request, setname, fname, tplname="sievefilters/filter.html"): ctx = dict( title=_("Edit filter"), formid="filterform", action=reverse(editfilter, args=[setname, fname]), action_label=_("Update"), action_classes="submit" ) sc = SieveClient(user=request.user.username, password=request.session["password"]) if request.method == "POST": return submitfilter(request, setname, _("Filter modified"), tplname, ctx, update=True, sc=sc) fset = sc.getscript(setname, format="fset") f = fset.getfilter(fname) form = build_filter_form_from_filter(request, fname, f) ctx = build_filter_ctx(ctx, form) ctx["oldname"] = fname ctx["hidestyle"] = "none" \ if form.fields["match_type"].initial == "all" else "block" return _render(request, tplname, ctx)
except ConnectionError, e: return _render_error(request, user_context={"error" : e}) try: active_script, scripts = sc.listscripts() except Error, e: return _render_error(request, user_context={"error" : e}) if active_script is None: active_script = "" default_script = "%s/" % scripts[0] if len(scripts) else "" else: default_script = "%s/" % active_script return _render(request, tplname, { "selection" : "user", "active_script" : active_script, "default_script" : default_script, "scripts" : sorted(scripts), }) @login_required @needs_mailbox() def get_templates(request, ftype): if ftype == "condition": return ajax_simple_response(FilterForm([], [], request).cond_templates) return ajax_simple_response(FilterForm([], [], request).action_templates) @login_required @needs_mailbox() def getfs(request, name): sc = SieveClient(user=request.user.username, password=request.session["password"])
def index(request): """Webmail actions handler Problèmes liés à la navigation 'anchor based' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Lors d'un rafraichissemt complet, une première requête est envoyée vers /webmail/. On ne connait pas encore l'action qui va être demandée mais on peut déjà envoyer des informations indépendantes (comme les dossiers, le quota). Si on se contente de cela, l'affichage donnera un aspect décomposé qui n'est pas très séduisant (à cause de la latence notamment). Il faudrait pouvoir envoyer le menu par la même occasion, le souci étant de savoir lequel... Une solution possible : il suffirait de déplacer le menu vers la droite pour l'aligner avec le contenu, remonter la liste des dossiers (même hauteur que le menu) et renvoyer le menu en même temps que le contenu. Le rendu sera plus uniforme je pense. """ action = request.GET.get("action", None) if action is not None: if not globals().has_key(action): raise WebmailError(_("Undefined action")) response = globals()[action](request) else: if request.is_ajax(): raise WebmailError(_("Bad request")) response = dict(selection="webmail") curmbox = request.session.get("mbox", "INBOX") if not request.is_ajax(): request.session["lastaction"] = None imapc = get_imapconnector(request) response["hdelimiter"] = imapc.hdelimiter response["mboxes"] = render_mboxes_list(request, imapc) imapc.getquota(curmbox) response["refreshrate"] = \ int(parameters.get_user(request.user, "REFRESH_INTERVAL")) response["quota"] = ImapListing.computequota(imapc) trash = parameters.get_user(request.user, "TRASH_FOLDER") response["trash"] = trash response["ro_mboxes"] = [ "INBOX", "Junk", parameters.get_user(request.user, "SENT_FOLDER"), trash, parameters.get_user(request.user, "DRAFTS_FOLDER") ] return _render(request, "webmail/index.html", response) if action in ["reply", "forward"]: action = "compose" if request.session["lastaction"] != action: extra_args = {} if response.has_key("menuargs"): extra_args = response["menuargs"] del response["menuargs"] try: response["menu"] = \ getattr(webextras, "%s_menu" % action)("", curmbox, request.user, **extra_args) except KeyError: pass response.update(callback=action) if not response.has_key("status"): response.update(status="ok") return ajax_simple_response(response)
def index(request): return _render( request, "amavis/index.html", dict(deflocation="listing/", defcallback="listing_cb", selection="quarantine"))
def viewheaders(request, mail_id): content = "" for qm in get_wrapper().get_mail_content(mail_id): content += qm.mail_text msg = email.message_from_string(content) return _render(request, 'amavis/viewheader.html', {"headers": msg.items()})
return _render_error(request, user_context={"error" : e}) try: active_script, scripts = sc.listscripts() except Error, e: return _render_error(request, user_context={"error" : e}) if active_script is None: active_script = "" default_script = "%s/" % scripts[0] if len(scripts) else "" else: default_script = "%s/" % active_script return _render(request, tplname, { "selection" : "user", "active_script" : active_script, "default_script" : default_script, "scripts" : sorted(scripts), "hdelimiter": get_imapconnector(request).hdelimiter }) @login_required @needs_mailbox() def get_templates(request, ftype): if ftype == "condition": return ajax_simple_response(FilterForm([], [], request).cond_templates) return ajax_simple_response(FilterForm([], [], request).action_templates) @login_required @needs_mailbox() def getfs(request, name): sc = SieveClient(user=request.user.username,
if csuploader.toobig: error = _("Attachment is too big (limit: %s)" \ % parameters.get_admin("MAX_ATTACHMENT_SIZE")) return _render(request, "webmail/upload_done.html", { "status" : "ko", "error" : error }) ctx = { "title" : _("Attachments"), "formid" : "uploadfile", "target" : "upload_target", "enctype" : "multipart/form-data", "form" : AttachmentForm(), "action" : reverse(attachments), "attachments" : request.session["compose_mail"]["attachments"] } return _render(request, tplname, ctx) @login_required @needs_mailbox() def delattachment(request): if not request.session.has_key("compose_mail") \ or not request.GET.has_key("name") \ or not request.GET["name"]: return ajax_response(request, "ko", respmsg=_("Bad query")) error = None for att in request.session["compose_mail"]["attachments"]: if att["tmpname"] == request.GET["name"]: request.session["compose_mail"]["attachments"].remove(att) fullpath = os.path.join(settings.MEDIA_ROOT, "webmail", att["tmpname"]) try:
error = _("Attachment is too big (limit: %s)" \ % parameters.get_admin("MAX_ATTACHMENT_SIZE")) return _render(request, "webmail/upload_done.html", { "status": "ko", "error": error }) ctx = { "title": _("Attachments"), "formid": "uploadfile", "target": "upload_target", "enctype": "multipart/form-data", "form": AttachmentForm(), "action": reverse(attachments), "attachments": request.session["compose_mail"]["attachments"] } return _render(request, tplname, ctx) @login_required @needs_mailbox() def delattachment(request): if not request.session.has_key("compose_mail") \ or not request.GET.has_key("name") \ or not request.GET["name"]: return ajax_response(request, "ko", respmsg=_("Bad query")) error = None for att in request.session["compose_mail"]["attachments"]: if att["tmpname"] == request.GET["name"]: request.session["compose_mail"]["attachments"].remove(att) fullpath = os.path.join(settings.MEDIA_ROOT, "webmail",
def index(request): """Webmail actions handler Problèmes liés à la navigation 'anchor based' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Lors d'un rafraichissemt complet, une première requête est envoyée vers /webmail/. On ne connait pas encore l'action qui va être demandée mais on peut déjà envoyer des informations indépendantes (comme les dossiers, le quota). Si on se contente de cela, l'affichage donnera un aspect décomposé qui n'est pas très séduisant (à cause de la latence notamment). Il faudrait pouvoir envoyer le menu par la même occasion, le souci étant de savoir lequel... Une solution possible : il suffirait de déplacer le menu vers la droite pour l'aligner avec le contenu, remonter la liste des dossiers (même hauteur que le menu) et renvoyer le menu en même temps que le contenu. Le rendu sera plus uniforme je pense. """ action = request.GET.get("action", None) if action is not None: if not globals().has_key(action): raise WebmailError(_("Undefined action")) response = globals()[action](request) else: if request.is_ajax(): raise WebmailError(_("Bad request")) response = dict(selection="webmail") curmbox = request.session.get("mbox", "INBOX") if not request.is_ajax(): request.session["lastaction"] = None imapc = get_imapconnector(request) response["mboxes"] = render_mboxes_list(request, imapc) imapc.getquota(curmbox) response["refreshrate"] = \ int(parameters.get_user(request.user, "REFRESH_INTERVAL")) response["quota"] = ImapListing.computequota(imapc) response["ro_mboxes"] = [ "INBOX", "Junk", parameters.get_user(request.user, "SENT_FOLDER"), parameters.get_user(request.user, "TRASH_FOLDER"), parameters.get_user(request.user, "DRAFTS_FOLDER") ] return _render(request, "webmail/index.html", response) if action in ["reply", "forward"]: action = "compose" if request.session["lastaction"] != action: extra_args = {} if response.has_key("menuargs"): extra_args = response["menuargs"] del response["menuargs"] try: response["menu"] = \ getattr(webextras, "%s_menu" % action)("", curmbox, request.user, **extra_args) except KeyError: pass response.update(callback=action) if not response.has_key("status"): response.update(status="ok") return ajax_simple_response(response)
def index(request): return _render(request, "amavis/index.html", dict( deflocation="listing/", defcallback="listing_cb", selection="quarantine" ))