From 064813560c20f53f9fd759d0c4e0f0a6729c8ba6 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sat, 9 Apr 2011 16:29:38 -0500 Subject: Show more info about todolists on developer dashboard Signed-off-by: Dan McGee --- templates/devel/index.html | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) (limited to 'templates/devel') diff --git a/templates/devel/index.html b/templates/devel/index.html index af2e5d28..92332c7a 100644 --- a/templates/devel/index.html +++ b/templates/devel/index.html @@ -72,19 +72,26 @@

Package Todo Lists

Name Creation Date + Creator Description + Package Count + Incomplete Count + {% for todo in todos %} - - {{ todo.name }} - {{ todo.date_added|date }} - {{ todo.description|urlize }} - + + {{ todo.name }} + {{ todo.date_added|date }} + {{ todo.creator.get_full_name }} + {{ todo.description|urlize }} + {{ todo.pkg_count }} + {{ todo.incomplete_count }} + {% empty %} - No package todo lists to display + No package todo lists to display {% endfor %} -- cgit v1.2.3-54-g00ecf From 96c59b1dc22b7318eadeaec11e7fed25829cecd5 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sat, 16 Apr 2011 07:25:47 -0500 Subject: Add some simple template caching on developer dashboard Signed-off-by: Dan McGee --- templates/devel/index.html | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'templates/devel') diff --git a/templates/devel/index.html b/templates/devel/index.html index 92332c7a..2eae0815 100644 --- a/templates/devel/index.html +++ b/templates/devel/index.html @@ -1,4 +1,6 @@ {% extends "base.html" %} +{% load cache %} + {% block title %}Arch Linux - Developer Dashboard{% endblock %} {% block content %} @@ -98,6 +100,7 @@

Package Todo Lists

+{% cache 60 dev-dash-by-arch %}

Stats by Architecture

@@ -124,9 +127,10 @@

Stats by Architecture

