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 |