wip: problem with postgres bytea fields

Partial fix. Need to update all queries using the Maddr.email field.

see #298
This commit is contained in:
Antoine Nguyen
2012-08-26 10:12:23 +02:00
parent 6386b36169
commit aa47390245
3 changed files with 41 additions and 11 deletions
+3
View File
@@ -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))
+25 -11
View File
@@ -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"]
+13
View File
@@ -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