Changeset - 75e3ab4d35f0
[Not reviewed]
0 8 0
Ben Sturmfels (bsturmfels) - 3 months ago 2024-02-23 04:02:04
ben@sturm.com.au
podjango: Fix linting warnings
8 files changed with 84 insertions and 64 deletions:
0 comments (0 inline, 0 general)
TODO.md
Show inline comments
 
# To-do
 

	
 
* remove `ForceCanonicalHostnameMiddleware` by ensuring canonical redirect and HTTPS redirect is done by Apache
 
* serve a 400 in Apache for a hostname we don't explicitly support
 
* use `<detail>` elements for supporter page hidden sections, rather than complex jQuery - or consider Alpine.js
 
* replace `internalNavigate` with inline flexbox layout
conservancy/podjango/admin.py
Show inline comments
...
 
@@ -25,6 +25,8 @@ class CastTagAdmin(admin.ModelAdmin):
 
    prepopulated_fields = {'slug': ('label',)}
 

	
 

	
 
admin.site.register(CastTag, CastTagAdmin)
 

	
 

	
 
class CastAdmin(admin.ModelAdmin):
 
    list_display = ('pub_date', 'title')
conservancy/podjango/feeds.py
Show inline comments
...
 
@@ -19,8 +19,5 @@
 

	
 
from datetime import datetime
 
import itertools
 
import operator
 

	
 
from django.conf import settings
 
from django.contrib.sites.shortcuts import get_current_site
 
from django.contrib.syndication.views import Feed, add_domain
...
 
@@ -54,34 +51,41 @@ class CastFeedBase(Feed):
 
                    year = getattr(getattr(item, attr), 'year')
 
                    break
 
        return { 'year' : year }
 
        return {'year': year}
 

	
 

	
 
def for_podcast_feed_extra_kwargs(self, obj):
 
    return { 'managingEditorNames' : 'Bradley and Karen',
 
             'rssImage' : { 'url' : 'http://faif.us/img/cast/faif_144x144.jpg',
 
                            'width' : '144', 'height' : '144' },
 
             'webMaster' : 'oggcast@faif.us (Bradley and Karen)',
 
             'dcCreator' : 'oggcast@faif.us (Bradley and Karen)',
 
             'iTunesExplicit'  : 'No',
 
             'iTunesBlock' : 'No',
 
             'iTunesImage' : { 'url' : 'http://faif.us/img/cast/faif_300x300.jpg',
 
                               'title' : 'The Corresponding Source (formerly Free as in Freedom)',
 
                               'link' : self.author_link,
 
                               'type' : 'video/jpg'},
 
             'category' : { 'name' : 'Government & Organizations', 'scheme' : 'http://www.itunes.com/dtds/podcast-1.0.dtd',
 
                            'subcats' : [ 'Non-Profit' ] },
 
             'keywords' : 'open source, opensource, freesoftware, software freedom, legal, law, linux, free, license, gpl, lgpl, agpl, bsd',
 
             'iTunesAuthor' : 'Software Freedom Conservancy',
 
             'iTunesSubtitle' : 'Bi-Weekly Discussion of Legal, Policy, and Any other Issues in the Free, Libre, and Open Source Software (FLOSS) Community',
 
             'copyrightHolder' : self.copyright_holder(),
 
             'copyrightLicense' : self.license_no_html() }
 
    return {
 
        'managingEditorNames': 'Bradley and Karen',
 
        'rssImage': {'url': 'http://faif.us/img/cast/faif_144x144.jpg',
 
                     'width': '144', 'height': '144'},
 
        'webMaster': 'oggcast@faif.us (Bradley and Karen)',
 
        'dcCreator': 'oggcast@faif.us (Bradley and Karen)',
 
        'iTunesExplicit': 'No',
 
        'iTunesBlock': 'No',
 
        'iTunesImage': {'url': 'http://faif.us/img/cast/faif_300x300.jpg',
 
                        'title': 'The Corresponding Source (formerly Free as in Freedom)',
 
                        'link': self.author_link,
 
                        'type': 'video/jpg'},
 
        'category': {'name': 'Government & Organizations', 'scheme': 'http://www.itunes.com/dtds/podcast-1.0.dtd',
 
                     'subcats': ['Non-Profit']},
 
        'keywords': 'open source, opensource, freesoftware, software freedom, legal, law, linux, free, license, gpl, lgpl, agpl, bsd',
 
        'iTunesAuthor': 'Software Freedom Conservancy',
 
        'iTunesSubtitle': 'Bi-Weekly Discussion of Legal, Policy, and Any other Issues in the Free, Libre, and Open Source Software (FLOSS) Community',
 
        'copyrightHolder': self.copyright_holder(),
 
        'copyrightLicense': self.license_no_html(),
 
    }
 

	
 

	
 
