added the functionality to assign a task to one of the claimed users.
--- 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()
--- 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
--- 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')
+
+
--- /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.<br />
+ <form action="" method="POST">
+ {{form.as_table}}
+ <input type="submit" value="Assign Task">
+ </form>
+{% endblock %}
--- /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 <a href="/task/view/tid={{task.id}}">{{task.title}}</a><br />
+ {% for claim in claims %}
+ <hr />
+ <a href="/user/view/uid={{claim.user.id}}">{{claim.user.username}}</a> at {{claim.creation_datetime.ctime}} wrote:<br />
+ {{claim.message}}<br />
+ {% endfor %}
+ {% if task_claimable and is_mentor %}
+ <a href="/task/assign/tid={{task.id}}">Assign task</a>
+ {% endif %}
+ {% if user_can_claim %}
+ <hr />
+ {% if errors %}
+ {% for error in errors %}
+ {{error}}<br />
+ {% endfor %}
+ {% endif %}
+ Claim the task:<br />
+ <form action="" method="post">
+ <textarea name="message"></textarea><br />
+ <input type="submit" value="Submit Claim">
+ </form>
+ {% endif %}
+{% endblock %}
--- 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 @@
<br />{{ task.desc }}<br />
<hr>
status of task is {{task.status}}<br />
- {% if user_can_view_claim %}
+ {% if assigned_user %}
+ Task has been assigned to <a href="/user/view/uid={{assigned_user.id}}">{{assigned_user.username}}</a><br />
+ {% endif %}
+ {% if not is_guest %}
<a href="/task/claim/tid={{task.id}}">View claims</a><br />
- view claims goes here depending on availability of claim<br />
{% endif %}
{% if comments %}
+ <hr />
<br/>comments:<br />
{% for comment in comments %}
<br /><a href="/user/view/uid={{comment.created_by.id}}">{{ comment.created_by.username }}</a> at {{ comment.creation_datetime.ctime }} wrote:<br />
--- 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)),