diff options
author | jelle van der Waa <jelle@vdwaa.nl> | 2018-04-20 17:43:13 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-04-20 17:43:13 +0200 |
commit | 4b2d3ad5c5c15e2354c6a1976153046bb7eee08c (patch) | |
tree | 776c48c9e41fcdeecd4fc334851c04eed7585f14 | |
parent | b3475381e5299929cc952b1dd2f96212166ade9d (diff) | |
parent | 3e5885c9ed01ce30f99e6be41b0294bf07f8fc43 (diff) | |
download | archweb-4b2d3ad5c5c15e2354c6a1976153046bb7eee08c.tar.gz archweb-4b2d3ad5c5c15e2354c6a1976153046bb7eee08c.zip |
Merge pull request #88 from archlinux/upgrade_django
Upgrade django
55 files changed, 294 insertions, 305 deletions
@@ -49,15 +49,11 @@ packages, you will probably want the following: Make sure to uncomment the appropriate database section (either sqlite or PostgreSQL). -4. Sync the database to create it. - - ./manage.py syncdb - -5. Migrate changes. +4. Migrate changes. ./manage.py migrate -6. Load the fixtures to prepopulate some data. If you don't want some of the +5. Load the fixtures to prepopulate some data. If you don't want some of the provided data, adjust the file glob accordingly. ./manage.py loaddata main/fixtures/*.json @@ -65,11 +61,11 @@ packages, you will probably want the following: ./manage.py loaddata mirrors/fixtures/*.json ./manage.py loaddata releng/fixtures/*.json -7. Use the following commands to start a service instance +6. Use the following commands to start a service instance ./manage.py runserver -8. To optionally populate the database with real data: +7. To optionally populate the database with real data: wget http://mirrors.kernel.org/archlinux/core/os/x86_64/core.db.tar.gz ./manage.py reporead x86_64 core.db.tar.gz diff --git a/devel/forms.py b/devel/forms.py index 73d725e5..db4428fa 100644 --- a/devel/forms.py +++ b/devel/forms.py @@ -6,7 +6,7 @@ from django import forms from django.contrib.auth.models import User, Group from django.contrib.sites.models import Site from django.core.mail import send_mail -from django.template import loader, Context +from django.template import loader from .models import UserProfile @@ -88,11 +88,11 @@ class NewUserForm(forms.ModelForm): self.save_m2m() template = loader.get_template('devel/new_account.txt') - ctx = Context({ + ctx = { 'site': Site.objects.get_current(), 'user': user, 'password': password, - }) + } send_mail("Your new archweb account", template.render(ctx), diff --git a/devel/management/commands/generate_keyring.py b/devel/management/commands/generate_keyring.py index 9c52dadc..a61cffa9 100644 --- a/devel/management/commands/generate_keyring.py +++ b/devel/management/commands/generate_keyring.py @@ -26,6 +26,9 @@ class Command(BaseCommand): args = "<keyserver> <keyring_path> [ownertrust_path]" help = "Assemble a GPG keyring with all known developer keys." + def add_arguments(self, parser): + parser.add_argument('args', nargs='*', help='<arch> <filename>') + def handle(self, *args, **options): v = int(options.get('verbosity', None)) if v == 0: diff --git a/devel/management/commands/pgp_import.py b/devel/management/commands/pgp_import.py index 8eb06d50..2188de3c 100644 --- a/devel/management/commands/pgp_import.py +++ b/devel/management/commands/pgp_import.py @@ -32,6 +32,9 @@ class Command(BaseCommand): args = "<keyring_path>" help = "Import keys and signatures from a given GPG keyring." + def add_arguments(self, parser): + parser.add_argument('args', nargs='*', help='<arch> <filename>') + def handle(self, *args, **options): v = int(options.get('verbosity', None)) if v == 0: diff --git a/devel/management/commands/rematch_developers.py b/devel/management/commands/rematch_developers.py index 8636002a..7178d1d8 100644 --- a/devel/management/commands/rematch_developers.py +++ b/devel/management/commands/rematch_developers.py @@ -11,7 +11,7 @@ matching up to a developer if we can find one. Usage: ./manage.py rematch_developers """ -from django.core.management.base import NoArgsCommand +from django.core.management.base import BaseCommand from django.db import transaction import sys @@ -28,10 +28,10 @@ logging.basicConfig( stream=sys.stderr) logger = logging.getLogger() -class Command(NoArgsCommand): +class Command(BaseCommand): help = "Match and map objects in database to developer emails" - def handle_noargs(self, **options): + def handle(self, **options): v = int(options.get('verbosity', None)) if v == 0: logger.level = logging.ERROR @@ -78,7 +78,7 @@ def match_flagrequest(finder): unmatched = FlagRequest.objects.filter(user__isnull=True).values_list( 'user_email', flat=True).order_by().distinct() - + logger.info("%d email addresses retrieved", len(unmatched)) for user_email in unmatched: logger.debug("email %s", user_email) diff --git a/devel/management/commands/reporead.py b/devel/management/commands/reporead.py index 3c24b5d3..73682f4b 100644 --- a/devel/management/commands/reporead.py +++ b/devel/management/commands/reporead.py @@ -23,7 +23,6 @@ import sys import tarfile import logging from datetime import datetime -from optparse import make_option from pytz import utc from django.core.management.base import BaseCommand, CommandError @@ -48,14 +47,22 @@ logging.addLevelName(TRACE, 'TRACE') logger = logging.getLogger() class Command(BaseCommand): - option_list = BaseCommand.option_list + ( - make_option('-f', '--force', action='store_true', dest='force', default=False, - help='Force a re-import of data for all packages instead of only new ones. Will not touch the \'last updated\' value.'), - make_option('--filesonly', action='store_true', dest='filesonly', default=False, - help='Load filelists if they are outdated, but will not add or remove any packages. Will not touch the \'last updated\' value.'), - ) help = "Runs a package repository import for the given arch and file." - args = "<arch> <filename>" + missing_args_message = 'missing arch and file.' + + def add_arguments(self, parser): + parser.add_argument('args', nargs='*', help='<arch> <filename>') + parser.add_argument('--force', + action='store_true', + dest='force', + default=False, + help='Force a re-import of data for all packages instead of only new ones. Will not touch the \'last updated\' value.') + + parser.add_argument('--filesonly', + action='store_true', + dest='filesonly', + default=False, + help='Load filelists if they are outdated, but will not add or remove any packages. Will not touch the \'last updated\' value.') def handle(self, arch=None, filename=None, **options): if not arch: diff --git a/devel/management/commands/update_types_permissions.py b/devel/management/commands/update_types_permissions.py deleted file mode 100644 index bbe8dc47..00000000 --- a/devel/management/commands/update_types_permissions.py +++ /dev/null @@ -1,25 +0,0 @@ -from django.core.management.base import BaseCommand -from django.db.models import get_models, get_app -from django.contrib.auth.management import create_permissions -from django.contrib.contenttypes.management import update_contenttypes - - -class Command(BaseCommand): - args = '<app app ...>' - help = 'reloads permissions for specified apps, or all apps if no args are specified' - - def handle(self, *args, **options): - if not args: - apps = [] - for model in get_models(): - apps.append(get_app(model._meta.app_label)) - else: - apps = [] - for arg in args: - apps.append(get_app(arg)) - - for app in apps: - update_contenttypes(app, None, options.get('verbosity', 2), interactive=True) - create_permissions(app, get_models(), options.get('verbosity', 0)) - -# vim: set ts=4 sw=4 et: diff --git a/devel/tests/test_reporead.py b/devel/tests/test_reporead.py index f86ab214..5aa3ceea 100644 --- a/devel/tests/test_reporead.py +++ b/devel/tests/test_reporead.py @@ -17,7 +17,7 @@ class RepoReadTest(TransactionTestCase): def test_invalid_args(self): with self.assertRaises(CommandError) as e: call_command('reporead') - self.assertIn('Architecture is required', str(e.exception)) + self.assertIn('missing arch and file.', str(e.exception)) with self.assertRaises(CommandError) as e: call_command('reporead', 'x86_64') diff --git a/devel/tests/test_templatetags.py b/devel/tests/test_templatetags.py index 3a0f32a2..e5d9782a 100644 --- a/devel/tests/test_templatetags.py +++ b/devel/tests/test_templatetags.py @@ -1,12 +1,11 @@ from django.contrib.auth.models import User -from django.test import SimpleTestCase +from django.test import TestCase from devel.templatetags.group import in_group -class DevelTemplatetagsTest(SimpleTestCase): +class DevelTemplatetagsTest(TestCase): def test_in_group(self): user = User.objects.create(username="joeuser", first_name="Joe", last_name="User", email="user1@example.com") self.assertEqual(in_group(user, 'none'), False) - diff --git a/devel/tests/test_user.py b/devel/tests/test_user.py index 8e32ef93..5fe7e346 100644 --- a/devel/tests/test_user.py +++ b/devel/tests/test_user.py @@ -10,21 +10,21 @@ class DevelTest(TestCase): self.assertEqual(response.status_code, 302) self.assertEqual(response.has_header('Location'), True) self.assertEqual(response['location'], - 'http://testserver/login/?next=/devel/') + '/login/?next=/devel/') def test_profile(self): response = self.client.get('/devel/profile/') self.assertEqual(response.status_code, 302) self.assertEqual(response.has_header('Location'), True) self.assertEqual(response['location'], - 'http://testserver/login/?next=/devel/profile/') + '/login/?next=/devel/profile/') def test_newuser(self): response = self.client.get('/devel/newuser/') self.assertEqual(response.status_code, 302) self.assertEqual(response.has_header('Location'), True) self.assertEqual(response['location'], - 'http://testserver/login/?next=/devel/newuser/') + '/login/?next=/devel/newuser/') def test_mirrors(self): response = self.client.get('/mirrors/') diff --git a/devel/urls.py b/devel/urls.py index 472c6456..bc26d89a 100644 --- a/devel/urls.py +++ b/devel/urls.py @@ -1,15 +1,18 @@ -from django.conf.urls import patterns - -urlpatterns = patterns('devel.views', - (r'^admin_log/$','admin_log'), - (r'^admin_log/(?P<username>.*)/$','admin_log'), - (r'^clock/$', 'clock', {}, 'devel-clocks'), - (r'^$', 'index', {}, 'devel-index'), - (r'^stats/$', 'stats', {}, 'devel-stats'), - (r'^newuser/$', 'new_user_form'), - (r'^profile/$', 'change_profile'), - (r'^reports/(?P<report_name>.*)/(?P<username>.*)/$', 'report'), - (r'^reports/(?P<report_name>.*)/$', 'report'), -) +from django.conf.urls import url + +from devel import views + + +urlpatterns = [ + url(r'^admin_log/$', views.admin_log), + url(r'^admin_log/(?P<username>.*)/$', views.admin_log), + url(r'^clock/$', views.clock, name='devel-clocks'), + url(r'^$', views.index, name='devel-index'), + url(r'^stats/$', views.stats, name='devel-stats'), + url(r'^newuser/$', views.new_user_form), + url(r'^profile/$', views.change_profile), + url(r'^reports/(?P<report_name>.*)/(?P<username>.*)/$', views.report), + url(r'^reports/(?P<report_name>.*)/$', views.report), +] # vim: set ts=4 sw=4 et: diff --git a/main/storage.py b/main/storage.py index 62e94ef7..83d84c4b 100644 --- a/main/storage.py +++ b/main/storage.py @@ -1,12 +1,12 @@ import cssmin import jsmin -from django.contrib.staticfiles.storage import CachedStaticFilesStorage +from django.contrib.staticfiles.storage import ManifestStaticFilesStorage from django.core.files.base import ContentFile from django.utils.encoding import smart_str -class MinifiedStaticFilesStorage(CachedStaticFilesStorage): +class MinifiedStaticFilesStorage(ManifestStaticFilesStorage): """ A static file system storage backend which minifies the hashed copies of the files it saves. It currently knows how to process diff --git a/main/templatetags/cdn.py b/main/templatetags/cdn.py index e0b702be..2439cfb2 100644 --- a/main/templatetags/cdn.py +++ b/main/templatetags/cdn.py @@ -1,5 +1,7 @@ from django import template from django.contrib.staticfiles.storage import staticfiles_storage +from django.utils.html import format_html +from django.utils.safestring import mark_safe register = template.Library() @@ -9,7 +11,7 @@ def jquery(): version = '1.8.3' filename = 'jquery-%s.min.js' % version link = staticfiles_storage.url(filename) - return '<script type="text/javascript" src="%s"></script>' % link + return mark_safe('<script type="text/javascript" src="%s"></script>' % link) @register.simple_tag @@ -17,6 +19,6 @@ def jquery_tablesorter(): version = '2.7' filename = 'jquery.tablesorter-%s.min.js' % version link = staticfiles_storage.url(filename) - return '<script type="text/javascript" src="%s"></script>' % link + return format_html('<script type="text/javascript" src="%s"></script>' % link) # vim: set ts=4 sw=4 et: diff --git a/main/templatetags/flags.py b/main/templatetags/flags.py index 3abd1aed..fafcb5aa 100644 --- a/main/templatetags/flags.py +++ b/main/templatetags/flags.py @@ -1,4 +1,5 @@ from django import template +from django.utils.html import format_html register = template.Library() @@ -7,8 +8,8 @@ register = template.Library() def country_flag(country): if not country: return '' - return '<span class="fam-flag fam-flag-%s" title="%s"></span> ' % ( - unicode(country.code).lower(), unicode(country.name)) + return format_html('<span class="fam-flag fam-flag-%s" title="%s"></span> ' % ( + unicode(country.code).lower(), unicode(country.name))) # vim: set ts=4 sw=4 et: diff --git a/main/templatetags/pgp.py b/main/templatetags/pgp.py index f5b937b6..ad4e49d0 100644 --- a/main/templatetags/pgp.py +++ b/main/templatetags/pgp.py @@ -1,6 +1,6 @@ from django import template from django.conf import settings -from django.utils.html import conditional_escape +from django.utils.html import conditional_escape, format_html from django.utils.safestring import mark_safe @@ -41,7 +41,7 @@ def pgp_key_link(key_id, link_text=None): if link_text is None: link_text = '0x%s' % key_id[-8:] values = (url, format_key(key_id), link_text) - return '<a href="%s" title="PGP key search for %s">%s</a>' % values + return format_html('<a href="%s" title="PGP key search for %s">%s</a>' % values) @register.simple_tag diff --git a/mirrors/fields.py b/mirrors/fields.py index e8963edf..dc38c6b9 100644 --- a/mirrors/fields.py +++ b/mirrors/fields.py @@ -18,7 +18,6 @@ class IPNetworkFormField(forms.Field): class IPNetworkField(models.Field): - __metaclass__ = models.SubfieldBase description = "IPv4 or IPv6 address or subnet" def __init__(self, *args, **kwargs): @@ -43,3 +42,6 @@ class IPNetworkField(models.Field): defaults = {'form_class': IPNetworkFormField} defaults.update(kwargs) return super(IPNetworkField, self).formfield(**defaults) + + def from_db_value(self, value, expression, connection, context): + return self.to_python(value) diff --git a/mirrors/management/commands/mirrorcheck.py b/mirrors/management/commands/mirrorcheck.py index 1a33073a..9eaf38f1 100644 --- a/mirrors/management/commands/mirrorcheck.py +++ b/mirrors/management/commands/mirrorcheck.py @@ -14,7 +14,6 @@ from datetime import datetime from httplib import HTTPException import logging import os -from optparse import make_option from pytz import utc import re import socket @@ -28,7 +27,7 @@ import types from Queue import Queue, Empty import urllib2 -from django.core.management.base import NoArgsCommand +from django.core.management.base import BaseCommand from django.db import transaction from django.utils.timezone import now @@ -43,16 +42,23 @@ logging.basicConfig( logger = logging.getLogger() -class Command(NoArgsCommand): - option_list = NoArgsCommand.option_list + ( - make_option('-t', '--timeout', dest='timeout', type='float', default=10.0, - help='Timeout value for connecting to URL'), - make_option('-l', '--location', dest='location', type='int', - help='ID of CheckLocation object to use for this run'), - ) +class Command(BaseCommand): help = "Runs a check on all known mirror URLs to determine their up-to-date status." - def handle_noargs(self, **options): + def add_arguments(self, parser): + parser.add_argument('-t', + '--timeout', + dest='timeout', + type=float, + default=10.0, + help='Timeout value for connecting to URL') + parser.add_argument('-l', + '--location', + dest='location', + type=int, + help='ID of CheckLocation object to use for this run') + + def handle(self, **options): v = int(options.get('verbosity', 0)) if v == 0: logger.level = logging.ERROR diff --git a/mirrors/management/commands/mirrorresolv.py b/mirrors/management/commands/mirrorresolv.py index d0f9bc1c..8934cfa5 100644 --- a/mirrors/management/commands/mirrorresolv.py +++ b/mirrors/management/commands/mirrorresolv.py @@ -8,7 +8,7 @@ available. Usage: ./manage.py mirrorresolv """ -from django.core.management.base import NoArgsCommand +from django.core.management.base import BaseCommand import sys import logging @@ -23,10 +23,10 @@ logging.basicConfig( stream=sys.stderr) logger = logging.getLogger() -class Command(NoArgsCommand): +class Command(BaseCommand): help = "Runs a check on all active mirror URLs to determine if they are reachable via IPv4 and/or v6." - def handle_noargs(self, **options): + def handle(self, **options): v = int(options.get('verbosity', 0)) if v == 0: logger.level = logging.ERROR diff --git a/mirrors/urls.py b/mirrors/urls.py index fc510fbb..f979c86e 100644 --- a/mirrors/urls.py +++ b/mirrors/urls.py @@ -1,18 +1,18 @@ -from django.conf.urls import patterns +from django.conf.urls import url from .views import mirrors, status, mirror_details, url_details from .views.api import status_json, mirror_details_json, locations_json -urlpatterns = patterns('', - (r'^$', mirrors, {}, 'mirror-list'), - (r'^status/$', status, {}, 'mirror-status'), - (r'^status/json/$', status_json, {}, 'mirror-status-json'), - (r'^status/tier/(?P<tier>\d+)/$', status, {}, 'mirror-status-tier'), - (r'^status/tier/(?P<tier>\d+)/json/$', status_json, {}, 'mirror-status-tier-json'), - (r'^locations/json/$', locations_json, {}, 'mirror-locations-json'), - (r'^(?P<name>[\.\-\w]+)/$', mirror_details), - (r'^(?P<name>[\.\-\w]+)/json/$', mirror_details_json), - (r'^(?P<name>[\.\-\w]+)/(?P<url_id>\d+)/$', url_details), -) +urlpatterns = [ + url(r'^$', mirrors, name='mirror-list'), + url(r'^status/$', status, name='mirror-status'), + url(r'^status/json/$', status_json, name='mirror-status-json'), + url(r'^status/tier/(?P<tier>\d+)/$', status, name='mirror-status-tier'), + url(r'^status/tier/(?P<tier>\d+)/json/$', status_json, name='mirror-status-tier-json'), + url(r'^locations/json/$', locations_json, name='mirror-locations-json'), + url(r'^(?P<name>[\.\-\w]+)/$', mirror_details), + url(r'^(?P<name>[\.\-\w]+)/json/$', mirror_details_json), + url(r'^(?P<name>[\.\-\w]+)/(?P<url_id>\d+)/$', url_details), +] # vim: set ts=4 sw=4 et: diff --git a/mirrors/urls_mirrorlist.py b/mirrors/urls_mirrorlist.py index a64656a9..7c022e5e 100644 --- a/mirrors/urls_mirrorlist.py +++ b/mirrors/urls_mirrorlist.py @@ -1,11 +1,11 @@ -from django.conf.urls import patterns +from django.conf.urls import url +from mirrors.views import mirrorlist as views -urlpatterns = patterns('mirrors.views.mirrorlist', - (r'^$', 'generate_mirrorlist', {}, 'mirrorlist'), - (r'^all/$', 'find_mirrors', {'countries': ['all']}), - (r'^all/(?P<protocol>[A-z]+)/$', 'find_mirrors_simple', - {}, 'mirrorlist_simple') -) +urlpatterns = [ + url(r'^$', views.generate_mirrorlist, name='mirrorlist'), + url(r'^all/$', views.find_mirrors, {'countries': ['all']}), + url(r'^all/(?P<protocol>[A-z]+)/$', views.find_mirrors_simple, name='mirrorlist_simple') +] # vim: set ts=4 sw=4 et: diff --git a/mirrors/views/mirrorlist.py b/mirrors/views/mirrorlist.py index 7a9ffad0..35d59e82 100644 --- a/mirrors/views/mirrorlist.py +++ b/mirrors/views/mirrorlist.py @@ -55,7 +55,7 @@ class MirrorlistForm(forms.Form): @csrf_exempt def generate_mirrorlist(request): if request.method == 'POST' or len(request.GET) > 0: - form = MirrorlistForm(data=request.REQUEST) + form = MirrorlistForm(data=request.POST) if form.is_valid(): countries = form.cleaned_data['country'] protocols = form.cleaned_data['protocol'] diff --git a/news/urls.py b/news/urls.py index c13722d4..111de4f5 100644 --- a/news/urls.py +++ b/news/urls.py @@ -1,24 +1,24 @@ -from django.conf.urls import patterns +from django.conf.urls import url from django.contrib.auth.decorators import permission_required -from .views import (NewsDetailView, NewsListView, - NewsCreateView, NewsEditView, NewsDeleteView) +from .views import (NewsDetailView, NewsListView, NewsCreateView, NewsEditView, + NewsDeleteView, preview, view_redirect) -urlpatterns = patterns('news.views', - (r'^$', NewsListView.as_view(), {}, 'news-list'), +urlpatterns = [ + url(r'^$', NewsListView.as_view(), name='news-list'), - (r'^preview/$', 'preview'), + url(r'^preview/$', preview), # old news URLs, permanent redirect view so we don't break all links - (r'^(?P<object_id>\d+)/$', 'view_redirect'), + url(r'^(?P<object_id>\d+)/$', view_redirect), - (r'^add/$', + url(r'^add/$', permission_required('news.add_news')(NewsCreateView.as_view())), - (r'^(?P<slug>[-\w]+)/$', + url(r'^(?P<slug>[-\w]+)/$', NewsDetailView.as_view()), - (r'^(?P<slug>[-\w]+)/edit/$', + url(r'^(?P<slug>[-\w]+)/edit/$', permission_required('news.change_news')(NewsEditView.as_view())), - (r'^(?P<slug>[-\w]+)/delete/$', + url(r'^(?P<slug>[-\w]+)/delete/$', permission_required('news.delete_news')(NewsDeleteView.as_view())), -) +] # vim: set ts=4 sw=4 et: diff --git a/news/views.py b/news/views.py index f85db171..48295944 100644 --- a/news/views.py +++ b/news/views.py @@ -2,7 +2,7 @@ from django import forms from django.core.mail import send_mail from django.http import HttpResponse from django.shortcuts import get_object_or_404, redirect -from django.template import Context, loader +from django.template import loader from django.views.decorators.http import require_POST from django.views.generic import (DetailView, ListView, CreateView, UpdateView, DeleteView) @@ -40,9 +40,9 @@ class NewsCreateView(CreateView): newsitem.slug = find_unique_slug(News, newsitem.title) newsitem.save() if newsitem.send_announce: - ctx = Context({ + ctx = { 'news': newsitem, - }) + } template = loader.get_template('news/news_email_notification.txt') send_mail('[arch-announce] %s' % newsitem.title, template.render(ctx), diff --git a/packages/management/commands/populate_signoffs.py b/packages/management/commands/populate_signoffs.py index 8a025f4e..50763cd0 100644 --- a/packages/management/commands/populate_signoffs.py +++ b/packages/management/commands/populate_signoffs.py @@ -15,7 +15,7 @@ import sys from xml.etree.ElementTree import XML from django.conf import settings -from django.core.management.base import NoArgsCommand +from django.core.management.base import BaseCommand from ...models import SignoffSpecification from ...utils import get_signoff_groups @@ -28,11 +28,14 @@ logging.basicConfig( stream=sys.stderr) logger = logging.getLogger() -class Command(NoArgsCommand): +class Command(BaseCommand): help = """Pull the latest commit message from SVN for a given package that is signoff-eligible and does not have an existing comment attached""" - def handle_noargs(self, **options): + def add_arguments(self, parser): + parser.add_argument('args', nargs='*', help='<arch> <filename>') + + def handle(self, **options): v = int(options.get('verbosity', None)) if v == 0: logger.level = logging.ERROR diff --git a/packages/management/commands/signoff_report.py b/packages/management/commands/signoff_report.py index a5022eeb..6749cf40 100644 --- a/packages/management/commands/signoff_report.py +++ b/packages/management/commands/signoff_report.py @@ -14,7 +14,7 @@ from django.core.management.base import BaseCommand, CommandError from django.contrib.auth.models import User from django.contrib.sites.models import Site from django.db.models import Count -from django.template import loader, Context +from django.template import loader from django.utils.timezone import now from collections import namedtuple @@ -106,7 +106,7 @@ def generate_report(email, repo_name): subject = 'Signoff report for [%s]' % repo.name.lower() t = loader.get_template('packages/signoff_report.txt') - c = Context({ + c = { 'repo': repo, 'signoffs_url': signoffs_url, 'disabled': disabled, @@ -119,7 +119,7 @@ def generate_report(email, repo_name): 'old': old, 'old_days': old_days, 'leaders': leaders, - }) + } from_addr = 'Arch Website Notification <nobody@archlinux.org>' send_mail(subject, t.render(c), from_addr, [email]) diff --git a/packages/templatetags/package_extras.py b/packages/templatetags/package_extras.py index de730e29..a3a84e12 100644 --- a/packages/templatetags/package_extras.py +++ b/packages/templatetags/package_extras.py @@ -2,6 +2,7 @@ from urllib import urlencode from urlparse import parse_qs from django import template +from django.utils.html import format_html register = template.Library() @@ -53,7 +54,7 @@ def pkg_details_link(pkg, link_title=None, honor_flagged=False): if honor_flagged and pkg.flag_date: link_content = '<span class="flagged">%s</span>' % link_title link = '<a href="%s" title="View package details for %s">%s</a>' - return link % (pkg.get_absolute_url(), pkg.pkgname, link_content) + return format_html(link % (pkg.get_absolute_url(), pkg.pkgname, link_content)) # vim: set ts=4 sw=4 et: diff --git a/packages/urls.py b/packages/urls.py index 4e2e2638..7532af29 100644 --- a/packages/urls.py +++ b/packages/urls.py @@ -1,42 +1,41 @@ -from django.conf.urls import include, patterns +from django.conf.urls import include, url from .views.search import SearchListView +from packages import views -package_patterns = patterns('packages.views', - (r'^$', 'details'), - (r'^json/$', 'details_json'), - (r'^files/$', 'files'), - (r'^files/json/$', 'files_json'), - (r'^flag/$', 'flag'), - (r'^flag/done/$', 'flag_confirmed', {}, 'package-flag-confirmed'), - (r'^unflag/$', 'unflag'), - (r'^unflag/all/$', 'unflag_all'), - (r'^signoff/$', 'signoff_package'), - (r'^signoff/revoke/$', 'signoff_package', {'revoke': True}), - (r'^signoff/options/$', 'signoff_options'), - (r'^download/$', 'download'), -) - -urlpatterns = patterns('packages.views', - (r'^flaghelp/$', 'flaghelp'), - (r'^signoffs/$', 'signoffs', {}, 'package-signoffs'), - (r'^signoffs/json/$', 'signoffs_json', {}, 'package-signoffs-json'), - (r'^update/$', 'update'), - - (r'^$', SearchListView.as_view(), {}, 'packages-search'), - (r'^search/json/$', 'search_json'), - - (r'^differences/$', 'arch_differences', {}, 'packages-differences'), - (r'^stale_relations/$', 'stale_relations'), - (r'^stale_relations/update/$','stale_relations_update'), - - (r'^(?P<name>[^ /]+)/$', - 'details'), - (r'^(?P<repo>[A-z0-9\-]+)/(?P<name>[^ /]+)/$', - 'details'), + +package_patterns = [ + url(r'^$', views.details), + url(r'^json/$', views.details_json), + url(r'^files/$', views.files), + url(r'^files/json/$', views.files_json), + url(r'^flag/$', views.flag), + url(r'^flag/done/$', views.flag_confirmed, name='package-flag-confirmed'), + url(r'^unflag/$', views.unflag), + url(r'^unflag/all/$', views.unflag_all), + url(r'^signoff/$', views.signoff_package), + url(r'^signoff/revoke/$', views.signoff_package, {'revoke': True}), + url(r'^signoff/options/$', views.signoff_options), + url(r'^download/$', views.download), +] + +urlpatterns = [ + url(r'^flaghelp/$', views.flaghelp), + url(r'^signoffs/$', views.signoffs, name='package-signoffs'), + url(r'^signoffs/json/$', views.signoffs_json, name='package-signoffs-json'), + url(r'^update/$', views.update), + + url(r'^$', SearchListView.as_view(), name='packages-search'), + url(r'^search/json/$', views.search_json), + + url(r'^differences/$', views.arch_differences, name='packages-differences'), + url(r'^stale_relations/$', views.stale_relations), + url(r'^stale_relations/update/$', views.stale_relations_update), + + url(r'^(?P<name>[^ /]+)/$', views.details), + url(r'^(?P<repo>[A-z0-9\-]+)/(?P<name>[^ /]+)/$', views.details), # canonical package url. subviews defined above - (r'^(?P<repo>[A-z0-9\-]+)/(?P<arch>[A-z0-9]+)/(?P<name>[^ /]+)/', - include(package_patterns)), -) + url(r'^(?P<repo>[A-z0-9\-]+)/(?P<arch>[A-z0-9]+)/(?P<name>[^ /]+)/', include(package_patterns)), +] # vim: set ts=4 sw=4 et: diff --git a/packages/urls_groups.py b/packages/urls_groups.py index 49ced145..daf26206 100644 --- a/packages/urls_groups.py +++ b/packages/urls_groups.py @@ -1,9 +1,11 @@ -from django.conf.urls import patterns +from django.conf.urls import url -urlpatterns = patterns('packages.views', - (r'^$', 'groups', {}, 'groups-list'), - (r'^(?P<arch>[A-z0-9]+)/$', 'groups'), - (r'^(?P<arch>[A-z0-9]+)/(?P<name>[^ /]+)/$', 'group_details'), -) +from packages.views import groups, group_details + +urlpatterns = [ + url(r'^$', groups, name='groups-list'), + url(r'^(?P<arch>[A-z0-9]+)/$', groups), + url(r'^(?P<arch>[A-z0-9]+)/(?P<name>[^ /]+)/$', group_details), +] # vim: set ts=4 sw=4 et: diff --git a/packages/views/flag.py b/packages/views/flag.py index 9fe60e2c..172de24f 100644 --- a/packages/views/flag.py +++ b/packages/views/flag.py @@ -6,7 +6,7 @@ from django.contrib.auth.decorators import permission_required from django.core.mail import EmailMessage from django.db import transaction from django.shortcuts import get_object_or_404, redirect, render -from django.template import loader, Context +from django.template import loader from django.utils.timezone import now from django.views.decorators.cache import cache_page, never_cache @@ -116,12 +116,12 @@ def flag(request, name, repo, arch): if toemail: # send notification email to the maintainers tmpl = loader.get_template('packages/outofdate.txt') - ctx = Context({ + ctx = { 'email': email, 'message': message, 'pkg': pkg, 'packages': flagged_pkgs, - }) + } msg = EmailMessage(subject, tmpl.render(ctx), 'Arch Website Notification <nobody@archlinux.org>', diff --git a/public/views.py b/public/views.py index 9afad7a2..74fea2ca 100644 --- a/public/views.py +++ b/public/views.py @@ -92,8 +92,7 @@ def feeds(request): def keys(request): 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') + is_active=True, userprofile__id__in=profile_ids).order_by('first_name', 'last_name') user_key_ids = frozenset(user.userprofile.pgp_key[-16:] for user in users if user.userprofile.pgp_key) @@ -138,8 +137,7 @@ def keys(request): def keys_json(request): 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') + is_active=True, userprofile__id__in=profile_ids).order_by('first_name', 'last_name') node_list = [{ 'name': user.get_full_name(), 'key': user.userprofile.pgp_key, diff --git a/releng/urls.py b/releng/urls.py index eff17115..70e2f462 100644 --- a/releng/urls.py +++ b/releng/urls.py @@ -1,26 +1,23 @@ -from django.conf.urls import include, patterns +from django.conf.urls import include, url from .views import ReleaseListView, ReleaseDetailView +from releng import views -releases_patterns = patterns('releng.views', - (r'^$', - ReleaseListView.as_view(), {}, 'releng-release-list'), - (r'^json/$', - 'releases_json', {}, 'releng-release-list-json'), - (r'^(?P<version>[-.\w]+)/$', - ReleaseDetailView.as_view(), {}, 'releng-release-detail'), - (r'^(?P<version>[-.\w]+)/torrent/$', - 'release_torrent', {}, 'releng-release-torrent'), -) +releases_patterns = [ + url(r'^$', ReleaseListView.as_view(), name='releng-release-list'), + url(r'^json/$', views.releases_json, name='releng-release-list-json'), + url(r'^(?P<version>[-.\w]+)/$', ReleaseDetailView.as_view(), name='releng-release-detail'), + url(r'^(?P<version>[-.\w]+)/torrent/$', views.release_torrent, name='releng-release-torrent'), +] -netboot_patterns = patterns('releng.views', - (r'^archlinux\.ipxe$', 'netboot_config', {}, 'releng-netboot-config'), - (r'^$', 'netboot_info', {}, 'releng-netboot-info') -) +netboot_patterns = [ + url(r'^archlinux\.ipxe$', views.netboot_config, name='releng-netboot-config'), + url(r'^$', views.netboot_info, name='releng-netboot-info') +] -urlpatterns = patterns('', - (r'^releases/', include(releases_patterns)), - (r'^netboot/', include(netboot_patterns)), -) +urlpatterns = [ + url(r'^releases/', include(releases_patterns)), + url(r'^netboot/', include(netboot_patterns)), +] # vim: set ts=4 sw=4 et: diff --git a/requirements.txt b/requirements.txt index 87f94e2b..6f17c59c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,12 +1,14 @@ -e git+git://github.com/fredj/cssmin.git@master#egg=cssmin -Django==1.8.18 +Django==1.11.11 IPy==0.83 -Markdown==2.6.8 +Markdown==2.6.10 MarkupSafe==0.23 bencode==1.0 -django-countries==3.3 +django-countries==5.0 jsmin==2.2.2 pgpdump==1.5 -pytz>=2015.4 +pytz>=2017.3 mock==2.0.0 parse==1.8.2 +django-jinja==2.4.1 +sqlparse==0.2.4 diff --git a/settings.py b/settings.py index 5919b86b..df447b3e 100644 --- a/settings.py +++ b/settings.py @@ -178,7 +178,7 @@ TEMPLATES = [ 'debug': DEBUG, 'context_processors': [ 'django.contrib.auth.context_processors.auth', - 'django.core.context_processors.debug', + 'django.template.context_processors.debug', 'django.contrib.messages.context_processors.messages', ], } diff --git a/templates/devel/clock.html b/templates/devel/clock.html index 9d672f12..2c5bfacf 100644 --- a/templates/devel/clock.html +++ b/templates/devel/clock.html @@ -1,5 +1,4 @@ {% extends "base.html" %} -{% load cycle from future %} {% load static from staticfiles %} {% load flags %} {% load tz %} diff --git a/templates/devel/index.html b/templates/devel/index.html index e9330734..dfe1d1fa 100644 --- a/templates/devel/index.html +++ b/templates/devel/index.html @@ -1,5 +1,4 @@ {% extends "base.html" %} -{% load cycle from future %} {% load static from staticfiles %} {% load cache %} {% load package_extras %} diff --git a/templates/devel/packages.html b/templates/devel/packages.html index c190ab08..c75f81eb 100644 --- a/templates/devel/packages.html +++ b/templates/devel/packages.html @@ -1,5 +1,4 @@ {% extends "base.html" %} -{% load cycle from future %} {% load static from staticfiles %} {% load attributes %} {% load package_extras %} @@ -53,7 +52,7 @@ </thead> <tbody> {% for pkg in packages %} - <tr class="{% cycle pkgr2,pkgr1 %} {{ pkg.arch.name }} {{ pkg.repo.name|lower }}"> + <tr class="{% cycle 'pkgr2' 'pkgr1' %} {{ pkg.arch.name }} {{ pkg.repo.name|lower }}"> <td>{{ pkg.arch.name }}</td> <td>{{ pkg.repo.name|capfirst }}</td> <td>{% pkg_details_link pkg %}</td> diff --git a/templates/devel/stats.html b/templates/devel/stats.html index 9b3b1d28..2dbe4755 100644 --- a/templates/devel/stats.html +++ b/templates/devel/stats.html @@ -1,4 +1,3 @@ -{% load cycle from future %} {% load cache %} {% cache 60 dev-dash-by-arch %} diff --git a/templates/mirrors/mirror_details.html b/templates/mirrors/mirror_details.html index ec7bd424..0c0d5559 100644 --- a/templates/mirrors/mirror_details.html +++ b/templates/mirrors/mirror_details.html @@ -1,5 +1,4 @@ {% extends "base.html" %} -{% load cycle from future %} {% load static from staticfiles %} {% load mirror_status %} {% load admin_urls %} diff --git a/templates/mirrors/mirrors.html b/templates/mirrors/mirrors.html index f55bd875..7da11268 100644 --- a/templates/mirrors/mirrors.html +++ b/templates/mirrors/mirrors.html @@ -1,5 +1,4 @@ {% extends "base.html" %} -{% load cycle from future %} {% load static from staticfiles %} {% load flags %} diff --git a/templates/news/list.html b/templates/news/list.html index 71cd3d02..366c9f37 100644 --- a/templates/news/list.html +++ b/templates/news/list.html @@ -1,5 +1,4 @@ {% extends "base.html" %} -{% load cycle from future %} {% block title %}Arch Linux - News{% endblock %} diff --git a/templates/packages/differences.html b/templates/packages/differences.html index be9059be..ac046897 100644 --- a/templates/packages/differences.html +++ b/templates/packages/differences.html @@ -1,5 +1,4 @@ {% extends "base.html" %} -{% load cycle from future %} {% load static from staticfiles %} {% load package_extras %} diff --git a/templates/packages/groups.html b/templates/packages/groups.html index ee4f0312..c135791f 100644 --- a/templates/packages/groups.html +++ b/templates/packages/groups.html @@ -1,5 +1,4 @@ {% extends "base.html" %} -{% load cycle from future %} {% load static from staticfiles %} {% block title %}Arch Linux - Package Groups{% if arch %} - {{ arch }}{% endif %}{% endblock %} diff --git a/templates/packages/packages_list.html b/templates/packages/packages_list.html index 0a1627f8..3dcc03dc 100644 --- a/templates/packages/packages_list.html +++ b/templates/packages/packages_list.html @@ -1,5 +1,4 @@ {% extends "base.html" %} -{% load cycle from future %} {% load static from staticfiles %} {% load package_extras %} diff --git a/templates/packages/search.html b/templates/packages/search.html index 02eca7ee..fe25da4c 100644 --- a/templates/packages/search.html +++ b/templates/packages/search.html @@ -1,5 +1,4 @@ {% extends "base.html" %} -{% load cycle from future %} {% load package_extras %} {% block title %}Arch Linux - Package Search{% endblock %} diff --git a/templates/packages/signoffs.html b/templates/packages/signoffs.html index 1c133f15..9f6437c2 100644 --- a/templates/packages/signoffs.html +++ b/templates/packages/signoffs.html @@ -1,5 +1,4 @@ {% extends "base.html" %} -{% load cycle from future %} {% load static from staticfiles %} {% load package_extras %} diff --git a/templates/packages/stale_relations.html b/templates/packages/stale_relations.html index 2dafc2be..218ddb3e 100644 --- a/templates/packages/stale_relations.html +++ b/templates/packages/stale_relations.html @@ -1,5 +1,4 @@ {% extends "base.html" %} -{% load cycle from future %} {% load static from staticfiles %} {% block title %}Arch Linux - Stale Package Relations{% endblock %} diff --git a/templates/releng/release_list.html b/templates/releng/release_list.html index fa15bcb9..bca30042 100644 --- a/templates/releng/release_list.html +++ b/templates/releng/release_list.html @@ -1,5 +1,4 @@ {% extends "base.html" %} -{% load cycle from future %} {% load static from staticfiles %} {% block title %}Arch Linux - Releases{% endblock %} diff --git a/templates/todolists/list.html b/templates/todolists/list.html index 983a49f0..04676812 100644 --- a/templates/todolists/list.html +++ b/templates/todolists/list.html @@ -1,5 +1,4 @@ {% extends "base.html" %} -{% load cycle from future %} {% load static from staticfiles %} {% block title %}Arch Linux - Todo Lists{% endblock %} diff --git a/templates/todolists/view.html b/templates/todolists/view.html index ec203b39..8360533b 100644 --- a/templates/todolists/view.html +++ b/templates/todolists/view.html @@ -1,5 +1,4 @@ {% extends "base.html" %} -{% load cycle from future %} {% load static from staticfiles %} {% load package_extras %} {% load todolists %} diff --git a/todolists/models.py b/todolists/models.py index 92ca5839..4b3e48a1 100644 --- a/todolists/models.py +++ b/todolists/models.py @@ -51,7 +51,7 @@ class Todolist(models.Model): if not hasattr(self, '_packages'): self._packages = self.todolistpackage_set.filter( removed__isnull=True).select_related( - 'pkg', 'repo', 'arch', 'user__username').order_by( + 'pkg', 'repo', 'arch', 'user__userprofile').order_by( 'pkgname', 'arch') return self._packages diff --git a/todolists/templatetags/todolists.py b/todolists/templatetags/todolists.py index 5f31dc1f..a54a9b82 100644 --- a/todolists/templatetags/todolists.py +++ b/todolists/templatetags/todolists.py @@ -1,4 +1,5 @@ from django import template +from django.utils.html import format_html register = template.Library() @@ -14,6 +15,6 @@ def todopkg_details_link(todopkg): return todopkg.pkgname link = '<a href="%s" title="View package details for %s">%s</a>' url = pkg_absolute_url(todopkg.repo, todopkg.arch, pkg.pkgname) - return link % (url, pkg.pkgname, pkg.pkgname) + return format_html(link % (url, pkg.pkgname, pkg.pkgname)) # vim: set ts=4 sw=4 et: diff --git a/todolists/urls.py b/todolists/urls.py index ed065f50..178cdc9a 100644 --- a/todolists/urls.py +++ b/todolists/urls.py @@ -1,26 +1,26 @@ -from django.conf.urls import patterns +from django.conf.urls import url from django.contrib.auth.decorators import permission_required from .views import (view_redirect, view, add, edit, flag, list_pkgbases, DeleteTodolist, TodolistListView) -urlpatterns = patterns('', - (r'^$', TodolistListView.as_view(), {}, 'todolist-list'), +urlpatterns = [ + url(r'^$', TodolistListView.as_view(), name='todolist-list'), # old todolists URLs, permanent redirect view so we don't break all links - (r'^(?P<old_id>\d+)/$', view_redirect), + url(r'^(?P<old_id>\d+)/$', view_redirect), - (r'^add/$', + url(r'^add/$', permission_required('todolists.add_todolist')(add)), - (r'^(?P<slug>[-\w]+)/$', view), - (r'^(?P<slug>[-\w]+)/edit/$', + url(r'^(?P<slug>[-\w]+)/$', view), + url(r'^(?P<slug>[-\w]+)/edit/$', permission_required('todolists.change_todolist')(edit)), - (r'^(?P<slug>[-\w]+)/delete/$', + url(r'^(?P<slug>[-\w]+)/delete/$', permission_required('todolists.delete_todolist')(DeleteTodolist.as_view())), - (r'^(?P<slug>[-\w]+)/flag/(?P<pkg_id>\d+)/$', + url(r'^(?P<slug>[-\w]+)/flag/(?P<pkg_id>\d+)/$', permission_required('todolists.change_todolistpackage')(flag)), - (r'^(?P<slug>[-\w]+)/pkgbases/(?P<svn_root>[a-z]+)/$', + url(r'^(?P<slug>[-\w]+)/pkgbases/(?P<svn_root>[a-z]+)/$', list_pkgbases), -) +] # vim: set ts=4 sw=4 et: diff --git a/todolists/views.py b/todolists/views.py index 75c3d2d6..40a767d1 100644 --- a/todolists/views.py +++ b/todolists/views.py @@ -9,7 +9,7 @@ from django.shortcuts import (get_list_or_404, get_object_or_404, from django.db import transaction from django.views.decorators.cache import never_cache from django.views.generic import DeleteView, ListView -from django.template import Context, loader +from django.template import loader from django.utils.timezone import now from main.models import Package, Repo @@ -225,10 +225,10 @@ def send_todolist_emails(todo_list, new_packages): for maint, packages in maint_packages.iteritems(): packages = sorted(packages, key=attrgetter('pkgname', 'arch')) - ctx = Context({ + ctx = { 'todo_packages': packages, 'todolist': todo_list, - }) + } template = loader.get_template('todolists/email_notification.txt') send_mail('Packages added to todo list \'%s\'' % todo_list.name, template.render(ctx), @@ -1,6 +1,7 @@ -from django.conf.urls import include, patterns +from django.conf.urls import include, url from django.contrib import admin from django.contrib.sitemaps import views as sitemap_views +from django.contrib.auth import views as auth_views from django.views.decorators.cache import cache_page from django.views.generic import TemplateView @@ -8,6 +9,18 @@ from django.views.generic import TemplateView from feeds import PackageFeed, NewsFeed, ReleaseFeed import sitemaps +import devel.urls +import mirrors.urls +import mirrors.urls_mirrorlist +import news.urls +import packages.urls +import packages.urls_groups +import public.views +import releng.urls +import retro.views +import todolists.urls +import visualize.urls + our_sitemaps = { 'base': sitemaps.BaseSitemap, 'news': sitemaps.NewsSitemap, @@ -24,79 +37,68 @@ news_sitemaps = {'news': sitemaps.RecentNewsSitemap} urlpatterns = [] # Public pages -urlpatterns += patterns('public.views', - (r'^$', 'index', {}, 'index'), - (r'^about/$', TemplateView.as_view(template_name='public/about.html'), - {}, 'page-about'), - (r'^art/$', TemplateView.as_view(template_name='public/art.html'), - {}, 'page-art'), - (r'^svn/$', TemplateView.as_view(template_name='public/svn.html'), - {}, 'page-svn'), - (r'^donate/$', 'donate', {}, 'page-donate'), - (r'^download/$', 'download', {}, 'page-download'), - (r'^master-keys/$', 'keys', {}, 'page-keys'), - (r'^master-keys/json/$', 'keys_json', {}, 'pgp-keys-json'), - (r'^people/(?P<slug>[-\w]+)/$', 'people', {}, 'people'), -) +urlpatterns.extend([ + url(r'^$', public.views.index, name='index'), + url(r'^about/$', TemplateView.as_view(template_name='public/about.html'), name='page-about'), + url(r'^art/$', TemplateView.as_view(template_name='public/art.html'), name='page-art'), + url(r'^svn/$', TemplateView.as_view(template_name='public/svn.html'), name='page-svn'), + url(r'^donate/$', public.views.donate, name='page-donate'), + url(r'^download/$', public.views.download, name='page-download'), + url(r'^master-keys/$', public.views.keys, name='page-keys'), + url(r'^master-keys/json/$', public.views.keys_json, name='pgp-keys-json'), + url(r'^people/(?P<slug>[-\w]+)/$', public.views.people, name='people'), +]) # Feeds patterns, used below -feeds_patterns = patterns('', - (r'^$', 'public.views.feeds', {}, 'feeds-list'), - (r'^news/$', cache_page(311)(NewsFeed())), - (r'^packages/$', cache_page(313)(PackageFeed())), - (r'^packages/(?P<arch>[A-z0-9]+)/$', - cache_page(313)(PackageFeed())), - (r'^packages/all/(?P<repo>[A-z0-9\-]+)/$', - cache_page(313)(PackageFeed())), - (r'^packages/(?P<arch>[A-z0-9]+)/(?P<repo>[A-z0-9\-]+)/$', - cache_page(313)(PackageFeed())), - (r'^releases/$', cache_page(317)(ReleaseFeed())), -) +feeds_patterns = [ + url(r'^$', public.views.feeds, name='feeds-list'), + url(r'^news/$', cache_page(311)(NewsFeed())), + url(r'^packages/$', cache_page(313)(PackageFeed())), + url(r'^packages/(?P<arch>[A-z0-9]+)/$', cache_page(313)(PackageFeed())), + url(r'^packages/all/(?P<repo>[A-z0-9\-]+)/$', cache_page(313)(PackageFeed())), + url(r'^packages/(?P<arch>[A-z0-9]+)/(?P<repo>[A-z0-9\-]+)/$', cache_page(313)(PackageFeed())), + url(r'^releases/$', cache_page(317)(ReleaseFeed())), +] # Includes and other remaining stuff -urlpatterns += patterns('', - (r'^admin/', include(admin.site.urls)), - (r'^devel/', include('devel.urls')), - (r'^feeds/', include(feeds_patterns)), - (r'^groups/', include('packages.urls_groups')), - (r'^mirrorlist/',include('mirrors.urls_mirrorlist')), - (r'^mirrors/', include('mirrors.urls')), - (r'^news/', include('news.urls')), - (r'^packages/', include('packages.urls')), - (r'^releng/', include('releng.urls')), - (r'^todo/', include('todolists.urls')), - (r'^visualize/', include('visualize.urls')), - (r'^opensearch/packages/$', 'packages.views.opensearch', - {}, 'opensearch-packages'), - (r'^opensearch/packages/suggest$', 'packages.views.opensearch_suggest', - {}, 'opensearch-packages-suggest'), -) +urlpatterns.extend([ + url(r'^admin/', include(admin.site.urls)), + url(r'^devel/', include(devel.urls)), + url(r'^feeds/', include(feeds_patterns)), + url(r'^groups/', include(packages.urls_groups)), + url(r'^mirrorlist/',include(mirrors.urls_mirrorlist)), + url(r'^mirrors/', include(mirrors.urls)), + url(r'^news/', include(news.urls)), + url(r'^packages/', include(packages.urls)), + url(r'^releng/', include(releng.urls)), + url(r'^todo/', include(todolists.urls)), + url(r'^visualize/', include(visualize.urls)), + url(r'^opensearch/packages/$', packages.views.opensearch, name='opensearch-packages'), + url(r'^opensearch/packages/suggest$', packages.views.opensearch_suggest, name='opensearch-packages-suggest'), +]) # Retro home page views -urlpatterns += patterns('retro.views', - (r'^retro/(?P<year>[0-9]{4})/$', 'retro_homepage', {}, 'retro-homepage'), -) +urlpatterns.extend([ + url(r'^retro/(?P<year>[0-9]{4})/$', retro.views.retro_homepage, name='retro-homepage'), +]) # Sitemaps -urlpatterns += patterns('', - (r'^sitemap.xml$', - cache_page(1831)(sitemap_views.index), +urlpatterns.extend([ + url(r'^sitemap.xml$', cache_page(1831)(sitemap_views.index), {'sitemaps': our_sitemaps, 'sitemap_url_name': 'sitemaps'}), - (r'^sitemap-(?P<section>.+)\.xml$', - cache_page(1831)(sitemap_views.sitemap), + url(r'^sitemap-(?P<section>.+)\.xml$', cache_page(1831)(sitemap_views.sitemap), {'sitemaps': our_sitemaps, 'template_name': 'sitemaps/sitemap.xml'}, - 'sitemaps'), - (r'^news-sitemap\.xml$', - cache_page(1831)(sitemap_views.sitemap), + name='sitemaps'), + url(r'^news-sitemap\.xml$', cache_page(1831)(sitemap_views.sitemap), {'sitemaps': news_sitemaps, 'template_name': 'sitemaps/news_sitemap.xml'}, - 'news-sitemap'), -) + name='news-sitemap'), +]) # Authentication -urlpatterns += patterns('django.contrib.auth.views', - (r'^login/$', 'login', {'template_name': 'registration/login.html'}, 'login'), - (r'^logout/$', 'logout', {'template_name': 'registration/logout.html'}, 'logout'), -) +urlpatterns.extend([ + url(r'^login/$', auth_views.login, {'template_name': 'registration/login.html'}, name='login'), + url(r'^logout/$', auth_views.logout, {'template_name': 'registration/logout.html'}, name='logout'), +]) def show_urls(urllist=urlpatterns, depth=0): diff --git a/visualize/urls.py b/visualize/urls.py index 8c3ea06a..b59de788 100644 --- a/visualize/urls.py +++ b/visualize/urls.py @@ -1,9 +1,12 @@ -from django.conf.urls import patterns +from django.conf.urls import url -urlpatterns = patterns('visualize.views', - (r'^$', 'index', {}, 'visualize-index'), - (r'^by_arch/$', 'by_arch', {}, 'visualize-byarch'), - (r'^by_repo/$', 'by_repo', {}, 'visualize-byrepo'), -) +from visualize import views + + +urlpatterns = [ + url(r'^$', views.index, name='visualize-index'), + url(r'^by_arch/$', views.by_arch, name='visualize-byarch'), + url(r'^by_repo/$', views.by_repo, name='visualize-byrepo'), +] # vim: set ts=4 sw=4 et: |