pytask/taskapp/views.py
changeset 408 0c12181e2c02
parent 387 32dd15eaf9d0
child 422 4bb891fc7a54
equal deleted inserted replaced
407:fe51e9080a17 408:0c12181e2c02
     1 from datetime import datetime
     1 from datetime import datetime
     2 
     2 
       
     3 from django.http import Http404
       
     4 from django.contrib.auth.decorators import login_required
     3 from django.contrib.auth.models import User
     5 from django.contrib.auth.models import User
     4 
       
     5 from django.shortcuts import render_to_response, redirect
       
     6 from django.http import Http404
       
     7 
       
     8 from django.contrib.auth.decorators import login_required
       
     9 from django.core.context_processors import csrf
     6 from django.core.context_processors import csrf
    10 from django.views.decorators.csrf import csrf_protect
     7 from django.core.urlresolvers import reverse
    11 
     8 from django.shortcuts import redirect
    12 from pytask.utils import make_key
     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 
    13 from pytask.views import show_msg
    27 from pytask.views import show_msg
    14 
       
    15 from pytask.taskapp.models import Task, TaskComment, TaskClaim, TextBook, \
       
    16         WorkReport
       
    17 from pytask.taskapp.forms import CreateTaskForm, EditTaskForm, \
       
    18                                  TaskCommentForm, ClaimTaskForm, \
       
    19                                  ChoiceForm, EditTaskForm, CreateTextbookForm,\
       
    20                                  EditTextbookForm, WorkReportForm
       
    21 from pytask.taskapp.utils import getTask, getTextBook
       
    22 from pytask.profile.utils import get_notification
       
    23 
    28 
    24 
    29 
    25 @login_required
    30 @login_required
    26 def create_task(request):
    31 def create_task(request):
    27 
    32 
    42                 data = form.cleaned_data.copy()
    47                 data = form.cleaned_data.copy()
    43                 data.update({"created_by": user,
    48                 data.update({"created_by": user,
    44                              "creation_datetime": datetime.now(),
    49                              "creation_datetime": datetime.now(),
    45                              "uniq_key": make_key(Task),
    50                              "uniq_key": make_key(Task),
    46                             })
    51                             })
    47                 
    52 
    48                 task = Task(**data)
    53                 task = Task(**data)
    49                 task.save()
    54                 task.save()
    50 
    55 
    51                 task_url = '/task/view/tid=%s'%task.uniq_key
    56                 task_url = reverse('view_task', kwargs={'task_id': task.id})
    52                 return redirect(task_url)
    57                 return redirect(task_url)
    53             else:
    58             else:
    54                 context.update({'form':form})
    59                 context.update({'form':form})
    55                 return render_to_response('task/create.html', context)
    60                 return render_to_response('task/create.html', context)
    56         else:
    61         else:
    87                    })
    92                    })
    88 
    93 
    89     return render_to_response("task/browse.html", context)
    94     return render_to_response("task/browse.html", context)
    90 
    95 
    91 
    96 
    92 def view_task(request, tid):
    97 def view_task(request, task_id):
    93     """ get the task depending on its tid and display accordingly if it is a get.
    98     """ get the task depending on its task_id and display accordingly if it is a get.
    94     check for authentication and add a comment if it is a post request.
    99     check for authentication and add a comment if it is a post request.
    95     """
   100     """
    96     
   101 
    97     task_url = "/task/view/tid=%s"%tid
   102     task_url = reverse('view_task', kwargs={'task_id': task_id})
    98     task = getTask(tid)
   103     task = getTask(task_id)
    99 
   104 
   100     user = request.user
   105     user = request.user
   101 
   106 
   102     if not user.is_authenticated():
   107     if not user.is_authenticated():
   103         return render_to_response("task/view.html", {"task": task})
   108         return render_to_response("task/view.html", {"task": task})
   110               }
   115               }
   111 
   116 
   112     context.update(csrf(request))
   117     context.update(csrf(request))
   113 
   118 
   114     if task.status == "DL":
   119     if task.status == "DL":
   115         return show_msg(user, 'This task no longer exists', '/task/browse/','browse the tasks')
   120         return show_msg(user, 'This task no longer exists',
       
   121                         reverse('browse_tasks'), 'browse the tasks')
   116 
   122 
   117     task_viewable = True if ( task.status != "UP" ) or profile.rights != "CT"\
   123     task_viewable = True if ( task.status != "UP" ) or profile.rights != "CT"\
   118                          else False
   124                          else False
   119     if not task_viewable:
   125     if not task_viewable:
   120         return show_msg(user, "You are not authorised to view this task", "/task/browse/", "browse the tasks")
   126         return show_msg(user, "You are not authorised to view this task",
       
   127                         reverse('browse_tasks'), "browse the tasks")
   121 
   128 
   122     reviewers = task.reviewers.all()
   129     reviewers = task.reviewers.all()
   123     is_reviewer = True if user in task.reviewers.all() else False
   130     is_reviewer = True if user in task.reviewers.all() else False
   124     comments = task.comments.filter(is_deleted=False).order_by('comment_datetime')
   131     comments = task.comments.filter(
       
   132       is_deleted=False).order_by('comment_datetime')
   125 
   133 
   126     context.update({'is_reviewer':is_reviewer,
   134     context.update({'is_reviewer':is_reviewer,
   127                     'comments':comments,
   135                     'comments':comments,
   128                     'reviewers':reviewers,
   136                     'reviewers':reviewers,
   129                    })
   137                    })
   150                                      profile.rights!="CT" else False
   158                                      profile.rights!="CT" else False
   151 
   159 
   152     context['can_mod_reviewers'] = True if profile.rights in ["MG", "DC"] else\
   160     context['can_mod_reviewers'] = True if profile.rights in ["MG", "DC"] else\
   153                                    False
   161                                    False
   154 
   162 
   155 #    if task.status == "CD":
       
   156 #        context['closing_notification'] =  Notification.objects.filter(task=task,role="CD")[0]
       
   157 #    elif task.status == "CM":
       
   158 #        context['completed_notification'] =  Notifications.objects.filter(task=task,role="CM")[0]
       
   159 #    elif task.status == "WR":
       
   160 #        context['assigned_users'] = task.assigned_users.all()
       
   161    
       
   162     if request.method == 'POST':
   163     if request.method == 'POST':
   163         form = TaskCommentForm(request.POST)
   164         form = TaskCommentForm(request.POST)
   164         if form.is_valid():
   165         if form.is_valid():
   165             data = form.cleaned_data['data']
   166             data = form.cleaned_data['data']
   166             new_comment = TaskComment(task=task, data=data,
   167             new_comment = TaskComment(task=task, data=data,
   175         form = TaskCommentForm()
   176         form = TaskCommentForm()
   176         context['form'] = form
   177         context['form'] = form
   177         return render_to_response('task/view.html', context)
   178         return render_to_response('task/view.html', context)
   178 
   179 
   179 @login_required
   180 @login_required
   180 def edit_task(request, tid):
   181 def edit_task(request, task_id):
   181     """ only creator gets to edit the task and that too only before it gets
   182     """ only creator gets to edit the task and that too only before it gets
   182     approved.
   183     approved.
   183     """
   184     """
   184 
   185 
   185     user = request.user
   186     user = request.user
   186     profile = user.get_profile()
   187     profile = user.get_profile()
   187 
   188 
   188     task_url = "/task/view/tid=%s"%tid
   189     task_url = reverse('view_task', kwargs={'task_id': task_id})
   189     task = getTask(tid)
   190     task = getTask(task_id)
   190 
   191 
   191     is_creator = True if user == task.created_by else False
   192     is_creator = True if user == task.created_by else False
   192     can_edit = True if task.status == "UP" and is_creator else False
   193     can_edit = True if task.status == "UP" and is_creator else False
   193     if not can_edit:
   194     if not can_edit:
   194         raise Http404
   195         raise Http404
   212         form = EditTaskForm(instance=task)
   213         form = EditTaskForm(instance=task)
   213         context.update({"form": form})
   214         context.update({"form": form})
   214         return render_to_response("task/edit.html", context)
   215         return render_to_response("task/edit.html", context)
   215 
   216 
   216 @login_required
   217 @login_required
   217 def approve_task(request, tid):
   218 def approve_task(request, task_id):
   218 
   219 
   219     user = request.user
   220     user = request.user
   220     profile = user.get_profile()
   221     profile = user.get_profile()
   221 
   222 
   222     task_url = "/task/view/tid=%s"%tid
   223     task = getTask(task_id)
   223     task = getTask(tid)
       
   224 
   224 
   225     if profile.rights not in ["MG", "DC"] or task.status != "UP":
   225     if profile.rights not in ["MG", "DC"] or task.status != "UP":
   226         raise Http404
   226         raise Http404
   227 
   227 
   228     context = {"user": user,
   228     context = {"user": user,
   231               }
   231               }
   232 
   232 
   233     return render_to_response("task/confirm_approval.html", context)
   233     return render_to_response("task/confirm_approval.html", context)
   234 
   234 
   235 @login_required
   235 @login_required
   236 def approved_task(request, tid):
   236 def approved_task(request, task_id):
   237 
   237 
   238     user = request.user
   238     user = request.user
   239     profile = user.get_profile()
   239     profile = user.get_profile()
   240 
   240 
   241     task_url = "/task/view/tid=%s"%tid
   241     task = getTask(task_id)
   242     task = getTask(tid)
       
   243 
   242 
   244     if profile.rights not in ["MG", "DC"] or task.status != "UP":
   243     if profile.rights not in ["MG", "DC"] or task.status != "UP":
   245         raise Http404
   244         raise Http404
   246 
   245 
   247     task.approved_by = user
   246     task.approved_by = user
   255               }
   254               }
   256 
   255 
   257     return render_to_response("task/approved_task.html", context)
   256     return render_to_response("task/approved_task.html", context)
   258 
   257 
   259 @login_required
   258 @login_required
   260 def addreviewer(request, tid):
   259 def addreviewer(request, task_id):
   261 
   260 
   262     user = request.user
   261     user = request.user
   263     profile = user.get_profile()
   262     profile = user.get_profile()
   264 
   263 
   265     task_url = "/task/view/tid=%s"%tid
   264     task_url = reverse('view_task', kwargs={'task_id': task_id})
   266     task = getTask(tid)
   265     task = getTask(task_id)
   267 
   266 
   268     can_mod_reviewers = True if profile.rights in ["MG", "DC"] else False
   267     can_mod_reviewers = True if profile.rights in ["MG", "DC"] else False
   269     if not can_mod_reviewers:
   268     if not can_mod_reviewers:
   270         raise Http404
   269         raise Http404
   271 
   270 
   277     context.update(csrf(request))
   276     context.update(csrf(request))
   278 
   277 
   279 
   278 
   280     # This part has to be made better
   279     # This part has to be made better
   281     reviewer_choices = User.objects.filter(is_active=True).\
   280     reviewer_choices = User.objects.filter(is_active=True).\
   282                                            exclude(reviewing_tasks__uniq_key=tid).\
   281                                            exclude(reviewing_tasks__uniq_key=task_id).\
   283                                            exclude(claimed_tasks__uniq_key=tid).\
   282                                            exclude(claimed_tasks__uniq_key=task_id).\
   284                                            exclude(selected_tasks__uniq_key=tid).\
   283                                            exclude(selected_tasks__uniq_key=task_id).\
   285                                            exclude(created_tasks__uniq_key=tid)
   284                                            exclude(created_tasks__uniq_key=task_id)
   286 
   285 
   287     choices = ((a_user.id,a_user.username) for a_user in reviewer_choices)
   286     choices = ((a_user.id,a_user.username) for a_user in reviewer_choices)
   288     label = "Reviewer"
   287     label = "Reviewer"
   289 
   288 
   290     if request.method == "POST":
   289     if request.method == "POST":
   302     else:
   301     else:
   303         form = ChoiceForm(choices, label=label)
   302         form = ChoiceForm(choices, label=label)
   304         context.update({"form": form})
   303         context.update({"form": form})
   305         return render_to_response("task/addreviewer.html", context)
   304         return render_to_response("task/addreviewer.html", context)
   306 
   305 
   307 def view_work(request, tid):
   306 def view_work(request, task_id):
   308 
   307 
   309     task_url = "/task/view/tid=%s"%tid
   308     task = getTask(task_id)
   310     task = getTask(tid)
       
   311 
   309 
   312     user = request.user
   310     user = request.user
   313     old_reports = task.reports.all()
   311     old_reports = task.reports.all()
   314 
   312 
   315     context = {"task": task,
   313     context = {"task": task,
   333     context.update({"is_working": is_working})
   331     context.update({"is_working": is_working})
   334 
   332 
   335     return render_to_response("task/view_work.html", context)
   333     return render_to_response("task/view_work.html", context)
   336 
   334 
   337 @login_required
   335 @login_required
   338 def view_report(request, rid):
   336 def view_report(request, report_id):
   339 
   337 
   340     try:
   338     try:
   341         report = WorkReport.objects.get(uniq_key=rid)
   339         report = WorkReport.objects.get(uniq_key=report_id)
   342     except WorkReport.DoesNotExist:
   340     except WorkReport.DoesNotExist:
   343         raise Http404
   341         raise Http404
   344 
   342 
   345     user = request.user
   343     user = request.user
   346     context = {"report": report,
   344     context = {"report": report,
   354 
   352 
   355     context.update({"profile": profile})
   353     context.update({"profile": profile})
   356     return render_to_response("task/view_report.html", context)
   354     return render_to_response("task/view_report.html", context)
   357 
   355 
   358 @login_required
   356 @login_required
   359 def submit_report(request, tid):
   357 def submit_report(request, task_id):
   360     """ Check if the work is in WR state and the user is in assigned_users.
   358     """ Check if the work is in WR state and the user is in assigned_users.
   361     """
   359     """
   362     
   360     task_url = reverse('view_task', kwargs={'task_id': task_id})
   363     user = request.user
   361     task = getTask(task_id)
   364     task = getTask(tid)
   362 
       
   363     user = request.user
   365     old_reports = task.reports.all()
   364     old_reports = task.reports.all()
   366 
   365 
   367     if not task.status == "WR":
   366     if not task.status == "WR":
   368         raise Http404
   367         raise Http404
   369 
   368 
   392                          "submitted_at": datetime.now(),
   391                          "submitted_at": datetime.now(),
   393                         })
   392                         })
   394             r = WorkReport(**data)
   393             r = WorkReport(**data)
   395             r.save()
   394             r.save()
   396 
   395 
   397             report_url = "/task/view/report/rid=%s"%r.uniq_key
   396             report_url = reverse('view_report', kwargs={'report_id': r.id})
   398             return redirect(report_url)
   397             return redirect(report_url)
   399 
   398 
   400         else:
   399         else:
   401             context.update({"form":form})
   400             context.update({"form":form})
   402             return render_to_response('task/submit_report.html', context)
   401             return render_to_response('task/submit_report.html', context)
   433             new_textbook = TextBook(**data)
   432             new_textbook = TextBook(**data)
   434             new_textbook.save()
   433             new_textbook.save()
   435 
   434 
   436             new_textbook.chapters = form.cleaned_data['chapters']
   435             new_textbook.chapters = form.cleaned_data['chapters']
   437 
   436 
   438             textbook_url = "/task/textbook/view/tid=%s"%new_textbook.uniq_key
   437             textbook_url = reverse(
       
   438               'view_textbook', kwargs={'task_id': new_textbook.id})
   439             return redirect(textbook_url)
   439             return redirect(textbook_url)
   440         else:
   440         else:
   441             context.update({"form": form})
   441             context.update({"form": form})
   442             return render_to_response("task/create_textbook.html", context)
   442             return render_to_response("task/create_textbook.html", context)
   443     else:
   443     else:
   444         form = CreateTextbookForm()
   444         form = CreateTextbookForm()
   445         context.update({"form": form})
   445         context.update({"form": form})
   446         return render_to_response("task/create_textbook.html", context)
   446         return render_to_response("task/create_textbook.html", context)
   447 
   447 
   448 def view_textbook(request, tid):
   448 def view_textbook(request, task_id):
   449 
   449 
   450     textbook = getTextBook(tid)
   450     textbook = getTextBook(task_id)
   451     textbook_url = "/task/textbook/view/tid=%s"%textbook.uniq_key
       
   452     chapters = textbook.chapters.all()
   451     chapters = textbook.chapters.all()
   453 
   452 
   454     user = request.user
   453     user = request.user
   455 
   454 
   456     context = {"user": user,
   455     context = {"user": user,
   498         context.update({"unpub_textbooks": unpub_textbooks})
   497         context.update({"unpub_textbooks": unpub_textbooks})
   499 
   498 
   500     return render_to_response("task/browse_textbooks.html", context)
   499     return render_to_response("task/browse_textbooks.html", context)
   501 
   500 
   502 @login_required
   501 @login_required
   503 def edit_textbook(request, tid):
   502 def edit_textbook(request, task_id):
   504 
   503 
   505     user = request.user
   504     user = request.user
   506     profile = user.get_profile()
   505     profile = user.get_profile()
   507 
   506 
   508     textbook = getTextBook(tid)
   507     textbook = getTextBook(task_id)
   509     textbook_url = "/task/textbook/view/tid=%s"%textbook.uniq_key
   508     textbook_url = reverse(
       
   509       'view_textbook', kwargs={'task_id': textbook.id})
   510 
   510 
   511     can_edit = True if user == textbook.created_by and textbook.status == "UP"\
   511     can_edit = True if user == textbook.created_by and textbook.status == "UP"\
   512                        else False
   512                        else False
   513 
   513 
   514     if not can_edit:
   514     if not can_edit:
   533         form = EditTextbookForm(instance=textbook)
   533         form = EditTextbookForm(instance=textbook)
   534         context.update({"form": form})
   534         context.update({"form": form})
   535         return render_to_response("task/edit_textbook.html", context)
   535         return render_to_response("task/edit_textbook.html", context)
   536 
   536 
   537 @login_required
   537 @login_required
   538 def claim_task(request, tid):
   538 def claim_task(request, task_id):
   539 
   539 
   540     task_url = "/task/view/tid=%s"%tid
   540     claim_url = "/task/claim/task_id=%s"%task_id
   541     claim_url = "/task/claim/tid=%s"%tid
   541     task = getTask(task_id)
   542     task = getTask(tid)
       
   543 
   542 
   544     if task.status == "UP":
   543     if task.status == "UP":
   545         raise Http404
   544         raise Http404
   546 
   545 
   547     user = request.user
   546     user = request.user
   554 
   553 
   555     context.update(csrf(request))
   554     context.update(csrf(request))
   556 
   555 
   557     reviewers = task.reviewers.all()
   556     reviewers = task.reviewers.all()
   558     claimed_users = task.claimed_users.all()
   557     claimed_users = task.claimed_users.all()
   559     selected_users = task.selected_users.all()
       
   560 
   558 
   561     is_creator = True if user == task.created_by else False
   559     is_creator = True if user == task.created_by else False
   562     is_reviewer = True if user in reviewers else False
   560     is_reviewer = True if user in reviewers else False
   563     has_claimed = True if user in claimed_users else False
   561     has_claimed = True if user in claimed_users else False
   564 
   562 
   597         form = ClaimTaskForm()
   595         form = ClaimTaskForm()
   598         context.update({"form": form})
   596         context.update({"form": form})
   599         return render_to_response("task/claim.html", context)
   597         return render_to_response("task/claim.html", context)
   600 
   598 
   601 @login_required
   599 @login_required
   602 def select_user(request, tid):
   600 def select_user(request, task_id):
   603     """ first get the status of the task and then select one of claimed users
   601     """ first get the status of the task and then select one of claimed users
   604     generate list of claimed users by passing it as an argument to a function.
   602     generate list of claimed users by passing it as an argument to a function.
   605     """
   603     """
   606     
   604 
   607     task_url = "/task/view/tid=%s"%tid
   605     task_url = reverse('view_task', kwargs={'task_id': task_id})
   608     
   606 
   609     user = request.user
   607     user = request.user
   610     profile = user.get_profile()
   608     profile = user.get_profile()
   611     task = getTask(tid)
   609     task = getTask(task_id)
   612     
   610 
   613     context = {"user": user,
   611     context = {"user": user,
   614                "profile": profile,
   612                "profile": profile,
   615                "task": task,
   613                "task": task,
   616               }
   614               }
   617 
   615 
   618     context.update(csrf(request))
   616     context.update(csrf(request))
   619 
   617 
   620     claimed_users = task.claimed_users.all()
   618     claimed_users = task.claimed_users.all()
   621     selected_users = task.selected_users.all()
       
   622     task_claimed = True if claimed_users else False
   619     task_claimed = True if claimed_users else False
   623     
   620     
   624     is_creator = True if user == task.created_by else False
   621     is_creator = True if user == task.created_by else False
   625 
   622 
   626     if ( is_creator or profile.rights in ["CR", "DC"] ) and \
   623     if ( is_creator or profile.rights in ["CR", "DC"] ) and \
   654                             task_url, 'view the task')
   651                             task_url, 'view the task')
   655     else:
   652     else:
   656         raise Http404
   653         raise Http404
   657 
   654 
   658 @login_required
   655 @login_required
   659 def approve_textbook(request, tid):
   656 def approve_textbook(request, task_id):
   660 
   657 
   661     user = request.user
   658     user = request.user
   662     profile = user.get_profile()
   659     profile = user.get_profile()
   663 
   660 
   664     textbook_url = "/task/view/tid=%s"%tid
   661     textbook = getTextBook(task_id)
   665     textbook = getTextBook(tid)
       
   666 
   662 
   667     if profile.rights not in ["MG", "DC"] or textbook.status != "UP":
   663     if profile.rights not in ["MG", "DC"] or textbook.status != "UP":
   668         raise Http404
   664         raise Http404
   669 
   665 
   670     context = {"user": user,
   666     context = {"user": user,
   673               }
   669               }
   674 
   670 
   675     return render_to_response("task/confirm_textbook_approval.html", context)
   671     return render_to_response("task/confirm_textbook_approval.html", context)
   676 
   672 
   677 @login_required
   673 @login_required
   678 def approved_textbook(request, tid):
   674 def approved_textbook(request, task_id):
   679 
   675 
   680     user = request.user
   676     user = request.user
   681     profile = user.get_profile()
   677     profile = user.get_profile()
   682 
   678 
   683     textbook_url = "/task/view/tid=%s"%tid
   679     textbook = getTextBook(task_id)
   684     textbook = getTextBook(tid)
       
   685 
   680 
   686     if profile.rights not in ["MG", "DC"] or textbook.status != "UP":
   681     if profile.rights not in ["MG", "DC"] or textbook.status != "UP":
   687         raise Http404
   682         raise Http404
   688 
   683 
   689     textbook.approved_by = user
   684     textbook.approved_by = user