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 --- main/fixtures/groups.json | 961 ++++++++++++++++++++++++---------------------- 1 file changed, 495 insertions(+), 466 deletions(-) (limited to 'main') 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-54-g00ecf 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(-) (limited to 'main') 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.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 @@

Developer Cross-Signatures

{% for sig in cross_signatures %} - {% 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:"" }} 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-54-g00ecf From 60327d96a687669d8b8842ecf0ac16c11a8f6483 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Mon, 8 Dec 2014 19:52:55 -0600 Subject: Upgrade to python-markdown 2.5.2 safe_mode is now deprecated, so adjust things accordingly. Signed-off-by: Dan McGee --- main/utils.py | 15 +++++++++++++++ news/models.py | 7 +++---- news/views.py | 6 ++---- releng/models.py | 6 ++---- requirements.txt | 2 +- requirements_prod.txt | 2 +- 6 files changed, 24 insertions(+), 14 deletions(-) (limited to 'main') diff --git a/main/utils.py b/main/utils.py index cf156566..f94f314d 100644 --- a/main/utils.py +++ b/main/utils.py @@ -4,6 +4,8 @@ import pickle import hashlib +import markdown +from markdown.extensions import Extension from django.core.cache import cache from django.db import connections, router @@ -109,6 +111,19 @@ def database_vendor(model, mode='read'): return connections[database].vendor +class EscapeHtml(Extension): + def extendMarkdown(self, md, md_globals): + del md.preprocessors['html_block'] + del md.inlinePatterns['html'] + + +def parse_markdown(text, allow_html=False): + if allow_html: + return markdown.markdown(text, enable_attributes=False) + ext = [EscapeHtml()] + return markdown.markdown(text, extensions=ext, enable_attributes=False) + + def groupby_preserve_order(iterable, keyfunc): '''Take an iterable and regroup using keyfunc to determine whether items belong to the same group. The order of the iterable is preserved and diff --git a/news/models.py b/news/models.py index 985c1088..a66da8d4 100644 --- a/news/models.py +++ b/news/models.py @@ -1,11 +1,11 @@ -import markdown - from django.db import models from django.contrib.auth.models import User from django.contrib.sites.models import Site from django.utils.safestring import mark_safe from django.utils.timezone import now +from main.utils import parse_markdown + class News(models.Model): slug = models.SlugField(max_length=255, unique=True) @@ -22,8 +22,7 @@ def get_absolute_url(self): return '/news/%s/' % self.slug def html(self): - return mark_safe(markdown.markdown( - self.content, safe_mode=self.safe_mode, enable_attributes=False)) + return mark_safe(parse_markdown(self.content, not self.safe_mode)) def __unicode__(self): return self.title diff --git a/news/views.py b/news/views.py index ca4fdf97..274ba75d 100644 --- a/news/views.py +++ b/news/views.py @@ -1,5 +1,3 @@ -import markdown - from django import forms from django.http import HttpResponse from django.shortcuts import get_object_or_404, redirect @@ -8,7 +6,7 @@ CreateView, UpdateView, DeleteView) from .models import News -from main.utils import find_unique_slug +from main.utils import find_unique_slug, parse_markdown class NewsForm(forms.ModelForm): @@ -62,7 +60,7 @@ def view_redirect(request, object_id): @require_POST def preview(request): data = request.POST.get('data', '') - markup = markdown.markdown(data, safe_mode=True, enable_attributes=False) + markup = parse_markdown(data) return HttpResponse(markup) # vim: set ts=4 sw=4 et: diff --git a/releng/models.py b/releng/models.py index 436308f2..c1a82589 100644 --- a/releng/models.py +++ b/releng/models.py @@ -2,7 +2,6 @@ from bencode import bdecode, bencode from datetime import datetime import hashlib -import markdown from pytz import utc from django.conf import settings @@ -12,7 +11,7 @@ from django.utils.safestring import mark_safe from main.fields import PositiveBigIntegerField -from main.utils import set_created_field +from main.utils import set_created_field, parse_markdown class IsoOption(models.Model): @@ -154,8 +153,7 @@ def magnet_uri(self): return "magnet:?%s" % '&'.join(['%s=%s' % (k, v) for k, v in query]) def info_html(self): - return mark_safe(markdown.markdown( - self.info, safe_mode=True, enable_attributes=False)) + return mark_safe(parse_markdown(self.info)) def torrent(self): try: diff --git a/requirements.txt b/requirements.txt index 473535b6..2a5dba96 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ Django==1.7.1 IPy==0.81 Jinja2==2.7.3 -Markdown==2.4.1 +Markdown==2.5.2 bencode==1.0 django-jinja==1.0.5 django_countries==3.0.1 diff --git a/requirements_prod.txt b/requirements_prod.txt index bb7567f3..6edfa17f 100644 --- a/requirements_prod.txt +++ b/requirements_prod.txt @@ -2,7 +2,7 @@ Django==1.7.1 IPy==0.81 Jinja2==2.7.3 -Markdown==2.4.1 +Markdown==2.5.2 bencode==1.0 django-jinja==1.0.5 django_countries==3.0.1 -- cgit v1.2.3-54-g00ecf