{% endfor %} +
{# #dash-by-arch #} +{% endcache %} - - +{% cache 60 dev-dash-by-repo %}

Stats by Repository

@@ -153,9 +157,10 @@

Stats by Repository

{% endfor %} +
{# dash-by-arch #} +{% endcache %} - - +{% cache 60 dev-dash-by-maintainer %}

Stats by Maintainer

@@ -191,8 +196,9 @@

Stats by Maintainer

{% endfor %} +
{# #dash-by-maintainer #} +{% endcache %} - {% load cdn %}{% jquery %} -- cgit v1.2.3-54-g00ecf From 381e0a787205af530ae11bac1b1a17e567eecc84 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Mon, 25 Apr 2011 18:09:39 -0500 Subject: Developer reports This commit adds four initial developer reports that are hopefully useful to developers and packages in checking up on the state of things. They include: * big : the 100 biggest packages in the repos * old : packages built > 2 years ago * uncompressed-man : self-explanatory * uncompressed-info : self-explanatory There should obviously be some sort of index page to access all of these, so that will be coming soon. Signed-off-by: Dan McGee --- devel/urls.py | 9 ++++--- devel/views.py | 54 +++++++++++++++++++++++++++++++++++---- main/templatetags/attributes.py | 21 ++++++++++++++++ templates/devel/packages.html | 56 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 131 insertions(+), 9 deletions(-) create mode 100644 main/templatetags/attributes.py create mode 100644 templates/devel/packages.html (limited to 'templates/devel') diff --git a/devel/urls.py b/devel/urls.py index 41be2b31..9bf50f45 100644 --- a/devel/urls.py +++ b/devel/urls.py @@ -1,12 +1,13 @@ from django.conf.urls.defaults import patterns urlpatterns = patterns('devel.views', - (r'^$', 'index'), + (r'^admin_log/$','admin_log'), + (r'^admin_log/(?P.*)/$','admin_log'), (r'^clock/$', 'clock'), - (r'^profile/$', 'change_profile'), + (r'^$', 'index'), (r'^newuser/$', 'new_user_form'), - (r'^admin_log/(?P.*)/$','admin_log'), - (r'^admin_log/$','admin_log'), + (r'^profile/$', 'change_profile'), + (r'^reports/(?P.*)/$', 'report'), ) # vim: set ts=4 sw=4 et: diff --git a/devel/views.py b/devel/views.py index b61e605f..01d54e6f 100644 --- a/devel/views.py +++ b/devel/views.py @@ -6,19 +6,22 @@ from django.contrib.sites.models import Site from django.core.mail import send_mail from django.db import transaction +from django.db.models import Q +from django.http import Http404 from django.shortcuts import get_object_or_404 from django.template import loader, Context from django.views.decorators.cache import never_cache from django.views.generic.simple import direct_to_template -from main.models import Package, TodolistPkg +from main.models import Package, PackageFile, TodolistPkg from main.models import Arch, Repo from main.models import UserProfile from packages.models import PackageRelation from todolists.utils import get_annotated_todolists from .utils import get_annotated_maintainers -import datetime +from datetime import datetime, timedelta +import operator import pytz import random from string import ascii_letters, digits @@ -26,7 +29,7 @@ @login_required @never_cache def index(request): - '''the Developer dashboard''' + '''the developer dashboard''' inner_q = PackageRelation.objects.filter(user=request.user).values('pkgbase') flagged = Package.objects.select_related('arch', 'repo').filter( flag_date__isnull=False, pkgbase__in=inner_q).order_by('pkgname') @@ -70,8 +73,8 @@ def clock(request): 'username').select_related('userprofile') # now annotate each dev object with their current time - now = datetime.datetime.now() - utc_now = datetime.datetime.utcnow().replace(tzinfo=pytz.utc) + now = datetime.now() + utc_now = datetime.utcnow().replace(tzinfo=pytz.utc) for dev in devs: # Work around https://bugs.launchpad.net/pytz/+bug/718673 timezone = str(dev.userprofile.time_zone) @@ -123,6 +126,47 @@ def change_profile(request): return direct_to_template(request, 'devel/profile.html', {'form': form, 'profile_form': profile_form}) +@login_required +def report(request, report): + title = "Developer Report" + packages = Package.objects.select_related('arch', 'repo') + names = attrs = None + if report == "old": + title = "Packages last built more than two years ago" + cutoff = datetime.now() - timedelta(days=730) + packages = packages.filter(build_date__lt=cutoff).order_by('build_date') + elif report == "big": + title = "100 largest compressed packages" + packages = packages.order_by('-compressed_size')[:100] + names = [ 'Compressed Size', 'Installed Size' ] + attrs = [ 'compressed_size', 'installed_size' ] + elif report == "uncompressed-man": + title = "Packages with uncompressed manpages" + # magic going on here! Checking for all '.1'...'.9' extensions + invalid_endings = [Q(filename__endswith='.%d' % n) for n in range(1,10)] + invalid_endings.append(Q(filename__endswith='.n')) + bad_files = PackageFile.objects.filter(Q(directory__contains='man') & ( + reduce(operator.or_, invalid_endings)) + ).values_list('pkg_id', flat=True).distinct() + packages = packages.filter(id__in=set(bad_files)) + elif report == "uncompressed-info": + title = "Packages with uncompressed infopages" + bad_files = PackageFile.objects.filter(directory__contains='/info', + filename__endswith='.info').values_list( + 'pkg_id', flat=True).distinct() + packages = packages.filter(id__in=set(bad_files)) + else: + raise Http404 + + context = { + 'title': title, + 'packages': packages, + 'column_names': names, + 'column_attrs': attrs, + } + return direct_to_template(request, 'devel/packages.html', context) + + class NewUserForm(forms.ModelForm): username = forms.CharField(max_length=30) private_email = forms.EmailField() diff --git a/main/templatetags/attributes.py b/main/templatetags/attributes.py new file mode 100644 index 00000000..bd4ccf3d --- /dev/null +++ b/main/templatetags/attributes.py @@ -0,0 +1,21 @@ +import re +from django import template +from django.conf import settings + +numeric_test = re.compile("^\d+$") +register = template.Library() + +def attribute(value, arg): + """Gets an attribute of an object dynamically from a string name""" + if hasattr(value, str(arg)): + return getattr(value, arg) + elif hasattr(value, 'has_key') and value.has_key(arg): + return value[arg] + elif numeric_test.match(str(arg)) and len(value) > int(arg): + return value[int(arg)] + else: + return settings.TEMPLATE_STRING_IF_INVALID + +register.filter('attribute', attribute) + +# vim: set ts=4 sw=4 et: diff --git a/templates/devel/packages.html b/templates/devel/packages.html new file mode 100644 index 00000000..3b511c98 --- /dev/null +++ b/templates/devel/packages.html @@ -0,0 +1,56 @@ +{% extends "base.html" %} +{% load attributes %} + +{% block title %}Arch Linux - {{ title }}{% endblock %} + +{% block content %} +
+

{{ title }}

+ + + + + + + + + + + + {% for name in column_names %} + + {% endfor %} + + + + {% for pkg in packages %} + + + + + {% if pkg.flag_date %} + + {% else %} + + {% endif %} + + + + + {% for attr in column_attrs %} + + {% endfor %} + + {% endfor %} + +
ArchRepoNameVersionDescriptionLast UpdatedBuild DateFlag Date{{ name }}
{{ pkg.arch.name }}{{ pkg.repo.name|capfirst }}{{ pkg.pkgname }}{{ pkg.full_version }}{{ pkg.full_version }}{{ pkg.pkgdesc }}{{ pkg.last_update|date }}{{ pkg.build_date|date }}{{ pkg.flag_date|date }}{{ pkg|attribute:attr }}
+
+{% load cdn %}{% jquery %} + + +{% endblock %} -- cgit v1.2.3-54-g00ecf From 174d04ad0334b1c441bc0237e3e2ed8f581575ef Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Mon, 25 Apr 2011 18:17:56 -0500 Subject: Add links to developer reports Signed-off-by: Dan McGee --- templates/devel/index.html | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'templates/devel') diff --git a/templates/devel/index.html b/templates/devel/index.html index 2eae0815..601de752 100644 --- a/templates/devel/index.html +++ b/templates/devel/index.html @@ -98,6 +98,14 @@

Package Todo Lists

+

Developer Reports

+ + {% cache 60 dev-dash-by-arch %} -- cgit v1.2.3-54-g00ecf From e58eb76a1ab4d6f1293b717e21da68f5aa3e5c45 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Fri, 29 Apr 2011 18:21:10 -0500 Subject: Change big packages report Signed-off-by: Dan McGee --- devel/views.py | 5 +++-- templates/devel/index.html | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) (limited to 'templates/devel') diff --git a/devel/views.py b/devel/views.py index cf24f0d9..a013b329 100644 --- a/devel/views.py +++ b/devel/views.py @@ -136,8 +136,9 @@ def report(request, report): cutoff = datetime.now() - timedelta(days=730) packages = packages.filter(build_date__lt=cutoff).order_by('build_date') elif report == 'big': - title = '100 largest compressed packages' - packages = packages.order_by('-compressed_size')[:100] + title = 'Packages with compressed size > 50 MiB' + cutoff = 50 * 1024 * 1024 + packages = packages.filter(compressed_size__gte=cutoff).order_by('-compressed_size') names = [ 'Compressed Size', 'Installed Size' ] attrs = [ 'compressed_size', 'installed_size' ] elif report == 'uncompressed-man': diff --git a/templates/devel/index.html b/templates/devel/index.html index 601de752..8bf8c910 100644 --- a/templates/devel/index.html +++ b/templates/devel/index.html @@ -100,7 +100,7 @@

Package Todo Lists

Developer Reports

    -
  • Big: 100 largest compressed packages in the repositories
  • +
  • Big: All packages with compressed size > 50 MiB
  • Old: Packages last built more than two years ago
  • Uncompressed Manpages: Self-explanatory
  • Uncompressed Info Pages: Self-explanatory
  • -- cgit v1.2.3-54-g00ecf From 5379348c9337a4abe27e807fef7956e11eebed30 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Fri, 29 Apr 2011 18:21:43 -0500 Subject: Add unneeded orphans report Signed-off-by: Dan McGee --- devel/views.py | 9 ++++++++- templates/devel/index.html | 3 +++ templates/devel/packages.html | 1 + 3 files changed, 12 insertions(+), 1 deletion(-) (limited to 'templates/devel') diff --git a/devel/views.py b/devel/views.py index a013b329..6907de24 100644 --- a/devel/views.py +++ b/devel/views.py @@ -13,7 +13,7 @@ from django.views.decorators.cache import never_cache from django.views.generic.simple import direct_to_template -from main.models import Package, PackageFile, TodolistPkg +from main.models import Package, PackageDepend, PackageFile, TodolistPkg from main.models import Arch, Repo from main.models import UserProfile from packages.models import PackageRelation @@ -156,6 +156,13 @@ def report(request, report): filename__endswith='.info').values_list( 'pkg_id', flat=True).distinct() packages = packages.filter(id__in=set(bad_files)) + elif report == 'unneeded-orphans': + title = 'Orphan packages required by no other packages' + owned = PackageRelation.objects.all().values('pkgbase') + required = PackageDepend.objects.all().values('depname') + # The two separate calls to exclude is required to do the right thing + packages = packages.exclude(pkgbase__in=owned).exclude( + pkgname__in=required) else: raise Http404 diff --git a/templates/devel/index.html b/templates/devel/index.html index 8bf8c910..29b98bdf 100644 --- a/templates/devel/index.html +++ b/templates/devel/index.html @@ -104,6 +104,9 @@

    Developer Reports

  • Old: Packages last built more than two years ago
  • Uncompressed Manpages: Self-explanatory
  • Uncompressed Info Pages: Self-explanatory
  • +
  • Unneeded Orphans: Packages + that have no maintainer and are not required by any other package in + any repository
