3 from django.http import HttpResponse, Http404 |
3 from django.http import HttpResponse, Http404 |
4 from django.shortcuts import render_to_response, redirect |
4 from django.shortcuts import render_to_response, redirect |
5 |
5 |
6 from pytask.taskapp.models import User, Task, Comment, Request, Notification |
6 from pytask.taskapp.models import User, Task, Comment, Request, Notification |
7 from pytask.taskapp.utilities.task import getTask |
7 from pytask.taskapp.utilities.task import getTask |
8 from pytask.taskapp.forms.task import TaskCreateForm, AddMentorForm, AddTaskForm, ChoiceForm, AssignCreditForm, RemoveUserForm, EditTaskForm, ClaimTaskForm |
8 from pytask.taskapp.forms.task import TaskCreateForm, AddReviewerForm, AddTaskForm, ChoiceForm, AssignCreditForm, RemoveUserForm, EditTaskForm, ClaimTaskForm |
9 from pytask.taskapp.events.task import createTask, reqMentor, publishTask, addSubTask, addDep, addClaim, assignTask, updateTask, removeTask, removeUser, assignCredits, completeTask, closeTask, addMentor, deleteTask |
9 from pytask.taskapp.events.task import createTask, reqReviewer, publishTask, addSubTask, addDep, addClaim, assignTask, updateTask, removeTask, removeUser, assignCredits, completeTask, closeTask, addReviewer, deleteTask |
10 from pytask.taskapp.views.user import show_msg |
10 from pytask.taskapp.views.user import show_msg |
11 from pytask.taskapp.utilities.user import get_user |
11 from pytask.taskapp.utilities.user import get_user |
12 |
12 |
13 ## everywhere if there is no task, django should display 500 message.. but take care of that in sensitive views like add mentor and all |
13 ## everywhere if there is no task, django should display 500 message.. but take care of that in sensitive views like add reviewer and all |
14 ## do not create su user thro syncdb |
14 ## do not create su user thro syncdb |
15 |
15 |
16 def browse_tasks(request): |
16 def browse_tasks(request): |
17 """ display all the tasks """ |
17 """ display all the tasks """ |
18 |
18 |
38 'task_list':task_list, |
38 'task_list':task_list, |
39 } |
39 } |
40 return render_to_response('task/browse.html', context) |
40 return render_to_response('task/browse.html', context) |
41 |
41 |
42 def publish_task(request, tid): |
42 def publish_task(request, tid): |
43 """ check if user is the mentor and also if the task status is UP. |
43 """ check if user is the reviewer and also if the task status is UP. |
44 """ |
44 """ |
45 |
45 |
46 task_url = "/task/view/tid=%s"%tid |
46 task_url = "/task/view/tid=%s"%tid |
47 |
47 |
48 user = get_user(request.user) if request.user.is_authenticated() else request.user |
48 user = get_user(request.user) if request.user.is_authenticated() else request.user |
49 task = getTask(tid) |
49 task = getTask(tid) |
50 |
50 |
51 is_guest = True if not user.is_authenticated() else False |
51 is_guest = True if not user.is_authenticated() else False |
52 is_mentor = True if user in task.mentors.all() else False |
52 is_reviewer = True if user in task.reviewers.all() else False |
53 |
53 |
54 if user == task.created_by: |
54 if user == task.created_by: |
55 context = { |
55 context = { |
56 'user':user, |
56 'user':user, |
57 } |
57 } |
77 task = getTask(tid) |
77 task = getTask(tid) |
78 |
78 |
79 if task.status == "DL": |
79 if task.status == "DL": |
80 return show_msg(user, 'This task no longer exists', '/task/browse/','browse the tasks') |
80 return show_msg(user, 'This task no longer exists', '/task/browse/','browse the tasks') |
81 comments = task.comment_set.filter(is_deleted=False).order_by('creation_datetime') |
81 comments = task.comment_set.filter(is_deleted=False).order_by('creation_datetime') |
82 mentors = task.mentors.all() |
82 reviewers = task.reviewers.all() |
83 |
83 |
84 deps, subs = task.deps, task.subs |
84 deps, subs = task.deps, task.subs |
85 |
85 |
86 is_guest = True if not user.is_authenticated() else False |
86 is_guest = True if not user.is_authenticated() else False |
87 is_mentor = True if user in task.mentors.all() else False |
87 is_reviewer = True if user in task.reviewers.all() else False |
88 context = {'user':user, |
88 context = {'user':user, |
89 'task':task, |
89 'task':task, |
90 'comments':comments, |
90 'comments':comments, |
91 'mentors':mentors, |
91 'reviewers':reviewers, |
92 'subs':subs, |
92 'subs':subs, |
93 'deps':deps, |
93 'deps':deps, |
94 'is_guest':is_guest, |
94 'is_guest':is_guest, |
95 'is_mentor':is_mentor, |
95 'is_reviewer':is_reviewer, |
96 } |
96 } |
97 |
97 |
98 claimed_users = task.claimed_users.all() |
98 claimed_users = task.claimed_users.all() |
99 |
99 |
100 |
100 |
101 is_requested_mentor = True if user.is_authenticated() and user.request_sent_to.filter(is_valid=True,is_replied=False,role="MT",task=task) else False |
101 is_requested_reviewer = True if user.is_authenticated() and user.request_sent_to.filter(is_valid=True,is_replied=False,role="MT",task=task) else False |
102 task_viewable = True if ( task.status != "UP" ) or is_mentor or is_requested_mentor else False |
102 task_viewable = True if ( task.status != "UP" ) or is_reviewer or is_requested_reviewer else False |
103 if not task_viewable: |
103 if not task_viewable: |
104 return show_msg(user, "You are not authorised to view this task", "/task/browse/", "browse the tasks") |
104 return show_msg(user, "You are not authorised to view this task", "/task/browse/", "browse the tasks") |
105 |
105 |
106 context['is_requested_mentor'] = is_requested_mentor |
106 context['is_requested_reviewer'] = is_requested_reviewer |
107 |
107 |
108 context['can_publish'] = True if task.status == "UP" and user == task.created_by else False |
108 context['can_publish'] = True if task.status == "UP" and user == task.created_by else False |
109 context['can_edit'] = True if task.status == "UP" and is_mentor else False |
109 context['can_edit'] = True if task.status == "UP" and is_reviewer else False |
110 context['can_close'] = True if task.status not in ["UP", "CD", "CM"] and is_mentor else False |
110 context['can_close'] = True if task.status not in ["UP", "CD", "CM"] and is_reviewer else False |
111 context['can_delete'] = True if task.status == "UP" and user == task.created_by else False |
111 context['can_delete'] = True if task.status == "UP" and user == task.created_by else False |
112 |
112 |
113 context['can_mod_mentors'] = True if task.status in ["UP", "OP", "LO", "WR"] and is_mentor else False |
113 context['can_mod_reviewers'] = True if task.status in ["UP", "OP", "LO", "WR"] and is_reviewer else False |
114 context['can_mod_tasks'] = True if task.status in ["UP", "OP", "LO"] and is_mentor else False |
114 context['can_mod_tasks'] = True if task.status in ["UP", "OP", "LO"] and is_reviewer else False |
115 |
115 |
116 context['can_assign_credits'] = True if task.status in ["OP", "WR"] and is_mentor else False |
116 context['can_assign_credits'] = True if task.status in ["OP", "WR"] and is_reviewer else False |
117 context['task_claimable'] = True if task.status in ["OP", "WR"] and not is_guest else False |
117 context['task_claimable'] = True if task.status in ["OP", "WR"] and not is_guest else False |
118 |
118 |
119 if task.status == "CD": |
119 if task.status == "CD": |
120 context['closing_notification'] = Notification.objects.filter(task=task,role="CD")[0] |
120 context['closing_notification'] = Notification.objects.filter(task=task,role="CD")[0] |
121 elif task.status == "CM": |
121 elif task.status == "CM": |
158 desc = data['desc'] |
158 desc = data['desc'] |
159 credits = data['credits'] |
159 credits = data['credits'] |
160 #publish = data['publish'] # just in case if we have to show the option |
160 #publish = data['publish'] # just in case if we have to show the option |
161 task = createTask(title,desc,user,credits) |
161 task = createTask(title,desc,user,credits) |
162 |
162 |
163 addMentor(task, user) |
163 addReviewer(task, user) |
164 updateTask(task,tags_field=data['tags_field']) |
164 updateTask(task,tags_field=data['tags_field']) |
165 # if publish: publishTask(task) |
165 # if publish: publishTask(task) |
166 task_url = '/task/view/tid=%s'%task.id |
166 task_url = '/task/view/tid=%s'%task.id |
167 return redirect(task_url) |
167 return redirect(task_url) |
168 else: |
168 else: |
173 else: |
173 else: |
174 return show_msg(user, 'You are not authorised to create a task.') |
174 return show_msg(user, 'You are not authorised to create a task.') |
175 else: |
175 else: |
176 return show_msg(user, 'You are not authorised to create a task.', "/", "home page") |
176 return show_msg(user, 'You are not authorised to create a task.', "/", "home page") |
177 |
177 |
178 def add_mentor(request, tid): |
178 def add_reviewer(request, tid): |
179 """ check if the current user has the rights to edit the task and add him. |
179 """ check if the current user has the rights to edit the task and add him. |
180 if user is not authenticated, redirect him to concerned page. """ |
180 if user is not authenticated, redirect him to concerned page. """ |
181 |
181 |
182 task_url = "/task/view/tid=%s"%tid |
182 task_url = "/task/view/tid=%s"%tid |
183 |
183 |
185 task = getTask(tid) |
185 task = getTask(tid) |
186 errors = [] |
186 errors = [] |
187 |
187 |
188 is_guest = True if not user.is_authenticated() else False |
188 is_guest = True if not user.is_authenticated() else False |
189 |
189 |
190 if (not is_guest) and user in task.mentors.all(): |
190 if (not is_guest) and user in task.reviewers.all(): |
191 |
191 |
192 pending_requests = Request.objects.filter(is_replied=False,is_valid=True,role="MT",task=task).order_by('creation_date').reverse() |
192 pending_requests = Request.objects.filter(is_replied=False,is_valid=True,role="MT",task=task).order_by('creation_date').reverse() |
193 user_pending_requests = pending_requests.filter(sent_by=user) |
193 user_pending_requests = pending_requests.filter(sent_by=user) |
194 |
194 |
195 ## now iam going for a brute force method |
195 ## now iam going for a brute force method |
196 user_list = list(User.objects.filter(is_active=True)) |
196 user_list = list(User.objects.filter(is_active=True)) |
197 for mentor in task.mentors.all(): |
197 for reviewer in task.reviewers.all(): |
198 user_list.remove(mentor) |
198 user_list.remove(reviewer) |
199 |
199 |
200 for a_user in task.claimed_users.all(): |
200 for a_user in task.claimed_users.all(): |
201 user_list.remove(a_user) |
201 user_list.remove(a_user) |
202 |
202 |
203 for a_user in task.assigned_users.all(): |
203 for a_user in task.assigned_users.all(): |
204 user_list.remove(a_user) |
204 user_list.remove(a_user) |
205 |
205 |
206 for req in user_pending_requests: |
206 for req in user_pending_requests: |
207 user_list.remove(req.sent_to.all()[0]) |
207 user_list.remove(req.sent_to.all()[0]) |
208 |
208 |
209 non_mentors = ((_.id, _.username) for _ in user_list) |
209 non_reviewers = ((_.id, _.username) for _ in user_list) |
210 non_mentor_ids = [ str(a_user.id) for a_user in user_list ] |
210 non_reviewer_ids = [ str(a_user.id) for a_user in user_list ] |
211 ## code till must be made elegant and not brute force like above |
211 ## code till must be made elegant and not brute force like above |
212 |
212 |
213 form = AddMentorForm(non_mentors) |
213 form = AddReviewerForm(non_reviewers) |
214 |
214 |
215 context = { |
215 context = { |
216 'user':user, |
216 'user':user, |
217 'task':task, |
217 'task':task, |
218 'pending_requests':pending_requests, |
218 'pending_requests':pending_requests, |
219 'form':form, |
219 'form':form, |
220 } |
220 } |
221 |
221 |
222 if request.method == "POST": |
222 if request.method == "POST": |
223 data = request.POST |
223 data = request.POST |
224 uid = data.get('mentor', None) |
224 uid = data.get('reviewer', None) |
225 if uid in non_mentor_ids: |
225 if uid in non_reviewer_ids: |
226 new_mentor = User.objects.get(id=int(uid)) |
226 new_reviewer = User.objects.get(id=int(uid)) |
227 reqMentor(task, new_mentor, user) |
227 reqReviewer(task, new_reviewer, user) |
228 return redirect('/task/addmentor/tid=%s'%task.id) |
228 return redirect('/task/addreviewer/tid=%s'%task.id) |
229 else: |
229 else: |
230 ## bogus post request |
230 ## bogus post request |
231 raise Http404 |
231 raise Http404 |
232 else: |
232 else: |
233 return render_to_response('task/addmentor.html', context) |
233 return render_to_response('task/addreviewer.html', context) |
234 else: |
234 else: |
235 return show_msg(user, 'You are not authorised to add mentors for this task', task_url, 'view the task') |
235 return show_msg(user, 'You are not authorised to add reviewers for this task', task_url, 'view the task') |
236 |
236 |
237 def add_tasks(request, tid): |
237 def add_tasks(request, tid): |
238 """ first display tasks which can be subtasks for the task and do the rest. |
238 """ first display tasks which can be subtasks for the task and do the rest. |
239 """ |
239 """ |
240 |
240 |
255 task_choices = [ (_.id,_.title) for _ in valid_tasks ] |
255 task_choices = [ (_.id,_.title) for _ in valid_tasks ] |
256 errors = [] |
256 errors = [] |
257 |
257 |
258 is_guest = True if not user.is_authenticated() else False |
258 is_guest = True if not user.is_authenticated() else False |
259 |
259 |
260 if (not is_guest) and user in task.mentors.all(): |
260 if (not is_guest) and user in task.reviewers.all(): |
261 if task.status in ["UP", "OP", "LO"]: |
261 if task.status in ["UP", "OP", "LO"]: |
262 form = AddTaskForm(task_choices, is_plain) |
262 form = AddTaskForm(task_choices, is_plain) |
263 if request.method == "POST": |
263 if request.method == "POST": |
264 ## first decide if adding subs and deps can be in same page |
264 ## first decide if adding subs and deps can be in same page |
265 ## only exclude tasks with status deleted |
265 ## only exclude tasks with status deleted |
360 |
360 |
361 #claims = task.notifications_task.filter(role="CL",sent_to=task.created_by) |
361 #claims = task.notifications_task.filter(role="CL",sent_to=task.created_by) |
362 # this is what the next line should be when i re sync the db |
362 # this is what the next line should be when i re sync the db |
363 claims = Notification.objects.filter(task=task, sent_to=task.created_by, role="CL") |
363 claims = Notification.objects.filter(task=task, sent_to=task.created_by, role="CL") |
364 |
364 |
365 mentors = task.mentors.all() |
365 reviewers = task.reviewers.all() |
366 claimed_users = task.claimed_users.all() |
366 claimed_users = task.claimed_users.all() |
367 assigned_users = task.assigned_users.all() |
367 assigned_users = task.assigned_users.all() |
368 |
368 |
369 is_guest = True if not user.is_authenticated() else False |
369 is_guest = True if not user.is_authenticated() else False |
370 is_mentor = True if user in mentors else False |
370 is_reviewer = True if user in reviewers else False |
371 |
371 |
372 task_claimable = True if task.status in ["OP", "WR"] else False |
372 task_claimable = True if task.status in ["OP", "WR"] else False |
373 user_can_claim = True if task_claimable and not ( is_guest or is_mentor ) and ( user not in claimed_users ) and ( user not in assigned_users ) else False |
373 user_can_claim = True if task_claimable and not ( is_guest or is_reviewer ) and ( user not in claimed_users ) and ( user not in assigned_users ) else False |
374 task_claimed = True if claimed_users else False |
374 task_claimed = True if claimed_users else False |
375 |
375 |
376 context = {'user':user, |
376 context = {'user':user, |
377 'is_mentor':is_mentor, |
377 'is_reviewer':is_reviewer, |
378 'task':task, |
378 'task':task, |
379 'claims':claims, |
379 'claims':claims, |
380 'user_can_claim':user_can_claim, |
380 'user_can_claim':user_can_claim, |
381 'task_claimable':task_claimable, |
381 'task_claimable':task_claimable, |
382 'task_claimed':task_claimed, |
382 'task_claimed':task_claimed, |
455 |
455 |
456 user = get_user(request.user) if request.user.is_authenticated() else request.user |
456 user = get_user(request.user) if request.user.is_authenticated() else request.user |
457 task = getTask(tid) |
457 task = getTask(tid) |
458 |
458 |
459 is_guest = True if not user.is_authenticated() else False |
459 is_guest = True if not user.is_authenticated() else False |
460 is_mentor = True if user in task.mentors.all() else False |
460 is_reviewer = True if user in task.reviewers.all() else False |
461 |
461 |
462 claimed_users = task.claimed_users.all() |
462 claimed_users = task.claimed_users.all() |
463 assigned_users = task.assigned_users.all() |
463 assigned_users = task.assigned_users.all() |
464 |
464 |
465 task_claimed = True if claimed_users else False |
465 task_claimed = True if claimed_users else False |
466 |
466 |
467 if (not is_guest) and is_mentor: |
467 if (not is_guest) and is_reviewer: |
468 if task.status in ["OP", "WR"]: |
468 if task.status in ["OP", "WR"]: |
469 if task_claimed: |
469 if task_claimed: |
470 user_list = ((user.id,user.username) for user in claimed_users) |
470 user_list = ((user.id,user.username) for user in claimed_users) |
471 form = ChoiceForm(user_list) |
471 form = ChoiceForm(user_list) |
472 |
472 |
485 return show_msg(user, "The task cannot be assigned to users at this stage", task_url, 'view the task') |
485 return show_msg(user, "The task cannot be assigned to users at this stage", task_url, 'view the task') |
486 else: |
486 else: |
487 return show_msg(user, 'You are not authorised to perform this action', task_url, 'view the task') |
487 return show_msg(user, 'You are not authorised to perform this action', task_url, 'view the task') |
488 |
488 |
489 def assign_credits(request, tid): |
489 def assign_credits(request, tid): |
490 """ Check if the user is a mentor and credits can be assigned. |
490 """ Check if the user is a reviewer and credits can be assigned. |
491 Then display all the approved credits. |
491 Then display all the approved credits. |
492 Then see if mentor can assign credits to users also or only mentors. |
492 Then see if reviewer can assign credits to users also or only reviewers. |
493 Then put up a form for mentor to assign credits accordingly. |
493 Then put up a form for reviewer to assign credits accordingly. |
494 """ |
494 """ |
495 |
495 |
496 task_url = "/task/view/tid=%s"%tid |
496 task_url = "/task/view/tid=%s"%tid |
497 |
497 |
498 user = get_user(request.user) if request.user.is_authenticated() else request.user |
498 user = get_user(request.user) if request.user.is_authenticated() else request.user |
499 task = getTask(tid) |
499 task = getTask(tid) |
500 |
500 |
501 ## the moment we see that user had requested credits, it means he had worked and hence we change the status to WR |
501 ## the moment we see that user had requested credits, it means he had worked and hence we change the status to WR |
502 ## we have to discuss on this since, credits may also be given to mentor |
502 ## we have to discuss on this since, credits may also be given to reviewer |
503 task.status = "WR" |
503 task.status = "WR" |
504 task.save() |
504 task.save() |
505 |
505 |
506 is_guest = True if not user.is_authenticated() else False |
506 is_guest = True if not user.is_authenticated() else False |
507 is_mentor = True if (not is_guest) and user in task.mentors.all() else False |
507 is_reviewer = True if (not is_guest) and user in task.reviewers.all() else False |
508 |
508 |
509 if is_mentor: |
509 if is_reviewer: |
510 if task.status in ["OP", "WR"]: |
510 if task.status in ["OP", "WR"]: |
511 choices = [(_.id,_.username) for _ in task.mentors.all()] |
511 choices = [(_.id,_.username) for _ in task.reviewers.all()] |
512 if task.status == "WR": |
512 if task.status == "WR": |
513 choices.extend([(_.id, _.username) for _ in task.assigned_users.all() ]) |
513 choices.extend([(_.id, _.username) for _ in task.assigned_users.all() ]) |
514 prev_credits = task.request_task.filter(role="PY",is_valid=True,is_replied=True,reply=True).count() |
514 prev_credits = task.request_task.filter(role="PY",is_valid=True,is_replied=True,reply=True).count() |
515 credit_requests = task.request_task.filter(role="PY",is_valid=True).order_by('creation_date').reverse() |
515 credit_requests = task.request_task.filter(role="PY",is_valid=True).order_by('creation_date').reverse() |
516 form = AssignCreditForm(choices) |
516 form = AssignCreditForm(choices) |
580 |
580 |
581 user = get_user(request.user) if request.user.is_authenticated() else request.user |
581 user = get_user(request.user) if request.user.is_authenticated() else request.user |
582 task = getTask(tid) |
582 task = getTask(tid) |
583 |
583 |
584 is_guest = True if not user.is_authenticated() else False |
584 is_guest = True if not user.is_authenticated() else False |
585 is_mentor = True if user in task.mentors.all() else False |
585 is_reviewer = True if user in task.reviewers.all() else False |
586 |
586 |
587 claimed_users = task.claimed_users.all() |
587 claimed_users = task.claimed_users.all() |
588 assigned_users = task.assigned_users.all() |
588 assigned_users = task.assigned_users.all() |
589 |
589 |
590 assign_credits_url = '/task/assigncredits/tid=%s'%task.id |
590 assign_credits_url = '/task/assigncredits/tid=%s'%task.id |
591 task_assigned_credits = task.credit_set.all() |
591 task_assigned_credits = task.credit_set.all() |
592 |
592 |
593 |
593 |
594 if is_mentor: |
594 if is_reviewer: |
595 if task.status in ["OP", "WR"]: |
595 if task.status in ["OP", "WR"]: |
596 |
596 |
597 context = { |
597 context = { |
598 'user':user, |
598 'user':user, |
599 'task':task, |
599 'task':task, |