"""
Provides views related to external repositories.
"""
from django.contrib.auth.decorators import login_required
from django.core.urlresolvers import reverse
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import get_object_or_404
from django.template import RequestContext, loader
from annotations.forms import RepositorySearchForm
from annotations.tasks import tokenize
from repository.models import Repository
@login_required
[docs]def repository_collections(request, repository_id):
    template = loader.get_template('annotations/repository_collections.html')
    repository = get_object_or_404(Repository, pk=repository_id)
    context = RequestContext(request, {
        'user': request.user,
        'repository': repository,
        'title': 'Browse collections in %s' % repository.name,
    })
    return HttpResponse(template.render(context)) 
@login_required
[docs]def repository_collection(request, repository_id, collection_id):
    template = loader.get_template('annotations/repository_collection.html')
    repository = get_object_or_404(Repository, pk=repository_id)
    collection = repository.collection(id=collection_id)
    context = RequestContext(request, {
        'user': request.user,
        'repository': repository,
        'collection': collection,
        'title': 'Browse collections in %s' % repository.name,
    })
    return HttpResponse(template.render(context)) 
@login_required
[docs]def repository_browse(request, repository_id):
    template = loader.get_template('annotations/repository_browse.html')
    repository = get_object_or_404(Repository, pk=repository_id)
    context = RequestContext(request, {
        'user': request.user,
        'repository': repository,
        'title': 'Browse repository %s' % repository.name,
    })
    return HttpResponse(template.render(context)) 
@login_required
[docs]def repository_search(request, repository_id):
    template = loader.get_template('annotations/repository_search.html')
    repository = get_object_or_404(Repository, pk=repository_id)
    query = request.GET.get('query', None)
    if query:
        results = repository.search(search=query)
        form = RepositorySearchForm({'query': query})
    else:
        results = None
        form = RepositorySearchForm()
    context = RequestContext(request, {
        'user': request.user,
        'repository': repository,
        'title': 'Browse repository %s' % repository.name,
        'form': form,
        'results': results,
        'query': query,
    })
    return HttpResponse(template.render(context)) 
@login_required
[docs]def repository_details(request, repository_id):
    template = loader.get_template('annotations/repository_details.html')
    repository = get_object_or_404(Repository, pk=repository_id)
    context = RequestContext(request, {
        'user': request.user,
        'repository': repository,
        'title': 'Repository details: %s' % repository.name,
    })
    return HttpResponse(template.render(context)) 
@login_required
[docs]def repository_list(request):
    template = loader.get_template('annotations/repository_list.html')
    repositories = Repository.objects.all()
    context = RequestContext(request, {
        'user': request.user,
        'repositories': repositories,
        'title': 'Repositories',
    })
    return HttpResponse(template.render(context)) 
@login_required
[docs]def repository_text(request, repository_id, text_id):
    template = loader.get_template('annotations/repository_text_details.html')
    repository = get_object_or_404(Repository, pk=repository_id)
    result = repository.read(id=int(text_id))
    context = RequestContext(request, {
        'user': request.user,
        'repository': repository,
        'result': result,
        'title': 'Text: %s' % result.data['title'].value,
    })
    return HttpResponse(template.render(context)) 
@login_required
[docs]def repository_text_content(request, repository_id, text_id, content_id):
    repository = get_object_or_404(Repository, pk=repository_id)
    result = repository.read(id=int(text_id))
    content = result.content.contents.get(int(content_id))    # Not a dict.
    content_type = content.data.get('content_type', None)
    if content_type and content_type.value == 'text/plain':
        content_response = requests.get(content.data['content_location'].value)
        tokenizedContent = tokenize(content_response.text)
    else:
        return _repository_text_fail(request, repository, result, content)
    defaults = {
        'title': getattr(result.get('title'), 'value', None),
        'created': getattr(result.get('created'), 'value', None),
        #'source': repository,
        'tokenizedContent': tokenizedContent,
        'addedBy': request.user,
        'originalResource': getattr(result.get('url'), 'value', None),
    }
    text, _ = Text.objects.get_or_create(uri=result.uri.value, defaults=defaults)
    return HttpResponseRedirect(reverse('text', args=(text.id,))) 
def _repository_text_fail(request, repository, result, content):
    template = loader.get_template('annotations/repository_text_fail.html')
    context = RequestContext(request, {
        'user': request.user,
        'repository': repository,
        'result': result,
        'content': content,
        'title': 'Whoops!',
        'content_type': content.data.get('content_type', None),
    })
    return HttpResponse(template.render(context))