mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-18 05:51:26 +02:00
* No more code inside lib/__init__.py
* Fixed a circular import raised only when using commands like 'manage.py syncdb'
This commit is contained in:
@@ -1,7 +1,26 @@
|
||||
# coding: utf-8
|
||||
from django.http import HttpResponse, HttpResponseRedirect
|
||||
from django.contrib.auth.models import User, Group
|
||||
from django.utils.translation import ugettext as _
|
||||
from models import *
|
||||
from modoboa.lib.webutils import _render_error
|
||||
|
||||
def is_not_localadmin(errortpl="error"):
|
||||
def dec(f):
|
||||
def wrapped_f(request, *args, **kwargs):
|
||||
if request.user.id == 1:
|
||||
return _render_error(request, errortpl, {
|
||||
"error" : _("Invalid action, %(user)s is a local user" \
|
||||
% {"user" : request.user.username})
|
||||
})
|
||||
return f(request, *args, **kwargs)
|
||||
|
||||
wrapped_f.__name__ = f.__name__
|
||||
wrapped_f.__dict__ = f.__dict__
|
||||
wrapped_f.__doc__ = f.__doc__
|
||||
wrapped_f.__module__ = f.__module__
|
||||
return wrapped_f
|
||||
return dec
|
||||
|
||||
def is_domain_admin(user):
|
||||
"""Tell if a user is administrator for a domain of not
|
||||
|
||||
+2
-1
@@ -5,8 +5,9 @@ from django.utils.translation import ugettext as _
|
||||
from django.dispatch import receiver
|
||||
from django.conf import settings
|
||||
from modoboa.lib import parameters
|
||||
from modoboa.lib import exec_cmd, exec_as_vuser, crypt_password
|
||||
from modoboa.lib.sysutils import exec_cmd, exec_as_vuser
|
||||
from modoboa.lib.emailutils import split_mailbox
|
||||
from modoboa.auth.lib import crypt_password
|
||||
import os
|
||||
import pwd
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
import datetime
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.contrib.auth.models import User, Group
|
||||
from modoboa.lib import _render, getctx, _render_to_string
|
||||
from modoboa.lib.webutils import _render, getctx, _render_to_string
|
||||
from forms import *
|
||||
|
||||
class Permissions(object):
|
||||
|
||||
@@ -3,7 +3,8 @@ from django.template.loader import render_to_string
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.core.urlresolvers import reverse
|
||||
from modoboa import admin
|
||||
from modoboa.lib import events, static_url, render_actions
|
||||
from modoboa.lib import events
|
||||
from modoboa.lib.webutils import static_url, render_actions
|
||||
|
||||
register = template.Library()
|
||||
|
||||
|
||||
+4
-3
@@ -17,9 +17,10 @@ from modoboa import admin, userprefs
|
||||
from models import *
|
||||
from admin.permissions import *
|
||||
from admin.tables import *
|
||||
from modoboa.lib import crypt_password
|
||||
from modoboa.lib import _render, ajax_response, ajax_simple_response, \
|
||||
getctx, events, parameters
|
||||
from modoboa.lib import events, parameters
|
||||
from modoboa.auth.lib import crypt_password
|
||||
from modoboa.lib.webutils \
|
||||
import _render, ajax_response, ajax_simple_response, getctx
|
||||
from modoboa.lib.emailutils import split_mailbox
|
||||
from modoboa.lib.models import Parameter
|
||||
import copy
|
||||
|
||||
+18
@@ -1,5 +1,7 @@
|
||||
# coding: utf-8
|
||||
|
||||
import crypt, hashlib
|
||||
from random import Random
|
||||
from Crypto.Cipher import AES
|
||||
import base64
|
||||
from modoboa.lib import parameters
|
||||
@@ -22,3 +24,19 @@ def decrypt(ciph):
|
||||
def get_password(request):
|
||||
return decrypt(request.session["password"])
|
||||
|
||||
def _check_password(password, crypted):
|
||||
scheme = parameters.get_admin("PASSWORD_SCHEME", app="admin")
|
||||
if scheme == "crypt":
|
||||
return crypt.crypt(password, crypted) == crypted
|
||||
if scheme == "md5":
|
||||
return hashlib.md5(password).hexdigest() == crypted
|
||||
return password
|
||||
|
||||
def crypt_password(password):
|
||||
scheme = parameters.get_admin("PASSWORD_SCHEME", app="admin")
|
||||
if scheme == "crypt":
|
||||
salt = ''.join(Random().sample(string.letters + string.digits, 2))
|
||||
return crypt.crypt(password, salt)
|
||||
if scheme == "md5":
|
||||
return hashlib.md5(password).hexdigest()
|
||||
return password
|
||||
|
||||
@@ -5,7 +5,8 @@
|
||||
from django.conf.urls.defaults import *
|
||||
from django.utils.translation import ugettext as _, ungettext
|
||||
from django.core.urlresolvers import reverse
|
||||
from modoboa.lib import events, parameters, static_url
|
||||
from modoboa.lib import events, parameters
|
||||
from modoboa.lib.webutils import static_url
|
||||
|
||||
def infos():
|
||||
return {
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
from datetime import datetime
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.db.models import Q
|
||||
from modoboa.lib import tables, static_url
|
||||
from modoboa.lib import tables
|
||||
from modoboa.lib.webutils import static_url
|
||||
from modoboa.lib.email_listing import MBconnector, EmailListing
|
||||
from modoboa.lib.emailutils import *
|
||||
from modoboa.admin.lib import is_domain_admin
|
||||
|
||||
@@ -3,7 +3,7 @@ from django.template.loader import render_to_string
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.conf import settings
|
||||
from modoboa.lib import static_url
|
||||
from modoboa.lib.webutils import static_url
|
||||
from modoboa.extensions import amavis_quarantine
|
||||
from modoboa.admin.lib import is_domain_admin
|
||||
|
||||
|
||||
@@ -9,13 +9,14 @@ from django.core.urlresolvers import reverse
|
||||
from django.contrib.auth.decorators \
|
||||
import login_required
|
||||
from django.db.models import Q
|
||||
from modoboa.lib import parameters, _render, getctx, ajax_response
|
||||
from modoboa.lib import parameters
|
||||
from modoboa.lib.webutils import _render, getctx, ajax_response
|
||||
from modoboa.admin.models import Mailbox
|
||||
from lib import AMrelease
|
||||
from templatetags.amextras import *
|
||||
from modoboa.lib.email_listing import parse_search_parameters
|
||||
from sql_listing import *
|
||||
from admin.lib import is_domain_admin
|
||||
from modoboa.admin.lib import is_domain_admin
|
||||
|
||||
def __get_current_url(request):
|
||||
if request.session.has_key("page"):
|
||||
|
||||
@@ -10,7 +10,8 @@ functionality into Postfix.
|
||||
from django.conf.urls.defaults import include
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.utils.translation import ugettext as _
|
||||
from modoboa.lib import events, parameters, static_url
|
||||
from modoboa.lib import events, parameters
|
||||
from modoboa.lib.webutils import static_url
|
||||
from models import *
|
||||
|
||||
def infos():
|
||||
|
||||
@@ -3,7 +3,7 @@ import datetime
|
||||
from south.db import db
|
||||
from south.v2 import SchemaMigration
|
||||
from django.db import models
|
||||
from modoboa.lib import db_table_exists
|
||||
from modoboa.lib.dbutils import db_table_exists
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
|
||||
|
||||
@@ -7,7 +7,8 @@ from django.contrib.auth.decorators \
|
||||
from django.contrib import messages
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.utils.translation import ugettext as _
|
||||
from modoboa.lib import _render, ajax_response, is_not_localadmin
|
||||
from modoboa.lib.webutils import _render, ajax_response
|
||||
from modoboa.admin.lib import is_not_localadmin
|
||||
from forms import *
|
||||
from models import *
|
||||
|
||||
|
||||
@@ -2,7 +2,8 @@
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.conf.urls.defaults import include
|
||||
from modoboa.lib import events, parameters, static_url
|
||||
from modoboa.lib import events, parameters
|
||||
from modoboa.lib.webutils import static_url
|
||||
from sievelib.managesieve import SUPPORTED_AUTH_MECHS
|
||||
|
||||
def init():
|
||||
|
||||
@@ -3,7 +3,7 @@ from django.template.loader import render_to_string
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.core.urlresolvers import reverse
|
||||
from modoboa.extensions.sievefilters import views
|
||||
from modoboa.lib import render_actions
|
||||
from modoboa.lib.webutils import render_actions
|
||||
|
||||
register = template.Library()
|
||||
|
||||
|
||||
@@ -4,8 +4,10 @@ from django.http import HttpResponse
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.core.urlresolvers import reverse
|
||||
from modoboa.lib import _render, _render_to_string, _render_error, \
|
||||
ajax_response, ajax_simple_response, is_not_localadmin, parameters
|
||||
from modoboa.lib import parameters
|
||||
from modoboa.lib.webutils import _render, _render_to_string, _render_error, \
|
||||
ajax_response, ajax_simple_response
|
||||
from modoboa.admin.lib import is_not_localadmin
|
||||
from modoboa.lib.connections import ConnectionError
|
||||
from modoboa.auth.lib import get_password
|
||||
from lib import *
|
||||
|
||||
@@ -10,7 +10,8 @@ sent, received, bounced, rejected
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.conf.urls.defaults import *
|
||||
from modoboa.lib import events, parameters, static_url
|
||||
from modoboa.lib import events, parameters
|
||||
from modoboa.lib.webutils import static_url
|
||||
|
||||
def infos():
|
||||
return {
|
||||
|
||||
@@ -4,7 +4,7 @@ from django.http import HttpResponse
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.utils import simplejson
|
||||
from modoboa.lib import _render, _render_to_string, getctx
|
||||
from modoboa.lib.webutils import _render, _render_to_string, getctx
|
||||
from modoboa.admin.views import good_domain
|
||||
from modoboa.admin.models import Domain, Mailbox
|
||||
from django.contrib.auth.decorators \
|
||||
|
||||
@@ -14,8 +14,8 @@ import email
|
||||
import lxml
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.conf import settings
|
||||
from modoboa.lib import decode, u2u_decode, tables, \
|
||||
imap_utf7, static_url, parameters
|
||||
from modoboa.lib import u2u_decode, tables, imap_utf7, parameters
|
||||
from modoboa.lib.webutils import static_url
|
||||
from modoboa.lib.connections import ConnectionsManager
|
||||
from modoboa.lib.email_listing import MBconnector, EmailListing
|
||||
from modoboa.lib.emailutils import *
|
||||
|
||||
@@ -2,7 +2,8 @@
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.conf.urls.defaults import include
|
||||
from modoboa.lib import events, parameters, static_url
|
||||
from modoboa.lib import events, parameters
|
||||
from modoboa.lib.webutils import static_url
|
||||
|
||||
def init():
|
||||
events.register("UserMenuDisplay", menu)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# coding: utf-8
|
||||
|
||||
from modoboa.lib import ajax_response
|
||||
from modoboa.lib.webutils import ajax_response
|
||||
from modoboa.extensions.webmail.lib import WebmailError
|
||||
|
||||
class WebmailErrorMiddleware(object):
|
||||
|
||||
@@ -5,7 +5,8 @@ from django.core.urlresolvers import reverse
|
||||
from django.conf import settings
|
||||
from modoboa.extensions import webmail
|
||||
from modoboa.extensions.webmail.lib import IMAPheader
|
||||
from modoboa.lib import parameters, static_url
|
||||
from modoboa.lib import parameters
|
||||
from modoboa.lib.webutils import static_url
|
||||
|
||||
register = template.Library()
|
||||
|
||||
|
||||
@@ -10,11 +10,12 @@ from django.core.urlresolvers import reverse
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.contrib import messages
|
||||
from modoboa.admin.models import Mailbox
|
||||
from modoboa.lib import parameters, _render, _render_error, \
|
||||
getctx, is_not_localadmin, _render_to_string, \
|
||||
ajax_response
|
||||
from modoboa.lib import parameters
|
||||
from modoboa.lib.webutils import _render, _render_error, \
|
||||
getctx, _render_to_string, ajax_response
|
||||
from modoboa.lib.emailutils import split_mailbox
|
||||
from modoboa.lib.email_listing import parse_search_parameters, Paginator
|
||||
from modoboa.admin.lib import is_not_localadmin
|
||||
from modoboa.auth.lib import *
|
||||
from lib import *
|
||||
from forms import *
|
||||
|
||||
-199
@@ -1,199 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import hashlib, crypt, string
|
||||
from random import Random
|
||||
from django.http import HttpResponse
|
||||
from django.conf import settings
|
||||
from django import template
|
||||
from django.shortcuts import render_to_response
|
||||
from django.template.loader import render_to_string
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.utils import simplejson
|
||||
from modoboa.lib import parameters
|
||||
|
||||
def exec_cmd(cmd, **kwargs):
|
||||
import subprocess
|
||||
|
||||
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, **kwargs)
|
||||
output = p.communicate()[0]
|
||||
return p.returncode, output
|
||||
|
||||
def _render(request, tpl, user_context):
|
||||
"""Custom rendering function
|
||||
|
||||
Just a wrapper which automatically adds a RequestContext instance
|
||||
(useful to use settings variables like MEDIA_URL inside templates)
|
||||
"""
|
||||
return render_to_response(tpl, user_context,
|
||||
context_instance=template.RequestContext(request))
|
||||
|
||||
def _render_to_string(request, tpl, user_context):
|
||||
"""Custom rendering function
|
||||
|
||||
Same as _render.
|
||||
"""
|
||||
return render_to_string(tpl, user_context,
|
||||
context_instance=template.RequestContext(request))
|
||||
|
||||
def _render_error(request, errortpl="error", user_context={}):
|
||||
return render_to_response("common/%s.html" % errortpl, user_context,
|
||||
context_instance=template.RequestContext(request))
|
||||
|
||||
def render_actions(actions):
|
||||
t = template.Template("""
|
||||
{% for a in actions %}
|
||||
<a href="{{ a.url }}" name="{{ a.name }}" class="{{ a.class }}" rel="{{ a.rel }}"
|
||||
{% if a.confirm %}onclick="return confirm('{{ a.confirm }}')"{% endif %}>
|
||||
<img src="{{ a.img }}" border="0" title="{{ a.title }}" />
|
||||
</a>
|
||||
{% endfor %}
|
||||
""")
|
||||
return t.render(template.Context({
|
||||
"actions" : actions
|
||||
}))
|
||||
|
||||
def exec_as_vuser(cmd):
|
||||
code, output = exec_cmd("sudo -u %s %s" \
|
||||
% (parameters.get_admin("VIRTUAL_UID", app="admin"), cmd))
|
||||
if code:
|
||||
exec_cmd("echo '%s' >> /tmp/vmail.log" % output)
|
||||
return False
|
||||
return True
|
||||
|
||||
def _ctx_ok(url):
|
||||
return {"status" : "ok", "url" : url}
|
||||
|
||||
def _ctx_ko(tpl, ctx):
|
||||
return {"status" : "ko", "content" : render_to_string(tpl, ctx)}
|
||||
|
||||
def static_url(path):
|
||||
"""Returns the correct static url for a given file
|
||||
|
||||
:param path: the targeted static media
|
||||
"""
|
||||
if path.startswith("/"):
|
||||
path = path[1:]
|
||||
return "%s%s" % (settings.MEDIA_URL, path)
|
||||
|
||||
def getctx(status, level=1, callback=None, **kwargs):
|
||||
if not callback:
|
||||
callername = sys._getframe(level).f_code.co_name
|
||||
else:
|
||||
callername = callback
|
||||
ctx = {"status" : status, "callback" : callername}
|
||||
for kw, v in kwargs.iteritems():
|
||||
ctx[kw] = v
|
||||
return ctx
|
||||
|
||||
def ajax_response(request, status="ok", respmsg=None,
|
||||
url="", ajaxnav=False, norefresh=False,
|
||||
template=None, **kwargs):
|
||||
"""Ajax response shortcut
|
||||
|
||||
Simple shortcut that sends an JSON response. If a template is
|
||||
provided, a 'content' field will be added to the response,
|
||||
containing the result of this template rendering.
|
||||
|
||||
:param request: a request object
|
||||
:param status: the response status ('ok' or 'ko)
|
||||
:param nexturl: url to display after receiving this response
|
||||
:param template: eventual template's path
|
||||
:param kwargs: dict used for template rendering
|
||||
"""
|
||||
ctx = {}
|
||||
for k, v in kwargs.iteritems():
|
||||
ctx[k] = v
|
||||
if template is not None:
|
||||
content = _render_to_string(request, template, ctx)
|
||||
elif kwargs.has_key("content"):
|
||||
content = kwargs["content"]
|
||||
else:
|
||||
content = ""
|
||||
jsonctx = {"status" : status, "content" : content}
|
||||
if respmsg is not None:
|
||||
jsonctx["respmsg"] = respmsg
|
||||
if ajaxnav:
|
||||
jsonctx["ajaxnav"] = True
|
||||
if url != "":
|
||||
jsonctx["url"] = url
|
||||
jsonctx["norefresh"] = norefresh
|
||||
return HttpResponse(simplejson.dumps(jsonctx), mimetype="application/json")
|
||||
|
||||
def ajax_simple_response(content):
|
||||
"""Simple AJAX response
|
||||
|
||||
No extra formatting is done. The content is passed directly to simplejon.
|
||||
|
||||
:param content: the response's content (list, dict, string)
|
||||
"""
|
||||
return HttpResponse(simplejson.dumps(content), mimetype="application/json")
|
||||
|
||||
def decode(s, encodings=('utf8', 'latin1', 'windows-1252', 'ascii'), charset=None):
|
||||
if charset is not None:
|
||||
try:
|
||||
return s.decode(charset, 'ignore')
|
||||
except LookupError:
|
||||
pass
|
||||
|
||||
for encoding in encodings:
|
||||
try:
|
||||
return s.decode(encoding)
|
||||
except UnicodeDecodeError:
|
||||
pass
|
||||
return s.decode('ascii', 'ignore')
|
||||
|
||||
def is_not_localadmin(errortpl="error"):
|
||||
def dec(f):
|
||||
def wrapped_f(request, *args, **kwargs):
|
||||
if request.user.id == 1:
|
||||
return _render_error(request, errortpl, {
|
||||
"error" : _("Invalid action, %(user)s is a local user" \
|
||||
% {"user" : request.user.username})
|
||||
})
|
||||
return f(request, *args, **kwargs)
|
||||
|
||||
wrapped_f.__name__ = f.__name__
|
||||
wrapped_f.__dict__ = f.__dict__
|
||||
wrapped_f.__doc__ = f.__doc__
|
||||
wrapped_f.__module__ = f.__module__
|
||||
return wrapped_f
|
||||
return dec
|
||||
|
||||
def db_table_exists(table, cursor=None):
|
||||
"""Check if table exists
|
||||
|
||||
Taken from here:
|
||||
https://gist.github.com/527113/307c2dec09ceeb647b8fa1d6d49591f3352cb034
|
||||
|
||||
"""
|
||||
try:
|
||||
if not cursor:
|
||||
from django.db import connection
|
||||
cursor = connection.cursor()
|
||||
if not cursor:
|
||||
raise Exception
|
||||
table_names = connection.introspection.get_table_list(cursor)
|
||||
except:
|
||||
raise Exception("unable to determine if the table '%s' exists" % table)
|
||||
else:
|
||||
return table in table_names
|
||||
|
||||
def _check_password(password, crypted):
|
||||
scheme = parameters.get_admin("PASSWORD_SCHEME", app="admin")
|
||||
if scheme == "crypt":
|
||||
return crypt.crypt(password, crypted) == crypted
|
||||
if scheme == "md5":
|
||||
return hashlib.md5(password).hexdigest() == crypted
|
||||
return password
|
||||
|
||||
def crypt_password(password):
|
||||
scheme = parameters.get_admin("PASSWORD_SCHEME", app="admin")
|
||||
if scheme == "crypt":
|
||||
salt = ''.join(Random().sample(string.letters + string.digits, 2))
|
||||
return crypt.crypt(password, salt)
|
||||
if scheme == "md5":
|
||||
return hashlib.md5(password).hexdigest()
|
||||
return password
|
||||
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
from django.contrib.auth.models import User
|
||||
from modoboa.admin.models import Mailbox
|
||||
from modoboa.lib import _check_password
|
||||
from modoboa.auth.lib import _check_password
|
||||
|
||||
class SimpleBackend:
|
||||
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
# coding: utf-8
|
||||
from django.db import connection
|
||||
|
||||
def db_table_exists(table, cursor=None):
|
||||
"""Check if table exists
|
||||
|
||||
Taken from here:
|
||||
https://gist.github.com/527113/307c2dec09ceeb647b8fa1d6d49591f3352cb034
|
||||
|
||||
"""
|
||||
try:
|
||||
if not cursor:
|
||||
cursor = connection.cursor()
|
||||
if not cursor:
|
||||
raise Exception
|
||||
table_names = connection.introspection.get_table_list(cursor)
|
||||
except:
|
||||
raise Exception("unable to determine if the table '%s' exists" % table)
|
||||
else:
|
||||
return table in table_names
|
||||
@@ -9,7 +9,8 @@ from django.conf import settings
|
||||
from django.template.loader import render_to_string
|
||||
from django.template import Template, Context
|
||||
from django.utils.translation import ugettext as _
|
||||
from modoboa.lib import _render, decode
|
||||
from modoboa.lib.webutils import _render
|
||||
from modoboa.lib.emailutils import decode
|
||||
|
||||
attached_map = {}
|
||||
|
||||
|
||||
+14
-1
@@ -7,7 +7,6 @@ import lxml
|
||||
from django.template import Template, Context
|
||||
from django.template.loader import render_to_string
|
||||
import u2u_decode
|
||||
from modoboa.lib import decode
|
||||
|
||||
class EmailAddress(object):
|
||||
def __init__(self, address):
|
||||
@@ -196,3 +195,17 @@ def split_mailbox(mailbox):
|
||||
domain = parts[-1]
|
||||
address = "@".join(parts[:-1])
|
||||
return (address, domain)
|
||||
|
||||
def decode(s, encodings=('utf8', 'latin1', 'windows-1252', 'ascii'), charset=None):
|
||||
if charset is not None:
|
||||
try:
|
||||
return s.decode(charset, 'ignore')
|
||||
except LookupError:
|
||||
pass
|
||||
|
||||
for encoding in encodings:
|
||||
try:
|
||||
return s.decode(encoding)
|
||||
except UnicodeDecodeError:
|
||||
pass
|
||||
return s.decode('ascii', 'ignore')
|
||||
|
||||
+1
-1
@@ -6,6 +6,6 @@ class Parameter(models.Model):
|
||||
value = models.CharField(max_length=255)
|
||||
|
||||
class UserParameter(models.Model):
|
||||
user = models.ForeignKey(User)
|
||||
user = models.ForeignKey("auth.User")
|
||||
name = models.CharField(max_length=255)
|
||||
value = models.CharField(max_length=255)
|
||||
|
||||
+8
-1
@@ -3,7 +3,6 @@
|
||||
import string
|
||||
import inspect
|
||||
import re
|
||||
from modoboa.lib.models import *
|
||||
|
||||
"""
|
||||
This interface provides a simple way to declare and store parameters
|
||||
@@ -76,6 +75,8 @@ def unregister_app(app):
|
||||
return True
|
||||
|
||||
def save_admin(name, value, app=None):
|
||||
from models import Parameter
|
||||
|
||||
if app is None:
|
||||
app = __guess_extension()
|
||||
__is_defined(app, 'A', name)
|
||||
@@ -91,6 +92,8 @@ def save_admin(name, value, app=None):
|
||||
return True
|
||||
|
||||
def save_user(user, name, value, app=None):
|
||||
from models import UserParameter
|
||||
|
||||
if app is None:
|
||||
app = __guess_extension()
|
||||
__is_defined(app, 'U', name)
|
||||
@@ -107,6 +110,8 @@ def save_user(user, name, value, app=None):
|
||||
return True
|
||||
|
||||
def get_admin(name, app=None):
|
||||
from models import Parameter
|
||||
|
||||
if app is None:
|
||||
app = __guess_extension()
|
||||
__is_defined(app, "A", name)
|
||||
@@ -117,6 +122,8 @@ def get_admin(name, app=None):
|
||||
return p.value.decode("string_escape")
|
||||
|
||||
def get_user(user, name, app=None):
|
||||
from models import UserParameter
|
||||
|
||||
if app is None:
|
||||
app = __guess_extension()
|
||||
__is_defined(app, "U", name)
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
# coding: utf-8
|
||||
|
||||
"""
|
||||
This module extra functions/shortcuts to communicate with the system
|
||||
(executing commands, etc.)
|
||||
"""
|
||||
|
||||
from modoboa.lib import parameters
|
||||
|
||||
def exec_cmd(cmd, **kwargs):
|
||||
import subprocess
|
||||
|
||||
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, **kwargs)
|
||||
output = p.communicate()[0]
|
||||
return p.returncode, output
|
||||
|
||||
def exec_as_vuser(cmd):
|
||||
code, output = exec_cmd("sudo -u %s %s" \
|
||||
% (parameters.get_admin("VIRTUAL_UID", app="admin"), cmd))
|
||||
if code:
|
||||
exec_cmd("echo '%s' >> /tmp/vmail.log" % output)
|
||||
return False
|
||||
return True
|
||||
@@ -3,7 +3,7 @@ import os
|
||||
from django.conf import settings
|
||||
from django import template
|
||||
from django.contrib import messages
|
||||
from modoboa.lib import exec_cmd
|
||||
from modoboa.lib.sysutils import exec_cmd
|
||||
|
||||
register = template.Library()
|
||||
|
||||
|
||||
+114
@@ -0,0 +1,114 @@
|
||||
# coding: utf-8
|
||||
|
||||
"""
|
||||
This module contains extra functions/shortcuts used to render HTML.
|
||||
"""
|
||||
import sys
|
||||
from django.http import HttpResponse
|
||||
from django.shortcuts import render_to_response
|
||||
from django.template.loader import render_to_string
|
||||
from django import template
|
||||
from django.utils import simplejson
|
||||
from django.conf import settings
|
||||
|
||||
def _render(request, tpl, user_context):
|
||||
"""Custom rendering function
|
||||
|
||||
Just a wrapper which automatically adds a RequestContext instance
|
||||
(useful to use settings variables like MEDIA_URL inside templates)
|
||||
"""
|
||||
return render_to_response(tpl, user_context,
|
||||
context_instance=template.RequestContext(request))
|
||||
|
||||
def _render_to_string(request, tpl, user_context):
|
||||
"""Custom rendering function
|
||||
|
||||
Same as _render.
|
||||
"""
|
||||
return render_to_string(tpl, user_context,
|
||||
context_instance=template.RequestContext(request))
|
||||
|
||||
def _render_error(request, errortpl="error", user_context={}):
|
||||
return render_to_response("common/%s.html" % errortpl, user_context,
|
||||
context_instance=template.RequestContext(request))
|
||||
|
||||
def render_actions(actions):
|
||||
t = template.Template("""
|
||||
{% for a in actions %}
|
||||
<a href="{{ a.url }}" name="{{ a.name }}" class="{{ a.class }}" rel="{{ a.rel }}"
|
||||
{% if a.confirm %}onclick="return confirm('{{ a.confirm }}')"{% endif %}>
|
||||
<img src="{{ a.img }}" border="0" title="{{ a.title }}" />
|
||||
</a>
|
||||
{% endfor %}
|
||||
""")
|
||||
return t.render(template.Context({
|
||||
"actions" : actions
|
||||
}))
|
||||
|
||||
def _ctx_ok(url):
|
||||
return {"status" : "ok", "url" : url}
|
||||
|
||||
def _ctx_ko(tpl, ctx):
|
||||
return {"status" : "ko", "content" : render_to_string(tpl, ctx)}
|
||||
|
||||
def getctx(status, level=1, callback=None, **kwargs):
|
||||
if not callback:
|
||||
callername = sys._getframe(level).f_code.co_name
|
||||
else:
|
||||
callername = callback
|
||||
ctx = {"status" : status, "callback" : callername}
|
||||
for kw, v in kwargs.iteritems():
|
||||
ctx[kw] = v
|
||||
return ctx
|
||||
|
||||
def ajax_response(request, status="ok", respmsg=None,
|
||||
url="", ajaxnav=False, norefresh=False,
|
||||
template=None, **kwargs):
|
||||
"""Ajax response shortcut
|
||||
|
||||
Simple shortcut that sends an JSON response. If a template is
|
||||
provided, a 'content' field will be added to the response,
|
||||
containing the result of this template rendering.
|
||||
|
||||
:param request: a request object
|
||||
:param status: the response status ('ok' or 'ko)
|
||||
:param nexturl: url to display after receiving this response
|
||||
:param template: eventual template's path
|
||||
:param kwargs: dict used for template rendering
|
||||
"""
|
||||
ctx = {}
|
||||
for k, v in kwargs.iteritems():
|
||||
ctx[k] = v
|
||||
if template is not None:
|
||||
content = _render_to_string(request, template, ctx)
|
||||
elif kwargs.has_key("content"):
|
||||
content = kwargs["content"]
|
||||
else:
|
||||
content = ""
|
||||
jsonctx = {"status" : status, "content" : content}
|
||||
if respmsg is not None:
|
||||
jsonctx["respmsg"] = respmsg
|
||||
if ajaxnav:
|
||||
jsonctx["ajaxnav"] = True
|
||||
if url != "":
|
||||
jsonctx["url"] = url
|
||||
jsonctx["norefresh"] = norefresh
|
||||
return HttpResponse(simplejson.dumps(jsonctx), mimetype="application/json")
|
||||
|
||||
def ajax_simple_response(content):
|
||||
"""Simple AJAX response
|
||||
|
||||
No extra formatting is done. The content is passed directly to simplejon.
|
||||
|
||||
:param content: the response's content (list, dict, string)
|
||||
"""
|
||||
return HttpResponse(simplejson.dumps(content), mimetype="application/json")
|
||||
|
||||
def static_url(path):
|
||||
"""Returns the correct static url for a given file
|
||||
|
||||
:param path: the targeted static media
|
||||
"""
|
||||
if path.startswith("/"):
|
||||
path = path[1:]
|
||||
return "%s%s" % (settings.MEDIA_URL, path)
|
||||
@@ -5,7 +5,7 @@
|
||||
# Patrick Ben Koetter <p@state-of-mind.de>, 2010-2011.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Modoboa-0.8.5\n"
|
||||
"Project-Id-Version: Modoboa-0.8.6\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2011-08-25 09:53+0200\n"
|
||||
"PO-Revision-Date: 2011-08-25 13:03+0100\n"
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
# Patrick Ben Koetter <p@state-of-mind.de>, 2010-2011.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Modoboa-0.8.5\n"
|
||||
"Project-Id-Version: Modoboa-0.8.6\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2011-08-25 09:58+0200\n"
|
||||
"PO-Revision-Date: 2011-07-10 07:30+0000\n"
|
||||
|
||||
@@ -48,7 +48,7 @@ from django.db.models import Q
|
||||
from django.contrib.auth.models import Group
|
||||
import modoboa.admin.models as md_models
|
||||
import models as pf_models
|
||||
from modoboa.lib import exec_cmd
|
||||
from modoboa.lib.sysutils import exec_cmd
|
||||
from modoboa.lib.emailutils import split_mailbox
|
||||
|
||||
def migrate_dates(oldobj):
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
from django import forms
|
||||
from modoboa.admin.models import Domain, Mailbox
|
||||
from modoboa.lib import _check_password
|
||||
from modoboa.auth.lib import _check_password
|
||||
from django.contrib.auth.models import check_password
|
||||
from django.utils.translation import ugettext as _
|
||||
from modoboa.lib.emailutils import split_mailbox
|
||||
|
||||
@@ -3,7 +3,8 @@ from django.template.loader import render_to_string
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.core.urlresolvers import reverse
|
||||
from modoboa import userprefs
|
||||
from modoboa.lib import events, static_url
|
||||
from modoboa.lib import events
|
||||
from modoboa.lib.webutils import static_url
|
||||
from modoboa.admin.lib import is_domain_admin
|
||||
|
||||
register = template.Library()
|
||||
|
||||
+3
-3
@@ -4,12 +4,12 @@ from django.http import HttpResponseRedirect
|
||||
from django.contrib.auth.decorators \
|
||||
import login_required, user_passes_test
|
||||
from django.utils.translation import ugettext as _
|
||||
from modoboa.lib import _render, ajax_response, parameters
|
||||
from modoboa.lib import crypt_password
|
||||
from modoboa.lib import parameters
|
||||
from modoboa.lib.webutils import _render, ajax_response
|
||||
from forms import *
|
||||
from modoboa.admin.models import Mailbox, Alias
|
||||
from modoboa.admin.lib import is_domain_admin
|
||||
from modoboa.auth.lib import encrypt
|
||||
from modoboa.auth.lib import encrypt, crypt_password
|
||||
|
||||
@login_required
|
||||
def index(request):
|
||||
|
||||
Reference in New Issue
Block a user