From 9f940aa6a9e67241d1c680b35b8f280f7210c514 Mon Sep 17 00:00:00 2001 From: nishanth Date: Thu, 4 Feb 2010 23:15:37 +0530 Subject: added the functionality to assign a task to one of the claimed users. --- taskapp/events/task.py | 24 +++++++++++++++- taskapp/forms/task.py | 8 ++++++ taskapp/views/task.py | 69 ++++++++++++++++++++++++++++++++++++++++------ templates/task/assign.html | 8 ++++++ templates/task/claim.html | 25 +++++++++++++++++ templates/task/view.html | 7 +++-- urls.py | 5 ++-- 7 files changed, 132 insertions(+), 14 deletions(-) create mode 100644 templates/task/assign.html create mode 100644 templates/task/claim.html diff --git a/taskapp/events/task.py b/taskapp/events/task.py index 85845b7..c9d3a21 100644 --- a/taskapp/events/task.py +++ b/taskapp/events/task.py @@ -1,5 +1,5 @@ from datetime import datetime -from pytask.taskapp.models import Profile, Task, Comment, Credit +from pytask.taskapp.models import Profile, Task, Comment, Credit, Claim def publishTask(task): """ set the task status to open """ @@ -39,3 +39,25 @@ def addSubTask(main_task, sub_task): main_task.status = "LO" main_task.save() return main_task + +def addClaim(task, message, user): + """ add claim data to the database if it does not exist + and also update the claimed users field of the task. + """ + + task.claimed_users.add(user) + task.status = "CL" + task.save() + claim = Claim() + claim.message = message + claim.task = task + claim.user = user + claim.creation_datetime = datetime.now() + claim.save() + +def assignTask(task, user): + """ check for the status of task and assign it to the particular user """ + + task.assigned_users.add(user) + task.status = "AS" + task.save() diff --git a/taskapp/forms/task.py b/taskapp/forms/task.py index b4303e3..953f615 100644 --- a/taskapp/forms/task.py +++ b/taskapp/forms/task.py @@ -19,3 +19,11 @@ class ClaimTaskForm(forms.ModelForm): class Meta: model = Claim fields = ['message'] + +def AssignTaskForm(choices, instance=None): + """ return a form object with appropriate choices """ + + class myform(forms.Form): + user = forms.ChoiceField(choices=choices, required=True) + form = myform() + return form diff --git a/taskapp/views/task.py b/taskapp/views/task.py index f08a82f..0fbc6aa 100644 --- a/taskapp/views/task.py +++ b/taskapp/views/task.py @@ -4,8 +4,8 @@ from django.http import HttpResponse from django.shortcuts import render_to_response, redirect from pytask.taskapp.models import User, Task, Comment, Claim -from pytask.taskapp.forms.task import TaskCreateForm, AddMentorForm -from pytask.taskapp.events.task import createTask, addMentor, publishTask, addSubTask +from pytask.taskapp.forms.task import TaskCreateForm, AddMentorForm, AssignTaskForm +from pytask.taskapp.events.task import createTask, addMentor, publishTask, addSubTask, addClaim, assignTask from pytask.taskapp.views.user import show_msg ## everywhere if there is no task, django should display 500 message.. but take care of that in sensitive views like add mentor and all @@ -39,7 +39,6 @@ def view_task(request, tid): is_mentor = True if user in task.mentors.all() else False task_claimable = True if task.status in ["OP", "RE"] else False - user_can_view_claim = True if ( task_claimable and not ( is_guest or is_mentor ) ) else False context = {'user':user, 'task':task, @@ -47,9 +46,11 @@ def view_task(request, tid): 'mentors':mentors, 'is_guest':is_guest, 'is_mentor':is_mentor, - 'user_can_view_claim':user_can_view_claim, 'errors':errors, } + + if task.status == "AS": + context['assigned_user'] = task.assigned_users.all()[0] if request.method == 'POST': if not is_guest: @@ -172,25 +173,75 @@ def claim_task(request, tid): ## see if that "one to n" or "n to one" relationship has a special field task_url = "/task/view/tid=%s"%tid + claim_url = "/task/claim/tid=%s"%tid + + errors = [] user = request.user task = Task.objects.get(id=tid) claims = Claim.objects.filter(task=task) is_guest = True if not user.is_authenticated() else False + if user in task.mentors.all(): + is_mentor = True + else: + is_mentor = False - task_claimable = True if task.status in ["OP", "RE"] else False - user_can_claim = True if ( task_claimable and not ( is_guest or is_mentor ) and ( user not in task.claimed_users.all() ) ) else False + task_claimable = True if task.status in ["OP", "RE", "CL"] else False + user_can_claim = True if task_claimable and not ( is_guest or is_mentor ) and ( user not in task.claimed_users.all() ) else False + + context = {'is_mentor':is_mentor, + 'task':task, + 'claims':claims, + 'user_can_claim':user_can_claim, + 'task_claimable':task_claimable, + 'errors':errors} if not is_guest: - if task_claimable: - pass + if request.method == "POST": + claim_proposal = request.POST['message'] + if claim_proposal: + addClaim(task, claim_proposal, user) + return redirect(claim_url) + else: + errors.append('Please fill up proposal in the field below') + return render_to_response('task/claim.html', context) else: - return show_msg('You are not logged in to view claims for this task', task_url, 'view the task') + return render_to_response('task/claim.html', context) else: return show_msg('You are not logged in to view claims for this task', task_url, 'view the task') +def assign_task(request, tid): + """ first get the status of the task and then assign it to one of claimed users + generate list of claimed users by passing it as an argument to a function. + """ + task_url = "/task/view/tid=%s"%tid + user = request.user + task = Task.objects.get(id=tid) + + is_guest = True if not user.is_authenticated() else False + is_mentor = True if user in task.mentors.all() else False + + task_claimed = True if task.status == "CL" else False + + if (not is_guest) and is_mentor: + if task_claimed: + user_list = ((user.id,user.username) for user in task.claimed_users.all()) + form = AssignTaskForm(user_list) + + if request.method == "POST": + uid = request.POST['user'] + assigned_user = User.objects.get(id=uid) + assignTask(task, assigned_user) + return redirect(task_url) + else: + return render_to_response('task/assign.html',{'form':form}) + else: + return show_msg('The task is already assigned', task_url, 'view the task') + else: + return show_msg('You are not authorised to perform this action', task_url, 'view the task') + diff --git a/templates/task/assign.html b/templates/task/assign.html new file mode 100644 index 0000000..232b56d --- /dev/null +++ b/templates/task/assign.html @@ -0,0 +1,8 @@ +{% extends 'base.html' %} +{% block content %} + Select a user to assign this task.
+
+ {{form.as_table}} + +
+{% endblock %} diff --git a/templates/task/claim.html b/templates/task/claim.html new file mode 100644 index 0000000..e758f42 --- /dev/null +++ b/templates/task/claim.html @@ -0,0 +1,25 @@ +{% extends 'base.html' %} +{% block content %} + List of all the claims for the task {{task.title}}
+ {% for claim in claims %} +
+ {{claim.user.username}} at {{claim.creation_datetime.ctime}} wrote:
+ {{claim.message}}
+ {% endfor %} + {% if task_claimable and is_mentor %} + Assign task + {% endif %} + {% if user_can_claim %} +
+ {% if errors %} + {% for error in errors %} + {{error}}
+ {% endfor %} + {% endif %} + Claim the task:
+
+
+ +
+ {% endif %} +{% endblock %} diff --git a/templates/task/view.html b/templates/task/view.html index b20356b..ebeacca 100644 --- a/templates/task/view.html +++ b/templates/task/view.html @@ -20,12 +20,15 @@
{{ task.desc }}

