Skip to content

Commit

Permalink
Merge branch 'master' of github.com:versae/qbe
Browse files Browse the repository at this point in the history
  • Loading branch information
versae committed Mar 9, 2011
2 parents a8812e7 + eb05baf commit 21c87e3
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 29 deletions.
4 changes: 3 additions & 1 deletion MANIFEST.in
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
include *.txt
recursive-include django_qbe *.css *.png *.jpg *.gif *.js *.html
recursive-include django_qbe/templates *.html *.js *.json
recursive-include django_qbe/media *.css *.png *.jpg *.gif *.js *.html *.json
recursive-include django_qbe *.css *.png *.jpg *.gif *.js *.html *.json
51 changes: 31 additions & 20 deletions django_qbe/forms.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
from django import forms
from django.db import connection
from django.db import connections
from django.db.models.fields import Field
from django.core.urlresolvers import reverse, NoReverseMatch
from django.conf import settings
Expand All @@ -11,8 +11,7 @@
from django_qbe.utils import get_models
from django_qbe.widgets import CriteriaInput

OPERATORS = {}
TABLE_NAMES = []

DATABASES = None
try:
DATABASES = settings.DATABASES
Expand All @@ -24,16 +23,6 @@
'NAME': settings.DATABASE_NAME,
}
}
for database, database_properties in DATABASES.items():
module = database_properties['ENGINE']
try:
base_mod = import_module("%s.base" % module)
intros_mod = import_module("%s.introspection" % module)
table_names = intros_mod.DatabaseIntrospection(connection).table_names()
OPERATORS.update(base_mod.DatabaseWrapper.operators)
TABLE_NAMES.extend(table_names)
except ImportError:
pass

