added the functionality to assign a task to one of the claimed users.
authornishanth
Thu, 04 Feb 2010 23:15:37 +0530
changeset 25 c0e4fc8b8b5b
parent 24 fcae44e94845
child 26 7c98e8968691
added the functionality to assign a task to one of the claimed users.
taskapp/events/task.py
taskapp/forms/task.py
taskapp/views/task.py
templates/task/assign.html
templates/task/claim.html
templates/task/view.html
urls.py
--- a/taskapp/events/task.py	Thu Feb 04 23:13:03 2010 +0530
+++ b/taskapp/events/task.py	Thu Feb 04 23:15:37 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/taskapp/forms/task.py	Thu Feb 04 23:13:03 2010 +0530
+++ b/taskapp/forms/task.py	Thu Feb 04 23:15:37 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/taskapp/views/task.py	Thu Feb 04 23:13:03 2010 +0530
+++ b/taskapp/views/task.py	Thu Feb 04 23:15:37 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/templates/task/assign.html	Thu Feb 04 23:15:37 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/templates/task/claim.html	Thu Feb 04 23:15:37 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/templates/task/view.html	Thu Feb 04 23:13:03 2010 +0530
+++ b/templates/task/view.html	Thu Feb 04 23:15:37 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/urls.py	Thu Feb 04 23:13:03 2010 +0530
+++ b/urls.py	Thu Feb 04 23:15:37 2010 +0530
@@ -4,8 +4,8 @@
 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 @@
     (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)),