From aa473902454e9e5bb86b5b87d969519fdcef5955 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Sun, 26 Aug 2012 10:12:23 +0200 Subject: [PATCH] wip: problem with postgres bytea fields Partial fix. Need to update all queries using the Maddr.email field. see #298 --- modoboa/extensions/amavis/lib.py | 3 +++ modoboa/extensions/amavis/views.py | 36 +++++++++++++++++++++--------- modoboa/lib/dbutils.py | 13 +++++++++++ 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/modoboa/extensions/amavis/lib.py b/modoboa/extensions/amavis/lib.py index 3ec55b860..80d3761c0 100644 --- a/modoboa/extensions/amavis/lib.py +++ b/modoboa/extensions/amavis/lib.py @@ -7,6 +7,7 @@ from functools import wraps from django.core.urlresolvers import reverse from django.db.models import Q from modoboa.lib import parameters +from modoboa.lib.dbutils import db_type from models import Msgrcpt def selfservice(ssfunc=None): @@ -41,6 +42,8 @@ def get_nb_requests(user): if not user.is_superuser: doms = user.get_domains() regexp = "(%s)" % '|'.join(map(lambda dom: dom.name, doms)) + if db_type() == 'postgres': + return len(Msgrcpt.objects.filter(rq).extra(where=["convert_from(maddr.email, 'UTF8') ~ '%s'" % (regexp,)], tables=['maddr'])) doms_q = Q(rid__email__regex=regexp) rq &= doms_q return len(Msgrcpt.objects.filter(rq)) diff --git a/modoboa/extensions/amavis/views.py b/modoboa/extensions/amavis/views.py index 1b20cb6f1..717fea042 100644 --- a/modoboa/extensions/amavis/views.py +++ b/modoboa/extensions/amavis/views.py @@ -70,18 +70,32 @@ def _listing(request): q = Q(rs='p') else: q = ~Q(rs='D') - if request.user.group == 'SimpleUsers': - q &= Q(rid__email=request.user.email) - else: - if not request.user.is_superuser: - doms = request.user.get_domains() - regexp = "(%s)" % '|'.join(map(lambda dom: dom.name, doms)) - doms_q = Q(rid__email__regex=regexp) - q &= doms_q - if rcptfilter is not None: - q &= Q(rid__email__contains=rcptfilter) - msgs = Msgrcpt.objects.filter(q).values("mail_id") + if db_type() != 'postgres': + if request.user.group == 'SimpleUsers': + q &= Q(rid__email=request.user.email) + else: + if not request.user.is_superuser: + doms = request.user.get_domains() + regexp = "(%s)" % '|'.join(map(lambda dom: dom.name, doms)) + doms_q = Q(rid__email__regex=regexp) + q &= doms_q + if rcptfilter is not None: + q &= Q(rid__email__contains=rcptfilter) + + msgs = Msgrcpt.objects.filter(q).values("mail_id") + else: + if request.user.group == 'SimpleUsers': + msgs = Msgrcpt.objects.filter(q).extra(where=["convert_from(maddr.email, 'UTF8') = '%s'" % request.user.email], tables=['maddr']) + else: + where = [] + if not request.user.is_superuser: + doms = request.user.get_domains() + regexp = "(%s)" % '|'.join(map(lambda dom: dom.name, doms)) + where.append("convert_from(maddr.email, 'UTF8') ~ '%s'" % regexp) + if rcptfilter is not None: + where.append("convert_from(maddr.email, 'UTF8') LIKE '%%%s%%'" % rcptfilter) + msgs = Msgrcpt.objects.filter(q).extra(where=where, tables=['maddr']).values("mail_id") if request.GET.has_key("page"): request.session["page"] = request.GET["page"] diff --git a/modoboa/lib/dbutils.py b/modoboa/lib/dbutils.py index 738b9f6a6..81fbb4f4d 100644 --- a/modoboa/lib/dbutils.py +++ b/modoboa/lib/dbutils.py @@ -1,5 +1,6 @@ # coding: utf-8 from django.db import connection +from django.conf import settings def db_table_exists(table, cursor=None): """Check if table exists @@ -18,3 +19,15 @@ def db_table_exists(table, cursor=None): raise Exception("unable to determine if the table '%s' exists" % table) else: return table in table_names + +def db_type(): + """Return the type of the *default* database + + Supported values : 'postgres', 'mysql', 'sqlite' + + :return: a string or None + """ + for t in ['postgres', 'mysql', 'sqlite']: + if settings.DATABASES['default']['ENGINE'].find(t) != -1: + return t + return None