# HG changeset patch # User nishanth # Date 1265016640 -19800 # Node ID 293692eb8f0648502675cb16992d86cbe70cd82c # Parent c6038cbf8a3990c4cddebec3c019ca9d3d4d928a added the functionality to assign a task to one of the claimed users. diff -r c6038cbf8a39 -r 293692eb8f06 pytask/taskapp/events/task.py --- a/pytask/taskapp/events/task.py Mon Feb 01 11:41:26 2010 +0530 +++ b/pytask/taskapp/events/task.py Mon Feb 01 15:00:40 2010 +0530 @@ -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 @@ 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 -r c6038cbf8a39 -r 293692eb8f06 pytask/taskapp/forms/task.py --- a/pytask/taskapp/forms/task.py Mon Feb 01 11:41:26 2010 +0530 +++ b/pytask/taskapp/forms/task.py Mon Feb 01 15:00:40 2010 +0530 @@ -19,3 +19,11 @@ 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 -r c6038cbf8a39 -r 293692eb8f06 pytask/taskapp/views/task.py --- a/pytask/taskapp/views/task.py Mon Feb 01 11:41:26 2010 +0530 +++ b/pytask/taskapp/views/task.py Mon Feb 01 15:00:40 2010 +0530 @@ -4,8 +4,8 @@ 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 @@ 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 @@ '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 @@ ## 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 -r c6038cbf8a39 -r 293692eb8f06 pytask/templates/task/assign.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pytask/templates/task/assign.html Mon Feb 01 15:00:40 2010 +0530 @@ -0,0 +1,8 @@ +{% extends 'base.html' %} +{% block content %} + Select a user to assign this task.
+
+ {{form.as_table}} + +
+{% endblock %} diff -r c6038cbf8a39 -r 293692eb8f06 pytask/templates/task/claim.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pytask/templates/task/claim.html Mon Feb 01 15:00:40 2010 +0530 @@ -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 -r c6038cbf8a39 -r 293692eb8f06 pytask/templates/task/view.html --- a/pytask/templates/task/view.html Mon Feb 01 11:41:26 2010 +0530 +++ b/pytask/templates/task/view.html Mon Feb 01 15:00:40 2010 +0530 @@ -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 -r c6038cbf8a39 -r 293692eb8f06 pytask/urls.py --- a/pytask/urls.py Mon Feb 01 11:41:26 2010 +0530 +++ b/pytask/urls.py Mon Feb 01 15:00:40 2010 +0530 @@ -5,7 +5,7 @@ admin.autodiscover() 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 +from pytask.taskapp.views.task import browse_tasks, view_task, create_task, add_mentor, add_tasks, claim_task, assign_task urlpatterns = patterns('', # Example: @@ -22,6 +22,7 @@ (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)),