From 87e8a16d6573d760cfb2a1388c29c1ea768fc620 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Mon, 3 Nov 2014 18:32:15 -0600 Subject: Update fixtures for new staff groups Signed-off-by: Dan McGee --- devel/fixtures/staff_groups.json | 72 +++ main/fixtures/groups.json | 961 ++++++++++++++++++++------------------- 2 files changed, 567 insertions(+), 466 deletions(-) create mode 100644 devel/fixtures/staff_groups.json diff --git a/devel/fixtures/staff_groups.json b/devel/fixtures/staff_groups.json new file mode 100644 index 00000000..6a0a0514 --- /dev/null +++ b/devel/fixtures/staff_groups.json @@ -0,0 +1,72 @@ +[ +{ + "fields": { + "group": [ + "Developers" + ], + "description": "This is a list of the current Arch Linux Developers. They maintain the [core] and [extra] package repositories in addition to doing any other developer duties.", + "sort_order": 1, + "member_title": "Developer", + "slug": "developers", + "name": "Developers" + }, + "model": "devel.staffgroup", + "pk": 1 +}, +{ + "fields": { + "group": [ + "Trusted Users" + ], + "description": "Here are all your friendly Arch Linux Trusted Users who are in charge of the [community] repository.", + "sort_order": 2, + "member_title": "Trusted User", + "slug": "trusted-users", + "name": "Trusted Users" + }, + "model": "devel.staffgroup", + "pk": 2 +}, +{ + "fields": { + "group": [ + "Retired Developers" + ], + "description": "Below you can find a list of ex-developers (aka project fellows). These folks helped make Arch what it is today. Thanks!", + "sort_order": 11, + "member_title": "Fellow", + "slug": "developer-fellows", + "name": "Developer Fellows" + }, + "model": "devel.staffgroup", + "pk": 3 +}, +{ + "fields": { + "group": [ + "Retired Trusted Users" + ], + "description": "Below you can find a list of ex-trusted users (aka fellows). These folks helped make Arch what it is today. Thanks!", + "sort_order": 12, + "member_title": "Fellow", + "slug": "trusted-user-fellows", + "name": "Trusted User Fellows" + }, + "model": "devel.staffgroup", + "pk": 4 +}, +{ + "fields": { + "group": [ + "Support Staff" + ], + "description": "These are the unheralded people that keep things running behind the scenes. Forum moderators, wiki admins, IRC moderators, mirror maintenance, and everything else that keeps a Linux distro running smoothly.", + "sort_order": 5, + "member_title": "Staff", + "slug": "support-staff", + "name": "Support Staff" + }, + "model": "devel.staffgroup", + "pk": 5 +} +] diff --git a/main/fixtures/groups.json b/main/fixtures/groups.json index 134b98b3..2205be7c 100644 --- a/main/fixtures/groups.json +++ b/main/fixtures/groups.json @@ -1,475 +1,504 @@ [ - { - "pk": 1, - "model": "auth.group", - "fields": { - "name": "Developers", - "permissions": [ - [ - "change_package", - "main", - "package" - ], - [ - "add_news", - "news", - "news" - ], - [ - "change_news", - "news", - "news" - ], - [ - "add_signoff", - "packages", - "signoff" - ], - [ - "change_signoff", - "packages", - "signoff" - ], - [ - "add_signoffspecification", - "packages", - "signoffspecification" - ], - [ - "change_signoffspecification", - "packages", - "signoffspecification" - ], - [ - "add_todolist", - "todolists", - "todolist" - ], - [ - "change_todolist", - "todolists", - "todolist" - ], - [ - "add_todolistpackage", - "todolists", - "todolistpackage" - ], - [ - "change_todolistpackage", - "todolists", - "todolistpackage" - ], - [ - "delete_todolistpackage", - "todolists", - "todolistpackage" - ] +{ + "fields": { + "name": "Developers", + "permissions": [ + [ + "change_package", + "main", + "package" + ], + [ + "add_news", + "news", + "news" + ], + [ + "change_news", + "news", + "news" + ], + [ + "add_signoff", + "packages", + "signoff" + ], + [ + "change_signoff", + "packages", + "signoff" + ], + [ + "add_signoffspecification", + "packages", + "signoffspecification" + ], + [ + "change_signoffspecification", + "packages", + "signoffspecification" + ], + [ + "add_todolist", + "todolists", + "todolist" + ], + [ + "change_todolist", + "todolists", + "todolist" + ], + [ + "add_todolistpackage", + "todolists", + "todolistpackage" + ], + [ + "change_todolistpackage", + "todolists", + "todolistpackage" + ], + [ + "delete_todolistpackage", + "todolists", + "todolistpackage" ] - } - }, - { - "pk": 2, - "model": "auth.group", - "fields": { - "name": "Trusted Users", - "permissions": [ - [ - "change_package", - "main", - "package" - ], - [ - "add_signoff", - "packages", - "signoff" - ], - [ - "change_signoff", - "packages", - "signoff" - ], - [ - "add_signoffspecification", - "packages", - "signoffspecification" - ], - [ - "change_signoffspecification", - "packages", - "signoffspecification" - ], - [ - "add_todolist", - "todolists", - "todolist" - ], - [ - "change_todolist", - "todolists", - "todolist" - ], - [ - "add_todolistpackage", - "todolists", - "todolistpackage" - ], - [ - "change_todolistpackage", - "todolists", - "todolistpackage" - ], - [ - "delete_todolistpackage", - "todolists", - "todolistpackage" - ] + ] + }, + "model": "auth.group", + "pk": 1 +}, +{ + "fields": { + "name": "Trusted Users", + "permissions": [ + [ + "change_package", + "main", + "package" + ], + [ + "add_signoff", + "packages", + "signoff" + ], + [ + "change_signoff", + "packages", + "signoff" + ], + [ + "add_signoffspecification", + "packages", + "signoffspecification" + ], + [ + "change_signoffspecification", + "packages", + "signoffspecification" + ], + [ + "add_todolist", + "todolists", + "todolist" + ], + [ + "change_todolist", + "todolists", + "todolist" + ], + [ + "add_todolistpackage", + "todolists", + "todolistpackage" + ], + [ + "change_todolistpackage", + "todolists", + "todolistpackage" + ], + [ + "delete_todolistpackage", + "todolists", + "todolistpackage" ] - } - }, - { - "pk": 3, - "model": "auth.group", - "fields": { - "name": "Mirror Maintainers", - "permissions": [ - [ - "add_mirror", - "mirrors", - "mirror" - ], - [ - "change_mirror", - "mirrors", - "mirror" - ], - [ - "delete_mirror", - "mirrors", - "mirror" - ], - [ - "add_mirrorprotocol", - "mirrors", - "mirrorprotocol" - ], - [ - "change_mirrorprotocol", - "mirrors", - "mirrorprotocol" - ], - [ - "add_mirrorrsync", - "mirrors", - "mirrorrsync" - ], - [ - "change_mirrorrsync", - "mirrors", - "mirrorrsync" - ], - [ - "delete_mirrorrsync", - "mirrors", - "mirrorrsync" - ], - [ - "add_mirrorurl", - "mirrors", - "mirrorurl" - ], - [ - "change_mirrorurl", - "mirrors", - "mirrorurl" - ], - [ - "delete_mirrorurl", - "mirrors", - "mirrorurl" - ] + ] + }, + "model": "auth.group", + "pk": 2 +}, +{ + "fields": { + "name": "Mirror Maintainers", + "permissions": [ + [ + "add_mirror", + "mirrors", + "mirror" + ], + [ + "change_mirror", + "mirrors", + "mirror" + ], + [ + "delete_mirror", + "mirrors", + "mirror" + ], + [ + "add_mirrorprotocol", + "mirrors", + "mirrorprotocol" + ], + [ + "change_mirrorprotocol", + "mirrors", + "mirrorprotocol" + ], + [ + "add_mirrorrsync", + "mirrors", + "mirrorrsync" + ], + [ + "change_mirrorrsync", + "mirrors", + "mirrorrsync" + ], + [ + "delete_mirrorrsync", + "mirrors", + "mirrorrsync" + ], + [ + "add_mirrorurl", + "mirrors", + "mirrorurl" + ], + [ + "change_mirrorurl", + "mirrors", + "mirrorurl" + ], + [ + "delete_mirrorurl", + "mirrors", + "mirrorurl" ] - } - }, - { - "pk": 4, - "model": "auth.group", - "fields": { - "name": "User Admins", - "permissions": [ - [ - "add_user", - "auth", - "user" - ], - [ - "change_user", - "auth", - "user" - ], - [ - "add_userprofile", - "devel", - "userprofile" - ], - [ - "change_userprofile", - "devel", - "userprofile" - ] + ] + }, + "model": "auth.group", + "pk": 3 +}, +{ + "fields": { + "name": "User Admins", + "permissions": [ + [ + "add_user", + "auth", + "user" + ], + [ + "change_user", + "auth", + "user" + ], + [ + "change_staffgroup", + "devel", + "staffgroup" + ], + [ + "add_userprofile", + "devel", + "userprofile" + ], + [ + "change_userprofile", + "devel", + "userprofile" ] - } - }, - { - "pk": 5, - "model": "auth.group", - "fields": { - "name": "Release Engineering", - "permissions": [ - [ - "add_architecture", - "releng", - "architecture" - ], - [ - "change_architecture", - "releng", - "architecture" - ], - [ - "delete_architecture", - "releng", - "architecture" - ], - [ - "add_bootloader", - "releng", - "bootloader" - ], - [ - "change_bootloader", - "releng", - "bootloader" - ], - [ - "delete_bootloader", - "releng", - "bootloader" - ], - [ - "add_boottype", - "releng", - "boottype" - ], - [ - "change_boottype", - "releng", - "boottype" - ], - [ - "delete_boottype", - "releng", - "boottype" - ], - [ - "add_clockchoice", - "releng", - "clockchoice" - ], - [ - "change_clockchoice", - "releng", - "clockchoice" - ], - [ - "delete_clockchoice", - "releng", - "clockchoice" - ], - [ - "add_filesystem", - "releng", - "filesystem" - ], - [ - "change_filesystem", - "releng", - "filesystem" - ], - [ - "delete_filesystem", - "releng", - "filesystem" - ], - [ - "add_hardwaretype", - "releng", - "hardwaretype" - ], - [ - "change_hardwaretype", - "releng", - "hardwaretype" - ], - [ - "delete_hardwaretype", - "releng", - "hardwaretype" - ], - [ - "add_installtype", - "releng", - "installtype" - ], - [ - "change_installtype", - "releng", - "installtype" - ], - [ - "delete_installtype", - "releng", - "installtype" - ], - [ - "add_iso", - "releng", - "iso" - ], - [ - "change_iso", - "releng", - "iso" - ], - [ - "delete_iso", - "releng", - "iso" - ], - [ - "add_isotype", - "releng", - "isotype" - ], - [ - "change_isotype", - "releng", - "isotype" - ], - [ - "delete_isotype", - "releng", - "isotype" - ], - [ - "add_module", - "releng", - "module" - ], - [ - "change_module", - "releng", - "module" - ], - [ - "delete_module", - "releng", - "module" - ], - [ - "add_release", - "releng", - "release" - ], - [ - "change_release", - "releng", - "release" - ], - [ - "delete_release", - "releng", - "release" - ], - [ - "add_source", - "releng", - "source" - ], - [ - "change_source", - "releng", - "source" - ], - [ - "delete_source", - "releng", - "source" - ], - [ - "add_test", - "releng", - "test" - ], - [ - "change_test", - "releng", - "test" - ], - [ - "delete_test", - "releng", - "test" - ] + ] + }, + "model": "auth.group", + "pk": 4 +}, +{ + "fields": { + "name": "Release Engineering", + "permissions": [ + [ + "add_architecture", + "releng", + "architecture" + ], + [ + "change_architecture", + "releng", + "architecture" + ], + [ + "delete_architecture", + "releng", + "architecture" + ], + [ + "add_bootloader", + "releng", + "bootloader" + ], + [ + "change_bootloader", + "releng", + "bootloader" + ], + [ + "delete_bootloader", + "releng", + "bootloader" + ], + [ + "add_boottype", + "releng", + "boottype" + ], + [ + "change_boottype", + "releng", + "boottype" + ], + [ + "delete_boottype", + "releng", + "boottype" + ], + [ + "add_clockchoice", + "releng", + "clockchoice" + ], + [ + "change_clockchoice", + "releng", + "clockchoice" + ], + [ + "delete_clockchoice", + "releng", + "clockchoice" + ], + [ + "add_filesystem", + "releng", + "filesystem" + ], + [ + "change_filesystem", + "releng", + "filesystem" + ], + [ + "delete_filesystem", + "releng", + "filesystem" + ], + [ + "add_hardwaretype", + "releng", + "hardwaretype" + ], + [ + "change_hardwaretype", + "releng", + "hardwaretype" + ], + [ + "delete_hardwaretype", + "releng", + "hardwaretype" + ], + [ + "add_installtype", + "releng", + "installtype" + ], + [ + "change_installtype", + "releng", + "installtype" + ], + [ + "delete_installtype", + "releng", + "installtype" + ], + [ + "add_iso", + "releng", + "iso" + ], + [ + "change_iso", + "releng", + "iso" + ], + [ + "delete_iso", + "releng", + "iso" + ], + [ + "add_isotype", + "releng", + "isotype" + ], + [ + "change_isotype", + "releng", + "isotype" + ], + [ + "delete_isotype", + "releng", + "isotype" + ], + [ + "add_module", + "releng", + "module" + ], + [ + "change_module", + "releng", + "module" + ], + [ + "delete_module", + "releng", + "module" + ], + [ + "add_release", + "releng", + "release" + ], + [ + "change_release", + "releng", + "release" + ], + [ + "delete_release", + "releng", + "release" + ], + [ + "add_source", + "releng", + "source" + ], + [ + "change_source", + "releng", + "source" + ], + [ + "delete_source", + "releng", + "source" + ], + [ + "add_test", + "releng", + "test" + ], + [ + "change_test", + "releng", + "test" + ], + [ + "delete_test", + "releng", + "test" ] - } - }, - { - "pk": 6, - "model": "auth.group", - "fields": { - "name": "Package Relation Maintainers", - "permissions": [ - [ - "add_packagerelation", - "packages", - "packagerelation" - ], - [ - "change_packagerelation", - "packages", - "packagerelation" - ], - [ - "delete_packagerelation", - "packages", - "packagerelation" - ] + ] + }, + "model": "auth.group", + "pk": 5 +}, +{ + "fields": { + "name": "Package Relation Maintainers", + "permissions": [ + [ + "add_packagerelation", + "packages", + "packagerelation" + ], + [ + "change_packagerelation", + "packages", + "packagerelation" + ], + [ + "delete_packagerelation", + "packages", + "packagerelation" ] - } - }, - { - "pk": 8, - "model": "auth.group", - "fields": { - "name": "Download Page Releases", - "permissions": [ - [ - "add_release", - "releng", - "release" - ], - [ - "change_release", - "releng", - "release" - ], - [ - "delete_release", - "releng", - "release" - ] + ] + }, + "model": "auth.group", + "pk": 6 +}, +{ + "fields": { + "name": "Download Page Releases", + "permissions": [ + [ + "add_release", + "releng", + "release" + ], + [ + "change_release", + "releng", + "release" + ], + [ + "delete_release", + "releng", + "release" ] - } - } + ] + }, + "model": "auth.group", + "pk": 8 +}, +{ + "fields": { + "name": "Retired Developers", + "permissions": [] + }, + "model": "auth.group", + "pk": 9 +}, +{ + "fields": { + "name": "Retired Trusted Users", + "permissions": [] + }, + "model": "auth.group", + "pk": 10 +}, +{ + "fields": { + "name": "Support Staff", + "permissions": [] + }, + "model": "auth.group", + "pk": 11 +} ] -- cgit v1.2.3 From 1bf6358b94d0466cd0ab0e5ef47bd45d770e477e Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Wed, 5 Nov 2014 22:39:21 -0600 Subject: Always link to torrent and magnet, even if not available We were already doing this on the details page; no need to hide it on the listing page. Signed-off-by: Dan McGee --- templates/releng/release_list.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/templates/releng/release_list.html b/templates/releng/release_list.html index be257f9e..5c8e003a 100644 --- a/templates/releng/release_list.html +++ b/templates/releng/release_list.html @@ -31,9 +31,9 @@ {{ item.version }} {{ item.kernel_version|default:"" }} {{ item.available|yesno|capfirst }} - {% if item.available %}Torrent{% endif %} - {% if item.available %}Magnet{% endif %} + Torrent + Magnet {% if item.torrent_data %}{{ item.torrent.file_length|filesizeformat }}{% endif %} {% endfor %} -- cgit v1.2.3 From 935d801615dd320693d4c85359aab9f12bd91b14 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Wed, 5 Nov 2014 23:02:24 -0600 Subject: Add icons, more detail to releases pages Signed-off-by: Dan McGee --- sitestatic/download.png | Bin 0 -> 1155 bytes sitestatic/magnet.png | Bin 0 -> 2382 bytes templates/releng/release_detail.html | 15 ++++++++++----- templates/releng/release_list.html | 25 +++++++++++++++++++------ 4 files changed, 29 insertions(+), 11 deletions(-) create mode 100644 sitestatic/download.png create mode 100644 sitestatic/magnet.png diff --git a/sitestatic/download.png b/sitestatic/download.png new file mode 100644 index 00000000..9ab858c2 Binary files /dev/null and b/sitestatic/download.png differ diff --git a/sitestatic/magnet.png b/sitestatic/magnet.png new file mode 100644 index 00000000..f67e69b9 Binary files /dev/null and b/sitestatic/magnet.png differ diff --git a/templates/releng/release_detail.html b/templates/releng/release_detail.html index 5cd1c432..11155c0c 100644 --- a/templates/releng/release_detail.html +++ b/templates/releng/release_detail.html @@ -1,4 +1,5 @@ {% extends "base.html" %} +{% load static %} {% block title %}Arch Linux - Release: {{ release.version }}{% endblock %} @@ -9,11 +10,15 @@
  • Release Date: {{ release.release_date|date }}
  • {% if release.kernel_version %}
  • Kernel Version: {{ release.kernel_version }}
  • {% endif %} -
  • Available: {{ release.available|yesno }}
  • - {% if release.torrent_data %}
  • Download: Torrent, - Magnet
  • {% endif %} +
  • Available: {{ release.available|yesno|capfirst }}
  • + {% if release.torrent_data %} +
  • + Download via Torrent
  • +
  • + Download via Magnet URI
  • + {% endif %} {% if release.md5_sum %}
  • MD5: {{ release.md5_sum }}
  • {% endif %} {% if release.sha1_sum %}
  • SHA1: {{ release.sha1_sum }}
  • {% endif %}
diff --git a/templates/releng/release_list.html b/templates/releng/release_list.html index 5c8e003a..fa15bcb9 100644 --- a/templates/releng/release_list.html +++ b/templates/releng/release_list.html @@ -12,28 +12,41 @@

Releases

+

This is a list of ISO releases made by the Arch Linux release + engineering team. These are typically done on a monthly cadence, containing + the latest kernel and base packages from the package repositories. Click + the version of each release to read any additional notes or details about + each release.

+

Torrents and magnet URIs are available to download the releases. + Releases listed as not available may still be seeded by peers, but are no + longer registered via the official Arch Linux torrent tracker. We always + recommend running the latest available release.

+ + - - {% for item in release_list %} + - - {% endfor %} @@ -50,7 +63,7 @@ $(document).ready(function() { $(".results").tablesorter({ widgets: ['zebra'], sortList: [[0,1], [1,1]], - headers: { 4: { sorter: false }, 5: { sorter: false } } + headers: { 0: { sorter: false } } }); }); -- cgit v1.2.3 From 9b5eb6ab383dcd090cdbf88a250ecdfd407c3beb Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Wed, 5 Nov 2014 23:03:43 -0600 Subject: Add torrent/magnet icons to download page Signed-off-by: Dan McGee --- templates/public/download.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/public/download.html b/templates/public/download.html index 967d8a6e..cbd7cd73 100644 --- a/templates/public/download.html +++ b/templates/public/download.html @@ -59,9 +59,9 @@ {% if release %}{% endif %}

Netboot

-- cgit v1.2.3 From cd22bfd73b184888df13b194ecdf6e482b36c3fc Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Fri, 7 Nov 2014 09:27:56 -0600 Subject: Master signing keys page improvements * Don't show non-packagers * Don't hardcode group names in view code * Reduce number of database queries for all of the cross-signature developer name lookups Signed-off-by: Dan McGee --- main/templatetags/pgp.py | 19 ++++++------------- public/views.py | 37 ++++++++++++++++++++++--------------- templates/public/keys.html | 4 ++-- visualize/static/visualize.js | 5 ++--- 4 files changed, 32 insertions(+), 33 deletions(-) diff --git a/main/templatetags/pgp.py b/main/templatetags/pgp.py index 2417f688..455e8f9c 100644 --- a/main/templatetags/pgp.py +++ b/main/templatetags/pgp.py @@ -44,21 +44,14 @@ def pgp_key_link(key_id, link_text=None): return '%s' % values -@cache_function(1741) -def name_for_key(normalized): - try: - matching_key = DeveloperKey.objects.select_related( - 'owner').get(key=normalized, owner_id__isnull=False) - return matching_key.owner.get_full_name() - except DeveloperKey.DoesNotExist: - return None - - @register.simple_tag -def user_pgp_key_link(key_id): +def user_pgp_key_link(dev_keys, key_id): normalized = key_id[-16:] - name = name_for_key(normalized) - return pgp_key_link(key_id, name) + found = dev_keys.get(normalized, None) + if found: + return pgp_key_link(key_id, found.owner.get_full_name()) + else: + return pgp_key_link(key_id, None) @register.filter(needs_autoescape=True) diff --git a/public/views.py b/public/views.py index 118f067a..c0dae400 100644 --- a/public/views.py +++ b/public/views.py @@ -9,7 +9,7 @@ from django.http import HttpResponse from django.shortcuts import get_object_or_404, render from django.views.decorators.cache import cache_control, cache_page -from devel.models import MasterKey, PGPSignature, StaffGroup +from devel.models import MasterKey, DeveloperKey, PGPSignature, StaffGroup, UserProfile from main.models import Arch, Repo, Donor from mirrors.models import MirrorUrl from news.models import News @@ -91,7 +91,9 @@ def feeds(request): @cache_control(max_age=307) def keys(request): - users = User.objects.filter(is_active=True).select_related( + profile_ids = UserProfile.allowed_repos.through.objects.values('userprofile_id') + users = User.objects.filter( + is_active=True, userprofile__id__in=profile_ids).select_related( 'userprofile__pgp_key').order_by('first_name', 'last_name') user_key_ids = frozenset(user.userprofile.pgp_key[-16:] for user in users if user.userprofile.pgp_key) @@ -114,34 +116,39 @@ def keys(request): not_expired, revoked__isnull=True).values_list('signer', 'signee')) restrict = Q(signer__in=user_key_ids) & Q(signee__in=user_key_ids) - cross_signatures = PGPSignature.objects.filter(restrict, + cross_signatures = PGPSignature.objects.filter( not_expired, revoked__isnull=True).order_by('created') + # filter in python so we aren't sending a crazy long query to the DB + cross_signatures = [s for s in cross_signatures + if s.signer in user_key_ids and s.signee in user_key_ids] + + developer_keys = DeveloperKey.objects.select_related( + 'owner').filter(owner__isnull=False) + developer_keys = {key.key[-16:]: key for key in developer_keys} context = { 'keys': master_keys, 'active_users': users, 'signatures': signatures, 'cross_signatures': cross_signatures, + 'developer_keys': developer_keys, } return render(request, 'public/keys.html', context) @cache_page(1789) def keys_json(request): - node_list = [] + profile_ids = UserProfile.allowed_repos.through.objects.values('userprofile_id') + users = User.objects.filter( + is_active=True, userprofile__id__in=profile_ids).select_related( + 'userprofile__pgp_key').order_by('first_name', 'last_name') users = User.objects.filter(is_active=True).select_related('userprofile') - node_list.extend({ - 'name': dev.get_full_name(), - 'key': dev.userprofile.pgp_key, - 'group': 'dev' - } for dev in users.filter(groups__name='Developers')) - node_list.extend({ - 'name': tu.get_full_name(), - 'key': tu.userprofile.pgp_key, - 'group': 'tu' - } for tu in users.filter(groups__name='Trusted Users').exclude( - groups__name='Developers')) + node_list = [{ + 'name': user.get_full_name(), + 'key': user.userprofile.pgp_key, + 'group': 'packager' + } for user in users] master_keys = MasterKey.objects.select_related('owner').filter( revoked__isnull=True) diff --git a/templates/public/keys.html b/templates/public/keys.html index 54d52ab8..37d5b232 100644 --- a/templates/public/keys.html +++ b/templates/public/keys.html @@ -123,8 +123,8 @@
{% for sig in cross_signatures %} - - + + diff --git a/visualize/static/visualize.js b/visualize/static/visualize.js index 5004fe6c..5254c26b 100644 --- a/visualize/static/visualize.js +++ b/visualize/static/visualize.js @@ -175,7 +175,7 @@ function developer_keys(chart_id, data_url) { } }); jQuery.map(json.nodes, function(d, i) { - if (d.group === "dev" || d.group === "tu") { + if (d.group === "packager") { d.approved = d.master_sigs >= 3; } else { d.approved = null; @@ -200,8 +200,7 @@ function developer_keys(chart_id, data_url) { return r * 1.6 - 0.75; case "cacert": return r * 1.4 - 0.75; - case "dev": - case "tu": + case "packager": default: return r - 0.75; } -- cgit v1.2.3 From eb7172cd4d9d7af690b2be06e3f925d3023be71c Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sat, 8 Nov 2014 13:43:59 -0600 Subject: Convert some of URL details to Jinja2 Anytime we have a loop with >100 items, the Django template engine begins to be the bottleneck. This one is relatively straightforward to convert, and sets the stage for converting the mirror status page as well. Signed-off-by: Dan McGee --- mirrors/templatetags/jinja2.py | 31 +++++++++++++++++++++++++++ packages/templatetags/jinja2.py | 1 - templates/mirrors/url_details.html | 29 +------------------------ templates/mirrors/url_details_logs.html.jinja | 28 ++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 29 deletions(-) create mode 100644 mirrors/templatetags/jinja2.py create mode 100644 templates/mirrors/url_details_logs.html.jinja diff --git a/mirrors/templatetags/jinja2.py b/mirrors/templatetags/jinja2.py new file mode 100644 index 00000000..5d47fe9b --- /dev/null +++ b/mirrors/templatetags/jinja2.py @@ -0,0 +1,31 @@ +from django_jinja import library +from markupsafe import Markup + + +@library.global_function +def country_flag(country): + if not country: + return '' + html = ' ' % ( + unicode(country.code).lower(), unicode(country.name)) + return Markup(html) + + +@library.filter +def duration(value): + if not value and type(value) != timedelta: + return u'' + # does not take microseconds into account + total_secs = value.seconds + value.days * 24 * 3600 + mins = total_secs // 60 + hrs, mins = divmod(mins, 60) + return '%d:%02d' % (hrs, mins) + + +@library.filter +def floatvalue(value, arg=2): + if value is None: + return u'' + return '%.*f' % (arg, value) + +# vim: set ts=4 sw=4 et: diff --git a/packages/templatetags/jinja2.py b/packages/templatetags/jinja2.py index 22f9914b..88b59a96 100644 --- a/packages/templatetags/jinja2.py +++ b/packages/templatetags/jinja2.py @@ -68,5 +68,4 @@ def bug_report(package): } return link_encode(url, data) - # vim: set ts=4 sw=4 et: diff --git a/templates/mirrors/url_details.html b/templates/mirrors/url_details.html index 557a1b79..8b7646b8 100644 --- a/templates/mirrors/url_details.html +++ b/templates/mirrors/url_details.html @@ -1,5 +1,4 @@ {% extends "base.html" %} -{% load cycle from future %} {% load static from staticfiles %} {% load mirror_status %} {% load flags %} @@ -57,34 +56,8 @@ {% endif %}
Release Date Version Kernel Version Available?TorrentMagnet Download Size
{% if item.torrent_data %} + Torrent +   + Magnet + {% endif %} {{ item.release_date|date }} {{ item.version }} {{ item.kernel_version|default:"" }} {{ item.available|yesno|capfirst }}TorrentMagnet {% if item.torrent_data %}{{ item.torrent.file_length|filesizeformat }}{% endif %}
{% user_pgp_key_link sig.signer %}{% user_pgp_key_link sig.signee %}{% user_pgp_key_link developer_keys sig.signer %}{% user_pgp_key_link developer_keys sig.signee %} {{ sig.created }} {{ sig.expires|default:"" }}
-

Check Logs

+ {% include "mirrors/url_details_logs.html.jinja" %} - - - - - - - - - - - - - - - {% for log in logs %} - - - - - - - - - {% endfor %} - -
Check TimeCheck LocationCheck IPLast SyncDelay (hh:mm)Duration (s)Success?Error Message
{{ log.check_time|date:'Y-m-d H:i' }}{% country_flag log.location.country %}{{ log.location.country.name }}{{ log.location.source_ip }}{{ log.last_sync|date:'Y-m-d H:i' }}{{ log.delay|duration }}{{ log.duration|floatvalue }}{{ log.is_success|yesno|capfirst }}{{ log.error|linebreaksbr }}
{% endblock %} diff --git a/templates/mirrors/url_details_logs.html.jinja b/templates/mirrors/url_details_logs.html.jinja new file mode 100644 index 00000000..8f7c5644 --- /dev/null +++ b/templates/mirrors/url_details_logs.html.jinja @@ -0,0 +1,28 @@ +

Check Logs

+ + + + + + + + + + + + + + + + {% for log in logs %} + + + + + + + + + {% endfor %} + +
Check TimeCheck LocationCheck IPLast SyncDelay (hh:mm)Duration (s)Success?Error Message
{{ log.check_time|date('Y-m-d H:i') }}{{ country_flag(log.location.country) }}{{ log.location.country.name }}{{ log.location.source_ip }}{{ log.last_sync|date('Y-m-d H:i') }}{{ log.delay()|duration }}{{ log.duration|floatvalue }}{{ log.is_success|yesno|capfirst }}{{ log.error|linebreaksbr }}
-- cgit v1.2.3 From 713ab837ba59c4a7c0b60cb8e8be4b27f4520e52 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sat, 8 Nov 2014 14:00:06 -0600 Subject: Convert mirror status tables to Jinja2 Yay for way improved performance. Local testing showed render times going from 265 ms to 135 ms. Signed-off-by: Dan McGee --- mirrors/templatetags/jinja2.py | 22 ++++++++++++++++++++++ templates/mirrors/error_table.html | 24 ------------------------ templates/mirrors/error_table.html.jinja | 22 ++++++++++++++++++++++ templates/mirrors/mirror_details.html | 2 +- templates/mirrors/status.html | 6 +++--- templates/mirrors/status_table.html | 30 ------------------------------ templates/mirrors/status_table.html.jinja | 28 ++++++++++++++++++++++++++++ 7 files changed, 76 insertions(+), 58 deletions(-) delete mode 100644 templates/mirrors/error_table.html create mode 100644 templates/mirrors/error_table.html.jinja delete mode 100644 templates/mirrors/status_table.html create mode 100644 templates/mirrors/status_table.html.jinja diff --git a/mirrors/templatetags/jinja2.py b/mirrors/templatetags/jinja2.py index 5d47fe9b..04e50238 100644 --- a/mirrors/templatetags/jinja2.py +++ b/mirrors/templatetags/jinja2.py @@ -1,3 +1,4 @@ +from datetime import timedelta from django_jinja import library from markupsafe import Markup @@ -22,10 +23,31 @@ def duration(value): return '%d:%02d' % (hrs, mins) +@library.filter +def hours(value): + if not value and type(value) != timedelta: + return u'' + # does not take microseconds into account + total_secs = value.seconds + value.days * 24 * 3600 + mins = total_secs // 60 + hrs, mins = divmod(mins, 60) + if hrs == 1: + return '%d hour' % hrs + return '%d hours' % hrs + + @library.filter def floatvalue(value, arg=2): if value is None: return u'' return '%.*f' % (arg, value) + +@library.filter +def percentage(value, arg=1): + if not value and type(value) != float: + return u'' + new_val = value * 100.0 + return '%.*f%%' % (arg, new_val) + # vim: set ts=4 sw=4 et: diff --git a/templates/mirrors/error_table.html b/templates/mirrors/error_table.html deleted file mode 100644 index cd7265af..00000000 --- a/templates/mirrors/error_table.html +++ /dev/null @@ -1,24 +0,0 @@ -{% load cycle from future %} -{% load flags mirror_status %} - - - - - - - - - - - - - {% for log in error_logs %} - - - - - - - {% endfor %} - -
Mirror URLProtocolCountryError MessageLast OccurredOccurrences (last {{ cutoff|hours }})
{{ log.url__url }}{{ log.url__protocol__protocol }}{% country_flag log.country %}{{ log.country.name }}{{ log.error|linebreaksbr }}{{ log.last_occurred|date:'Y-m-d H:i' }}{{ log.error_count }}
diff --git a/templates/mirrors/error_table.html.jinja b/templates/mirrors/error_table.html.jinja new file mode 100644 index 00000000..52f68135 --- /dev/null +++ b/templates/mirrors/error_table.html.jinja @@ -0,0 +1,22 @@ + + + + + + + + + + + + + {% for log in error_logs %} + + + + + + + {% endfor %} + +
Mirror URLProtocolCountryError MessageLast OccurredOccurrences (last {{ cutoff|hours }})
{{ log.url__url }}{{ log.url__protocol__protocol }}{{ country_flag(log.country) }}{{ log.country.name }}{{ log.error|linebreaksbr }}{{ log.last_occurred|date('Y-m-d H:i') }}{{ log.error_count }}
diff --git a/templates/mirrors/mirror_details.html b/templates/mirrors/mirror_details.html index 2ff41828..e4ae55b4 100644 --- a/templates/mirrors/mirror_details.html +++ b/templates/mirrors/mirror_details.html @@ -132,7 +132,7 @@

Error Log

- {% include "mirrors/error_table.html" %} + {% include "mirrors/error_table.html.jinja" %}
diff --git a/templates/mirrors/status.html b/templates/mirrors/status.html index 24408be7..530e3ff5 100644 --- a/templates/mirrors/status.html +++ b/templates/mirrors/status.html @@ -60,18 +60,18 @@

Out of Sync Mirrors

{% with urls=bad_urls table_id='outofsync_mirrors' %} - {% include "mirrors/status_table.html" %} + {% include "mirrors/status_table.html.jinja" %} {% endwith %}

Successfully Syncing Mirrors

{% with urls=good_urls table_id='successful_mirrors' %} - {% include "mirrors/status_table.html" %} + {% include "mirrors/status_table.html.jinja" %} {% endwith %}

Mirror Syncing Error Log

- {% include "mirrors/error_table.html" %} + {% include "mirrors/error_table.html.jinja" %}
{% endblock %} diff --git a/templates/mirrors/status_table.html b/templates/mirrors/status_table.html deleted file mode 100644 index 83538303..00000000 --- a/templates/mirrors/status_table.html +++ /dev/null @@ -1,30 +0,0 @@ -{% load cycle from future %} -{% load flags mirror_status %} - - - - - - - - - - - - - - - - {% for m_url in urls %} - - - - - - - - - - {% endfor %} - -
Mirror URLProtocolCountryCompletion %μ Delay (hh:mm)μ Duration (s)σ Duration (s)Mirror Score
{{ m_url.url }}{{ m_url.protocol }}{% country_flag m_url.country %}{{ m_url.country.name }}{{ m_url.completion_pct|percentage:1 }}{{ m_url.delay|duration|default:'unknown' }}{{ m_url.duration_avg|floatvalue:2 }}{{ m_url.duration_stddev|floatvalue:2 }}{{ m_url.score|floatvalue:1|default:'∞' }}details
diff --git a/templates/mirrors/status_table.html.jinja b/templates/mirrors/status_table.html.jinja new file mode 100644 index 00000000..598a1af0 --- /dev/null +++ b/templates/mirrors/status_table.html.jinja @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + {% for m_url in urls %} + + + + + + + + + + {% endfor %} + +
Mirror URLProtocolCountryCompletion %μ Delay (hh:mm)μ Duration (s)σ Duration (s)Mirror Score
{{ m_url.url }}{{ m_url.protocol }}{{ country_flag(m_url.country) }}{{ m_url.country.name }}{{ m_url.completion_pct|percentage(1) }}{{ m_url.delay|duration|default('unknown') }}{{ m_url.duration_avg|floatvalue(2) }}{{ m_url.duration_stddev|floatvalue(2) }}{{ m_url.score|floatvalue(1)|default('∞') }}details
-- cgit v1.2.3 From 122273496a24c4608de776978b1b449d9c6cde09 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sat, 8 Nov 2014 14:04:31 -0600 Subject: Make delay a property, not a function And re-indent the URL details log template now that we've broken it out. Signed-off-by: Dan McGee --- mirrors/models.py | 1 + templates/mirrors/url_details_logs.html.jinja | 54 +++++++++++++-------------- 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/mirrors/models.py b/mirrors/models.py index 820f3328..9743d177 100644 --- a/mirrors/models.py +++ b/mirrors/models.py @@ -165,6 +165,7 @@ class MirrorLog(models.Model): is_success = models.BooleanField(default=True) error = models.TextField(blank=True, default='') + @property def delay(self): if self.last_sync is None: return None diff --git a/templates/mirrors/url_details_logs.html.jinja b/templates/mirrors/url_details_logs.html.jinja index 8f7c5644..09742f76 100644 --- a/templates/mirrors/url_details_logs.html.jinja +++ b/templates/mirrors/url_details_logs.html.jinja @@ -1,28 +1,28 @@ -

Check Logs

+

Check Logs

- - - - - - - - - - - - - - - {% for log in logs %} - - - - - - - - - {% endfor %} - -
Check TimeCheck LocationCheck IPLast SyncDelay (hh:mm)Duration (s)Success?Error Message
{{ log.check_time|date('Y-m-d H:i') }}{{ country_flag(log.location.country) }}{{ log.location.country.name }}{{ log.location.source_ip }}{{ log.last_sync|date('Y-m-d H:i') }}{{ log.delay()|duration }}{{ log.duration|floatvalue }}{{ log.is_success|yesno|capfirst }}{{ log.error|linebreaksbr }}
+ + + + + + + + + + + + + + + {% for log in logs %} + + + + + + + + + {% endfor %} + +
Check TimeCheck LocationCheck IPLast SyncDelay (hh:mm)Duration (s)Success?Error Message
{{ log.check_time|date('Y-m-d H:i') }}{{ country_flag(log.location.country) }}{{ log.location.country.name }}{{ log.location.source_ip }}{{ log.last_sync|date('Y-m-d H:i') }}{{ log.delay|duration }}{{ log.duration|floatvalue }}{{ log.is_success|yesno|capfirst }}{{ log.error|linebreaksbr }}
-- cgit v1.2.3 From 886d2934ec672e0d4533f73e8b38248fdff9a6d5 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sat, 8 Nov 2014 14:12:32 -0600 Subject: Break out available URLs into Jinja2 template Signed-off-by: Dan McGee --- templates/mirrors/mirror_details.html | 38 +----------------------- templates/mirrors/mirror_details_urls.html.jinja | 36 ++++++++++++++++++++++ templates/mirrors/url_details.html | 2 +- templates/mirrors/url_details_logs.html.jinja | 2 -- 4 files changed, 38 insertions(+), 40 deletions(-) create mode 100644 templates/mirrors/mirror_details_urls.html.jinja diff --git a/templates/mirrors/mirror_details.html b/templates/mirrors/mirror_details.html index e4ae55b4..64009380 100644 --- a/templates/mirrors/mirror_details.html +++ b/templates/mirrors/mirror_details.html @@ -93,43 +93,7 @@

Available URLs

- - - - - - - - - - - - - - - - - - - - {% for m_url in urls %} - - - - - - - - - - - - - - - {% endfor %} - -
Mirror URLProtocolCountryIPv4IPv6Last SyncCompletion %μ Delay (hh:mm)μ Duration (s)σ Duration (s)ScoreDetails
{% if m_url.protocol.is_download %}{{ m_url.url }}{% else %}{{ m_url.url }}{% endif %}{{ m_url.protocol }}{% country_flag m_url.country %}{{ m_url.country.name }}{{ m_url.has_ipv4|yesno|capfirst }}{{ m_url.has_ipv6|yesno|capfirst }}{{ m_url.last_sync|date:'Y-m-d H:i'|default:'unknown' }}{{ m_url.completion_pct|percentage:1 }}{{ m_url.delay|duration|default:'unknown' }}{{ m_url.duration_avg|floatvalue:2 }}{{ m_url.duration_stddev|floatvalue:2 }}{{ m_url.score|floatvalue:1|default:'∞' }}Details
+ {% include "mirrors/mirror_details_urls.html.jinja" %}

Error Log

{% include "mirrors/error_table.html.jinja" %} diff --git a/templates/mirrors/mirror_details_urls.html.jinja b/templates/mirrors/mirror_details_urls.html.jinja new file mode 100644 index 00000000..7ab1548b --- /dev/null +++ b/templates/mirrors/mirror_details_urls.html.jinja @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + {% for m_url in urls %} + + + + + + + + + + + + + + + {% endfor %} + +
Mirror URLProtocolCountryIPv4IPv6Last SyncCompletion %μ Delay (hh:mm)μ Duration (s)σ Duration (s)ScoreDetails
{% if m_url.protocol.is_download %}{{ m_url.url }}{% else %}{{ m_url.url }}{% endif %}{{ m_url.protocol }}{{ country_flag(m_url.country) }}{{ m_url.country.name }}{{ m_url.has_ipv4|yesno|capfirst }}{{ m_url.has_ipv6|yesno|capfirst }}{{ m_url.last_sync|date('Y-m-d H:i')|default('unknown') }}{{ m_url.completion_pct|percentage(1) }}{{ m_url.delay|duration|default('unknown') }}{{ m_url.duration_avg|floatvalue(2) }}{{ m_url.duration_stddev|floatvalue(2) }}{{ m_url.score|floatvalue(1)|default('∞') }}Details
diff --git a/templates/mirrors/url_details.html b/templates/mirrors/url_details.html index 8b7646b8..b61033cd 100644 --- a/templates/mirrors/url_details.html +++ b/templates/mirrors/url_details.html @@ -56,8 +56,8 @@ {% endif %} +

Check Logs

{% include "mirrors/url_details_logs.html.jinja" %} - {% endblock %} diff --git a/templates/mirrors/url_details_logs.html.jinja b/templates/mirrors/url_details_logs.html.jinja index 09742f76..58f179d8 100644 --- a/templates/mirrors/url_details_logs.html.jinja +++ b/templates/mirrors/url_details_logs.html.jinja @@ -1,5 +1,3 @@ -

Check Logs

- -- cgit v1.2.3 From 1a35cbe842212d674d83196ecfa70569ffe2e2da Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sat, 8 Nov 2014 14:15:11 -0600 Subject: Remove percentage filter from Django templates filters Signed-off-by: Dan McGee --- mirrors/templatetags/mirror_status.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/mirrors/templatetags/mirror_status.py b/mirrors/templatetags/mirror_status.py index b3810d9a..c8004e4b 100644 --- a/mirrors/templatetags/mirror_status.py +++ b/mirrors/templatetags/mirror_status.py @@ -31,11 +31,4 @@ def floatvalue(value, arg=2): return u'' return '%.*f' % (arg, value) -@register.filter -def percentage(value, arg=1): - if not value and type(value) != float: - return u'' - new_val = value * 100.0 - return '%.*f%%' % (arg, new_val) - # vim: set ts=4 sw=4 et: -- cgit v1.2.3