status of task is {{task.status}}
- {% if user_can_view_claim %} + {% if assigned_user %} + Task has been assigned to {{assigned_user.username}}
+ {% endif %} + {% if not is_guest %} View claims
- view claims goes here depending on availability of claim
{% endif %} {% if comments %} +

comments:
{% for comment in comments %}
{{ comment.created_by.username }} at {{ comment.creation_datetime.ctime }} wrote:
diff --git a/urls.py b/urls.py index 2386de6..160f550 100644 --- a/urls.py +++ b/urls.py @@ -4,8 +4,8 @@ from django.conf.urls.defaults import * from django.contrib import admin admin.autodiscover() -from pytask.taskapp.views.user import homepage, register, user_login, user_logout, view_my_profile, edit_my_profile -from pytask.taskapp.views.task import browse_tasks, view_task, create_task, add_mentor, add_tasks, claim_task +from pytask.taskapp.views.user import homepage, register, user_login, user_logout +from pytask.taskapp.views.task import browse_tasks, view_task, create_task, add_mentor, add_tasks, claim_task, assign_task urlpatterns = patterns('', # Example: @@ -23,6 +23,7 @@ urlpatterns = patterns('', (r'^task/addmentor/tid=(\d+)', add_mentor), (r'^task/addtasks/tid=(\d+)', add_tasks), (r'^task/claim/tid=(\d+)', claim_task), + (r'^task/assign/tid=(\d+)', assign_task), (r'^admin/', include(admin.site.urls)), -- cgit