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
-
-
-
- |
- # of found versions |
- average confidence |
-
-
-
- {% for handler in handlers %}
-
-
-
- {{ handler.handler }}
-
- |
- {{ handler.n }} |
- {{ handler.avg_conf }} |
-
- {% endfor %}
-
-
-
-
+
Current statistics
@@ -45,4 +43,30 @@
+
+
+Handlers
+
+
+
+ Handler |
+ # of found versions |
+ Average confidence |
+
+
+
+ {% for handler in handlers %}
+
+
+
+ {{ handler.handler }}
+
+ |
+ {{ handler.n }} |
+ {{ handler.avg_conf }} |
+
+ {% endfor %}
+
+
+
{% 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}