from django.shortcuts import get_object_or_404, redirect from django.views.generic import TemplateView from django.http import Http404 from mainsite.models import Publication, PublicationYear, SiteConfiguration class HomeView(TemplateView): ''' Website's homepage ''' template_name = 'mainsite/homepage.html' class WriteArticleView(TemplateView): ''' Tell the readers how they can contribute to the BOcal ''' template_name = 'mainsite/write_article.html' class PublicationListView(TemplateView): ''' Display a list of publications (generic class). Reimplement `get_publications` (called with the url template args in a place where you can Http404) in subclasses to get it working. ''' template_name = 'mainsite/publications_list_view.html' def initView(self): ''' Cannot be __init__, we don't have **kwargs there ''' pass def get_context_data(self, **kwargs): self.initView(**kwargs) context = super(PublicationListView, self).get_context_data(**kwargs) context.update(self.additional_context(**kwargs)) publications = self.get_publications(**kwargs) if len(publications) == 0: raise Http404 context['publications'] = publications return context class YearView(PublicationListView): ''' Display a year worth of BOcals ''' def initView(self, year, nYear): try: year, nYear = int(year), int(nYear) except ValueError: raise Http404 if year + 1 != nYear: raise Http404 self.year = year self.pubYear = get_object_or_404(PublicationYear, startYear=year) def additional_context(self, year, nYear): return { 'intro_text': self.pubYear.descr, 'is_year_view': True, 'year_range': self.pubYear.prettyName, } def get_publications(self, year, nYear): return self.pubYear.publis() class SpecialPublicationsView(PublicationListView): ''' Display the list of special publications ''' def additional_context(self): siteConf = SiteConfiguration.get_solo() return { 'intro_text': siteConf.specialPublisDescr, 'is_year_view': False, 'list_title': "Numéros spéciaux", } def get_publications(self): publications = Publication.objects\ .filter(is_special=True)\ .order_by('-date') return publications def latestPublication(req): ''' Redirects to the latest standard publication ''' latestPubli = Publication.latest() return redirect(latestPubli.url)