2013-06-03 16:31:39 +00:00
|
|
|
from tastypie.models import ApiKey
|
|
|
|
|
2011-09-21 05:22:48 +00:00
|
|
|
from django.contrib import auth
|
2011-09-29 18:40:45 +00:00
|
|
|
from django.contrib.auth.models import User
|
2014-07-16 23:47:32 +00:00
|
|
|
from django.contrib.sites.models import Site
|
2015-08-03 22:39:26 +00:00
|
|
|
from django.core.urlresolvers import reverse
|
2011-09-14 15:38:29 +00:00
|
|
|
from django.db.models import Q
|
2013-06-03 16:31:39 +00:00
|
|
|
from django.shortcuts import render_to_response, get_object_or_404
|
|
|
|
from django.template import RequestContext
|
2014-07-16 23:47:32 +00:00
|
|
|
from django.views.generic.base import View, TemplateView
|
|
|
|
from django.http import (
|
|
|
|
HttpResponse,
|
2015-08-03 22:39:26 +00:00
|
|
|
HttpResponseNotFound,
|
|
|
|
HttpResponseRedirect,
|
2015-08-27 19:23:25 +00:00
|
|
|
Http404,
|
2014-07-16 23:47:32 +00:00
|
|
|
)
|
2011-09-14 15:38:29 +00:00
|
|
|
|
2011-12-20 04:26:55 +00:00
|
|
|
import regluit.core.isbn
|
2015-07-30 04:34:05 +00:00
|
|
|
from regluit.core.bookloader import load_from_yaml
|
2015-08-27 01:35:29 +00:00
|
|
|
from regluit.api import opds, onix
|
2015-08-04 16:02:06 +00:00
|
|
|
from regluit.api.models import repo_allowed
|
2011-12-20 04:26:55 +00:00
|
|
|
|
2013-06-03 16:31:39 +00:00
|
|
|
from regluit.core import models
|
2011-09-14 15:38:29 +00:00
|
|
|
|
|
|
|
def isbn(request,isbn):
|
2011-12-20 04:26:55 +00:00
|
|
|
if len(isbn)==10:
|
|
|
|
isbn=regluit.core.isbn.convert_10_to_13(isbn)
|
2012-01-10 20:20:02 +00:00
|
|
|
try:
|
|
|
|
edition = models.Identifier.objects.get( Q(type = 'isbn', value = isbn)).edition
|
|
|
|
editions = [edition]
|
|
|
|
except models.Identifier.DoesNotExist:
|
|
|
|
editions = []
|
2011-09-14 15:38:29 +00:00
|
|
|
return render_to_response('isbn.html',
|
|
|
|
{'isbn':isbn, 'editions':editions},
|
|
|
|
context_instance=RequestContext(request)
|
|
|
|
)
|
|
|
|
|
2011-09-14 17:31:16 +00:00
|
|
|
def editions(request):
|
|
|
|
editions = models.Edition.objects.all()
|
|
|
|
return render_to_response('editions.html',
|
|
|
|
{'editions':editions},
|
|
|
|
context_instance=RequestContext(request)
|
|
|
|
)
|
2011-09-21 05:22:48 +00:00
|
|
|
|
2015-08-03 22:39:26 +00:00
|
|
|
def negotiate_content(request,work_id):
|
|
|
|
if request.META.get('HTTP_ACCEPT', None):
|
|
|
|
if "opds-catalog" in request.META['HTTP_ACCEPT']:
|
|
|
|
return HttpResponseRedirect(reverse('opds_acqusition',args=['all'])+'?work='+work_id)
|
|
|
|
return HttpResponseRedirect(reverse('work', kwargs={'work_id': work_id}))
|
|
|
|
|
2011-09-21 05:22:48 +00:00
|
|
|
def widget(request,isbn):
|
|
|
|
"""
|
2015-02-18 18:09:43 +00:00
|
|
|
supply info for book panel. parameter is named isbn for historical reasons. can be isbn or work_id
|
2011-09-21 05:22:48 +00:00
|
|
|
"""
|
|
|
|
|
2014-04-23 23:41:43 +00:00
|
|
|
|
2011-12-20 04:26:55 +00:00
|
|
|
if len(isbn)==10:
|
2012-01-10 20:20:02 +00:00
|
|
|
isbn = regluit.core.isbn.convert_10_to_13(isbn)
|
2015-02-18 18:09:43 +00:00
|
|
|
if len(isbn)==13:
|
|
|
|
try:
|
|
|
|
identifier = models.Identifier.objects.get( Q( type = 'isbn', value = isbn ))
|
|
|
|
work = identifier.work
|
|
|
|
except models.Identifier.DoesNotExist:
|
|
|
|
return render_to_response('widget.html',
|
|
|
|
{ 'work':None,},
|
|
|
|
context_instance=RequestContext(request)
|
|
|
|
)
|
|
|
|
else:
|
|
|
|
work= models.safe_get_work(isbn)
|
2011-09-21 05:22:48 +00:00
|
|
|
return render_to_response('widget.html',
|
2015-02-18 18:09:43 +00:00
|
|
|
{'work':work, },
|
2011-09-21 05:22:48 +00:00
|
|
|
context_instance=RequestContext(request)
|
|
|
|
)
|
2011-10-20 00:08:17 +00:00
|
|
|
|
2015-07-30 04:34:05 +00:00
|
|
|
def load_yaml(request):
|
|
|
|
if request.method == "GET":
|
|
|
|
return render_to_response('load_yaml.html', { }, context_instance=RequestContext(request))
|
|
|
|
repo_url = request.POST.get('repo_url', None)
|
|
|
|
if not repo_url:
|
|
|
|
return HttpResponse('needs repo_url')
|
2015-08-04 16:02:06 +00:00
|
|
|
(allowed,reason) =repo_allowed(repo_url)
|
|
|
|
if not allowed:
|
|
|
|
return HttpResponse('repo_url not allowed: '+reason)
|
2015-07-30 04:34:05 +00:00
|
|
|
try:
|
|
|
|
work_id = load_from_yaml(repo_url)
|
|
|
|
return HttpResponseRedirect(reverse('work', args=[work_id]))
|
|
|
|
except:
|
|
|
|
return HttpResponse('unsuccessful')
|
|
|
|
|
2011-10-20 00:08:17 +00:00
|
|
|
class ApiHelpView(TemplateView):
|
|
|
|
template_name = "api_help.html"
|
|
|
|
def get_context_data(self, **kwargs):
|
|
|
|
context = super(ApiHelpView, self).get_context_data(**kwargs)
|
|
|
|
|
|
|
|
# base_url passed in to allow us to write absolute URLs for this site
|
|
|
|
base_url = self.request.build_absolute_uri("/")[:-1]
|
|
|
|
context["base_url"] = base_url
|
|
|
|
|
|
|
|
# if user is logged in, pass in the user's API key
|
|
|
|
u = auth.get_user(self.request)
|
|
|
|
if u.is_authenticated():
|
|
|
|
api_key = ApiKey.objects.filter(user=u)[0].key
|
|
|
|
context['api_key'] = api_key
|
|
|
|
|
|
|
|
# pass in a sample Campaign whose widget can be displayed
|
|
|
|
campaigns = models.Campaign.objects.all()
|
|
|
|
if len(campaigns):
|
|
|
|
c = campaigns[0]
|
2012-01-10 20:20:02 +00:00
|
|
|
isbn = c.work.first_isbn_13
|
2011-10-20 00:08:17 +00:00
|
|
|
context["campaign"] = campaigns[0]
|
|
|
|
context["campaign_isbn"] = isbn
|
|
|
|
|
|
|
|
return context
|
2014-07-16 23:47:32 +00:00
|
|
|
|
|
|
|
class OPDSNavigationView(TemplateView):
|
|
|
|
|
|
|
|
# http://stackoverflow.com/a/6867976: secret to how to change content-type
|
|
|
|
|
|
|
|
def render_to_response(self, context, **response_kwargs):
|
|
|
|
response_kwargs['content_type'] = "application/atom+xml;profile=opds-catalog;kind=navigation"
|
|
|
|
return super(TemplateView, self).render_to_response(context, **response_kwargs)
|
|
|
|
|
|
|
|
def get_context_data(self, **kwargs):
|
|
|
|
context = super(OPDSNavigationView, self).get_context_data(**kwargs)
|
2014-07-17 04:00:16 +00:00
|
|
|
context["feeds"] = opds.feeds()
|
2014-12-06 20:00:23 +00:00
|
|
|
context["feed"] = opds.get_facet_facet('all')
|
2014-07-16 23:47:32 +00:00
|
|
|
return context
|
|
|
|
|
|
|
|
class OPDSAcquisitionView(View):
|
|
|
|
|
|
|
|
def get(self, request, *args, **kwargs):
|
2015-08-03 22:39:26 +00:00
|
|
|
work = request.GET.get('work', None)
|
|
|
|
if work:
|
|
|
|
return HttpResponse(opds.opds_feed_for_work(work),
|
|
|
|
content_type="application/atom+xml;profile=opds-catalog;kind=acquisition")
|
2014-07-16 23:47:32 +00:00
|
|
|
facet = kwargs.get('facet')
|
2014-11-04 00:36:26 +00:00
|
|
|
page = request.GET.get('page', None)
|
2014-12-06 20:00:23 +00:00
|
|
|
order_by = request.GET.get('order_by', 'newest')
|
2014-11-04 00:36:26 +00:00
|
|
|
try:
|
|
|
|
page = int(page)
|
|
|
|
except:
|
|
|
|
page = None
|
2014-12-05 23:38:04 +00:00
|
|
|
facet_class = opds.get_facet_class(facet)()
|
2014-12-06 20:00:23 +00:00
|
|
|
return HttpResponse(facet_class.feed(page,order_by),
|
2014-07-16 23:47:32 +00:00
|
|
|
content_type="application/atom+xml;profile=opds-catalog;kind=acquisition")
|
2015-08-27 01:35:29 +00:00
|
|
|
|
|
|
|
|
|
|
|
class OnixView(View):
|
|
|
|
|
|
|
|
def get(self, request, *args, **kwargs):
|
2015-08-27 19:23:25 +00:00
|
|
|
facet = kwargs.get('facet', None)
|
|
|
|
if facet:
|
|
|
|
max = request.GET.get('max', 100)
|
|
|
|
try:
|
|
|
|
max = int(max)
|
|
|
|
except:
|
|
|
|
max = None
|
|
|
|
facet_class = opds.get_facet_class(facet)()
|
|
|
|
return HttpResponse(onix.onix_feed(facet_class, max),
|
|
|
|
content_type="text/xml")
|
2015-08-27 01:35:29 +00:00
|
|
|
work = request.GET.get('work', None)
|
|
|
|
if work:
|
2015-08-27 19:23:25 +00:00
|
|
|
try:
|
|
|
|
work=models.safe_get_work(work)
|
|
|
|
except models.Work.DoesNotExist:
|
|
|
|
raise Http404
|
2015-08-27 01:35:29 +00:00
|
|
|
return HttpResponse(onix.onix_feed_for_work(work),
|
|
|
|
content_type="text/xml")
|
2015-08-27 19:23:25 +00:00
|
|
|
raise Http404
|