# HG changeset patch # User ymh # Date 1308837638 -7200 # Node ID e1098febb9d30d986d3ad50f5a8c678e7bc63654 # Parent deaa9393e6a206b3a60e1cd4bf87e04649618c94# Parent 1f01957a3eaed11ca63e7f75da1b326f8ac8de15 Merge with 1f01957a3eaed11ca63e7f75da1b326f8ac8de15 + some optimisations diff -r deaa9393e6a2 -r e1098febb9d3 web/hdabo/settings.py --- a/web/hdabo/settings.py Wed Jun 22 18:34:38 2011 +0200 +++ b/web/hdabo/settings.py Thu Jun 23 16:00:38 2011 +0200 @@ -111,8 +111,17 @@ 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', + #django-debug-toolbar + 'debug_toolbar.middleware.DebugToolbarMiddleware', ) +#django-debug-toolbar +INTERNAL_IPS = ('127.0.0.1','localhost',) +DEBUG_TOOLBAR_CONFIG = { + 'SHOW_TOOLBAR_CALLBACK': lambda(req): True, +} + + ROOT_URLCONF = 'hdabo.urls' TEMPLATE_DIRS = ( @@ -132,6 +141,8 @@ 'django_extensions', 'haystack', 'hdabo', + #django-debug-toolbar + 'debug_toolbar', ) # A sample logging configuration. The only tangible logging @@ -163,4 +174,7 @@ DBPEDIA_URI_TEMPLATE = "http://dbpedia.org/resource/%s" +SEARCH_STAR_CHARACTER = "*" +PAGINATION_DEFAULT_NB_BY_PAGE = 50 + from hdabo.config import * #@UnusedWildImport diff -r deaa9393e6a2 -r e1098febb9d3 web/hdabo/templates/partial/all_tags_table.html --- a/web/hdabo/templates/partial/all_tags_table.html Wed Jun 22 18:34:38 2011 +0200 +++ b/web/hdabo/templates/partial/all_tags_table.html Thu Jun 23 16:00:38 2011 +0200 @@ -7,7 +7,9 @@ Lien D Catégorie Supprimer
le lien W - Alias + Alias + Nb de
fiches + Popularité {% for tag in tags %} {{tag.id}} @@ -29,7 +31,9 @@ {% if tag.category %}{{ tag.category }}{% endif %} {{tag.label}} - {% if tag.alias %}{{tag.alias}}{% endif %} + {% if tag.alias %}{{tag.alias}}{% endif %} + {{tag.num_ds}} + {{tag.popularity}} {% endfor %} {% endblock %} diff -r deaa9393e6a2 -r e1098febb9d3 web/hdabo/views.py --- 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