Source code for language.views
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Mon Nov 5 14:31:14 2018
@author: Paolo Cozzi <cozzi@ibba.cnr.it>
"""
import logging
from django.urls import reverse_lazy
from django.shortcuts import get_object_or_404
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import ListView, UpdateView
from uid.models import DictCountry
from .models import SpecieSynonym
from .forms import SpecieSynonymForm
# Get an instance of a logger
logger = logging.getLogger(__name__)
[docs]class CountryMixin(object):
"""Read country label from request get (if present) and add to context"""
country = None
# perform a join while getting queryset
queryset = SpecieSynonym.objects.select_related("language", "dictspecie")
[docs] def get_queryset(self):
"""Read country if requested using GET method"""
# call super method
queryset = super(CountryMixin, self).get_queryset()
# get country or none from a get request
country = self.request.GET.get('country')
if country:
self.country = get_object_or_404(
DictCountry, label=country)
queryset = queryset.filter(language=self.country)
return queryset
[docs] def get_context_data(self, **kwargs):
"""Add a dictcountry object to a context"""
# Call the base implementation first to get a context
context = super(CountryMixin, self).get_context_data(**kwargs)
# Add my country attribute to context
context['country'] = self.country
return context
[docs]class ListSpeciesView(LoginRequiredMixin, CountryMixin, ListView):
model = SpecieSynonym
template_name = "language/speciesynonym_list.html"
paginate_by = 10
ordering = ['word']
[docs]class UpdateSpeciesView(LoginRequiredMixin, CountryMixin, UpdateView):
form_class = SpecieSynonymForm
template_name = "language/speciesynonym_form.html"
# https://stackoverflow.com/a/31275770/4385116
# You can't use reverse with success_url, because then reverse is
# called when the module is imported, before the urls have been loaded.
success_url = reverse_lazy("language:species")
[docs] def get_success_url(self):
"""Redirect to page if form is valid"""
success_url = self.success_url
if self.country:
success_url += "?country={country}".format(
country=self.country.label)
return success_url