# Copyright 2010 Bradley M. Kuhn # Copyright 2005-2008 James Garrison # This software's license gives you freedom; you can copy, convey, # propagate, redistribute, modify and/or redistribute modified versions of # this program under the terms of the GNU Affero General Public License # (AGPL) as published by the Free Software Foundation (FSF), either # version 3 of the License, or (at your option) any later version of the # AGPL published by the FSF. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero # General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program in a file in the toplevel directory called # "AGPLv3". If not, see . import datetime from django.conf import settings from django.shortcuts import get_object_or_404 from django.urls import path from django.views.generic.dates import DateDetailView from . import frontpage from .feeds import Mp3CastFeed, OggCastFeed, view from .models import Cast, CastTag, Podcast from . import views app_name = 'podjango' extra_context = {} info_dict = { 'date_field': 'pub_date', 'extra_context': extra_context, } class PodcastDateDetailView(DateDetailView): date_field = 'pub_date' model = Cast def get(self, request, podcast_slug, *args, **kwargs): self.podcast = get_object_or_404(Podcast, slug=podcast_slug) return super().get(request, *args, **kwargs) def get_queryset(self): return super().get_queryset().filter(podcast=self.podcast) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['podcast'] = self.podcast return context urlpatterns = [ path('', views.podcasts, name='podcasts'), path('/', frontpage.view, name='cast-home'), path( '/////', PodcastDateDetailView.as_view( template_name='podjango/cast_detail.html', ), name='detail' ), path('/all/', views.custom_index, info_dict, name='cast'), path('/feeds/ogg/', OggCastFeed(), name='feed-ogg'), path('/feeds/mp3/', Mp3CastFeed(), name='feed-mp3'), path('/feeds/', view, name='feeds'), ] if settings.DEBUG: from django.conf.urls.static import static urlpatterns += static('/', document_root='podjango/static') def all_tags_by_use_amount(): """Returns all tags with an added 'cnt' attribute (how many times used) Also sorts the tags so most-used tags appear first. """ # tally use amount retval = [] current = None for obj in CastTag.objects.filter(cast__pub_date__lte=datetime.now(), cast__isnull=False).order_by('label'): if current is not None and obj.id == current.id: current.cnt += 1 else: if current is not None: retval.append(current) current = obj current.cnt = 1 if current is not None: retval.append(current) # sort and return retval.sort(key=lambda x: -x.cnt) 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 # queries a single time when a web server process begins, call both # functions below (i.e. make both lines below end in '()') extra_context['all_tags'] = all_tags_by_use_amount