def for_podcast_item_extra_kwargs(self, item):
 
    return { 'duration' : item.duration,
 
             'year' : item.date_created.year,
 
             'dcCreator' : 'oggcast@faif.us (Bradley and Karen)',
 
             'intheitembkuhn' : item.__dict__.__str__()}
 
    return {
 
        'duration': item.duration,
 
        'year': item.date_created.year,
 
        'dcCreator': 'oggcast@faif.us (Bradley and Karen)',
 
        'intheitembkuhn': item.__dict__.__str__(),
 
    }
 

	
 

	
 
def podcast_helper_add_root_elements(self, handler):
 
    handler.addQuickElement('managingEditor', self.feed['author_email'] 
 
    handler.addQuickElement('managingEditor', self.feed['author_email']
 
                            + ' (' + self.feed['managingEditorNames'] + ')')
 
    handler.startElement('image', {})
...
 
@@ -92,5 +96,5 @@ def podcast_helper_add_root_elements(self, handler):
 
    handler.addQuickElement('height', self.feed['rssImage']['height'])
 
    handler.endElement('image')
 
    
 

 
    handler.addQuickElement('webMaster', self.feed['webMaster'])
 
#    handler.addQuickElement('dc:creator', self.feed['dcCreator'])
...
 
@@ -98,37 +102,37 @@ def podcast_helper_add_root_elements(self, handler):
 
    handler.addQuickElement('itunes:block', self.feed['iTunesBlock'])
 
    handler.addQuickElement('generator', 'http://www.faif.us/code')
 
    
 

 
    handler.addQuickElement('media:thumbnail', '' , { 'url' : self.feed['rssImage']['url'] })
 
    handler.addQuickElement('itunes:image', '' , { 'href' : self.feed['iTunesImage']['url']})
 
#    handler.addQuickElement('itunes:link', '', { 'href' : self.feed['iTunesImage']['url'],
 
#                                                 'type' : self.feed['iTunesImage']['type']})
 
    
 

 
    handler.addQuickElement("media:category", self.feed['category']['name'],
 
                            { 'scheme': self.feed['category']['scheme']})
 
    if not (self.feed['category']['subcats'] and len(self.feed['category']['subcats']) > 0): 
 
        handler.addQuickElement("itunes:category", '', { 'text': self.feed['category']['name']})
 
                            {'scheme': self.feed['category']['scheme']})
 
    if not (self.feed['category']['subcats'] and len(self.feed['category']['subcats']) > 0):
 
        handler.addQuickElement("itunes:category", '', {'text': self.feed['category']['name']})
 
    else:
 
        handler.startElement("itunes:category", { 'text': self.feed['category']['name']})
 
        handler.startElement("itunes:category", {'text': self.feed['category']['name']})
 
        for cc in self.feed['category']['subcats']:
 
            handler.addQuickElement("itunes:category", '', { 'text': cc })
 
            handler.addQuickElement("itunes:category", '', {'text': cc})
 
        handler.endElement("itunes:category")
 

	
 
    handler.addQuickElement("media:keywords", self.feed['keywords'].replace(" ", ","))
 
    
 

 
    handler.startElement("itunes:owner", {})
 
    handler.addQuickElement("itunes:email", self.feed['author_email'])
 
    handler.addQuickElement("itunes:name", self.feed['author_name'])
 
    handler.endElement("itunes:owner")
 
    
 

 
    handler.addQuickElement("itunes:summary", self.feed['description'])
 
    handler.addQuickElement("itunes:subtitle", self.feed['iTunesSubtitle'])
 
    
 

 
    handler.addQuickElement("itunes:author", self.feed['iTunesAuthor'])
 
    handler.addQuickElement('atom:link', '', { 'rel' : "self",  'href'  : self.feed['feed_url'],
 
                                                'type' : "application/rss+xml"})
 
    
 
    handler.addQuickElement('atom:link', '', {'rel': "self", 'href': self.feed['feed_url'],
 
                                              'type': "application/rss+xml"})
 

	
 
    years = {}
 
    for ii in self.items: years[ii['year']] = 1
 
    
 

 
    copyrightString = ""
 
    ll = years.keys()
