--- a/web/hdabo/views.py Wed Jun 22 18:34:38 2011 +0200
+++ b/web/hdabo/views.py Thu Jun 23 16:00:38 2011 +0200
@@ -3,7 +3,7 @@
from django.conf import settings
from django.contrib.auth.decorators import login_required #@UnusedImport
from django.core.paginator import Paginator
-from django.db.models import Max
+from django.db.models import Max, Count
from django.http import HttpResponseBadRequest
from django.shortcuts import render_to_response, redirect
from django.template import RequestContext
@@ -24,14 +24,21 @@
def home(request):
# Get all organizations
- orgas = Organisation.objects.all().order_by('name')
+ #ds_queryset = Datasheet.objects.filter(organisation="hdabo_organisation.id")
+
+ orgas = Organisation.objects.all()\
+ .order_by('name').annotate(nb_all=Count("datasheet"))\
+ .extra(select={
+ 'nb_val':"SELECT COUNT(*) FROM hdabo_datasheet WHERE hdabo_datasheet.validated=true and hdabo_datasheet.organisation_id=hdabo_organisation.id",
+ 'nb_unval':"SELECT COUNT(*) FROM hdabo_datasheet WHERE hdabo_datasheet.validated=false and hdabo_datasheet.organisation_id=hdabo_organisation.id",
+ })
# Count all validated, unvalidated sheets for each organisation
org_list = []
for orga in orgas :
- all_datasheets = Datasheet.objects.filter(organisation=orga)
- nb_all = len(all_datasheets)
- nb_val = len(all_datasheets.filter(validated=True))
- nb_unval = len(all_datasheets.filter(validated=False))
+ #all_datasheets = Datasheet.objects.filter(organisation=orga)
+ nb_all = orga.nb_all#len(all_datasheets)
+ nb_val = orga.nb_val#len(all_datasheets.filter(validated=True))
+ nb_unval = orga.nb_unval#len(all_datasheets.filter(validated=False))
org_list.append({'organisation':orga, 'nb_all':nb_all, 'nb_val':nb_val, 'nb_unval':nb_unval})
return render_to_response("organisation_list.html",
@@ -56,27 +63,28 @@
# If valid = 0, we search unvalidated sheets
# If valid = 1, we search validated sheets
# If valid = 2, we search AND DISPLAY all sheets
+ datasheets_qs = Datasheet.objects.filter(organisation=orga).order_by("id").select_related("format")
+
if valid == "1" :
# We count all the validated sheets
- datasheets = Datasheet.objects.filter(organisation=orga).filter(validated=True)
- nb_sheets = len(datasheets)
+ datasheets_qs = datasheets_qs.filter(validated=True)
# And select the current one
- datasheets = [datasheets[start_index]]
+ datasheets = [datasheets_qs[start_index]]
elif valid != "2":
valid = "0"
# We count all the validated sheets
- datasheets = Datasheet.objects.filter(organisation=orga).filter(validated=False)
- nb_sheets = len(datasheets)
+ datasheets_qs = datasheets_qs.filter(validated=False)
# And select the current one
- datasheets = [datasheets[start_index]]
- else :
- datasheets = Datasheet.objects.filter(organisation=orga)
- nb_sheets = len(datasheets)
+ datasheets = [datasheets_qs[start_index]]
+ else:
+ datasheets = datasheets_qs
+
+ nb_sheets = datasheets_qs.count()
# We get the ORDERED tags if we display one sheet (case valid = 0 and 1)
ordered_tags = None
if valid != "2" :
- ordered_tags = TaggedSheet.objects.filter(datasheet=datasheets[0]).order_by('order')
+ ordered_tags = TaggedSheet.objects.filter(datasheet=datasheets[0]).select_related("tag").order_by('order')
displayed_index = start_index + 1;
prev_index = max(start_index - 1, 0);
@@ -95,92 +103,21 @@
#@login_required
def all_tags(request, num_page=None, nb_by_page=None, searched=None):
- default_nb_py_page = 50
- star_character = "*"
# If the view is asked after a form sent with post vars, it means that searched is a post var.
if u"searched" in request.POST :
searched = request.POST["searched"]
- nb_by_page = default_nb_py_page
+ nb_by_page = settings.PAGINATION_DEFAULT_NB_BY_PAGE
num_page = 1
- alltags = Tag.objects.all()
-
- if searched and searched != "" :
- searched = searched.strip()
- regex = "^%s$" % (re.escape(searched).replace(re.escape(star_character),".*"))
- # searched terms are word, word* or *word* (* = star_character)
-# if searched.endswith(star_character) and not searched.startswith(star_character) :
-# alltags = alltags.filter(label__istartswith=searched[:-1])
-# elif not searched.endswith(star_character) and searched.startswith(star_character) :
-# alltags = alltags.filter(label__iendswith=searched[1:])
-# elif searched.endswith(star_character) and searched.startswith(star_character) :
-# alltags = alltags.filter(label__icontains=searched[1:-1])
-# else :
-# alltags = alltags.filter(label__iexact=searched)
- alltags = alltags.filter(label__iregex=regex)
-
- alltags = alltags.order_by('label')
-
- # We build the paginator for the requested list
- if nb_by_page :
- try:
- nb_by_page = int(nb_by_page)
- except :
- nb_by_page = default_nb_py_page
- else :
- nb_by_page = default_nb_py_page
- if num_page :
- try:
- num_page = int(num_page)
- except :
- num_page = 1
- else :
- num_page = 1
-
- p = Paginator(alltags, nb_by_page)
- current_page = p.page(num_page)
+ # Get paginator and current page
+ current_page, p, num_page, nb_by_page = get_current_page(num_page, nb_by_page, searched)
prev_page = max(num_page - 1, 1)
next_page = min(num_page + 1, p.num_pages)
last_page = p.num_pages
-
- search_def = (('0', urlquote('0' + star_character)),
- ('1', urlquote('1' + star_character)),
- ('2', urlquote('2' + star_character)),
- ('3', urlquote('3' + star_character)),
- ('4', urlquote('4' + star_character)),
- ('5', urlquote('5' + star_character)),
- ('6', urlquote('6' + star_character)),
- ('7', urlquote('7' + star_character)),
- ('8', urlquote('8' + star_character)),
- ('9', urlquote('9' + star_character)),
- ('A', urlquote('a' + star_character)),
- ('B', urlquote('b' + star_character)),
- ('C', urlquote('c' + star_character)),
- ('D', urlquote('d' + star_character)),
- ('E', urlquote('e' + star_character)),
- ('F', urlquote('f' + star_character)),
- ('G', urlquote('g' + star_character)),
- ('H', urlquote('h' + star_character)),
- ('I', urlquote('i' + star_character)),
- ('J', urlquote('j' + star_character)),
- ('K', urlquote('k' + star_character)),
- ('L', urlquote('l' + star_character)),
- ('M', urlquote('m' + star_character)),
- ('N', urlquote('n' + star_character)),
- ('O', urlquote('o' + star_character)),
- ('P', urlquote('p' + star_character)),
- ('Q', urlquote('q' + star_character)),
- ('R', urlquote('r' + star_character)),
- ('S', urlquote('s' + star_character)),
- ('T', urlquote('t' + star_character)),
- ('U', urlquote('u' + star_character)),
- ('V', urlquote('v' + star_character)),
- ('W', urlquote('w' + star_character)),
- ('X', urlquote('x' + star_character)),
- ('Y', urlquote('y' + star_character)),
- ('Z', urlquote('z' + star_character)))
-
+
+ search_def = tuple([(c,urlquote(c + settings.SEARCH_STAR_CHARACTER)) for c in '01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ'])
+
return render_to_response("all_tags.html",
{'nb_total':p.count, 'tags':current_page.object_list, 'current_page':current_page,
'prev_page':prev_page, 'next_page':next_page, 'last_page':last_page,
@@ -237,29 +174,33 @@
#@login_required
def get_all_tags_table(request, num_page=None, nb_by_page=None, searched=None):
- default_nb_py_page = 50
- star_character = "*"
+ current_page, p, num_page, nb_by_page = get_current_page(num_page, nb_by_page, searched) #@UnusedVariable
+
+ return render_to_response("partial/all_tags_table.html",
+ {'tags':current_page.object_list},
+ context_instance=RequestContext(request))
+
+
+def get_current_page(num_page=None, nb_by_page=None, searched=None):
+
+ base_queryset = Tag.objects.all()
+
if searched and searched != "" :
- # searched terms are word, word* or *word* (* = star_character)
- if searched.endswith(star_character) and not searched.startswith(star_character) :
- alltags = Tag.objects.filter(label__istartswith=searched[:-1]).order_by('label')
- elif not searched.endswith(star_character) and searched.startswith(star_character) :
- alltags = Tag.objects.filter(label__iendswith=searched[1:]).order_by('label')
- elif searched.endswith(star_character) and searched.startswith(star_character) :
- alltags = Tag.objects.filter(label__icontains=searched[1:-1]).order_by('label')
- else :
- alltags = Tag.objects.filter(label__iexact=searched).order_by('label')
- else :
- alltags = Tag.objects.order_by('label')
+ searched = searched.strip()
+ regex = "^%s$" % (re.escape(searched).replace(re.escape(settings.SEARCH_STAR_CHARACTER),".*"))
+ base_queryset = base_queryset.filter(label__iregex=regex)
+
+ alltags = base_queryset.annotate(num_ds=Count('datasheet')).order_by('-popularity','-num_ds','label')
+ #alltags = alltags.order_by('-popularity','label')
# We build the paginator for the requested list
if nb_by_page :
try:
nb_by_page = int(nb_by_page)
except :
- nb_by_page = default_nb_py_page
+ nb_by_page = settings.PAGINATION_DEFAULT_NB_BY_PAGE
else :
- nb_by_page = default_nb_py_page
+ nb_by_page = settings.PAGINATION_DEFAULT_NB_BY_PAGE
if num_page :
try:
num_page = int(num_page)
@@ -268,11 +209,12 @@
else :
num_page = 1
p = Paginator(alltags, nb_by_page)
+
+ #use the much simpler base query to have the count
+ p._count = base_queryset.count()
current_page = p.page(num_page)
- return render_to_response("partial/all_tags_table.html",
- {'tags':current_page.object_list},
- context_instance=RequestContext(request))
+ return current_page, p, num_page, nb_by_page
#@login_required