Apply pyupgrade --py36-plus (but skip f-strings as we're on Python 3.5)

This commit is contained in:
Ben Sturmfels 2023-09-07 23:15:48 +10:00
parent 5900f347c4
commit 9e39d7eadc
Signed by: bsturmfels
GPG key ID: 023C05E2C9C068F0
37 changed files with 56 additions and 107 deletions

View file

@ -1,4 +1,3 @@
from builtins import object
import hashlib import hashlib
from django.conf import settings from django.conf import settings
@ -8,7 +7,7 @@ from django.conf import settings
from django.shortcuts import render as render_template_with_context from django.shortcuts import render as render_template_with_context
class ParameterValidator(object): class ParameterValidator:
def __init__(self, given_hash_or_params, params_hash_key=None): def __init__(self, given_hash_or_params, params_hash_key=None):
if params_hash_key is None: if params_hash_key is None:
self.given_hash = given_hash_or_params self.given_hash = given_hash_or_params

View file

@ -1,5 +1,3 @@
from __future__ import unicode_literals
from django.apps import AppConfig from django.apps import AppConfig

View file

@ -1,6 +1,4 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.7 on 2021-11-30 00:24 # Generated by Django 1.10.7 on 2021-11-30 00:24
from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models

View file

@ -1,6 +1,4 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.29 on 2021-12-06 22:37 # Generated by Django 1.11.29 on 2021-12-06 22:37
from __future__ import unicode_literals
import datetime import datetime
from django.db import migrations, models from django.db import migrations, models

View file

@ -1,6 +1,4 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.29 on 2021-12-06 22:49 # Generated by Django 1.11.29 on 2021-12-06 22:49
from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
import uuid import uuid

View file

@ -1,6 +1,4 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.29 on 2023-01-27 06:02 # Generated by Django 1.11.29 on 2023-01-27 06:02
from __future__ import unicode_literals
import conservancy.apps.assignment.models import conservancy.apps.assignment.models
from django.db import migrations, models from django.db import migrations, models

View file

@ -1,5 +1,3 @@
from __future__ import unicode_literals
import uuid import uuid
from django.core.validators import URLValidator, ValidationError from django.core.validators import URLValidator, ValidationError

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
import textwrap import textwrap
TERMS = textwrap.dedent("""\ TERMS = textwrap.dedent("""\

View file

@ -1,4 +1,3 @@
from builtins import object
from django.db import models from django.db import models
from django.conf import settings from django.conf import settings
from conservancy import bsoup from conservancy import bsoup
@ -11,14 +10,14 @@ class EntryTag(models.Model):
label = models.CharField(max_length=100) label = models.CharField(max_length=100)
slug = models.SlugField() slug = models.SlugField()
class Meta(object): class Meta:
db_table = 'techblog_entrytag' # legacy db_table = 'techblog_entrytag' # legacy
def __str__(self): def __str__(self):
return self.label return self.label
def get_absolute_url(self): def get_absolute_url(self):
return u"/blog/?tag=%s" % self.slug return "/blog/?tag=%s" % self.slug
class Entry(models.Model, bsoup.SoupModelMixin): class Entry(models.Model, bsoup.SoupModelMixin):
"""Blog entry""" """Blog entry"""
@ -34,7 +33,7 @@ class Entry(models.Model, bsoup.SoupModelMixin):
date_created = models.DateTimeField(auto_now_add=True) date_created = models.DateTimeField(auto_now_add=True)
date_last_modified = models.DateTimeField(auto_now=True) date_last_modified = models.DateTimeField(auto_now=True)
class Meta(object): class Meta:
db_table = 'techblog_entries' # legacy db_table = 'techblog_entries' # legacy
verbose_name_plural = 'entries' verbose_name_plural = 'entries'
ordering = ('-pub_date',) ordering = ('-pub_date',)
@ -46,7 +45,7 @@ class Entry(models.Model, bsoup.SoupModelMixin):
return self.headline return self.headline
def get_absolute_url(self): def get_absolute_url(self):
return (u"/blog/%s/%s/" return ("/blog/%s/%s/"
% (self.pub_date.strftime("%Y/%b/%d").lower(), % (self.pub_date.strftime("%Y/%b/%d").lower(),
self.slug)) self.slug))
@ -58,7 +57,7 @@ class Entry(models.Model, bsoup.SoupModelMixin):
# http://blog.foozia.com/blog/2007/apr/21/ping-technorati-your-django-blog-using-xml-rpc/ # http://blog.foozia.com/blog/2007/apr/21/ping-technorati-your-django-blog-using-xml-rpc/
def save(self): def save(self):
if settings.CONSERVANCY_DEVEL or True: # "or True" means it is disabled always if settings.CONSERVANCY_DEVEL or True: # "or True" means it is disabled always
super(Entry, self).save() super().save()
return return
blog_name = 'Software Freedom Conservancy Blog' blog_name = 'Software Freedom Conservancy Blog'
@ -77,4 +76,4 @@ class Entry(models.Model, bsoup.SoupModelMixin):
reply = j.weblogUpdates.ping(blog_name, blog_url, post_url) reply = j.weblogUpdates.ping(blog_name, blog_url, post_url)
# Call any superclass's method # Call any superclass's method
super(Entry, self).save() super().save()

View file

@ -96,7 +96,7 @@ def query(request):
query_string = d.urlencode() query_string = d.urlencode()
return relative_redirect(request, '%s%s%s' % (base_url, '?' if query_string else '', query_string)) return relative_redirect(request, '{}{}{}'.format(base_url, '?' if query_string else '', query_string))
else: else:
authors = sorted(Person.objects.filter(currently_employed=True, authors = sorted(Person.objects.filter(currently_employed=True,
@ -113,7 +113,7 @@ def relative_redirect(request, path):
if settings.FORCE_CANONICAL_HOSTNAME: if settings.FORCE_CANONICAL_HOSTNAME:
host = settings.FORCE_CANONICAL_HOSTNAME host = settings.FORCE_CANONICAL_HOSTNAME
url = "%s://%s%s" % (request.is_secure() and 'https' or 'http', host, path) url = "{}://{}{}".format(request.is_secure() and 'https' or 'http', host, path)
return http.HttpResponseRedirect(url) return http.HttpResponseRedirect(url)
class BlogYearArchiveView(YearArchiveView): class BlogYearArchiveView(YearArchiveView):
@ -122,7 +122,7 @@ class BlogYearArchiveView(YearArchiveView):
extra_context = {} extra_context = {}
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(BlogYearArchiveView, self).get_context_data(**kwargs) context = super().get_context_data(**kwargs)
context.update(self.extra_context) context.update(self.extra_context)
return context return context
@ -131,7 +131,7 @@ class BlogMonthArchiveView(MonthArchiveView):
extra_context = {} extra_context = {}
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(BlogMonthArchiveView, self).get_context_data(**kwargs) context = super().get_context_data(**kwargs)
context.update(self.extra_context) context.update(self.extra_context)
return context return context
@ -140,7 +140,7 @@ class BlogDayArchiveView(DayArchiveView):
extra_context = {} extra_context = {}
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(BlogDayArchiveView, self).get_context_data(**kwargs) context = super().get_context_data(**kwargs)
context.update(self.extra_context) context.update(self.extra_context)
return context return context
@ -149,6 +149,6 @@ class BlogDateDetailView(DateDetailView):
extra_context = {} extra_context = {}
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(BlogDateDetailView, self).get_context_data(**kwargs) context = super().get_context_data(**kwargs)
context.update(self.extra_context) context.update(self.extra_context)
return context return context

View file

@ -1,4 +1,3 @@
from builtins import object
from django.db import models from django.db import models
class ContactEntry(models.Model): class ContactEntry(models.Model):
@ -9,6 +8,6 @@ class ContactEntry(models.Model):
email = models.EmailField() # should make it unique, but we really cannot email = models.EmailField() # should make it unique, but we really cannot
subscribe_conservancy = models.BooleanField(default=False) subscribe_conservancy = models.BooleanField(default=False)
class Meta(object): class Meta:
ordering = ('email',) ordering = ('email',)

View file

@ -1,4 +1,3 @@
from builtins import object
from django.shortcuts import render from django.shortcuts import render
from django import forms from django import forms
from conservancy.apps.contacts.models import ContactEntry from conservancy.apps.contacts.models import ContactEntry
@ -9,7 +8,7 @@ def subscribe(request):
""" """
class ContactEntryForm(ModelForm): class ContactEntryForm(ModelForm):
class Meta(object): class Meta:
model = ContactEntry model = ContactEntry
ContactEntryForm.base_fields['subscribe_conservancy'].label = 'Receive Software Freedom Conservancy updates' ContactEntryForm.base_fields['subscribe_conservancy'].label = 'Receive Software Freedom Conservancy updates'

View file

@ -1,4 +1,3 @@
from builtins import object
from django.db import models from django.db import models
from conservancy.apps.staff.models import Person from conservancy.apps.staff.models import Person
from conservancy.apps.worldmap.models import EarthLocation from conservancy.apps.worldmap.models import EarthLocation
@ -21,13 +20,13 @@ class PastEventManager(models.Manager):
"""Returns all past events""" """Returns all past events"""
def get_queryset(self): def get_queryset(self):
return super(PastEventManager, self).get_queryset().filter(date__lt=datetime.today()) return super().get_queryset().filter(date__lt=datetime.today())
class FutureEventManager(models.Manager): class FutureEventManager(models.Manager):
"""Returns all future events""" """Returns all future events"""
def get_queryset(self): def get_queryset(self):
return super(FutureEventManager, self).get_queryset().filter(date__gte=datetime.today()) return super().get_queryset().filter(date__gte=datetime.today())
class Event(models.Model): class Event(models.Model):
"""Model for Conservancy staff member events (presentations, etc)""" """Model for Conservancy staff member events (presentations, etc)"""
@ -47,14 +46,14 @@ class Event(models.Model):
date_created = models.DateTimeField(auto_now_add=True) date_created = models.DateTimeField(auto_now_add=True)
date_last_modified = models.DateTimeField(auto_now=True) date_last_modified = models.DateTimeField(auto_now=True)
class Meta(object): class Meta:
ordering = ("-date",) ordering = ("-date",)
def __str__(self): def __str__(self):
return u"%s (%s)" % (self.title, self.date) return "{} ({})".format(self.title, self.date)
def get_absolute_url(self): def get_absolute_url(self):
return u"/events/%s/%s/" % (self.date.strftime("%Y"), self.slug) return "/events/{}/{}/".format(self.date.strftime("%Y"), self.slug)
def day_after(self): def day_after(self):
return self.date + timedelta(days=1) return self.date + timedelta(days=1)
@ -87,9 +86,9 @@ class EventMedia(models.Model):
date_created = models.DateTimeField(auto_now_add=True) date_created = models.DateTimeField(auto_now_add=True)
date_last_modified = models.DateTimeField(auto_now=True) date_last_modified = models.DateTimeField(auto_now=True)
class Meta(object): class Meta:
verbose_name_plural = 'event media' verbose_name_plural = 'event media'
def __str__(self): def __str__(self):
return u"%s media: %s" % (self.event, self.format) return "{} media: {}".format(self.event, self.format)

View file

@ -14,7 +14,7 @@ def organize_media_by_event(eventmedia_queryset):
media_by_event.setdefault(media.event.id, []).append(media) media_by_event.setdefault(media.event.id, []).append(media)
mbe = [{'event': x[0].event, mbe = [{'event': x[0].event,
'date': max(y.date_created for y in x), 'date': max(y.date_created for y in x),
'media_list': ', '.join(set(y.get_format_display() for y in x))} 'media_list': ', '.join({y.get_format_display() for y in x})}
for x in list(media_by_event.values())] for x in list(media_by_event.values())]
mbe.sort(key=(lambda x: x['date']), reverse=True) # sort by date mbe.sort(key=(lambda x: x['date']), reverse=True) # sort by date
return mbe return mbe

View file

@ -1,6 +1,4 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.29 on 2023-01-27 06:19 # Generated by Django 1.11.29 on 2023-01-27 06:19
from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
import uuid import uuid

View file

@ -1,6 +1,4 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.29 on 2023-01-30 18:41 # Generated by Django 1.11.29 on 2023-01-30 18:41
from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models

View file

@ -1,6 +1,4 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.7 on 2018-11-18 12:09 # Generated by Django 1.10.7 on 2018-11-18 12:09
from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models

View file

@ -1,6 +1,4 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.7 on 2018-11-18 12:11 # Generated by Django 1.10.7 on 2018-11-18 12:11
from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion

View file

@ -1,6 +1,4 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.7 on 2021-11-19 01:45 # Generated by Django 1.10.7 on 2021-11-19 01:45
from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models

View file

@ -1,5 +1,3 @@
from __future__ import division
from builtins import object
import random import random
from django.db import models from django.db import models
@ -21,7 +19,7 @@ class FundraisingGoal(models.Model):
def percentage_there(self): def percentage_there(self):
return self.fundraiser_so_far_amount / self.fundraiser_goal_amount * 100 return self.fundraiser_so_far_amount / self.fundraiser_goal_amount * 100
class Meta(object): class Meta:
ordering = ('fundraiser_code_name',) ordering = ('fundraiser_code_name',)
def providers(self): def providers(self):

View file

@ -1,4 +1,3 @@
from builtins import object
from django.db import models from django.db import models
from django.conf import settings from django.conf import settings
from conservancy import bsoup from conservancy import bsoup
@ -22,7 +21,7 @@ class PressRelease(models.Model, bsoup.SoupModelMixin):
date_last_modified = models.DateTimeField(auto_now=True) date_last_modified = models.DateTimeField(auto_now=True)
class Meta(object): class Meta:
ordering = ("-pub_date",) ordering = ("-pub_date",)
get_latest_by = "pub_date" get_latest_by = "pub_date"
@ -32,7 +31,7 @@ class PressRelease(models.Model, bsoup.SoupModelMixin):
return self.headline return self.headline
def get_absolute_url(self): def get_absolute_url(self):
return u"/news/%s/%s/" % (self.pub_date.strftime("%Y/%b/%d").lower(), return "/news/{}/{}/".format(self.pub_date.strftime("%Y/%b/%d").lower(),
self.slug) self.slug)
def is_recent(self): def is_recent(self):
@ -46,7 +45,7 @@ class PressRelease(models.Model, bsoup.SoupModelMixin):
def save(self): def save(self):
if settings.CONSERVANCY_DEVEL or True: if settings.CONSERVANCY_DEVEL or True:
super(PressRelease, self).save() super().save()
return return
blog_name = 'Software Freedom Conservancy News' blog_name = 'Software Freedom Conservancy News'
@ -65,7 +64,7 @@ class PressRelease(models.Model, bsoup.SoupModelMixin):
reply = j.weblogUpdates.ping(blog_name, blog_url, post_url) reply = j.weblogUpdates.ping(blog_name, blog_url, post_url)
# Call any superclass's method # Call any superclass's method
super(PressRelease, self).save() super().save()
class ExternalArticleTag(models.Model): class ExternalArticleTag(models.Model):
"""A way to tag external articles""" """A way to tag external articles"""
@ -79,7 +78,7 @@ class ExternalArticleTag(models.Model):
class PublicExternalArticleManager(models.Manager): class PublicExternalArticleManager(models.Manager):
def get_queryset(self): def get_queryset(self):
return super(PublicExternalArticleManager, self).get_queryset().filter(visible=True) return super().get_queryset().filter(visible=True)
class ExternalArticle(models.Model): class ExternalArticle(models.Model):
"""A system for displaying Conservancy news mentions on the site. """A system for displaying Conservancy news mentions on the site.
@ -103,12 +102,12 @@ class ExternalArticle(models.Model):
date_created = models.DateField(auto_now_add=True) date_created = models.DateField(auto_now_add=True)
class Meta(object): class Meta:
ordering = ("-date_created",) ordering = ("-date_created",)
get_latest_by = "date_created" get_latest_by = "date_created"
def __str__(self): def __str__(self):
return u"%s (%s)" % (self.title, self.publication) return "{} ({})".format(self.title, self.publication)
objects = models.Manager() objects = models.Manager()
public = PublicExternalArticleManager() public = PublicExternalArticleManager()

View file

@ -1,4 +1,3 @@
from builtins import zip
import urllib.parse import urllib.parse
from django import template from django import template

View file

@ -14,7 +14,7 @@ from django.http import HttpResponse
class NewsListView(ListView): class NewsListView(ListView):
extra_context = {} extra_context = {}
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(NewsListView, self).get_context_data(**kwargs) context = super().get_context_data(**kwargs)
# context['key'] = 'value' # context['key'] = 'value'
context.update(self.extra_context) context.update(self.extra_context)
return context return context

View file

@ -1,6 +1,4 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.7 on 2021-11-28 21:12 # Generated by Django 1.10.7 on 2021-11-28 21:12
from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models

View file

@ -1,6 +1,4 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.7 on 2021-11-28 21:12 # Generated by Django 1.10.7 on 2021-11-28 21:12
from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models

View file

@ -1,4 +1,3 @@
from builtins import object
from django.db import models from django.db import models
class Person(models.Model): class Person(models.Model):
@ -20,11 +19,11 @@ class Person(models.Model):
date_created = models.DateTimeField(auto_now_add=True) date_created = models.DateTimeField(auto_now_add=True)
date_last_modified = models.DateTimeField(auto_now=True) date_last_modified = models.DateTimeField(auto_now=True)
class Meta(object): class Meta:
verbose_name_plural = 'people' verbose_name_plural = 'people'
def __str__(self): def __str__(self):
return self.username return self.username
def biography_url(self): def biography_url(self):
return u"/about/#%s" % self.username return "/about/#%s" % self.username

View file

@ -1,4 +1,3 @@
from builtins import object
from django.db import models from django.db import models
class SummitRegistration(models.Model): class SummitRegistration(models.Model):
@ -12,6 +11,6 @@ class SummitRegistration(models.Model):
date_created = models.DateField(auto_now_add=True) date_created = models.DateField(auto_now_add=True)
cle_credit = models.BooleanField(default=True) cle_credit = models.BooleanField(default=True)
class Meta(object): class Meta:
ordering = ('name',) ordering = ('name',)

View file

@ -1,4 +1,3 @@
from builtins import object
from django.shortcuts import render from django.shortcuts import render
from django import forms from django import forms
from conervancy.apps.summit_registration.models import SummitRegistration from conervancy.apps.summit_registration.models import SummitRegistration
@ -8,7 +7,7 @@ def register(request):
""" """
class SummitForm(ModelForm): class SummitForm(ModelForm):
class Meta(object): class Meta:
model = SummitRegistration model = SummitRegistration
SummitForm.base_fields['email'].label = 'Email address' SummitForm.base_fields['email'].label = 'Email address'

View file

@ -1,4 +1,3 @@
from builtins import object
from django.db import models from django.db import models
class Supporter(models.Model): class Supporter(models.Model):
@ -13,5 +12,5 @@ class Supporter(models.Model):
def __str__(self): def __str__(self):
return self.display_name return self.display_name
class Meta(object): class Meta:
ordering = ('ledger_entity_id',) ordering = ('ledger_entity_id',)

View file

@ -1,4 +1,3 @@
from builtins import object
from django.db import models from django.db import models
class EarthLocation(models.Model): class EarthLocation(models.Model):
@ -11,7 +10,7 @@ class EarthLocation(models.Model):
date_created = models.DateTimeField(auto_now_add=True) date_created = models.DateTimeField(auto_now_add=True)
date_last_modified = models.DateTimeField(auto_now=True) date_last_modified = models.DateTimeField(auto_now=True)
class Meta(object): class Meta:
unique_together = (("latitude", "longitude"),) unique_together = (("latitude", "longitude"),)
def __str__(self): def __str__(self):

View file

@ -1,7 +1,3 @@
# -*- encoding: utf-8 -*-
from builtins import filter
from builtins import object
import io import io
import itertools import itertools
import re import re
@ -27,7 +23,7 @@ class BeautifulSoup(bs4.BeautifulSoup):
# for speed, but that doesn't work in our web application. On # for speed, but that doesn't work in our web application. On
# Debian stretch, at least, using lxml causes the web server WSGI # Debian stretch, at least, using lxml causes the web server WSGI
# application to go into an infinite loop. # application to go into an infinite loop.
super(BeautifulSoup, self).__init__(src, parser) super().__init__(src, parser)
def _body_text(self, root): def _body_text(self, root):
# "Body text" is all the strings under the root element, in order, # "Body text" is all the strings under the root element, in order,
@ -47,8 +43,7 @@ class BeautifulSoup(bs4.BeautifulSoup):
if not started: if not started:
break break
else: else:
for s in self._body_text(child): yield from self._body_text(child)
yield s
# It's not worth it to use issubclass here, because elements that # It's not worth it to use issubclass here, because elements that
# don't have body text like Comments and CDATA are subclasses of # don't have body text like Comments and CDATA are subclasses of
# NavigableString. # NavigableString.
@ -107,7 +102,7 @@ class BeautifulSoup(bs4.BeautifulSoup):
return self.find_all(self.is_video_source, src=True) return self.find_all(self.is_video_source, src=True)
class SoupModelMixin(object): class SoupModelMixin:
"""Mixin for models to parse HTML with BeautifulSoup. """Mixin for models to parse HTML with BeautifulSoup.
Classes that use this mixin must define `SOUP_ATTRS`, a list of strings Classes that use this mixin must define `SOUP_ATTRS`, a list of strings
@ -153,7 +148,7 @@ class SoupModelMixin(object):
def get_description(self): def get_description(self):
"""Return a string with a brief excerpt of body text from the HTML.""" """Return a string with a brief excerpt of body text from the HTML."""
return u''.join(self._get_soup().some_body_text()) return ''.join(self._get_soup().some_body_text())
def get_image_urls(self, *slice_args): def get_image_urls(self, *slice_args):
"""Return an iterator of source URL strings of all images in the HTML. """Return an iterator of source URL strings of all images in the HTML.

View file

@ -53,7 +53,7 @@ class PressReleaseFeed(Feed):
class OmnibusFeedType(Rss201rev2Feed): class OmnibusFeedType(Rss201rev2Feed):
def root_attributes(self): def root_attributes(self):
attrs = super(OmnibusFeedType, self).root_attributes() attrs = super().root_attributes()
attrs['xmlns:itunes'] = 'http://www.itunes.com/dtds/podcast-1.0.dtd' attrs['xmlns:itunes'] = 'http://www.itunes.com/dtds/podcast-1.0.dtd'
attrs['xmlns:atom'] = 'http://www.w3.org/2005/Atom' attrs['xmlns:atom'] = 'http://www.w3.org/2005/Atom'
attrs['xmlns:media'] = 'http://search.yahoo.com/mrss/' attrs['xmlns:media'] = 'http://search.yahoo.com/mrss/'
@ -61,10 +61,10 @@ class OmnibusFeedType(Rss201rev2Feed):
return attrs return attrs
def add_root_elements(self, handler): def add_root_elements(self, handler):
super(OmnibusFeedType, self).add_root_elements(handler) super().add_root_elements(handler)
def add_item_elements(self, handler, item): def add_item_elements(self, handler, item):
super(OmnibusFeedType, self).add_item_elements(handler, item) super().add_item_elements(handler, item)
# Block things that don't have an enclosure from iTunes in # Block things that don't have an enclosure from iTunes in
# case someone uploads this feed there. # case someone uploads this feed there.
handler.addQuickElement("itunes:block", 'Yes') handler.addQuickElement("itunes:block", 'Yes')
@ -147,7 +147,7 @@ class OmnibusFeed(ConservancyFeedBase):
def item_extra_kwargs(self, item): def item_extra_kwargs(self, item):
return super(OmnibusFeed, self).item_extra_kwargs(item) return super().item_extra_kwargs(item)
class BlogFeed(ConservancyFeedBase): class BlogFeed(ConservancyFeedBase):
link = "/blog/" link = "/blog/"
@ -234,7 +234,7 @@ class BlogFeed(ConservancyFeedBase):
def OR_filter(field_name, subfield_name, objs): def OR_filter(field_name, subfield_name, objs):
from django.db.models import Q from django.db.models import Q
return reduce(lambda x, y: x | y, return reduce(lambda x, y: x | y,
[Q(**{'%s__%s' % (field_name, subfield_name): x}) [Q(**{'{}__{}'.format(field_name, subfield_name): x})
for x in objs]) for x in objs])
queryset = BlogEntry.objects.filter(pub_date__lte=datetime.now()) queryset = BlogEntry.objects.filter(pub_date__lte=datetime.now())

View file

@ -1,5 +1,3 @@
from __future__ import unicode_literals
from datetime import datetime as DateTime from datetime import datetime as DateTime
import conservancy.settings import conservancy.settings
@ -21,9 +19,9 @@ def sitefundraiser(request):
} }
if conservancy.settings.FORCE_CANONICAL_HOSTNAME: if conservancy.settings.FORCE_CANONICAL_HOSTNAME:
_HOST_URL_VAR = {'host_url': u'https://' + conservancy.settings.FORCE_CANONICAL_HOSTNAME} _HOST_URL_VAR = {'host_url': 'https://' + conservancy.settings.FORCE_CANONICAL_HOSTNAME}
def host_url(request): def host_url(request):
return _HOST_URL_VAR return _HOST_URL_VAR
else: else:
def host_url(request): def host_url(request):
return {'host_url': request.build_absolute_uri(u'/').rstrip(u'/')} return {'host_url': request.build_absolute_uri('/').rstrip('/')}

View file

@ -1,9 +1,8 @@
from builtins import object
from django import http from django import http
from django.conf import settings from django.conf import settings
from django.utils.cache import patch_response_headers from django.utils.cache import patch_response_headers
class ForceCanonicalHostnameMiddleware(object): class ForceCanonicalHostnameMiddleware:
def process_request(self, request): def process_request(self, request):
"""Modified common middleware for Conservancy site """Modified common middleware for Conservancy site
@ -28,7 +27,7 @@ class ForceCanonicalHostnameMiddleware(object):
if settings.APPEND_SLASH and (old_url[1][-1] != '/') and ('.' not in old_url[1].split('/')[-1]): if settings.APPEND_SLASH and (old_url[1][-1] != '/') and ('.' not in old_url[1].split('/')[-1]):
new_url[1] = new_url[1] + '/' new_url[1] = new_url[1] + '/'
if settings.DEBUG and request.method == 'POST': if settings.DEBUG and request.method == 'POST':
raise(RuntimeError, "You called this URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set. Django can't redirect to the slash URL while maintaining POST data. Change your form to point to %s%s (note the trailing slash), or set APPEND_SLASH=False in your Django settings." % (new_url[0], new_url[1])) raise(RuntimeError, "You called this URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set. Django can't redirect to the slash URL while maintaining POST data. Change your form to point to {}{} (note the trailing slash), or set APPEND_SLASH=False in your Django settings.".format(new_url[0], new_url[1]))
# Strip trailing index.html # Strip trailing index.html
if new_url[1].endswith('/index.html'): if new_url[1].endswith('/index.html'):
new_url[1] = new_url[1][:new_url[1].rfind('index.html')] new_url[1] = new_url[1][:new_url[1].rfind('index.html')]
@ -42,7 +41,7 @@ class ForceCanonicalHostnameMiddleware(object):
new_url[0] = settings.FORCE_CANONICAL_HOSTNAME new_url[0] = settings.FORCE_CANONICAL_HOSTNAME
# Redirect # Redirect
if new_url[0]: if new_url[0]:
newurl = "%s://%s%s" % (request.is_secure() and 'https' or 'http', new_url[0], new_url[1]) newurl = "{}://{}{}".format(request.is_secure() and 'https' or 'http', new_url[0], new_url[1])
else: else:
newurl = new_url[1] newurl = new_url[1]
if request.GET: if request.GET:

View file

@ -26,7 +26,7 @@ ROOT_URLCONF = 'conservancy.urls'
FORCE_CANONICAL_HOSTNAME = False if DEBUG else 'sfconservancy.org' FORCE_CANONICAL_HOSTNAME = False if DEBUG else 'sfconservancy.org'
ALLOWED_HOSTS = [ 'www.sfconservancy.org', 'aspen.sfconservancy.org', 'sfconservancy.org', u'104.130.70.210' ] ALLOWED_HOSTS = [ 'www.sfconservancy.org', 'aspen.sfconservancy.org', 'sfconservancy.org', '104.130.70.210' ]
if DEBUG: if DEBUG:
ALLOWED_HOSTS.append('localhost') ALLOWED_HOSTS.append('localhost')

View file

@ -1,4 +1,3 @@
from builtins import str
import mimetypes import mimetypes
import os.path import os.path
from django.http import HttpResponse from django.http import HttpResponse
@ -30,9 +29,9 @@ def handler500(request):
return handler(request, 500) return handler(request, 500)
def index(request, *args, **kwargs): def index(request, *args, **kwargs):
path = request.path.lstrip(u'/') path = request.path.lstrip('/')
if path.endswith(u'/'): if path.endswith('/'):
path += u'index.html' path += 'index.html'
fullpath = os.path.join(STATIC_ROOT, path) fullpath = os.path.join(STATIC_ROOT, path)
try: try:
# Junk URLs in production (Python 3.5) are causing UnicodeEncodeErrors # Junk URLs in production (Python 3.5) are causing UnicodeEncodeErrors

View file

@ -1,4 +1,3 @@
from builtins import str
from mod_python import apache from mod_python import apache
# 404 should do NOTHING so apache can handle it. This view is referenced # 404 should do NOTHING so apache can handle it. This view is referenced