diff options
-rw-r--r-- | pytask/taskapp/urls.py | 4 | ||||
-rwxr-xr-x | pytask/taskapp/views/__init__.py | 6 | ||||
-rwxr-xr-x | pytask/taskapp/views/task.py (renamed from pytask/taskapp/views.py) | 307 | ||||
-rwxr-xr-x | pytask/taskapp/views/textbook.py | 339 |
4 files changed, 360 insertions, 296 deletions
diff --git a/pytask/taskapp/urls.py b/pytask/taskapp/urls.py index 5d63355..927a2fa 100644 --- a/pytask/taskapp/urls.py +++ b/pytask/taskapp/urls.py @@ -2,7 +2,7 @@ from django.conf.urls.defaults import patterns from django.conf.urls.defaults import url -urlpatterns = patterns('pytask.taskapp.views', +urlpatterns = patterns('pytask.taskapp.views.task', url(r'^create/$', 'create_task', name='create_task'), url(r'^edit/(?P<task_id>\d+)$', 'edit_task', name='edit_task'), url(r'^view/(?P<task_id>\d+)$', 'view_task', name='view_task'), @@ -24,7 +24,7 @@ urlpatterns = patterns('pytask.taskapp.views', ) # URL patterns specific to textbook projects. -urlpatterns += patterns('pytask.taskapp.views', +urlpatterns += patterns('pytask.taskapp.views.textbook', url(r'^textbook/create/$', 'create_textbook', name='create_textbook'), url(r'^textbook/view/(?P<task_id>\d+)$', 'view_textbook', diff --git a/pytask/taskapp/views/__init__.py b/pytask/taskapp/views/__init__.py new file mode 100755 index 0000000..fb15fc1 --- /dev/null +++ b/pytask/taskapp/views/__init__.py @@ -0,0 +1,6 @@ +"""Package containing the views related to tasks and textbooks. +""" + +__authors__ = [ + '"Madhusudan.C.S" <madhusudancs@fossee.in>', + ] diff --git a/pytask/taskapp/views.py b/pytask/taskapp/views/task.py index 6b30bf9..1a53cb2 100755 --- a/pytask/taskapp/views.py +++ b/pytask/taskapp/views/task.py @@ -1,3 +1,16 @@ +"""Module containing the views for all the task related activities. + +If there is something common to all other views. They sit here, here +even if there nothing relevant to tasks alone since task is the basis +for everything else. +""" + +__authors__ = [ + '"Nishanth Amuluru" <nishanth@fossee.in>', + '"Madhusudan.C.S" <madhusudancs@fossee.in>', + ] + + from datetime import datetime from django import shortcuts @@ -10,7 +23,6 @@ from django.template import RequestContext from django.utils import simplejson as json from django.utils.translation import ugettext -from tagging.managers import TaggedItem from tagging.models import Tag from pytask.views import show_msg @@ -486,255 +498,6 @@ def submit_report(request, task_id): 'task/submit_report.html', RequestContext(request, context)) @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.TextBook, pk=task_id) - textbook_url = reverse( - 'view_textbook', kwargs={'task_id': textbook.id}) - - can_edit = True if user == textbook.created_by and textbook.status == taskapp_models.TB_STATUS_CHOICES[0][0]\ - else False - - if not can_edit: - raise http.Http404 - - 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 claim_task(request, task_id): context = {} @@ -863,50 +626,6 @@ def select_user(request, task_id): else: raise http.Http404 -@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)) - def suggest_task_tags(request): """Returns the tags matching the query for the AJAXy autocomplete to get tags related to tasks. diff --git a/pytask/taskapp/views/textbook.py b/pytask/taskapp/views/textbook.py new file mode 100755 index 0000000..2aed142 --- /dev/null +++ b/pytask/taskapp/views/textbook.py @@ -0,0 +1,339 @@ +"""Module containing the views for all the textbook project related activities. + +""" + +__authors__ = [ + '"Nishanth Amuluru" <nishanth@fossee.in>', + '"Madhusudan.C.S" <madhusudancs@fossee.in>', + ] + + +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)) |