Source code for annotations.views.project_views

"""
Provides project (:class:`.TextCollection`) -related views.
"""

from django.shortcuts import get_object_or_404
from django.contrib.auth.decorators import login_required
from django.core.urlresolvers import reverse
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.core.exceptions import PermissionDenied
from django.http import HttpResponse, HttpResponseRedirect
from django.template import RequestContext, loader
from django.contrib.auth import login, authenticate
from django.conf import settings
from django.db.models import Q, Count

from annotations.models import TextCollection
from annotations.forms import ProjectForm


[docs]def view_project(request, project_id): """ Shows details about a specific project owned by the current user. Parameters ---------- request : `django.http.requests.HttpRequest` project_id : int Returns ---------- :class:`django.http.response.HttpResponse` """ project = get_object_or_404(TextCollection, pk=project_id) template = loader.get_template('annotations/project_details.html') order_by = request.GET.get('order_by', 'title') texts = project.texts.all().order_by(order_by)\ .values('id', 'title', 'created') paginator = Paginator(texts, 15) page = request.GET.get('page') try: texts = paginator.page(page) except PageNotAnInteger: # If page is not an integer, deliver first page. texts = paginator.page(1) except EmptyPage: # If page is out of range (e.g. 9999), deliver last page of results. texts = paginator.page(paginator.num_pages) context = RequestContext(request, { 'user': request.user, 'title': project.name, 'project': project, 'texts': texts, }) return HttpResponse(template.render(context))
@login_required
[docs]def edit_project(request, project_id): """ Allow the owner of a project to edit it. Parameters ---------- project_id : int request : `django.http.requests.HttpRequest` Returns ---------- :class:`django.http.response.HttpResponse` """ template = loader.get_template('annotations/project_change.html') project = get_object_or_404(TextCollection, pk=project_id) if project.ownedBy.id != request.user.id: raise PermissionDenied("Whoops, you're not supposed to be here!") if request.method == 'POST': form = ProjectForm(request.POST, instance=project) if form.is_valid(): form.save() redirect_target = reverse('view_project', args=(project.id,)) return HttpResponseRedirect(redirect_target) else: print form.errors else: form = ProjectForm(instance=project) context = RequestContext(request, { 'user': request.user, 'title': 'Editing project: %s' % project.name, 'project': project, 'form': form, 'page_title': 'Edit project' }) return HttpResponse(template.render(context))
@login_required
[docs]def create_project(request): """ Create a new project owned by the current (logged-in) user. Parameters ---------- request : `django.http.requests.HttpRequest` Returns ---------- :class:`django.http.response.HttpResponse` """ template = loader.get_template('annotations/project_change.html') if request.method == 'POST': form = ProjectForm(request.POST) if form.is_valid(): project = form.save(commit=False) project.ownedBy = request.user project.save() redirect_target = reverse('view_project', args=(project.id,)) return HttpResponseRedirect(redirect_target) else: print form.errors else: form = ProjectForm() context = RequestContext(request, { 'user': request.user, 'title': 'Create a new project', 'form': form, 'page_title': 'Create a new project' }) return HttpResponse(template.render(context))
[docs]def list_projects(request): """ All known projects. Parameters ---------- project_id : int request : `django.http.requests.HttpRequest` Returns ---------- :class:`django.http.response.HttpResponse` """ fields = [ 'id', 'name', 'created', 'ownedBy__id', 'ownedBy__username', 'description', 'num_texts', 'num_relations', ] qs = TextCollection.objects.all() qs = qs.annotate(num_texts=Count('texts'), num_relations=Count('texts__relationsets')) qs = qs.values(*fields) template = loader.get_template('annotations/project_list.html') context = RequestContext(request, { 'user': request.user, 'title': 'Projects', 'projects': qs, }) return HttpResponse(template.render(context))