pytask/taskapp/views.py
changeset 422 4bb891fc7a54
parent 408 0c12181e2c02
child 425 e15749fab2e4
equal deleted inserted replaced
421:89a61c582f39 422:4bb891fc7a54
     1 from datetime import datetime
     1 from datetime import datetime
     2 
     2 
       
     3 from django import shortcuts
     3 from django.http import Http404
     4 from django.http import Http404
     4 from django.contrib.auth.decorators import login_required
     5 from django.contrib.auth.decorators import login_required
     5 from django.contrib.auth.models import User
     6 from django.contrib.auth.models import User
     6 from django.core.context_processors import csrf
     7 from django.core.context_processors import csrf
     7 from django.core.urlresolvers import reverse
     8 from django.core.urlresolvers import reverse
     8 from django.shortcuts import redirect
       
     9 from django.shortcuts import render_to_response
       
    10 
       
    11 from pytask.taskapp.forms import ChoiceForm
       
    12 from pytask.taskapp.forms import ClaimTaskForm
       
    13 from pytask.taskapp.forms import CreateTaskForm
       
    14 from pytask.taskapp.forms import CreateTextbookForm
       
    15 from pytask.taskapp.forms import EditTaskForm
       
    16 from pytask.taskapp.forms import EditTextbookForm
       
    17 from pytask.taskapp.forms import TaskCommentForm
       
    18 from pytask.taskapp.forms import WorkReportForm
       
    19 from pytask.taskapp.models import Task
       
    20 from pytask.taskapp.models import TaskComment
       
    21 from pytask.taskapp.models import TaskClaim
       
    22 from pytask.taskapp.models import TextBook
       
    23 from pytask.taskapp.models import WorkReport
       
    24 from pytask.taskapp.utils import getTask
       
    25 from pytask.taskapp.utils import getTextBook
       
    26 
     9 
    27 from pytask.views import show_msg
    10 from pytask.views import show_msg
       
    11 
       
    12 from pytask.taskapp import forms as taskapp_forms
       
    13 from pytask.taskapp import models as taskapp_models
    28 
    14 
    29 
    15 
    30 @login_required
    16 @login_required
    31 def create_task(request):
    17 def create_task(request):
    32 
    18 
    40     context.update(csrf(request))
    26     context.update(csrf(request))
    41 
    27 
    42     can_create_task = False if profile.rights == "CT" else True
    28     can_create_task = False if profile.rights == "CT" else True
    43     if can_create_task:
    29     if can_create_task:
    44         if request.method == "POST":
    30         if request.method == "POST":
    45             form = CreateTaskForm(request.POST)
    31             form = taskapp_forms.CreateTaskForm(request.POST)
    46             if form.is_valid():
    32             if form.is_valid():
    47                 data = form.cleaned_data.copy()
    33                 data = form.cleaned_data.copy()
    48                 data.update({"created_by": user,
    34                 data.update({"created_by": user,
    49                              "creation_datetime": datetime.now(),
    35                              "creation_datetime": datetime.now(),
    50                              "uniq_key": make_key(Task),
       
    51                             })
    36                             })
    52 
    37 
    53                 task = Task(**data)
    38                 task = taskapp_models.Task(**data)
    54                 task.save()
    39                 task.save()
    55 
    40 
    56                 task_url = reverse('view_task', kwargs={'task_id': task.id})
    41                 task_url = reverse('view_task', kwargs={'task_id': task.id})
    57                 return redirect(task_url)
    42                 return shortcuts.redirect(task_url)
    58             else:
    43             else:
    59                 context.update({'form':form})
    44                 context.update({'form':form})
    60                 return render_to_response('task/create.html', context)
    45                 return shortcuts.render_to_response(
    61         else:
    46                   'task/create.html', context)
    62             form = CreateTaskForm()
    47         else:
       
    48             form = taskapp_forms.CreateTaskForm()
    63             context.update({'form':form})
    49             context.update({'form':form})
    64             return render_to_response('task/create.html', context)
    50             return shortcuts.render_to_response('task/create.html', context)
    65     else:
    51     else:
    66         return show_msg(user, 'You are not authorised to create a task.')
    52         return show_msg(user, 'You are not authorised to create a task.')
    67 
    53 
    68 def browse_tasks(request):
    54 def browse_tasks(request):
    69 
    55 
    70     open_tasks = Task.objects.filter(status="OP")
    56     open_tasks = taskapp_models.Task.objects.filter(status="OP")
    71     working_tasks = Task.objects.filter(status="WR")
    57     working_tasks = taskapp_models.Task.objects.filter(status="WR")
    72     comp_tasks = Task.objects.filter(status="CM")
    58     comp_tasks = taskapp_models.Task.objects.filter(status="CM")
    73 
    59 
    74     context = {"open_tasks": open_tasks,
    60     context = {"open_tasks": open_tasks,
    75                "working_tasks": working_tasks,
    61                "working_tasks": working_tasks,
    76                "comp_tasks": comp_tasks,
    62                "comp_tasks": comp_tasks,
    77               }
    63               }
    78 
    64 
    79     user = request.user
    65     user = request.user
    80     if not user.is_authenticated():
    66     if not user.is_authenticated():
    81         return render_to_response("task/browse.html")
    67         return shortcuts.render_to_response("task/browse.html")
    82 
    68 
    83     profile = user.get_profile()
    69     profile = user.get_profile()
    84 
    70 
    85     can_approve = True if profile.rights in ["MG", "DC"] else False
    71     can_approve = True if profile.rights in ["MG", "DC"] else False
    86     unpub_tasks = Task.objects.filter(status="UP").exclude(status="DL")
    72     unpub_tasks = taskapp_models.Task.objects.filter(status="UP").exclude(status="DL")
    87     if can_approve:
    73     if can_approve:
    88         context.update({"unpub_tasks": unpub_tasks})
    74         context.update({"unpub_tasks": unpub_tasks})
    89 
    75 
    90     context.update({"user": user,
    76     context.update({"user": user,
    91                     "profile": profile,
    77                     "profile": profile,
    92                    })
    78                    })
    93 
    79 
    94     return render_to_response("task/browse.html", context)
    80     return shortcuts.render_to_response("task/browse.html", context)
    95 
    81 
    96 
    82 
    97 def view_task(request, task_id):
    83 def view_task(request, task_id):
    98     """ get the task depending on its task_id and display accordingly if it is a get.
    84     """ get the task depending on its task_id and display accordingly if it is a get.
    99     check for authentication and add a comment if it is a post request.
    85     check for authentication and add a comment if it is a post request.
   100     """
    86     """
   101 
    87 
   102     task_url = reverse('view_task', kwargs={'task_id': task_id})
    88     task_url = reverse('view_task', kwargs={'task_id': task_id})
   103     task = getTask(task_id)
    89     task = shortcuts.get_object_or_404(taskapp_models.Task, pk=task_id)
   104 
    90 
   105     user = request.user
    91     user = request.user
   106 
    92 
   107     if not user.is_authenticated():
    93     if not user.is_authenticated():
   108         return render_to_response("task/view.html", {"task": task})
    94         return shortcuts.render_to_response("task/view.html", {"task": task})
   109 
    95 
   110     profile = user.get_profile()
    96     profile = user.get_profile()
   111 
    97 
   112     context = {"user": user,
    98     context = {"user": user,
   113                "profile": profile,
    99                "profile": profile,
   134     context.update({'is_reviewer':is_reviewer,
   120     context.update({'is_reviewer':is_reviewer,
   135                     'comments':comments,
   121                     'comments':comments,
   136                     'reviewers':reviewers,
   122                     'reviewers':reviewers,
   137                    })
   123                    })
   138 
   124 
   139     claimed_users = task.claimed_users.all()
       
   140     selected_users = task.selected_users.all()
   125     selected_users = task.selected_users.all()
   141 
   126 
   142     is_creator = True if user == task.created_by else False
   127     is_creator = True if user == task.created_by else False
   143     has_claimed = True if user in claimed_users else False
       
   144 
   128 
   145     context['selected_users'] = selected_users
   129     context['selected_users'] = selected_users
   146     context['is_selected'] = True if user in selected_users else False
   130     context['is_selected'] = True if user in selected_users else False
   147     context['can_approve'] = True if task.status == "UP" and\
   131     context['can_approve'] = True if task.status == "UP" and\
   148                                      profile.rights in ["MG", "DC"]\
   132                                      profile.rights in ["MG", "DC"]\
   159 
   143 
   160     context['can_mod_reviewers'] = True if profile.rights in ["MG", "DC"] else\
   144     context['can_mod_reviewers'] = True if profile.rights in ["MG", "DC"] else\
   161                                    False
   145                                    False
   162 
   146 
   163     if request.method == 'POST':
   147     if request.method == 'POST':
   164         form = TaskCommentForm(request.POST)
   148         form = taskapp_forms.TaskCommentForm(request.POST)
   165         if form.is_valid():
   149         if form.is_valid():
   166             data = form.cleaned_data['data']
   150             data = form.cleaned_data['data']
   167             new_comment = TaskComment(task=task, data=data,
   151             new_comment = taskapp_forms.TaskComment(
   168                                       uniq_key=make_key(TaskComment),
   152               task=task, data=data, commented_by=user,
   169                                       commented_by=user, comment_datetime=datetime.now())
   153               comment_datetime=datetime.now())
   170             new_comment.save()
   154             new_comment.save()
   171             return redirect(task_url)
   155             return shortcuts.redirect(task_url)
   172         else:
   156         else:
   173             context['form'] = form
   157             context['form'] = form
   174             return render_to_response('task/view.html', context)
   158             return shortcuts.render_to_response('task/view.html', context)
   175     else:
   159     else:
   176         form = TaskCommentForm()
   160         form = taskapp_forms.TaskCommentForm()
   177         context['form'] = form
   161         context['form'] = form
   178         return render_to_response('task/view.html', context)
   162         return shortcuts.render_to_response('task/view.html', context)
   179 
   163 
   180 @login_required
   164 @login_required
   181 def edit_task(request, task_id):
   165 def edit_task(request, task_id):
   182     """ only creator gets to edit the task and that too only before it gets
   166     """ only creator gets to edit the task and that too only before it gets
   183     approved.
   167     approved.
   185 
   169 
   186     user = request.user
   170     user = request.user
   187     profile = user.get_profile()
   171     profile = user.get_profile()
   188 
   172 
   189     task_url = reverse('view_task', kwargs={'task_id': task_id})
   173     task_url = reverse('view_task', kwargs={'task_id': task_id})
   190     task = getTask(task_id)
   174     task = shortcuts.get_object_or_404(taskapp_models.Task, pk=task_id)
   191 
   175 
   192     is_creator = True if user == task.created_by else False
   176     is_creator = True if user == task.created_by else False
   193     can_edit = True if task.status == "UP" and is_creator else False
   177     can_edit = True if task.status == "UP" and is_creator else False
   194     if not can_edit:
   178     if not can_edit:
   195         raise Http404
   179         raise Http404
   200               }
   184               }
   201 
   185 
   202     context.update(csrf(request))
   186     context.update(csrf(request))
   203 
   187 
   204     if request.method == "POST":
   188     if request.method == "POST":
   205         form = EditTaskForm(request.POST, instance=task)
   189         form = taskapp_forms.EditTaskForm(request.POST, instance=task)
   206         if form.is_valid():
   190         if form.is_valid():
   207             form.save()
   191             form.save()
   208             return redirect(task_url)
   192             return shortcuts.redirect(task_url)
   209         else:
   193         else:
   210             context.update({"form": form})
   194             context.update({"form": form})
   211             return render_to_response("task/edit.html", context)
   195             return shortcuts.render_to_response("task/edit.html", context)
   212     else:
   196     else:
   213         form = EditTaskForm(instance=task)
   197         form = taskapp_forms.EditTaskForm(instance=task)
   214         context.update({"form": form})
   198         context.update({"form": form})
   215         return render_to_response("task/edit.html", context)
   199         return shortcuts.render_to_response("task/edit.html", context)
   216 
   200 
   217 @login_required
   201 @login_required
   218 def approve_task(request, task_id):
   202 def approve_task(request, task_id):
   219 
   203 
   220     user = request.user
   204     user = request.user
   221     profile = user.get_profile()
   205     profile = user.get_profile()
   222 
   206 
   223     task = getTask(task_id)
   207     task = shortcuts.get_object_or_404(taskapp_models.Task, pk=task_id)
   224 
   208 
   225     if profile.rights not in ["MG", "DC"] or task.status != "UP":
   209     if profile.rights not in ["MG", "DC"] or task.status != "UP":
   226         raise Http404
   210         raise Http404
   227 
   211 
   228     context = {"user": user,
   212     context = {"user": user,
   229                "profile": profile,
   213                "profile": profile,
   230                "task": task,
   214                "task": task,
   231               }
   215               }
   232 
   216 
   233     return render_to_response("task/confirm_approval.html", context)
   217     return shortcuts.render_to_response("task/confirm_approval.html", context)
   234 
   218 
   235 @login_required
   219 @login_required
   236 def approved_task(request, task_id):
   220 def approved_task(request, task_id):
   237 
   221 
   238     user = request.user
   222     user = request.user
   239     profile = user.get_profile()
   223     profile = user.get_profile()
   240 
   224 
   241     task = getTask(task_id)
   225     task = shortcuts.get_object_or_404(taskapp_models.Task, pk=task_id)
   242 
   226 
   243     if profile.rights not in ["MG", "DC"] or task.status != "UP":
   227     if profile.rights not in ["MG", "DC"] or task.status != "UP":
   244         raise Http404
   228         raise Http404
   245 
   229 
   246     task.approved_by = user
   230     task.approved_by = user
   251     context = {"user": user,
   235     context = {"user": user,
   252                "profile": profile,
   236                "profile": profile,
   253                "task": task,
   237                "task": task,
   254               }
   238               }
   255 
   239 
   256     return render_to_response("task/approved_task.html", context)
   240     return shortcuts.render_to_response("task/approved_task.html", context)
   257 
   241 
   258 @login_required
   242 @login_required
   259 def addreviewer(request, task_id):
   243 def addreviewer(request, task_id):
   260 
   244 
   261     user = request.user
   245     user = request.user
   262     profile = user.get_profile()
   246     profile = user.get_profile()
   263 
   247 
   264     task_url = reverse('view_task', kwargs={'task_id': task_id})
   248     task_url = reverse('view_task', kwargs={'task_id': task_id})
   265     task = getTask(task_id)
   249     task = shortcuts.get_object_or_404(taskapp_models.Task, pk=task_id)
   266 
   250 
   267     can_mod_reviewers = True if profile.rights in ["MG", "DC"] else False
   251     can_mod_reviewers = True if profile.rights in ["MG", "DC"] else False
   268     if not can_mod_reviewers:
   252     if not can_mod_reviewers:
   269         raise Http404
   253         raise Http404
   270 
   254 
   276     context.update(csrf(request))
   260     context.update(csrf(request))
   277 
   261 
   278 
   262 
   279     # This part has to be made better
   263     # This part has to be made better
   280     reviewer_choices = User.objects.filter(is_active=True).\
   264     reviewer_choices = User.objects.filter(is_active=True).\
   281                                            exclude(reviewing_tasks__uniq_key=task_id).\
   265                                            exclude(reviewing_tasks__id=task_id).\
   282                                            exclude(claimed_tasks__uniq_key=task_id).\
   266                                            exclude(claimed_tasks__id=task_id).\
   283                                            exclude(selected_tasks__uniq_key=task_id).\
   267                                            exclude(selected_tasks__id=task_id).\
   284                                            exclude(created_tasks__uniq_key=task_id)
   268                                            exclude(created_tasks__id=task_id)
   285 
   269 
   286     choices = ((a_user.id,a_user.username) for a_user in reviewer_choices)
   270     choices = ((a_user.id,a_user.username) for a_user in reviewer_choices)
   287     label = "Reviewer"
   271     label = "Reviewer"
   288 
   272 
   289     if request.method == "POST":
   273     if request.method == "POST":
   290         form = ChoiceForm(choices, data=request.POST, label=label)
   274         form = taskapp_forms.ChoiceForm(choices, data=request.POST, label=label)
   291         if form.is_valid():
   275         if form.is_valid():
   292             data = form.cleaned_data.copy()
   276             data = form.cleaned_data.copy()
   293             uid = data['choice']
   277             uid = data['choice']
   294             reviewer = User.objects.get(id=uid)
   278             reviewer = User.objects.get(id=uid)
   295 
   279 
   296             task.reviewers.add(reviewer)
   280             task.reviewers.add(reviewer)
   297             return redirect(task_url)
   281             return shortcuts.redirect(task_url)
   298         else:
   282         else:
   299             context.update({"form": form})
   283             context.update({"form": form})
   300             return render_to_response("task/addreviewer.html", context)
   284             return shortcuts.render_to_response("task/addreviewer.html", context)
   301     else:
   285     else:
   302         form = ChoiceForm(choices, label=label)
   286         form = taskapp_forms.ChoiceForm(choices, label=label)
   303         context.update({"form": form})
   287         context.update({"form": form})
   304         return render_to_response("task/addreviewer.html", context)
   288         return shortcuts.render_to_response("task/addreviewer.html", context)
   305 
   289 
   306 def view_work(request, task_id):
   290 def view_work(request, task_id):
   307 
   291 
   308     task = getTask(task_id)
   292     task = shortcuts.get_object_or_404(taskapp_models.Task, pk=task_id)
   309 
   293 
   310     user = request.user
   294     user = request.user
   311     old_reports = task.reports.all()
   295     old_reports = task.reports.all()
   312 
   296 
   313     context = {"task": task,
   297     context = {"task": task,
   314                "old_reports": old_reports,
   298                "old_reports": old_reports,
   315               }
   299               }
   316 
   300 
   317     if not user.is_authenticated():
   301     if not user.is_authenticated():
   318         return render_to_response("task/view_work.html", context)
   302         return shortcuts.render_to_response("task/view_work.html", context)
   319 
   303 
   320     profile = user.get_profile()
   304     profile = user.get_profile()
   321 
   305 
   322     context.update({"user": user,
   306     context.update({"user": user,
   323                     "profile": profile,
   307                     "profile": profile,
   328     working_users = task.selected_users.all()
   312     working_users = task.selected_users.all()
   329     is_working = True if user in working_users else False
   313     is_working = True if user in working_users else False
   330 
   314 
   331     context.update({"is_working": is_working})
   315     context.update({"is_working": is_working})
   332 
   316 
   333     return render_to_response("task/view_work.html", context)
   317     return shortcuts.render_to_response("task/view_work.html", context)
   334 
   318 
   335 @login_required
   319 @login_required
   336 def view_report(request, report_id):
   320 def view_report(request, report_id):
   337 
   321 
   338     try:
   322     try:
   339         report = WorkReport.objects.get(uniq_key=report_id)
   323         report = taskapp_models.WorkReport.objects.get(pk=report_id)
   340     except WorkReport.DoesNotExist:
   324     except taskapp_models.WorkReport.DoesNotExist:
   341         raise Http404
   325         raise Http404
   342 
   326 
   343     user = request.user
   327     user = request.user
   344     context = {"report": report,
   328     context = {"report": report,
   345                "user": user,
   329                "user": user,
   346               }
   330               }
   347 
   331 
   348     if not user.is_authenticated():
   332     if not user.is_authenticated():
   349         return render_to_response("task/view_report.html", context)
   333         return shortcuts.render_to_response("task/view_report.html", context)
   350 
   334 
   351     profile = user.get_profile()
   335     profile = user.get_profile()
   352 
   336 
   353     context.update({"profile": profile})
   337     context.update({"profile": profile})
   354     return render_to_response("task/view_report.html", context)
   338     return shortcuts.render_to_response("task/view_report.html", context)
   355 
   339 
   356 @login_required
   340 @login_required
   357 def submit_report(request, task_id):
   341 def submit_report(request, task_id):
   358     """ Check if the work is in WR state and the user is in assigned_users.
   342     """ Check if the work is in WR state and the user is in assigned_users.
   359     """
   343     """
   360     task_url = reverse('view_task', kwargs={'task_id': task_id})
   344     task_url = reverse('view_task', kwargs={'task_id': task_id})
   361     task = getTask(task_id)
   345     task = shortcuts.get_object_or_404(taskapp_models.Task, pk=task_id)
   362 
   346 
   363     user = request.user
   347     user = request.user
   364     old_reports = task.reports.all()
   348     old_reports = task.reports.all()
   365 
   349 
   366     if not task.status == "WR":
   350     if not task.status == "WR":
   378 
   362 
   379     if request.method == "POST":
   363     if request.method == "POST":
   380         if not can_upload:
   364         if not can_upload:
   381             return show_msg(user, "You are not authorised to upload data to this task", task_url, "view the task")
   365             return show_msg(user, "You are not authorised to upload data to this task", task_url, "view the task")
   382 
   366 
   383         form = WorkReportForm(request.POST, request.FILES)
   367         form = taskapp_forms.WorkReportForm(request.POST, request.FILES)
   384 
   368 
   385         if form.is_valid():
   369         if form.is_valid():
   386             data = form.cleaned_data.copy()
   370             data = form.cleaned_data.copy()
   387             data.update({"task":task,
   371             data.update({"task":task,
   388                          "revision": old_reports.count(),
   372                          "revision": old_reports.count(),
   389                          "uniq_key": make_key(WorkReport),
       
   390                          "submitted_by": user,
   373                          "submitted_by": user,
   391                          "submitted_at": datetime.now(),
   374                          "submitted_at": datetime.now(),
   392                         })
   375                         })
   393             r = WorkReport(**data)
   376             r = taskapp_models.WorkReport(**data)
   394             r.save()
   377             r.save()
   395 
   378 
   396             report_url = reverse('view_report', kwargs={'report_id': r.id})
   379             report_url = reverse('view_report', kwargs={'report_id': r.id})
   397             return redirect(report_url)
   380             return shortcuts.redirect(report_url)
   398 
   381 
   399         else:
   382         else:
   400             context.update({"form":form})
   383             context.update({"form":form})
   401             return render_to_response('task/submit_report.html', context)
   384             return shortcuts.render_to_response('task/submit_report.html', context)
   402 
   385 
   403     else:
   386     else:
   404         form = WorkReportForm()
   387         form = taskapp_forms.WorkReportForm()
   405         context.update({"form":form})
   388         context.update({"form":form})
   406         return render_to_response('task/submit_report.html', context)
   389         return shortcuts.render_to_response('task/submit_report.html', context)
   407 
   390 
   408 @login_required
   391 @login_required
   409 def create_textbook(request):
   392 def create_textbook(request):
   410 
   393 
   411     user = request.user
   394     user = request.user
   420               }
   403               }
   421 
   404 
   422     context.update(csrf(request))
   405     context.update(csrf(request))
   423 
   406 
   424     if request.method == "POST":
   407     if request.method == "POST":
   425         form = CreateTextbookForm(request.POST)
   408         form = taskapp_forms.CreateTextbookForm(request.POST)
   426         if form.is_valid():
   409         if form.is_valid():
   427             data = form.cleaned_data.copy()
   410             data = form.cleaned_data.copy()
   428             data.update({"uniq_key": make_key(TextBook),
   411             data.update({"created_by": user,
   429                          "created_by": user,
       
   430                          "creation_datetime": datetime.now()})
   412                          "creation_datetime": datetime.now()})
   431             del data['chapters']
   413             del data['chapters']
   432             new_textbook = TextBook(**data)
   414             new_textbook = taskapp_models.TextBook(**data)
   433             new_textbook.save()
   415             new_textbook.save()
   434 
   416 
   435             new_textbook.chapters = form.cleaned_data['chapters']
   417             new_textbook.chapters = form.cleaned_data['chapters']
   436 
   418 
   437             textbook_url = reverse(
   419             textbook_url = reverse(
   438               'view_textbook', kwargs={'task_id': new_textbook.id})
   420               'view_textbook', kwargs={'task_id': new_textbook.id})
   439             return redirect(textbook_url)
   421             return shortcuts.redirect(textbook_url)
   440         else:
   422         else:
   441             context.update({"form": form})
   423             context.update({"form": form})
   442             return render_to_response("task/create_textbook.html", context)
   424             return shortcuts.render_to_response("task/create_textbook.html", context)
   443     else:
   425     else:
   444         form = CreateTextbookForm()
   426         form = taskapp_forms.CreateTextbookForm()
   445         context.update({"form": form})
   427         context.update({"form": form})
   446         return render_to_response("task/create_textbook.html", context)
   428         return shortcuts.render_to_response("task/create_textbook.html", context)
   447 
   429 
   448 def view_textbook(request, task_id):
   430 def view_textbook(request, task_id):
   449 
   431 
   450     textbook = getTextBook(task_id)
   432     textbook = shortcuts.get_object_or_404(taskapp_models.TextBook, pk=task_id)
   451     chapters = textbook.chapters.all()
   433     chapters = textbook.chapters.all()
   452 
   434 
   453     user = request.user
   435     user = request.user
   454 
   436 
   455     context = {"user": user,
   437     context = {"user": user,
   456                "textbook": textbook,
   438                "textbook": textbook,
   457                "chapters": chapters,
   439                "chapters": chapters,
   458               }
   440               }
   459 
   441 
   460     if not user.is_authenticated():
   442     if not user.is_authenticated():
   461         return render_to_response("task/view_textbook.html", context)
   443         return shortcuts.render_to_response("task/view_textbook.html", context)
   462 
   444 
   463     profile = user.get_profile()
   445     profile = user.get_profile()
   464 
   446 
   465     context.update({"profile": profile,
   447     context.update({"profile": profile,
   466                     "textbook": textbook,
   448                     "textbook": textbook,
   474     can_approve = True if profile.rights in ["MG", "DC"] and \
   456     can_approve = True if profile.rights in ["MG", "DC"] and \
   475                           textbook.status == "UP" else False
   457                           textbook.status == "UP" else False
   476 
   458 
   477     context.update({"can_edit": can_edit,
   459     context.update({"can_edit": can_edit,
   478                     "can_approve": can_approve})
   460                     "can_approve": can_approve})
   479     return render_to_response("task/view_textbook.html", context)
   461     return shortcuts.render_to_response("task/view_textbook.html", context)
   480 
   462 
   481 def browse_textbooks(request):
   463 def browse_textbooks(request):
   482 
   464 
   483     user = request.user
   465     user = request.user
   484 
   466 
   485     open_textbooks = TextBook.objects.filter(status="OP").\
   467     open_textbooks = taskapp_models.TextBook.objects.filter(status="OP").\
   486                                       order_by("creation_datetime")
   468                                       order_by("creation_datetime")
   487     comp_textbooks = TextBook.objects.filter(status="CM").\
   469     comp_textbooks = taskapp_models.TextBook.objects.filter(status="CM").\
   488                                       order_by("creation_datetime")
   470                                       order_by("creation_datetime")
   489     context = {"user": user,
   471     context = {"user": user,
   490                "open_textbooks": open_textbooks,
   472                "open_textbooks": open_textbooks,
   491                "comp_textbooks": comp_textbooks,
   473                "comp_textbooks": comp_textbooks,
   492               }
   474               }
   493 
   475 
   494     if user.is_authenticated() and user.get_profile().rights in ["DC", "MG"]:
   476     if user.is_authenticated() and user.get_profile().rights in ["DC", "MG"]:
   495         unpub_textbooks = TextBook.objects.filter(status="UP")
   477         unpub_textbooks = taskapp_models.TextBook.objects.filter(status="UP")
   496 
   478 
   497         context.update({"unpub_textbooks": unpub_textbooks})
   479         context.update({"unpub_textbooks": unpub_textbooks})
   498 
   480 
   499     return render_to_response("task/browse_textbooks.html", context)
   481     return shortcuts.render_to_response("task/browse_textbooks.html", context)
   500 
   482 
   501 @login_required
   483 @login_required
   502 def edit_textbook(request, task_id):
   484 def edit_textbook(request, task_id):
   503 
   485 
   504     user = request.user
   486     user = request.user
   505     profile = user.get_profile()
   487     profile = user.get_profile()
   506 
   488 
   507     textbook = getTextBook(task_id)
   489     textbook = shortcuts.get_object_or_404(taskapp_models.TextBook, pk=task_id)
   508     textbook_url = reverse(
   490     textbook_url = reverse(
   509       'view_textbook', kwargs={'task_id': textbook.id})
   491       'view_textbook', kwargs={'task_id': textbook.id})
   510 
   492 
   511     can_edit = True if user == textbook.created_by and textbook.status == "UP"\
   493     can_edit = True if user == textbook.created_by and textbook.status == "UP"\
   512                        else False
   494                        else False
   520               }
   502               }
   521 
   503 
   522     context.update(csrf(request))
   504     context.update(csrf(request))
   523 
   505 
   524     if request.method == "POST":
   506     if request.method == "POST":
   525         form = EditTextbookForm(request.POST, instance=textbook)
   507         form = taskapp_forms.EditTextbookForm(request.POST, instance=textbook)
   526         if form.is_valid():
   508         if form.is_valid():
   527             form.save()
   509             form.save()
   528             return redirect(textbook_url)
   510             return shortcuts.redirect(textbook_url)
   529         else:
   511         else:
   530             context.update({"form": form})
   512             context.update({"form": form})
   531             return render_to_response("task/edit_textbook.html", context)
   513             return shortcuts.render_to_response("task/edit_textbook.html", context)
   532     else:
   514     else:
   533         form = EditTextbookForm(instance=textbook)
   515         form = taskapp_forms.EditTextbookForm(instance=textbook)
   534         context.update({"form": form})
   516         context.update({"form": form})
   535         return render_to_response("task/edit_textbook.html", context)
   517         return shortcuts.render_to_response("task/edit_textbook.html", context)
   536 
   518 
   537 @login_required
   519 @login_required
   538 def claim_task(request, task_id):
   520 def claim_task(request, task_id):
   539 
   521 
   540     claim_url = "/task/claim/task_id=%s"%task_id
   522     claim_url = "/task/claim/task_id=%s"%task_id
   541     task = getTask(task_id)
   523     task = shortcuts.get_object_or_404(taskapp_models.Task, pk=task_id)
   542 
   524 
   543     if task.status == "UP":
   525     if task.status == "UP":
   544         raise Http404
   526         raise Http404
   545 
   527 
   546     user = request.user
   528     user = request.user
   571                     "task_claimable": task_claimable,
   553                     "task_claimable": task_claimable,
   572                     "can_claim": can_claim,
   554                     "can_claim": can_claim,
   573                     "old_claims": old_claims})
   555                     "old_claims": old_claims})
   574 
   556 
   575     if request.method == "POST" and can_claim:
   557     if request.method == "POST" and can_claim:
   576         form = ClaimTaskForm(request.POST)
   558         form = taskapp_forms.ClaimTaskForm(request.POST)
   577         if form.is_valid():
   559         if form.is_valid():
   578             data = form.cleaned_data.copy()
   560             data = form.cleaned_data.copy()
   579             data.update({"uniq_key": make_key(TaskClaim),
   561             data.update({"task": task,
   580                          "task": task,
       
   581                          "claim_datetime": datetime.now(),
   562                          "claim_datetime": datetime.now(),
   582                          "claimed_by": user,})
   563                          "claimed_by": user,})
   583             new_claim = TaskClaim(**data)
   564             new_claim = taskapp_models.TaskClaim(**data)
   584             new_claim.save()
   565             new_claim.save()
   585 
   566 
   586             task.claimed_users.add(user)
   567             task.claimed_users.add(user)
   587             task.save()
   568             task.save()
   588 
   569 
   589             return redirect(claim_url)
   570             return shortcuts.redirect(claim_url)
   590 
   571 
   591         else:
   572         else:
   592             context.update({"form": form})
   573             context.update({"form": form})
   593             return render_to_response("task/claim.html", context)
   574             return shortcuts.render_to_response("task/claim.html", context)
   594     else:
   575     else:
   595         form = ClaimTaskForm()
   576         form = taskapp_forms.ClaimTaskForm()
   596         context.update({"form": form})
   577         context.update({"form": form})
   597         return render_to_response("task/claim.html", context)
   578         return shortcuts.render_to_response("task/claim.html", context)
   598 
   579 
   599 @login_required
   580 @login_required
   600 def select_user(request, task_id):
   581 def select_user(request, task_id):
   601     """ first get the status of the task and then select one of claimed users
   582     """ first get the status of the task and then select one of claimed users
   602     generate list of claimed users by passing it as an argument to a function.
   583     generate list of claimed users by passing it as an argument to a function.
   604 
   585 
   605     task_url = reverse('view_task', kwargs={'task_id': task_id})
   586     task_url = reverse('view_task', kwargs={'task_id': task_id})
   606 
   587 
   607     user = request.user
   588     user = request.user
   608     profile = user.get_profile()
   589     profile = user.get_profile()
   609     task = getTask(task_id)
   590     task = shortcuts.get_object_or_404(taskapp_models.Task, pk=task_id)
   610 
   591 
   611     context = {"user": user,
   592     context = {"user": user,
   612                "profile": profile,
   593                "profile": profile,
   613                "task": task,
   594                "task": task,
   614               }
   595               }
   626         if task_claimed:
   607         if task_claimed:
   627 
   608 
   628             user_list = ((user.id,user.username) for user in claimed_users)
   609             user_list = ((user.id,user.username) for user in claimed_users)
   629 
   610 
   630             if request.method == "POST":
   611             if request.method == "POST":
   631                 form = ChoiceForm(user_list, request.POST)
   612                 form = taskapp_forms.ChoiceForm(user_list, request.POST)
   632                 if form.is_valid():
   613                 if form.is_valid():
   633                     uid = form.cleaned_data['choice']
   614                     uid = form.cleaned_data['choice']
   634                     selected_user = User.objects.get(id=uid)
   615                     selected_user = User.objects.get(id=uid)
   635 
   616 
   636                     task.selected_users.add(selected_user)
   617                     task.selected_users.add(selected_user)
   637                     task.claimed_users.remove(selected_user)
   618                     task.claimed_users.remove(selected_user)
   638                     task.status = "WR"
   619                     task.status = "WR"
   639                     task.save()
   620                     task.save()
   640 
   621 
   641                     return redirect(task_url)
   622                     return shortcuts.redirect(task_url)
   642                 else:
   623                 else:
   643                     context.update({"form": form})
   624                     context.update({"form": form})
   644                     return render_to_response('task/select_user.html', context)
   625                     return shortcuts.render_to_response('task/select_user.html', context)
   645             else:
   626             else:
   646                 form = ChoiceForm(user_list)
   627                 form = taskapp_forms.ChoiceForm(user_list)
   647                 context.update({"form": form})
   628                 context.update({"form": form})
   648                 return render_to_response('task/select_user.html', context)
   629                 return shortcuts.render_to_response('task/select_user.html', context)
   649         else:
   630         else:
   650             return show_msg(user, 'There are no pending claims for this task',
   631             return show_msg(user, 'There are no pending claims for this task',
   651                             task_url, 'view the task')
   632                             task_url, 'view the task')
   652     else:
   633     else:
   653         raise Http404
   634         raise Http404
   656 def approve_textbook(request, task_id):
   637 def approve_textbook(request, task_id):
   657 
   638 
   658     user = request.user
   639     user = request.user
   659     profile = user.get_profile()
   640     profile = user.get_profile()
   660 
   641 
   661     textbook = getTextBook(task_id)
   642     textbook = shortcuts.get_object_or_404(taskapp_models.TextBook, pk=task_id)
   662 
   643 
   663     if profile.rights not in ["MG", "DC"] or textbook.status != "UP":
   644     if profile.rights not in ["MG", "DC"] or textbook.status != "UP":
   664         raise Http404
   645         raise Http404
   665 
   646 
   666     context = {"user": user,
   647     context = {"user": user,
   667                "profile": profile,
   648                "profile": profile,
   668                "textbook": textbook,
   649                "textbook": textbook,
   669               }
   650               }
   670 
   651 
   671     return render_to_response("task/confirm_textbook_approval.html", context)
   652     return shortcuts.render_to_response("task/confirm_textbook_approval.html", context)
   672 
   653 
   673 @login_required
   654 @login_required
   674 def approved_textbook(request, task_id):
   655 def approved_textbook(request, task_id):
   675 
   656 
   676     user = request.user
   657     user = request.user
   677     profile = user.get_profile()
   658     profile = user.get_profile()
   678 
   659 
   679     textbook = getTextBook(task_id)
   660     textbook = shortcuts.get_object_or_404(taskapp_models.TextBook, pk=task_id)
   680 
   661 
   681     if profile.rights not in ["MG", "DC"] or textbook.status != "UP":
   662     if profile.rights not in ["MG", "DC"] or textbook.status != "UP":
   682         raise Http404
   663         raise Http404
   683 
   664 
   684     textbook.approved_by = user
   665     textbook.approved_by = user
   689     context = {"user": user,
   670     context = {"user": user,
   690                "profile": profile,
   671                "profile": profile,
   691                "textbook": textbook,
   672                "textbook": textbook,
   692               }
   673               }
   693 
   674 
   694     return render_to_response("task/approved_textbook.html", context)
   675     return shortcuts.render_to_response("task/approved_textbook.html", context)