diff --git a/templates/devel/packages.html b/templates/devel/packages.html index 3b511c98..32cdf217 100644 --- a/templates/devel/packages.html +++ b/templates/devel/packages.html @@ -6,6 +6,7 @@ {% block content %}

{{ title }}

+

{{ packages|length }} package{{ packages|pluralize }} found.

-- cgit v1.2.3-54-g00ecf From 8de1bd0639a8b6117bc35dfe0ad1e6a1ac34f715 Mon Sep 17 00:00:00 2001 From: Evangelos Foutras Date: Sat, 30 Apr 2011 15:15:38 +0300 Subject: Add filesizeformat filter to sizes in reports/big We also add a new 'filesize' tablesorter parser that handles all the suffixes found in django's filesizeformat filter. Signed-off-by: Dan McGee --- devel/views.py | 9 ++++++++- media/archweb.js | 27 +++++++++++++++++++++++++++ templates/devel/packages.html | 1 + 3 files changed, 36 insertions(+), 1 deletion(-) (limited to 'templates/devel') diff --git a/devel/views.py b/devel/views.py index 6907de24..9c523f0a 100644 --- a/devel/views.py +++ b/devel/views.py @@ -10,6 +10,7 @@ from django.http import Http404 from django.shortcuts import get_object_or_404 from django.template import loader, Context +from django.template.defaultfilters import filesizeformat from django.views.decorators.cache import never_cache from django.views.generic.simple import direct_to_template @@ -140,7 +141,13 @@ def report(request, report): cutoff = 50 * 1024 * 1024 packages = packages.filter(compressed_size__gte=cutoff).order_by('-compressed_size') names = [ 'Compressed Size', 'Installed Size' ] - attrs = [ 'compressed_size', 'installed_size' ] + attrs = [ 'compressed_size_pretty', 'installed_size_pretty' ] + # Format the compressed and installed sizes with MB/GB/etc suffixes + for package in packages: + package.compressed_size_pretty = filesizeformat( + package.compressed_size) + package.installed_size_pretty = filesizeformat( + package.installed_size) elif report == 'uncompressed-man': title = 'Packages with uncompressed manpages' # magic going on here! Checking for all '.1'...'.9' extensions diff --git a/media/archweb.js b/media/archweb.js index 03358fa9..78b15670 100644 --- a/media/archweb.js +++ b/media/archweb.js @@ -67,6 +67,33 @@ if (typeof $.tablesorter !== 'undefined') { }, type: 'numeric' }); + $.tablesorter.addParser({ + id: 'filesize', + re: /^(\d+(?:\.\d+)?) (bytes?|KB|MB|GB|TB)$/, + is: function(s) { + return this.re.test(s); + }, + format: function(s) { + var matches = this.re.exec(s); + var size = parseFloat(matches[1]); + var suffix = matches[2]; + + switch(suffix) { + case 'byte': + case 'bytes': + return size; + case 'KB': + return size * 1024; + case 'MB': + return size * 1024 * 1024; + case 'GB': + return size * 1024 * 1024 * 1024; + case 'TB': + return size * 1024 * 1024 * 1024 * 1024; + } + }, + type: 'numeric' + }); } /* news/add.html */ diff --git a/templates/devel/packages.html b/templates/devel/packages.html index 32cdf217..e0988c03 100644 --- a/templates/devel/packages.html +++ b/templates/devel/packages.html @@ -49,6 +49,7 @@

{{ title }}

{% load cdn %}{% jquery %} +