taskapp/views/task.py
branchbuildout
changeset 227 3c8f3b0e5b00
parent 214 679c7e237052
child 228 81994e525e69
--- a/taskapp/views/task.py	Tue Mar 09 11:39:34 2010 +0530
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,660 +0,0 @@
-from datetime import datetime
-
-from django.http import HttpResponse, Http404
-from django.shortcuts import render_to_response, redirect
-
-from pytask.taskapp.models import User, Task, Comment, Request, Notification
-from pytask.taskapp.utilities.task import getTask
-from pytask.taskapp.forms.task import TaskCreateForm, AddMentorForm, AddTaskForm, ChoiceForm, AssignCreditForm, RemoveUserForm, EditTaskForm, ClaimTaskForm
-from pytask.taskapp.events.task import createTask, reqMentor, publishTask, addSubTask, addDep, addClaim, assignTask, updateTask, removeTask, removeUser, assignCredits, completeTask, closeTask, addMentor, deleteTask
-from pytask.taskapp.views.user import show_msg
-from pytask.taskapp.utilities.user import get_user
-
-## everywhere if there is no task, django should display 500 message.. but take care of that in sensitive views like add mentor and all
-## do not create su user thro syncdb
-
-def browse_tasks(request):
-    """ display all the tasks """
-    
-    user = get_user(request.user) if request.user.is_authenticated() else request.user
-    task_list = Task.objects.exclude(status="UP").exclude(status="DL").order_by('published_datetime').reverse()
-    
-    context = {'user':user,
-               'task_list':task_list,
-               }
-    return render_to_response('task/browse.html', context)
-
-def publish_task(request, tid):
-    """ check if user is the mentor and also if the task status is UP.
-    """
-
-    task_url = "/task/view/tid=%s"%tid
-    
-    user = get_user(request.user) if request.user.is_authenticated() else request.user
-    task = getTask(tid)
-
-    is_guest = True if not user.is_authenticated() else False
-    is_mentor = True if user in task.mentors.all() else False
-
-    if user == task.created_by:
-        context = {
-            'user':user,
-        }
-        if task.status == "UP":
-            if request.method == "POST":
-                publishTask(task)
-                return show_msg(user, "The task has been published", task_url, "view the task")
-            else:
-                return render_to_response('task/publish.html', context)
-        else:
-            return show_msg(user, "The task is already published", task_url, "view the task")
-    else:
-        return show_msg(user, "You are not authorised to do this", '/task/browse/', "browse tasks")
-
-def view_task(request, tid):
-    """ get the task depending on its tid and display accordingly if it is a get.
-    check for authentication and add a comment if it is a post request.
-    """
-    
-    task_url = "/task/view/tid=%s"%tid
-    
-    user = get_user(request.user) if request.user.is_authenticated() else request.user
-    task = getTask(tid)
-
-    if task.status == "DL":
-        return show_msg(user, 'This task no longer exists', '/task/browse/','browse the tasks')
-    comments = task.comment_set.filter(is_deleted=False).order_by('creation_datetime')
-    mentors = task.mentors.all()
-
-    deps, subs = task.deps, task.subs
-    
-    is_guest = True if not user.is_authenticated() else False
-    is_mentor = True if user in task.mentors.all() else False
-    context = {'user':user,
-               'task':task,
-               'comments':comments,
-               'mentors':mentors,
-               'subs':subs,
-               'deps':deps,
-               'is_guest':is_guest,
-               'is_mentor':is_mentor,
-              }
-
-    claimed_users = task.claimed_users.all()
-
-
-    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
-    task_viewable = True if ( task.status != "UP" ) or is_mentor or is_requested_mentor else False
-    if not task_viewable:
-        return show_msg(user, "You are not authorised to view this task", "/task/browse/", "browse the tasks")
-
-    context['is_requested_mentor'] = is_requested_mentor
-
-    context['can_publish'] = True if task.status == "UP" and user == task.created_by else False
-    context['can_edit'] = True if task.status == "UP" and is_mentor else False
-    context['can_close'] = True if task.status not in ["UP", "CD", "CM"] and is_mentor else False
-    context['can_delete'] = True if task.status == "UP" and user == task.created_by else False
-
-    context['can_mod_mentors'] = True if task.status in ["UP", "OP", "LO", "WR"] and is_mentor else False
-    context['can_mod_tasks'] = True if task.status in ["UP", "OP", "LO"] and is_mentor else False
-
-    context['can_assign_credits'] = True if task.status in ["OP", "WR"] and is_mentor else False
-    context['task_claimable'] = True if task.status in ["OP", "WR"] and not is_guest else False
-
-    if task.status == "CD":
-        context['closing_notification'] =  Notification.objects.filter(task=task,role="CD")[0]
-    elif task.status == "CM":
-        context['completed_notification'] =  Notifications.objects.filter(task=task,role="CM")[0]
-    elif task.status == "WR":
-        context['assigned_users'] = task.assigned_users.all()
-   
-    if request.method == 'POST':
-        if not is_guest:
-            data = request.POST.get("data", "").strip()
-            if not data:
-                context['error_msg'] = "Enter some message to comment"
-                return render_to_response('task/view.html', context)
-            new_comment = Comment(task=task, data=data, created_by=user, creation_datetime=datetime.now())
-            new_comment.save()
-            return redirect(task_url)
-        else:
-            errors.append("You must be logged in to post a comment")
-            return render_to_response('task/view.html', context)
-    else:
-        return render_to_response('task/view.html', context)
-        
-def create_task(request):
-    """ check for rights and create a task if applicable.
-    if user cannot create a task, redirect to homepage.
-    """
-    
-    user = get_user(request.user) if request.user.is_authenticated() else request.user
-    is_guest = True if not user.is_authenticated() else False
-    
-    if not is_guest:
-        user_profile = user.get_profile()
-        can_create_task = False if user_profile.rights == "CT" else True
-        if can_create_task:
-            if request.method == "POST":
-                form = TaskCreateForm(request.POST)
-                if form.is_valid():
-                    data = form.cleaned_data
-                    title = data['title']
-                    desc = data['desc']
-                    credits = data['credits']
-                    #publish = data['publish'] # just in case if we have to show the option
-                    task = createTask(title,desc,user,credits)
-                    
-                    addMentor(task, user)
-                    updateTask(task,tags_field=data['tags_field'])
-                    # if publish: publishTask(task)    
-                    task_url = '/task/view/tid=%s'%task.id
-                    return redirect(task_url)
-                else:
-                    return render_to_response('task/create.html',{'user':user, 'form':form})
-            else:
-                form = TaskCreateForm()
-                return render_to_response('task/create.html',{'user':user, 'form':form})
-        else:
-            return show_msg(user, 'You are not authorised to create a task.')
-    else:
-        return show_msg(user, 'You are not authorised to create a task.', "/", "home page")
-        
-def add_mentor(request, tid):
-    """ check if the current user has the rights to edit the task and add him.
-    if user is not authenticated, redirect him to concerned page. """
-    
-    task_url = "/task/view/tid=%s"%tid
-    
-    user = get_user(request.user) if request.user.is_authenticated() else request.user
-    task = getTask(tid)
-    errors = []
-    
-    is_guest = True if not user.is_authenticated() else False
-    
-    if (not is_guest) and user in task.mentors.all():
-
-        pending_requests = Request.objects.filter(is_replied=False,is_valid=True,role="MT",task=task).order_by('creation_date').reverse()
-        user_pending_requests = pending_requests.filter(sent_by=user)
-
-        ## now iam going for a brute force method
-        user_list = list(User.objects.filter(is_active=True))
-        for mentor in task.mentors.all():
-            user_list.remove(mentor)
-            
-        for a_user in task.claimed_users.all():
-            user_list.remove(a_user)
-
-        for a_user in task.assigned_users.all():
-            user_list.remove(a_user)
-
-        for req in user_pending_requests:
-            user_list.remove(req.sent_to.all()[0])
-            
-        non_mentors = ((_.id, _.username) for _ in user_list)
-        non_mentor_ids = [ str(a_user.id) for a_user in user_list ]
-        ## code till must be made elegant and not brute force like above
-
-        form = AddMentorForm(non_mentors)
-
-        context = {
-            'user':user,
-            'task':task,
-            'pending_requests':pending_requests,
-            'form':form,
-        }
-
-        if request.method == "POST":
-            data = request.POST
-            uid = data.get('mentor', None)
-            if uid in non_mentor_ids:
-                new_mentor = User.objects.get(id=int(uid))
-                reqMentor(task, new_mentor, user)
-                return redirect('/task/addmentor/tid=%s'%task.id)
-            else:
-                ## bogus post request
-                raise Http404
-        else:
-            return render_to_response('task/addmentor.html', context)
-    else:
-        return show_msg(user, 'You are not authorised to add mentors for this task', task_url, 'view the task')
-    
-def add_tasks(request, tid):
-    """ first display tasks which can be subtasks for the task and do the rest.
-    """
-    
-    task_url = "/task/view/tid=%s"%tid
-    
-    user = get_user(request.user) if request.user.is_authenticated() else request.user
-    task = getTask(tid)
-
-    deps, subs = task.deps, task.subs
-    is_plain = False if deps or subs else True
-
-    ## again a brute force method
-    valid_tasks = []
-    for a_task in Task.objects.all():
-        if not ( a_task in deps or a_task in subs or a_task.status=="CD" or a_task==task ):
-            valid_tasks.append(a_task)
-
-    task_choices = [ (_.id,_.title) for _ in valid_tasks ]
-    errors = []
-    
-    is_guest = True if not user.is_authenticated() else False
-    
-    if (not is_guest) and user in task.mentors.all():
-        if task.status in ["UP", "OP", "LO"]:
-            form = AddTaskForm(task_choices, is_plain)
-            if request.method == "POST":
-                ## first decide if adding subs and deps can be in same page
-                ## only exclude tasks with status deleted
-                data = request.POST
-                if is_plain and not data.get('type', None): errors.append('Please choose which type of task(s) do you want to add.')
-                if not data.get('task', None): errors.append('Please choose a one task')
-
-                if not errors:
-                    if is_plain:
-                        update_method = addDep if data['type'] == "D" else addSubTask
-                    elif deps:
-                        update_method = addDep
-                    elif subs:
-                        update_method = addSubTask
-                    else:
-                        print "Screw you"
-
-                    ## we might iterate over a task list later on
-                    task_id = data['task']
-                    sub_or_dep = getTask(task_id)
-                    update_method(task, sub_or_dep)
-
-                    return redirect(task_url)
-                else:
-                    return render_to_response('task/addtask.html', {'user':user, 'form':form, 'errors':errors})
-            else:
-                return render_to_response('task/addtask.html', {'user':user, 'form':form, 'errors':errors})
-        else:
-            errors = ["The task cannot be added subtasks or dependencies in this state"]
-#            return render_to_response('task/add.html', {'form':form, 'errors':errors})
-            return show_msg(user, 'The task cannot be added subtasks or dependencies now', task_url, 'view the task')
-    else:
-        return show_msg(user, 'You are not authorised to add subtasks or dependencies for this task', task_url, 'view the task')
-    
-def remove_task(request, tid):
-    """ display a list of tasks and remove the selectes ones.
-    """
-
-    task_url = "/task/view/tid=%s"%tid
-    
-    user = get_user(request.user) if request.user.is_authenticated() else request.user
-    task = getTask(tid)
-
-    is_guest = True if not user.is_authenticated() else False
-    if (not is_guest) and user in task.mentors.all():
-
-        if task.status in ["UP", "LO", "OP"]:
-            
-            deps, subs = task.deps, task.subs
-            task_list = deps if task.sub_type == "D" else subs
-
-            if task_list:
-                choices = [(_.id,_.title) for _ in task_list ]
-                form = ChoiceForm(choices)
-
-                errors = []
-                
-                context = {
-                    'user':user,
-                    'task':task,
-                    'form':form,
-                }
-
-                if request.method == "POST":
-                    data = request.POST
-                    if not data.get('choice', None):
-                        errors.append("Please choose a task to remove.")
-                        context['errors'] = errors
-                    if not errors:
-                        tid = data['choice']
-                        sub_task = getTask(tid)
-                        removeTask(task, sub_task)
-                        return redirect(task_url)
-                    else:
-                        return render_to_response('task/removetask.html', context)
-                else:
-                    return render_to_response('task/removetask.html', context)
-            else:
-                return show_msg(user, "The task has no subtasks/dependencies to be removed", task_url, "view the task")
-        else:
-            return show_msg(user, "subtasks/dependencies cannot be removed at this stage", task_url, "view the task")
-    else:
-        return show_msg(user, "You are not authorised to do this", task_url, "view the task")
-
-def claim_task(request, tid):
-    """ display a list of claims for get and display submit only if claimable """
-
-    ## create claims model and create a new database with required tables for it
-    ## 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 = get_user(request.user) if request.user.is_authenticated() else request.user
-    task = getTask(tid)
-    
-    #claims = task.notifications_task.filter(role="CL",sent_to=task.created_by) 
-    # this is what the next line should be when i re sync the db
-    claims = Notification.objects.filter(task=task, sent_to=task.created_by, role="CL")
-
-    mentors = task.mentors.all()
-    claimed_users = task.claimed_users.all()
-    assigned_users = task.assigned_users.all()
-    
-    is_guest = True if not user.is_authenticated() else False
-    is_mentor = True if user in mentors else False
-
-    task_claimable = True if task.status in ["OP", "WR"] else False
-    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
-    task_claimed = True if claimed_users else False
-    
-    context = {'user':user,
-               'is_mentor':is_mentor,
-               'task':task,
-               'claims':claims,
-               'user_can_claim':user_can_claim,
-               'task_claimable':task_claimable,
-               'task_claimed':task_claimed,
-               'errors':errors}
-    
-    if not is_guest:
-        form = ClaimTaskForm()
-        context['form'] = form
-        if request.method == "POST":
-            form = ClaimTaskForm(request.POST)
-            context['form'] = form
-            if form.is_valid():
-                claim_proposal = form.cleaned_data['message']
-                addClaim(task, claim_proposal, user)
-                return redirect(claim_url)
-            else:
-                return render_to_response('task/claim.html', context)
-        else:
-            return render_to_response('task/claim.html', context)
-    else:
-        return show_msg(user, 'You are not logged in to view claims for this task', task_url, 'view the task')
-    
-def rem_user(request, tid):
-    """ show a list of working users and ask for a message/reason for removing user.
-    """
-    
-    task_url = "/task/view/tid=%s"%tid
-    
-    user = get_user(request.user) if request.user.is_authenticated() else request.user
-    task = getTask(tid)
-    
-    is_guest = True if not user.is_authenticated() else False
-    is_mentor = True if user in task.mentors.all() else False
-
-    if (not is_guest) and is_mentor:
-
-        assigned_users = task.assigned_users.all()
-        choices = [ (_.id,_.username) for _ in assigned_users ]
-        context = {
-            'user':user,
-            'task':task,
-        }
-        
-        if task.status in ["WR"]:
-            if assigned_users:
-                form = RemoveUserForm(choices)
-                context['form'] = form
-                if request.method == "POST":
-                    data = request.POST
-                    form = RemoveUserForm(choices, data)
-                    if form.is_valid():
-                        data = form.cleaned_data
-                        uid = data['user']
-                        reason = data['reason']
-                        rem_user = User.objects.get(id=uid)
-                        removeUser(task, rem_user, user, reason)
-                        return redirect(task_url)
-                    else:
-                        context['form'] = form
-                        return render_to_response('task/remove_user.html', context)
-                else:
-                    return render_to_response('task/remove_user.html',context)
-            else:
-                return show_msg(user, "There is no one working on this task to be kicked off", task_url, "view the task")
-        else:
-            return show_msg(user, "This is not the stage to remove users", task_url, "view the task")
-    else:
-        return show_msg(user, "You are not authorised to do this", 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 = get_user(request.user) if request.user.is_authenticated() else request.user
-    task = getTask(tid)
-    
-    is_guest = True if not user.is_authenticated() else False
-    is_mentor = True if user in task.mentors.all() else False
-
-    claimed_users = task.claimed_users.all()
-    assigned_users = task.assigned_users.all()
-
-    task_claimed = True if claimed_users else False
-    
-    if (not is_guest) and is_mentor:
-        if task.status in ["OP", "WR"]:
-            if task_claimed:
-                user_list = ((user.id,user.username) for user in claimed_users)
-                form = ChoiceForm(user_list)
-        
-                if request.method == "POST":
-                    uid = request.POST['choice']
-                    assigned_user = User.objects.get(id=uid)
-                    assignTask(task, assigned_user, user)
-                    return redirect(task_url)
-                else:
-                    return render_to_response('task/assign.html',{'user':user, 'task':task,'form':form})
-            elif assigned_users:
-                return show_msg(user, 'When the no of users you need for the task is more than the no of users willing to do the task, I\'d say please re consider the task :P',task_url, 'view the task')
-            else:
-                return show_msg(user, 'Wait for ppl to claim dude... slow and steady wins the race :)', task_url, 'view the task')
-        else: 
-            return show_msg(user, "The task cannot be assigned to users at this stage", task_url, 'view the task')
-    else:
-        return show_msg(user, 'You are not authorised to perform this action', task_url, 'view the task')
-
-def assign_credits(request, tid):
-    """ Check if the user is a mentor and credits can be assigned.
-    Then display all the approved credits.
-    Then see if mentor can assign credits to users also or only mentors.
-    Then put up a form for mentor to assign credits accordingly.
-    """
-    
-    task_url = "/task/view/tid=%s"%tid
-    
-    user = get_user(request.user) if request.user.is_authenticated() else request.user
-    task = getTask(tid)
-
-    ## the moment we see that user had requested credits, it means he had worked and hence we change the status to WR
-    ## we have to discuss on this since, credits may also be given to mentor
-    task.status = "WR"
-    task.save()
-
-    is_guest = True if not user.is_authenticated() else False
-    is_mentor = True if (not is_guest) and user in task.mentors.all() else False
-
-    if is_mentor:
-        if task.status in ["OP", "WR"]:
-            choices = [(_.id,_.username) for _ in task.mentors.all()]
-            if task.status == "WR":
-                choices.extend([(_.id, _.username) for _  in task.assigned_users.all() ])
-            prev_credits = task.request_task.filter(role="PY",is_valid=True,is_replied=True,reply=True).count()
-            credit_requests = task.request_task.filter(role="PY",is_valid=True).order_by('creation_date').reverse()
-            form = AssignCreditForm(choices)
-
-            context = {
-                'user':user,
-                'task':task,
-                'prev_credits':prev_credits,
-                'credit_requests':credit_requests,
-                'form':form,
-            }
-
-            if request.method == "POST":
-                data = request.POST
-                form = AssignCreditForm(choices, data)
-                if form.is_valid():
-                    data = form.cleaned_data
-                    uid = data['user']
-                    points = data['pynts']
-                    given_to = User.objects.get(id=uid)
-                    assignCredits(task=task, given_by=user, given_to=given_to, points=points)
-                    return redirect('/task/assigncredits/tid=%s'%task.id)
-                else:
-                    context['form'] = form
-                    return render_to_response('task/assigncredits.html', context)
-            else:
-                return render_to_response('task/assigncredits.html', context)
-        else:
-            return show_msg(user, "Credits cannot be assigned at this stage", task_url, "view the task")
-    else:
-        return show_msg(user, "You are not authorised to perform this action", task_url, "view the task")
-
-def edit_task(request, tid):
-    """ see what are the attributes that can be edited depending on the current status
-    and then give the user fields accordingly.
-    """
-    
-    task = getTask(tid)
-
-    task_url = "/task/view/tid=%s"%tid
-    user = get_user(request.user) if request.user.is_authenticated() else request.user
-
-    is_mentor = True if user in task.mentors.all() else False
-    can_edit = True if is_mentor and task.status == "UP" else False
-
-    if can_edit:
-        form = EditTaskForm(instance=task)
-        if request.method=="POST":
-            data = request.POST
-            form = EditTaskForm(data, instance=task)
-            if form.is_valid():
-                form.save()
-                return redirect(task_url)
-            else:
-                return render_to_response('task/edittask.html',{'user':user, 'form':form})
-        else:
-            return render_to_response('task/edittask.html',{'user':user, 'form':form})
-    else:
-        return show_msg(user, "You cannot edit the task at this stage", task_url, "view the task")
-
-def complete_task(request, tid):
-    """ call the event called complete task.
-    and also pass it the current user to know who marked it as complete. 
-    """
-
-    task_url = "/task/view/tid=%s"%tid
-    
-    user = get_user(request.user) if request.user.is_authenticated() else request.user
-    task = getTask(tid)
-    
-    is_guest = True if not user.is_authenticated() else False
-    is_mentor = True if user in task.mentors.all() else False
-
-    claimed_users = task.claimed_users.all()
-    assigned_users = task.assigned_users.all()
-
-    assign_credits_url = '/task/assigncredits/tid=%s'%task.id
-    task_assigned_credits = task.credit_set.all()
-
-
-    if is_mentor:
-        if task.status in ["OP", "WR"]:
-
-            context = {
-                'user':user,
-                'task':task,
-            }
-
-            if task_assigned_credits:
-                if request.method=="POST":
-                    completeTask(task, user)
-                    return redirect(task_url)
-                else:
-                    return render_to_response('task/complete.html', context)
-            else:
-                return show_msg(user, "Nobody has been credited for doing this task.", assign_credits_url, "assign credits")
-        else:
-            return show_msg(user, "The task cannot be marked as completed at this stage", task_url, "view the task")
-    else:
-        return show_msg(user, "You are not authorised to do this", task_url, "view the task")
-
-def close_task(request, tid):
-    """ task can be closed only if task is published.
-    call the event close task if everything is fine.
-    """
-
-    task_url = "/task/view/tid=%s"%tid
-    
-    user = get_user(request.user) if request.user.is_authenticated() else request.user
-    task = getTask(tid)
-    
-    is_guest = True if not user.is_authenticated() else False
-    is_mentor = True if user in task.mentors.all() else False
-
-    if is_mentor:
-
-        context = {
-            'user':user,
-            'task':task,
-        }
-
-        if not task.status in ["UP", "CD", "DL", "CM"]:
-            if request.method == "POST":
-                data = request.POST
-                if not data.get("reason", None):
-                    context["error"] = "Please enter a reason for closing the task"
-                    return render_to_response('task/close.html', context)
-                else:
-                    closeTask(task, user, data['reason'])
-                    return show_msg(user, "The task has been closed.", task_url, "view the task.")
-            else:
-                return render_to_response('task/close.html', context)
-        else:
-            return show_msg(user, "The task is either already closed or cannot be closed at this stage", task_url, "view the task")
-    else:
-        return show_msg(user, "You are not authorised to do this", task_url, "view the task")
-
-def delete_task(request, tid):
-    """ mark the task status as DL.
-    take a reason from the user and pass on to all the other mentors.
-    """
-
-    task_url = "/task/view/tid=%s"%tid
-
-    task = getTask(tid)
-    user = get_user(request.user) if request.user.is_authenticated() else request.user
-
-    if task.status == "DL":
-        return show_msg(user, "This task no longer exists", '/task/browse/', "to browse other tasks")
-
-    can_delete = True if task.status == "UP" and task.created_by == user else False
-
-    if can_delete:
-        if request.method == "POST":
-            data = request.POST
-            reason = data.get('reason', None)
-            deleteTask(task, user, reason)
-            return show_msg(user, "The task is deleted", '/', "to return to home page")
-        else:
-            return render_to_response('task/delete.html',{'user':user,})
-    else:
-        return show_msg(user, "You are not authorised to do this at this stage", task_url, "view the task")