167 lines
6.3 KiB
Python
167 lines
6.3 KiB
Python
"""doab_check views
|
|
"""
|
|
|
|
from django.db.models import Count, F
|
|
from django.http import HttpResponseRedirect, JsonResponse, Http404
|
|
from django.shortcuts import get_object_or_404, render
|
|
from django.urls import reverse
|
|
from django.views import generic
|
|
from django.views.decorators.csrf import csrf_exempt
|
|
|
|
from .models import Item, Link
|
|
|
|
NOPUBNAME = '*** no publisher name ***'
|
|
class HomepageView(generic.TemplateView):
|
|
template_name = 'index.html'
|
|
|
|
def get_context_data(self, **kwargs):
|
|
active_links = Link.objects.filter(recent_check__isnull=False, live=True
|
|
).only('recent_check').order_by('-recent_check__return_code')
|
|
codes = active_links.values(
|
|
'recent_check__return_code').distinct()
|
|
num_checked = active_links.count()
|
|
items = Item.objects.filter(status=1)
|
|
num_items = items.count()
|
|
num_bad_items = active_links.exclude(recent_check__return_code=200).values('items'
|
|
).distinct().count()
|
|
|
|
for code in codes:
|
|
code['count'] = active_links.filter(
|
|
recent_check__return_code=code['recent_check__return_code'],
|
|
).count()
|
|
code['percent'] = '{:.2%}'.format(code['count'] / num_checked)
|
|
return {'num_checked': num_checked, 'codes': codes,
|
|
'num_items': num_items, 'num_bad_items': num_bad_items}
|
|
|
|
|
|
class ProblemsView(generic.TemplateView):
|
|
template_name = 'problems.html'
|
|
|
|
def get_context_data(self, **kwargs):
|
|
code = kwargs['code']
|
|
|
|
problems = Link.objects.exclude(recent_check__isnull=True
|
|
).filter(recent_check__return_code__exact=code, live=True
|
|
).order_by('provider').annotate(title=F('items__title'))
|
|
providers = problems.values('provider').distinct().annotate(Count('provider'))
|
|
for provider in providers:
|
|
provider['links'] = problems.filter(provider=provider['provider'])
|
|
#provider['count'] = provider['links'].count()
|
|
return {'code': code, 'providers': providers}
|
|
|
|
|
|
class ProvidersView(generic.TemplateView):
|
|
template_name = 'providers.html'
|
|
|
|
def get_context_data(self, **kwargs):
|
|
providers = Link.objects.order_by('provider').filter(live=True, recent_check__isnull=False,
|
|
).values('provider').distinct().annotate(Count('provider'))
|
|
return {'provider_list': providers}
|
|
|
|
|
|
class ProviderView(generic.TemplateView):
|
|
template_name = 'provider.html'
|
|
|
|
def get_context_data(self, **kwargs):
|
|
prov = kwargs['provider']
|
|
provider = {'provider': prov}
|
|
provider_links = Link.objects.filter(
|
|
provider=prov, live=True, recent_check__isnull=False
|
|
).annotate(title=F('items__title'))
|
|
provider['link_count'] = provider_links.count()
|
|
codes = provider_links.order_by('-recent_check__return_code').values(
|
|
'recent_check__return_code').distinct().annotate(Count('recent_check__return_code'))
|
|
for code in codes:
|
|
code['links'] = provider_links.filter(live=True,
|
|
recent_check__return_code=code['recent_check__return_code'],
|
|
).order_by('items__title')
|
|
code['links'] = code['links'][:1000]
|
|
|
|
return {'provider': provider,
|
|
'links': provider_links.order_by('-recent_check__return_code'),
|
|
'codes': codes}
|
|
|
|
class LinkView(generic.TemplateView):
|
|
template_name = 'link.html'
|
|
|
|
def get_context_data(self, **kwargs):
|
|
link_id = int(kwargs['link_id'])
|
|
link = get_object_or_404(Link, id=link_id)
|
|
|
|
return {'link': link}
|
|
|
|
|
|
class PublishersView(generic.TemplateView):
|
|
template_name = 'publishers.html'
|
|
|
|
def get_context_data(self, **kwargs):
|
|
items = Item.objects.filter(status=1)
|
|
publishers = items.order_by('publisher_name').values(
|
|
'publisher_name').distinct().annotate(Count('publisher_name'))
|
|
return {'publisher_list': publishers}
|
|
|
|
|
|
class ProblemPublishersView(generic.TemplateView):
|
|
template_name = 'probpubs.html'
|
|
|
|
def get_context_data(self, **kwargs):
|
|
problinks = Link.objects.filter(live=True, recent_check__isnull=False).exclude(
|
|
recent_check__return_code__exact=200)
|
|
pubnames = problinks.order_by('items__publisher_name').values(
|
|
'items__publisher_name').distinct().annotate(Count('items__publisher_name'))
|
|
return {'pubs': pubnames}
|
|
|
|
|
|
class PublisherView(generic.TemplateView):
|
|
template_name = 'publisherlinks.html'
|
|
|
|
def get_context_data(self, **kwargs):
|
|
pub = kwargs['publisher']
|
|
publisher = {'publisher': pub}
|
|
if pub == NOPUBNAME:
|
|
pub = ''
|
|
publisher_links = Link.objects.filter(
|
|
items__publisher_name=pub, live=True, recent_check__isnull=False
|
|
).annotate(title=F('items__title'))
|
|
link_count = publisher_links.distinct().count()
|
|
|
|
codes = publisher_links.order_by('-recent_check__return_code').values(
|
|
'recent_check__return_code').distinct().annotate(Count('recent_check__return_code'))
|
|
for code in codes:
|
|
code['links'] = publisher_links.filter(live=True,
|
|
recent_check__return_code=code['recent_check__return_code'],
|
|
).order_by('items__title')
|
|
|
|
return {'codes': codes, 'publisher': pub, 'count': link_count}
|
|
|
|
@csrf_exempt
|
|
def link_api_view(request, doab):
|
|
data = {'doab': doab}
|
|
if not doab.startswith('oai:doab-books:'):
|
|
if doab.startswith('20.500.12854'):
|
|
doab = 'oai:doab-books:' + doab
|
|
data['doab'] = doab
|
|
else:
|
|
data['status'] = 'invalid'
|
|
return JsonResponse(data)
|
|
item = Item.objects.get(doab=doab)
|
|
if not item:
|
|
data['status'] = 'not found'
|
|
return JsonResponse(data)
|
|
data['status'] = 'found'
|
|
links = []
|
|
data['links'] = links
|
|
for linkrel in item.related.filter(status=1):
|
|
link_dict = {'url': linkrel.link.url}
|
|
if linkrel.link.recent_check:
|
|
link_dict['checked'] = linkrel.link.recent_check.created
|
|
link_dict['return_code'] = linkrel.link.recent_check.return_code
|
|
link_dict['content_type'] = linkrel.link.recent_check.content_type
|
|
links.append(link_dict)
|
|
return JsonResponse(data)
|
|
|
|
|
|
|
|
|
|
|
|
|