...
 
@@ -136,8 +140,9 @@ def podcast_helper_add_root_elements(self, handler):
 
    for yy in ll: copyrightString += "%d, " % yy 
 
    copyrightString += "%s.  %s" % (self.feed['copyrightHolder'], self.feed['copyrightLicense'])
 
    
 

 
    handler.addQuickElement('copyright', copyrightString)
 
    handler.addQuickElement('media:copyright', "Copyright (C) " + copyrightString)
 
    
 

	
 

	
 
def podcast_helper_add_item_elements(self, handler, item):
 
    handler.addQuickElement("itunes:explicit", self.feed['iTunesExplicit'])
...
 
@@ -148,7 +153,7 @@ def podcast_helper_add_item_elements(self, handler, item):
 
    handler.addQuickElement("itunes:duration", item['duration'])
 
    if 'enclosure' in item:
 
        handler.addQuickElement('media:content', '', { 'url' : item['enclosure'].url,
 
                                                       'fileSize' : item['enclosure'].length,
 
                                                       'type' : item['enclosure'].mime_type})
 
        handler.addQuickElement('media:content', '', {'url': item['enclosure'].url,
 
                                                      'fileSize': item['enclosure'].length,
 
                                                      'type': item['enclosure'].mime_type})
 

	
 
# http://www.feedforall.com/itune-tutorial-tags.htm
...
 
@@ -211,5 +216,5 @@ class CastFeed(CastFeedBase):
 

	
 
    def item_categories(self, item):
 
        return  ('Technology',)
 
        return ('Technology',)
 

	
 
    def copyright_holder(self): return "Software Freedom Conservancy"
...
 
@@ -223,5 +228,5 @@ class CastFeed(CastFeedBase):
 
        return for_podcast_item_extra_kwargs(self, item)
 

	
 
# FIXME: 
 
# FIXME:
 
# GUEST NAME GOES HERE!!!
 
#<itunes:author>
...
 
@@ -237,4 +242,5 @@ class Mp3CastFeed(CastFeed):
 
        return item.mp3_length
 

	
 

	
 
class OggCastFeed(CastFeed):
 
    def item_enclosure_mime_type(self): return "audio/ogg"
...
 
@@ -244,4 +250,5 @@ class OggCastFeed(CastFeed):
 
        return item.ogg_length
 

	
 

	
 
