diff options
Diffstat (limited to 'taskapp/events')
-rw-r--r-- | taskapp/events/__init__.py | 0 | ||||
-rw-r--r-- | taskapp/events/request.py | 130 | ||||
-rw-r--r-- | taskapp/events/task.py | 271 | ||||
-rw-r--r-- | taskapp/events/user.py | 56 |
4 files changed, 0 insertions, 457 deletions
diff --git a/taskapp/events/__init__.py b/taskapp/events/__init__.py deleted file mode 100644 index e69de29..0000000 --- a/taskapp/events/__init__.py +++ /dev/null diff --git a/taskapp/events/request.py b/taskapp/events/request.py deleted file mode 100644 index d69f717..0000000 --- a/taskapp/events/request.py +++ /dev/null @@ -1,130 +0,0 @@ -from datetime import datetime -from pytask.taskapp.models import Profile -from pytask.taskapp.events.task import addReviewer -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 reviewer 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 reviewer.", requested_by = req.sent_by) - req.is_valid = False - req.save() - - ## alert all the reviewers including who made request and all assigned users - for a_reviewer in task.reviewers.all(): - create_notification(request_obj.role, a_reviewer, 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) - - addReviewer(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 diff --git a/taskapp/events/task.py b/taskapp/events/task.py deleted file mode 100644 index 77ad361..0000000 --- a/taskapp/events/task.py +++ /dev/null @@ -1,271 +0,0 @@ -from datetime import datetime -from pytask.taskapp.models import Profile, Task, Comment, Map -from pytask.taskapp.utilities.task import getTask -from pytask.taskapp.utilities.request import create_request -from pytask.taskapp.utilities.helper import get_key -from pytask.taskapp.utilities.notification import create_notification - -def publishTask(task, rem_reviewers=True, rem_comments=True): - """ set the task status to open """ - - # if task.sub_type == 'D': - # deps, subs = task.map_subs.all(), [] - #else: - # subs, deps = task.map_subs.all(), [] - - task = getTask(task.id) - if task.subs or any(map(lambda t:t.status!="CM",task.deps)): - task.status = "LO" - else: - task.status = "OP" - - if rem_reviewers: - task.reviewers.clear() - task.reviewers.add(task.created_by) - - if rem_comments: - task.comment_set.update(is_deleted=True) - task.comment_set.update(deleted_by=task.created_by) - - task.published_datetime = datetime.now() - task.save() - - pending_requests = task.request_task.filter(is_valid=True, is_replied=False) - pending_requests.update(is_valid=False) - - return task - -def addSubTask(main_task, sub_task): - """ add the task to subs attribute of the task and update its status. - sub task can be added only if a task is in UP/OP/LO state. - """ - - ## Shall modify after talking to pr about subtasks - ## I think i might even remove the concept of subtasks - - main_task.sub_type = "S" - main_task.save() - - try: - mapobj = Map.objects.get(main=main_task) - except Map.DoesNotExist: - mapobj = Map() - mapobj.main = main_task - mapobj.save() - mapobj.subs.add(sub_task) - mapobj.save() - - sub_tasks = getTask(main_task.id).subs - if main_task.status == "OP": - if any(map(lambda t:t.status!="CM",sub_tasks)): - main_task.status = "LO" - else: - "CM" - main_task.save() - -def addDep(main_task, dependency): - """ add the dependency task to deps attribute of the task. - update the status of main_task accordingly. - note that deps can be added only if task is in UP/OP/LO state. - And also if the task doesn't have any subs. - """ - - main_task.sub_type = "D" - main_task.save() - - try: - mapobj = Map.objects.get(main=main_task) - except Map.DoesNotExist: - mapobj = Map() - mapobj.main = main_task - mapobj.save() - - mapobj.subs.add(dependency) - mapobj.save() - - deps = getTask(main_task.id).deps - - if main_task.status in ["OP", "LO"]: - if all(map(lambda t:t.status=="CM",deps)): - main_task.status = "OP" - else: - main_task.status = "LO" - - main_task.save() - -def reqReviewer(task, reviewer, req_by): - """ create a request object with role as MT. - """ - - create_request(sent_by=req_by, role="MT", sent_to=reviewer, task=task) - -def addReviewer(task,reviewer): - """ add the reviewer to reviewers list of the task """ - - task.reviewers.add(reviewer) - task.save() - return task - -def createTask(title,desc,created_by,pynts): - """ creates a bare minimum task with title, description and pynts. - the creator of the task will be assigned as a reviewer for the task. - """ - - while True: - id = get_key() - try: - task = Task.objects.get(id__iexact=id) - continue - except Task.DoesNotExist: - break - - try: - task = Task.objects.exclude(status="DL").get(title__iexact=title) - return None - except: - task = Task(title=title) - - task.id = id - task.desc = desc - task.created_by = created_by - task.pynts = pynts - task.creation_datetime = datetime.now() - task.published_datetime = datetime.now() - task.save() - return 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.save() - - pending_reqs = user.request_sent_to.filter(is_replied=False, is_valid=True, role="MT", task=task).all() - for req in pending_reqs: - req.is_valid = False - req.save() - user_url = '<a href="/user/view/uid=%s">%s</a>'%(user.id, user.username) - reason = "User has claimed the task and hence cannot be a reviewer and this request was made invalid." - create_notification("MT", req.sent_by, user, task=task, reply=False, remarks=reason, requested_by=req.sent_by) - - for a_reviewer in task.reviewers.all(): - create_notification("CL", a_reviewer, user, task=task, remarks=message) - -def assignTask(task, added_user, assigned_by): - """ check for the status of task and assign it to the particular user """ - - if task.status in ['OP', 'WR']: - task.assigned_users.add(added_user) - task.claimed_users.remove(added_user) - task.status = "WR" - task.save() - - create_notification("AU", added_user, assigned_by, task=task) - - -def updateTask(task, title=None, desc=None, pynts=None, tags_field=None): - """ update the property accordingly. - while updating title, check for uniqueness of title. - return None if any error. - """ - - if title: - try: - task.title = title - task.save() - except Task.IntegrityError: - return None - if desc:task.desc = desc - if pynts:task.pynts = pynts - if tags_field:task.tags_field = tags_field - task.save() - return task - -def removeTask(main_task, sub_task): - """ get the corresponding map object and remove the sub_task. - """ - - mapobj = Map.objects.get(main=main_task) - mapobj.subs.remove(sub_task) - mapobj.save() - -def removeUser(main_task, rem_user, removed_by, reason=None): - """ right now, just remove the user from the list of assigned_users. - """ - - main_task.assigned_users.remove(rem_user) - main_task.save() - - ## TODiscuss : when a user is kicked off, his pending requests for pynts is made invalid - rem_user.request_receiving_user.filter(task=main_task,role="PY",is_valid=True,is_replied=False).update(is_valid=False) - - create_notification("RU", rem_user, removed_by, task=main_task, remarks=reason) - ## TODO : create notification to the victim - -def assignPynts(task, given_by, given_to, points): - """ make a proper request object. - """ - - create_request(sent_by=given_by, role="PY", task=task, receiving_user=given_to, pynts=points ) - -def completeTask(task, marked_by): - """ set the status of task as completed. - We dont have to inform parent tasks. - That part is taken care by getTask method. - """ - - task.status = "CM" - task.save() - - pending_requests = task.request_task.filter(is_replied=False) - pending_requests.update(is_valid=False) - - ## generate notification appropriately using marked_by - ## we also have to mark unread requests as invalid - - for a_user in task.assigned_users.all(): - create_notification(role="CM", sent_to=a_user, sent_from=marked_by, task=task) - - for a_user in task.claimed_users.all(): - create_notification(role="CM", sent_to=a_user, sent_from=marked_by, task=task) - - for a_reviewer in task.reviewers.all(): - create_notification(role="CM", sent_to=a_reviewer, sent_from=marked_by, task=task) - -def closeTask(task, closed_by, reason=None): - """ set the status of task as CD. - generate notifications accordingly. - """ - - task.status = "CD" - task.save() - - pending_requests = task.request_task.filter(is_replied=False) - pending_requests.update(is_valid=False) - - ## generate notifications here - - for a_user in task.assigned_users.all(): - create_notification(role="CD", sent_to=a_user, sent_from=closed_by, task=task, remarks=reason) - - for a_user in task.claimed_users.all(): - create_notification(role="CD", sent_to=a_user, sent_from=closed_by, task=task, remarks=reason) - - for a_reviewer in task.reviewers.all(): - create_notification(role="CD", sent_to=a_reviewer, sent_from=closed_by, task=task, remarks=reason) - -def deleteTask(task, deleted_by, reason=None): - """ set the task status as DL - notify all its other viewers about the deleting of task. - """ - - task.status = "DL" - task.save() - - pending_requests = task.request_task.filter(is_replied=False,is_valid=True) - pending_requests.update(is_valid=False) - - for a_reviewer in task.reviewers.exclude(id=deleted_by.id): - create_notification("DL", sent_to=a_reviewer, sent_from=deleted_by, task=task, remarks=reason) diff --git a/taskapp/events/user.py b/taskapp/events/user.py deleted file mode 100644 index 754cab0..0000000 --- a/taskapp/events/user.py +++ /dev/null @@ -1,56 +0,0 @@ -from django.contrib.auth.models import User -from pytask.taskapp.models import Profile, Task, Comment - -""" A collection of helper methods. note that there is no validation done here. -we take care of validation and others checks in methods that invoke these methods. -""" - -def updateProfile(user_profile, properties): - """ updates the given properties in the profile for a user. - args: - user_profile : a profile object - properties : a dictionary with attributes to set as keys and corresponding values - """ - - for attr,value in properties.items(): - user_profile.__setattr__(attr,value) - user_profile.save() - -def createUser(username,email,password,dob,gender): - """ create a user and create a profile and update its properties - args: - username : a username that does not exist - email : a valid email - password : a password - dob : a date object - gender : u'M'/u'F' - """ - - try: - user = User.objects.get(username=username) - return user - except: - user = User(username=username, email=email) - user.set_password(password) - user.save() - properties = {'dob':dob, 'gender':gender} - user_profile = Profile(user=user) - updateProfile(user_profile, properties) - return user - -def createSuUser(username,email,password,dob,gender): - """ create user using createUser method and set the is_superuser flag """ - - su_user = createUser(username,email,password,dob,gender) - su_user.is_staff = True - su_user.is_superuser = True - su_user.save() - return su_user - -def changeRole(role, user): - """ change the status of user to role. - """ - - user_profile = user.get_profile() - user_profile.rights = role - user_profile.save() |