summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjelle van der Waa <jelle@vdwaa.nl>2018-04-20 17:43:13 +0200
committerGitHub <noreply@github.com>2018-04-20 17:43:13 +0200
commit4b2d3ad5c5c15e2354c6a1976153046bb7eee08c (patch)
tree776c48c9e41fcdeecd4fc334851c04eed7585f14
parentb3475381e5299929cc952b1dd2f96212166ade9d (diff)
parent3e5885c9ed01ce30f99e6be41b0294bf07f8fc43 (diff)
downloadarchweb-4b2d3ad5c5c15e2354c6a1976153046bb7eee08c.tar.gz
archweb-4b2d3ad5c5c15e2354c6a1976153046bb7eee08c.zip
Merge pull request #88 from archlinux/upgrade_django
Upgrade django
-rw-r--r--README.md12
-rw-r--r--devel/forms.py6
-rw-r--r--devel/management/commands/generate_keyring.py3
-rw-r--r--devel/management/commands/pgp_import.py3
-rw-r--r--devel/management/commands/rematch_developers.py8
-rw-r--r--devel/management/commands/reporead.py23
-rw-r--r--devel/management/commands/update_types_permissions.py25
-rw-r--r--devel/tests/test_reporead.py2
-rw-r--r--devel/tests/test_templatetags.py5
-rw-r--r--devel/tests/test_user.py6
-rw-r--r--devel/urls.py29
-rw-r--r--main/storage.py4
-rw-r--r--main/templatetags/cdn.py6
-rw-r--r--main/templatetags/flags.py5
-rw-r--r--main/templatetags/pgp.py4
-rw-r--r--mirrors/fields.py4
-rw-r--r--mirrors/management/commands/mirrorcheck.py26
-rw-r--r--mirrors/management/commands/mirrorresolv.py6
-rw-r--r--mirrors/urls.py24
-rw-r--r--mirrors/urls_mirrorlist.py14
-rw-r--r--mirrors/views/mirrorlist.py2
-rw-r--r--news/urls.py24
-rw-r--r--news/views.py6
-rw-r--r--packages/management/commands/populate_signoffs.py9
-rw-r--r--packages/management/commands/signoff_report.py6
-rw-r--r--packages/templatetags/package_extras.py3
-rw-r--r--packages/urls.py71
-rw-r--r--packages/urls_groups.py14
-rw-r--r--packages/views/flag.py6
-rw-r--r--public/views.py6
-rw-r--r--releng/urls.py35
-rw-r--r--requirements.txt10
-rw-r--r--settings.py2
-rw-r--r--templates/devel/clock.html1
-rw-r--r--templates/devel/index.html1
-rw-r--r--templates/devel/packages.html3
-rw-r--r--templates/devel/stats.html1
-rw-r--r--templates/mirrors/mirror_details.html1
-rw-r--r--templates/mirrors/mirrors.html1
-rw-r--r--templates/news/list.html1
-rw-r--r--templates/packages/differences.html1
-rw-r--r--templates/packages/groups.html1
-rw-r--r--templates/packages/packages_list.html1
-rw-r--r--templates/packages/search.html1
-rw-r--r--templates/packages/signoffs.html1
-rw-r--r--templates/packages/stale_relations.html1
-rw-r--r--templates/releng/release_list.html1
-rw-r--r--templates/todolists/list.html1
-rw-r--r--templates/todolists/view.html1
-rw-r--r--todolists/models.py2
-rw-r--r--todolists/templatetags/todolists.py3
-rw-r--r--todolists/urls.py22
-rw-r--r--todolists/views.py6
-rw-r--r--urls.py124
-rw-r--r--visualize/urls.py15
55 files changed, 294 insertions, 305 deletions
diff --git a/README.md b/README.md
index 0fb8ddc7..6aacd15e 100644
--- a/README.md
+++ b/README.md
@@ -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),
diff --git a/urls.py b/urls.py
index 081331e0..ba63eea8 100644
--- a/urls.py
+++ b/urls.py
@@ -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: