diff -r f285333bc66d -r 478c7fc9a223 pytask/taskapp/views/textbook.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pytask/taskapp/views/textbook.py Tue Feb 01 02:14:28 2011 +0530 @@ -0,0 +1,339 @@ +"""Module containing the views for all the textbook project related activities. + +""" + +__authors__ = [ + '"Nishanth Amuluru" ', + '"Madhusudan.C.S" ', + ] + + +from datetime import datetime + +from django import shortcuts +from django import http +from django.contrib.auth.decorators import login_required +from django.contrib.auth.models import User +from django.core.context_processors import csrf +from django.core.urlresolvers import reverse +from django.template import RequestContext +from django.utils.translation import ugettext + +from tagging.managers import TaggedItem + +from pytask.helpers.exceptions import UnauthorizedAccess + +from pytask.profile import models as profile_models + +from pytask.taskapp import forms as taskapp_forms +from pytask.taskapp import models as taskapp_models + + +DONT_CLAIM_TASK_MSG = ugettext( + "Please don't submit any claims for the tasks until the workshop is " + "over. During the workshop we will introduce you to the work-flow of " + "this entire project. Also please be warned that the task claim work-" + "flow may change. So all the claims submitted before the workshop may " + "not be valid.") + +NO_EDIT_RIGHT = ugettext( + "You are not authorized to edit this page.") + + +@login_required +def create_textbook(request): + + user = request.user + profile = user.get_profile() + + if profile.role != profile_models.ROLES_CHOICES[3][0]: + can_create = True + else: + can_create= False + + if not can_create: + raise http.HttpResponseForbidden + + context = { + 'user': user, + 'profile': profile, + } + + context.update(csrf(request)) + + if request.method == 'POST': + form = taskapp_forms.CreateTextbookForm(request.POST) + if form.is_valid(): + data = form.cleaned_data.copy() + data.update({"created_by": user, + "creation_datetime": datetime.now()}) + del data['chapters'] + new_textbook = taskapp_models.TextBook(**data) + new_textbook.save() + + new_textbook.chapters = form.cleaned_data['chapters'] + + textbook_url = reverse( + 'view_textbook', kwargs={'task_id': new_textbook.id}) + return shortcuts.redirect(textbook_url) + else: + context.update({"form": form}) + return shortcuts.render_to_response( + "task/edit.html", RequestContext(request, context)) + else: + form = taskapp_forms.CreateTextbookForm() + context.update({"form": form}) + return shortcuts.render_to_response( + "task/edit.html", RequestContext(request, context)) + +def view_textbook(request, task_id, template='task/view_textbook.html'): + + # Shortcut to get_object_or_404 is not used since django-tagging + # api expects a queryset object for tag filtering. + task = taskapp_models.Task.objects.filter(pk=task_id) + + textbooks = TaggedItem.objects.get_by_model(task, ['Textbook']) + + if textbooks: + textbook = textbooks[0] + else: + raise http.Http404 + + chapters = textbook.children_tasks.all() + + user = request.user + + context = { + 'user': user, + 'textbook': textbook, + 'chapters': chapters, + } + + if not user.is_authenticated(): + return shortcuts.render_to_response(template, + RequestContext(request, context)) + + profile = user.get_profile() + + context.update({ + 'profile': profile, + 'textbook': textbook, + }) + + context.update(csrf(request)) + + user_role = user.get_profile().role + if ((user == textbook.created_by or + user_role != profile_models.ROLES_CHOICES[3][0]) and + textbook.status in [taskapp_models.TB_STATUS_CHOICES[0][0], + taskapp_models.TB_STATUS_CHOICES[1][0]]): + can_edit = True + can_create_chapters = True + else: + can_edit = False + can_create_chapters = False + + if (profile.role in [profile_models.ROLES_CHOICES[0][0], + profile_models.ROLES_CHOICES[1][0]] and + textbook.status == taskapp_models.TB_STATUS_CHOICES[0][0]): + can_approve = True + else: + can_approve = False + + context.update({ + 'can_edit': can_edit, + 'can_approve': can_approve, + 'can_create_chapters': can_create_chapters, + }) + return shortcuts.render_to_response(template, + RequestContext(request, context)) + +def browse_textbooks(request): + """View to list all the open textbooks. This view fetches tasks + tagged with Textbook. + """ + + user = request.user + + + # Get all the textbooks that are Open. + open_textbooks = taskapp_models.Task.objects.filter( + status=taskapp_models.TASK_STATUS_CHOICES[1][0]).order_by( + 'creation_datetime') + + + context = { + 'aero_textbooks': TaggedItem.objects.get_by_model( + open_textbooks, ['Textbook', 'Aerospace']), + 'chemical_textbooks': TaggedItem.objects.get_by_model( + open_textbooks, ['Textbook', 'Chemical']), + 'computerscience_textbooks': TaggedItem.objects.get_by_model( + open_textbooks, ['Textbook', 'ComputerScience']), + 'electrical_textbooks': TaggedItem.objects.get_by_model( + open_textbooks, ['Textbook', 'Electrical']), + 'engineeringphysics_textbooks': TaggedItem.objects.get_by_model( + open_textbooks, ['Textbook', 'EngineeringPhysics']), + 'mechanical_textbooks': TaggedItem.objects.get_by_model( + open_textbooks, ['Mechanical', 'Textbook']), + 'metallurgical_textbooks': TaggedItem.objects.get_by_model( + open_textbooks, ['Textbook', 'Metallurgical']), + } + + # Nothing + if user.is_authenticated() and (user.get_profile().role in + [profile_models.ROLES_CHOICES[0][0], profile_models.ROLES_CHOICES[1][0]]): + unpub_textbooks = taskapp_models.TextBook.objects.filter( + status=taskapp_models.TB_STATUS_CHOICES[0][0]) + + context.update({"unpub_textbooks": unpub_textbooks}) + + return shortcuts.render_to_response("task/browse_textbooks.html", + RequestContext(request, context)) + +@login_required +def edit_textbook(request, task_id): + + user = request.user + profile = user.get_profile() + + textbook = shortcuts.get_object_or_404(taskapp_models.Task, pk=task_id) + textbook_url = reverse( + 'view_textbook', kwargs={'task_id': textbook.id}) + + if ((user == textbook.created_by or + user.get_profile().role != profile_models.ROLES_CHOICES[3][0]) + and textbook.status in [taskapp_models.TASK_STATUS_CHOICES[0][0], + taskapp_models.TASK_STATUS_CHOICES[1][0]]): + can_edit = True + else: + can_edit = False + + if not can_edit: + raise UnauthorizedAccess(NO_EDIT_RIGHT) + + context = { + 'user': user, + 'profile': profile, + 'textbook': textbook, + } + + context.update(csrf(request)) + + if request.method == "POST": + form = taskapp_forms.EditTextbookForm(request.POST, instance=textbook) + if form.is_valid(): + form.save() + return shortcuts.redirect(textbook_url) + else: + context.update({"form": form}) + return shortcuts.render_to_response( + "task/edit.html", RequestContext(request, context)) + else: + form = taskapp_forms.EditTextbookForm(instance=textbook) + context.update({"form": form}) + return shortcuts.render_to_response("task/edit.html", + RequestContext(request, context)) + +@login_required +def create_chapter(request, book_id, template='task/chapter_edit.html'): + """View function to let Coordinators and TAs (Mentor in + PyTask terminology) create chapters out of textbooks. + + Args: + book_id: ID of the text book to which this chapter belongs to + """ + + user = request.user + profile = user.get_profile() + + if profile.role != profile_models.ROLES_CHOICES[3][0]: + can_create = True + else: + can_create= False + + if not can_create: + raise http.HttpResponseForbidden + + context = { + 'user': user, + 'profile': profile, + } + + context.update(csrf(request)) + + textbook = shortcuts.get_object_or_404(taskapp_models.Task, pk=book_id) + initial_tags = ', '.join([textbook.tags_field] + ['Chapter']) + + if request.method == 'POST': + form = taskapp_forms.CreateChapterForm(request.POST) + if form.is_valid(): + data = form.cleaned_data.copy() + + data.update({ + 'created_by': user, + 'creation_datetime': datetime.now(), + 'parent': textbook, + }) + + # TODO: remove hard coded default publish for chapters + data['status'] = 'Open' + new_chapter = taskapp_models.Task(**data) + new_chapter.save() + + textbook_url = reverse( + 'view_textbook', kwargs={'task_id': textbook.id}) + return shortcuts.redirect(textbook_url) + else: + context.update({"form": form}) + return shortcuts.render_to_response( + template, RequestContext(request, context)) + else: + form = taskapp_forms.CreateChapterForm( + initial={'tags_field': initial_tags}) + context.update({'form': form}) + return shortcuts.render_to_response( + template, RequestContext(request, context)) + +@login_required +def approve_textbook(request, task_id): + + user = request.user + profile = user.get_profile() + + textbook = shortcuts.get_object_or_404(taskapp_models.TextBook, pk=task_id) + + if profile.role not in [profile_models.ROLES_CHOICES[0][0], profile_models.ROLES_CHOICES[1][0]] or textbook.status != taskapp_models.TB_STATUS_CHOICES[0][0]: + raise http.Http404 + + context = {"user": user, + "profile": profile, + "textbook": textbook, + } + + return shortcuts.render_to_response( + "task/confirm_textbook_approval.html", + RequestContext(request, context)) + +@login_required +def approved_textbook(request, task_id): + + user = request.user + profile = user.get_profile() + + textbook = shortcuts.get_object_or_404(taskapp_models.TextBook, pk=task_id) + + if profile.role not in [profile_models.ROLES_CHOICES[0][0], profile_models.ROLES_CHOICES[1][0]] or textbook.status != taskapp_models.TB_STATUS_CHOICES[0][0]: + raise http.Http404 + + textbook.approved_by = user + textbook.approval_datetime = datetime.now() + textbook.status = taskapp_models.TB_STATUS_CHOICES[1][0] + textbook.save() + + context = {"user": user, + "profile": profile, + "textbook": textbook, + } + + return shortcuts.render_to_response( + "task/approved_textbook.html", RequestContext(request, context))