From c6a0c29401a7e26f7f7481254c27844aa022c9fd Mon Sep 17 00:00:00 2001 From: Corentin Chary Date: Mon, 26 Nov 2012 23:39:34 +0100 Subject: [PATCH] euscanwww: tweak the new handler code Signed-off-by: Corentin Chary --- euscanwww/djeuscan/managers.py | 9 +++ euscanwww/djeuscan/models.py | 2 +- .../djeuscan/templates/euscan/statistics.html | 78 ++++++++++++------- euscanwww/djeuscan/urls.py | 2 +- euscanwww/djeuscan/views.py | 30 +++---- 5 files changed, 79 insertions(+), 42 deletions(-) diff --git a/euscanwww/djeuscan/managers.py b/euscanwww/djeuscan/managers.py index 33d7ee8..6c04b85 100644 --- a/euscanwww/djeuscan/managers.py +++ b/euscanwww/djeuscan/managers.py @@ -109,6 +109,15 @@ class PackageMixin(object): ) return packages.filter(version__overlay=overlay).distinct() + def for_handler(self, handler): + """ + Returns packages that belong to the given handler + """ + packages = self.values( + 'id', 'name', 'category', 'n_versions', 'n_packaged', 'n_overlay' + ) + return packages.filter(version__handler=handler, + version__overlay="").distinct() class PackageQuerySet(models.query.QuerySet, PackageMixin): pass diff --git a/euscanwww/djeuscan/models.py b/euscanwww/djeuscan/models.py index 2c7f6c2..5a0991c 100644 --- a/euscanwww/djeuscan/models.py +++ b/euscanwww/djeuscan/models.py @@ -147,7 +147,7 @@ class Version(models.Model): alive = models.BooleanField(default=True, db_index=True) vtype = models.CharField(max_length=128, blank=True) - handler = models.CharField(max_length=128, blank=True) + handler = models.CharField(max_length=128, blank=True, db_index=True) confidence = models.IntegerField(default=0) ebuild_path = models.CharField(blank=True, max_length=256) diff --git a/euscanwww/djeuscan/templates/euscan/statistics.html b/euscanwww/djeuscan/templates/euscan/statistics.html index 8e03c3e..8372be0 100644 --- a/euscanwww/djeuscan/templates/euscan/statistics.html +++ b/euscanwww/djeuscan/templates/euscan/statistics.html @@ -2,36 +2,34 @@ {% load url from future %} +{% block css %} +{{ block.super }} + +{% endblock %} + + +{% block javascript %} +{{ block.super }} + + + + +{% endblock %} + + {% block content %}

Statistics

-
- -

Handlers

- - - - - - - - - - {% for handler in handlers %} - - - - - - {% endfor %} - -
# of found versionsaverage confidence
- - {{ handler.handler }} - - {{ handler.n }}{{ handler.avg_conf }}
- -
+

Current statistics

pie versions @@ -45,4 +43,30 @@ versions weekly versions monthly +
+ +

Handlers

+ + + + + + + + + + {% for handler in handlers %} + + + + + + {% endfor %} + +
Handler# of found versionsAverage confidence
+ + {{ handler.handler }} + + {{ handler.n }}{{ handler.avg_conf }}
+ {% endblock %} diff --git a/euscanwww/djeuscan/urls.py b/euscanwww/djeuscan/urls.py index 57cc08e..8e1e087 100644 --- a/euscanwww/djeuscan/urls.py +++ b/euscanwww/djeuscan/urls.py @@ -88,7 +88,7 @@ urlpatterns = patterns('djeuscan.views', url(r'^about/feeds$', 'feeds', name="feeds"), url(r'^about/config$', 'config', name="config"), url(r'^statistics/$', 'statistics', name="statistics"), - url(r'^statistics/handlers/(?P\w+)/$', 'statistics_handler', + url(r'^statistics/handlers/(?P[^/]+)/$', 'statistics_handler', name="statistics_handler"), url(r'^statistics/charts/(?P[\w\-]+).png$', 'chart', name="chart"), url(r'^world/$', 'world', name="world"), diff --git a/euscanwww/djeuscan/views.py b/euscanwww/djeuscan/views.py index e09b82f..1b128a4 100644 --- a/euscanwww/djeuscan/views.py +++ b/euscanwww/djeuscan/views.py @@ -380,25 +380,29 @@ def config(request): @render_to("euscan/statistics.html") def statistics(request): - handlers = ( - Version.objects.values("handler", "confidence") - .filter(overlay="") - .annotate(n=models.Count("handler"), - avg_conf=models.Avg("confidence")) - .order_by("-n") + # Didn't found a way to do: + # SELECT COUNT(*), AVG(confidence) FROM Versions + # GROUP BY handler + handlers = ( Version.objects.values("handler") + .filter(overlay="") + .annotate(n=models.Count("handler")) ) + for i in xrange(len(handlers)): + handler_id = handlers[i]['handler'] + avg = ( Version.objects.filter(handler=handler_id) + .aggregate(avg=models.Avg("confidence")) + ) + if not handler_id: + handlers[i]['handler'] = "None" + handlers[i]['avg_conf'] = avg['avg'] if 'avg' in avg else 0 return {"handlers": handlers} @render_to("euscan/statistics_handler.html") def statistics_handler(request, handler): - package_ids = [ - elem["package"] for elem in - Version.objects.filter(handler=handler) - .values("package") - .distinct() - ] - packages = Package.objects.filter(pk__in=package_ids) + if handler == "None": + handler = "" + packages = Package.objects.for_handler(handler) return {"handler": handler, "packages": packages}