pytask/taskapp/events/request.py
author Madhusudan.C.S <madhusudancs@gmail.com>
Thu, 06 Jan 2011 19:07:04 +0530
branchbuildout
changeset 227 3c8f3b0e5b00
permissions -rw-r--r--
Add support for buildout and move the files to the directory to support buildout structure.

from datetime import datetime
from pytask.taskapp.models import Profile
from pytask.taskapp.events.task import  addMentor
from pytask.taskapp.events.user import changeRole
from pytask.taskapp.utilities.notification import create_notification

def reply_to_request(request_obj, reply, replied_by):
    """
    makes a request replied with the given reply.
    arguments:
        request_obj - Request object for which change is intended
        reply - a boolean value to be given as reply (True/False)
        replied_by - the user object who replies to the request
    """
    if not request_obj.is_replied:
        request_obj.reply = reply
        request_obj.is_replied = True
        request_obj.reply_date = datetime.now()
        request_obj.replied_by = replied_by
        request_obj.save()

        if request_obj.role == "PY":
            ## note that we are not doing any check. we make requests invalid when an event like closing task happens.
            task = request_obj.task
            pynts = request_obj.pynts
            receiving_user = request_obj.receiving_user
            requested_by = request_obj.sent_by
            create_notification(request_obj.role, receiving_user, replied_by, reply, task, request_obj.remarks, requested_by, receiving_user, pynts)
            if receiving_user != requested_by:
                create_notification(request_obj.role, requested_by, replied_by, reply, task, request_obj.remarks, requested_by, receiving_user, pynts)

        elif request_obj.role == "MT":
            task = request_obj.task
            requested_by = request_obj.sent_by
            if reply:
                ## tell the replied user that he is mentor for this task and give him learn more link
                create_notification("NT", request_obj.replied_by, task=task) 

                ## now check if there are such similar requests and mark them as invalid
                ## they cannot be of type PY and so we can use the replied_by to get requests
                pending_requests = replied_by.request_sent_to.filter(is_valid=True, is_replied=False, role="MT",task=task)
                for req in pending_requests:
                       create_notification("MT", req.sent_by, replied_by, False, task=req.task, remarks = "User has already accepted one such request and is a mentor.", requested_by = req.sent_by)
                       req.is_valid = False
                       req.save()

                ## alert all the mentors including who made request and all assigned users
                for a_mentor in task.mentors.all():
                    create_notification(request_obj.role, a_mentor, replied_by, True, task, request_obj.remarks, requested_by)
                for a_user in task.assigned_users.all():
                    create_notification(request_obj.role, a_user, replied_by, True, task, request_obj.remarks, requested_by)

                addMentor(task, request_obj.replied_by)
            else:
                ## tell the requested user that his request was rejected due to these reasons.
                create_notification(request_obj.role, requested_by, replied_by, False, task, request_obj.remarks, requested_by)

        elif request_obj.role == "DV":
            if reply:
                ## here we look for requests that are similar => requesting for DV and make them invalid
                ## also we drop a notification to user who made request
                pending_requests = request_obj.replied_by.request_sent_to.filter(is_valid=True,is_replied=False,role="DV")
                for req in pending_requests:
                    req.is_valid = False
                    req.save()
                    create_notification(role = req.role, sent_to = req.sent_by, sent_from = replied_by, reply = False, \
                                        remarks = "User has accepted a similar request and has rights same or higher privileged than the request", \
                                        requested_by = req.sent_by )

                ## tell only the user who made him a DV
                ## drop a welcome message to that fucker
                create_notification(request_obj.role, request_obj.sent_by, request_obj.replied_by, reply, requested_by=request_obj.sent_by)
                create_notification("ND", request_obj.replied_by, requested_by=request_obj.sent_by)
                changeRole(role=request_obj.role, user=request_obj.replied_by)

            else:
                create_notification(request_obj.role, request_obj.sent_by, request_obj.replied_by, reply, remarks=request_obj.remarks, requested_by=request_obj.sent_by)

        elif request_obj.role == "MG":
            if reply:
                ## tell all the MG and AD
                alerting_users = Profile.objects.filter(user__is_active=True).exclude(rights="CT").exclude(rights="DV")
                for a_profile in alerting_users:
                    create_notification(request_obj.role, a_profile.user, request_obj.replied_by, reply, requested_by=request_obj.sent_by)

                ## here we look for requests that less or similar => requesting for DV or MG and make them invalid
                ## also we drop a notification to user who made request
                active_requests = request_obj.replied_by.request_sent_to.filter(is_valid=True,is_replied=False)
                pending_requests = active_requests.filter(role="DV") | active_requests.filter(role="MG")
                for req in pending_requests:
                    req.is_valid = False
                    req.save()
                    create_notification(role = req.role, sent_to = req.sent_by, sent_from = replied_by, reply = False, \
                                        remarks = "User has accepted a similar request and has rights same or higher privileged than the request", \
                                        requested_by = req.sent_by )

                ## drop a welcome message to that fucker
                create_notification("NG", request_obj.replied_by, requested_by=request_obj.sent_by)
                changeRole(role=request_obj.role, user=request_obj.replied_by)

            else:
                create_notification(request_obj.role, request_obj.sent_by, request_obj.replied_by, reply, remarks=request_obj.remarks, requested_by=request_obj.sent_by)

        elif request_obj.role == "AD":
            if reply:

                ## here we look for requests that less or similar => requesting for DV or MG or AD and make them invalid
                ## also we drop a notification to user who made request
                active_requests = request_obj.replied_by.request_sent_to.filter(is_valid=True,is_replied=False)
                pending_requests = active_requests.filter(role="DV") | active_requests.filter(role="MG") | active_requests.filter(role="AD")
                for req in pending_requests:
                    req.is_valid = False
                    req.save()
                    create_notification(role = req.role, sent_to = req.sent_by, sent_from = replied_by, reply = False, \
                                        remarks = "User has accepted a similar request and has rights same or higher privileged than the request", \
                                        requested_by = req.sent_by )
                ## tell all the AD
                alerting_users = Profile.objects.filter(user__is_active=True).filter(rights="AD")
                for a_profile in alerting_users:
                    create_notification(request_obj.role, a_profile.user, request_obj.replied_by, reply, requested_by=request_obj.sent_by)

                ## drop a welcome message to that fucker
                create_notification("NA", request_obj.replied_by, requested_by=request_obj.sent_by)
                changeRole(role=request_obj.role, user=request_obj.replied_by)

            else:
                create_notification(request_obj.role, request_obj.sent_by, request_obj.replied_by, reply, remarks=request_obj.remarks, requested_by=request_obj.sent_by)

        return True #Reply has been added successfully
    return False #Already replied