feed_dict = {
 
    'cast-ogg': OggCastFeed,
...
 
@@ -253,4 +260,5 @@ for k, v in feed_dict.items():
 
    v.get_absolute_url = '/feeds/%s/' % k
 

	
 

	
 
def view(request):
 
    """Listing of all available feeds
conservancy/podjango/frontpage.py
Show inline comments
...
 
@@ -18,5 +18,5 @@
 
# "AGPLv3".  If not, see <http://www.gnu.org/licenses/>.
 

	
 
from datetime import datetime, timedelta
 
from datetime import datetime
 

	
 
from django.shortcuts import render
conservancy/podjango/models.py
Show inline comments
...
 
@@ -54,8 +54,10 @@ class Cast(models.Model):
 
    pub_date = models.DateTimeField()
 
    tags = models.ManyToManyField(CastTag, blank=True)
 
    ogg_path = models.CharField(max_length=300, blank=True,
 
                             help_text="Local filename of the Ogg file, relative to webroot.  File should be uploaded into the static media area for casts.")
 
    mp3_path = models.CharField(max_length=300, blank=True,
 
                             help_text="Local filename of the mp3 file, relative to webroot.  File should be uploaded into the static media area for casts.")
 
    ogg_path = models.CharField(
 
        max_length=300, blank=True,
 
        help_text="Local filename of the Ogg file, relative to webroot.  File should be uploaded into the static media area for casts.")
 
    mp3_path = models.CharField(
 
        max_length=300, blank=True,
 
        help_text="Local filename of the mp3 file, relative to webroot.  File should be uploaded into the static media area for casts.")
 
    ogg_length = models.IntegerField(blank=False, help_text="size in bytes of ogg file")
 
    mp3_length = models.IntegerField(blank=False, help_text="size in bytes of mp3 file")
conservancy/podjango/templatetags/date_within.py
Show inline comments
...
 
@@ -5,4 +5,5 @@ from django import template
 
register = template.Library()
 

	
 

	
 
@register.filter
 
def date_within_past_days(value, arg):
conservancy/podjango/urls.py
Show inline comments
...
 
@@ -18,8 +18,8 @@
 
# "AGPLv3".  If not, see <http://www.gnu.org/licenses/>.
 

	
 
import datetime
 

	
 
from django.conf import settings
 
from django.conf.urls import include, url
 
from django.contrib import admin
 
from django.contrib.syndication.views import Feed
 
from django.conf.urls import url
 
from django.views.generic.dates import (
 
    DateDetailView,
...
 
@@ -30,5 +30,5 @@ from django.views.generic.dates import (
 

	
 
from . import frontpage
 
from .feeds import Mp3CastFeed, OggCastFeed, feed_dict, view
 
from .feeds import Mp3CastFeed, OggCastFeed, view
 
from .models import Cast, CastTag
 
from .views import custom_index, query
...
 
@@ -61,4 +61,5 @@ if settings.DEBUG:
 
  urlpatterns += static('/', document_root='podjango/static')
 

	
 

	
 
def all_tags_by_use_amount():
 
    """Returns all tags with an added 'cnt' attribute (how many times used)
...
 
@@ -86,4 +87,5 @@ def all_tags_by_use_amount():
 
    return retval
 

	
 

	
 
# The functions are passed to the context uncalled so they will be
 
# called for each web request.  If we want to only make these database
conservancy/podjango/views.py
Show inline comments
...
 
@@ -22,7 +22,6 @@ from operator import or_
 

	
 
from django.shortcuts import get_object_or_404, render
 
from django.views.generic.list import ListView
 

	
 
from .models import Cast, CastTag
 
from .models import CastTag
 

	
 

	
...
 
@@ -32,7 +31,9 @@ def OR_filter(field_name, objs):
 
                  [Q(**{field_name: x.id}) for x in objs])
 

	
 

	
 
def last_name(person):
 
    return person.formal_name.rpartition(' ')[2]
 

	
 

	
 
def custom_index(request, queryset, *args, **kwargs):
 
    """Cast list view that allows scrolling and also shows an index by
...
 
@@ -76,4 +77,5 @@ def custom_index(request, queryset, *args, **kwargs):
 
    return render(request, 'podjango/cast/cast_list.html', {'object_list': queryset})
 

	
 

	
 
def query(request):
 
    """Page to query the cast based on and tags
...
 
@@ -83,13 +85,13 @@ def query(request):
 
        d = request.GET.copy()
 
        if 'authors' in d.getlist('all'):
 
            d.setlist('author', []) # remove author queries
 
            d.setlist('author', [])  # remove author queries
 
        if 'tags' in d.getlist('all'):
 
            d.setlist('tag', []) # remove tag queries
 
        d.setlist('all', []) # remove "all" from the query string
 
            d.setlist('tag', [])  # remove tag queries
 
        d.setlist('all', [])  # remove "all" from the query string
 

	
 
        base_url = '/cast/'
 
        if 'rss' in d:
 
            base_url = '/feeds/cast/'
 
            d.setlist('rss', []) # remove it
 
            d.setlist('rss', [])  # remove it
 

	
 
        query_string = d.urlencode()
...
 
@@ -101,4 +103,5 @@ def query(request):
 
        return render(request, 'podjango/cast/query.html', {'tags': tags})
 

	
 

	
 
def relative_redirect(request, path):
 
    from django import http
0 comments (0 inline, 0 general)