SORT_CHOICES = (
("", ""),
Expand Down Expand Up @@ -92,6 +81,27 @@ class BaseQueryByExampleFormSet(BaseFormSet):
_params = []
_models = {}
_raw_query = None
_db_alias = "default"
_db_operators = {}
_db_table_names = []

def __init__(self, *args, **kwargs):
self._db_alias = kwargs.pop("using", "default")
self._db_connection = connections["default"]
database_properties = DATABASES.get(self._db_alias, "default")
module = database_properties['ENGINE']
try:
base_mod = import_module("%s.base" % module)
self._db_operators = base_mod.DatabaseWrapper.operators
operations_mod = import_module("%s.operations" % module)
DatabaseOperations = operations_mod.DatabaseOperations
self._db_operations = DatabaseOperations(self._db_connection)
intros_mod = import_module("%s.introspection" % module)
intros_db = intros_mod.DatabaseIntrospection(self._db_connection)
self._db_table_names = intros_db.table_names()
except ImportError:
pass
super(BaseQueryByExampleFormSet, self).__init__(*args, **kwargs)

def clean(self):
"""
Expand Down Expand Up @@ -161,20 +171,21 @@ def get_query_parts(self):
else:
join = u"%s.%s = %s_id" \
% (join_model, join_field, db_field)
if join not in wheres and join_model in TABLE_NAMES:
is_in_table_names = join_model in self._db_table_names
if join not in wheres and is_in_table_names:
wheres.append(join)
if join_model not in froms:
froms.append(join_model)
# join_select = u"%s.%s" % (join_model, join_field)
# if join_select not in selects:
# selects.append(join_select)
elif operator in OPERATORS:
# db_operator = OPERATORS[operator] % over
db_operator = OPERATORS[operator]
elif operator in self._db_operators:
# db_operator = self._db_operators[operator] % over
db_operator = self._db_operators[operator]
lookup = self._get_lookup(operator, over)
params.append(lookup)
wheres.append(u"%s %s" % (db_field, db_operator))
if model not in froms and model in TABLE_NAMES:
if model not in froms and model in self._db_table_names:
froms.append(model)
return selects, froms, wheres, sorts, params

Expand Down Expand Up @@ -234,7 +245,7 @@ def get_results(self, limit=None, offset=None, query=None, admin_name=None,
sql = query
if settings.DEBUG:
print sql
cursor = connection.cursor()
cursor = self._db_connection.cursor()
cursor.execute(sql, tuple(self._params))
query_results = cursor.fetchall()
if admin_name:
Expand Down Expand Up @@ -310,7 +321,7 @@ def get_labels(self, add_extra_ids=False, row_number=False):

def _get_lookup(self, operator, over):
lookup = Field().get_db_prep_lookup(operator, over,
connection=connection,
connection=self._db_connection,
prepared=True)
string_related_operators = ('exact', 'contains', 'regex', 'startswith',
'endswith', 'iexact', 'endswith', 'iregex',
Expand Down
14 changes: 14 additions & 0 deletions django_qbe/templates/qbe.html
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,20 @@
<input type="submit" name="_save" class="default" value="{% trans "Run" %}">
</div>

<div >
{% trans "Database" %}
<select name="database_alias" id="id_database_alias">
{% for db_alias, database_properties in databases.items %}
{% ifequal database_alias db_alias %}
<option value="{{ db_alias }}" selected="selected">{{ db_alias }}: {{ database_properties.NAME }} ({{ database_properties.ENGINE }})</option>
{% else %}
<option value="{{ db_alias }}">{{ db_alias }}: {{ database_properties.NAME }} ({{ database_properties.ENGINE }})</option>
{% endifequal %}
{% endfor %}
</select>
</div>


</div>

<div id="changelist-filter" class="qbeModelList module">
Expand Down
25 changes: 18 additions & 7 deletions django_qbe/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from django.utils import simplejson
from django.utils.translation import ugettext as _

from django_qbe.forms import QueryByExampleFormSet
from django_qbe.forms import QueryByExampleFormSet, DATABASES
from django_qbe.utils import (autocomplete_graph, qbe_models, formats,
pickle_encode, pickle_decode)

Expand All @@ -33,13 +33,15 @@
def qbe_form(request):
query_hash = request.GET.get("hash", "")
query_key = "qbe_query_%s" % query_hash
formset = QueryByExampleFormSet()
db_alias = request.session.get("qbe_database", "default")
formset = QueryByExampleFormSet(using=db_alias)
json_data = None
if query_key in request.session:
data = request.session[query_key]
formset = QueryByExampleFormSet(data=data)
db_alias = data.get("database_alias", "default")
formset = QueryByExampleFormSet(data=data, using=db_alias)
if not formset.is_valid():
formset = QueryByExampleFormSet()
formset = QueryByExampleFormSet(using=db_alias)
else:
json_data = simplejson.dumps(data)
apps = get_apps()
Expand All @@ -50,6 +52,8 @@ def qbe_form(request):
{'apps': apps,
'models': models,
'formset': formset,
'databases': DATABASES,
'database_alias': db_alias,
'title': _(u"Query by Example"),
'json_models': json_models,
'json_data': json_data,
Expand All @@ -61,7 +65,8 @@ def qbe_form(request):
def qbe_proxy(request):
if request.POST:
data = request.POST.copy()
formset = QueryByExampleFormSet(data=data)
db_alias = request.session.get("qbe_database", "default")
formset = QueryByExampleFormSet(data=data, using=db_alias)
if formset.is_valid():
pickled = pickle_encode(data)
query_hash = md5(pickled + settings.SECRET_KEY).hexdigest()
Expand All @@ -80,7 +85,12 @@ def qbe_results(request, query_hash):
data = request.session[query_key]
else:
return HttpResponseRedirect(reverse("qbe_form"))
formset = QueryByExampleFormSet(data=data)
db_alias = data.get("database_alias", "default")
if db_alias in DATABASES:
request.session["qbe_database"] = db_alias
else:
db_alias = request.session.get("qbe_database", "default")
formset = QueryByExampleFormSet(data=data, using=db_alias)
if formset.is_valid():
row_number = True
admin_name = getattr(settings, "QBE_ADMIN", "admin")
Expand Down Expand Up @@ -141,7 +151,8 @@ def qbe_export(request, format=None):
query_key = "qbe_query_%s" % query_hash
if format and format in formats and query_key in request.session:
data = request.session[query_key]
formset = QueryByExampleFormSet(data=data)
db_alias = request.session.get("qbe_database", "default")
formset = QueryByExampleFormSet(data=data, using=db_alias)
if formset.is_valid():
labels = formset.get_labels()
query = formset.get_raw_query()
Expand Down
3 changes: 2 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ def read(*rnames):

setup(
name='django_qbe',
version='0.1.1',
version='0.1.2',
author='Javier de la Rosa',
author_email='versae@gmail.com',
url='http://versae.github.com/qbe/',
Expand All @@ -23,6 +23,7 @@ def read(*rnames):
'Intended Audience :: Developers',
'License :: OSI Approved :: GNU Affero General Public License v3',
'Operating System :: OS Independent',
'Programming Language :: JavaScript',
'Programming Language :: Python',
'Topic :: Internet :: WWW/HTTP',
],
Expand Down

0 comments on commit 21c87e3

Please sign in to comment.