taskapp/utilities/notification.py
changeset 236 39f83b4cf557
parent 235 e338eaeccad7
equal deleted inserted replaced
235:e338eaeccad7 236:39f83b4cf557
     1 from datetime import datetime
       
     2 from django.contrib.auth.models import User
       
     3 from pytask.taskapp.models import Notification, RIGHTS_CHOICES
       
     4 
       
     5 def create_notification(role, sent_to, sent_from=None, reply=None, task=None, remarks=None, requested_by=None, receiving_user=None, pynts=None):
       
     6     """
       
     7     creates a notification based on the passed arguments.
       
     8         role: role of the notification - look at choices in models 
       
     9         sent_to: a user to which the notification is to be sent
       
    10         sent_from : a user from which the message has originated
       
    11             A user who approves/rejects in case of request
       
    12             A reviewer who closes/complets the task
       
    13         reply: A boolean
       
    14         task: a task if applicable
       
    15         requested_by: a user makes the request
       
    16             A reviewer who assigns pynts in case of pynts
       
    17             A reviewer who requests to act as a reviewer
       
    18         remarks: any remarks for rejecting
       
    19         receiving_user: user receiving pynts
       
    20         pynts: the obvious
       
    21     """
       
    22 
       
    23     notification = Notification(sent_date = datetime.now())
       
    24     notification.role = role
       
    25     notification.sent_to = sent_to
       
    26     notification.save()
       
    27 
       
    28     if role == "PY":
       
    29 
       
    30         notification.sent_from = sent_from
       
    31         notification.task = task
       
    32         notification.pynts = pynts
       
    33 
       
    34         task_url= '<a href="/task/view/tid=%s">%s</a>'%(task.id, task.title)
       
    35         pynts_url = '<a href="/task/assignpynts/tid=%s">%s</a>'%(task.id, "click here")
       
    36         reviewer_url = '<a href="/user/view/uid=%s">%s</a>'%(requested_by.id, requested_by.username)
       
    37         admin_url = '<a href="/user/view/uid=%s">%s</a>'%(sent_from.id, sent_from.username)
       
    38         user_url = '<a href="/user/view/uid=%s">%s</a>'%(receiving_user.id, receiving_user.username)
       
    39 
       
    40         if reply:
       
    41             notification.sub = "Approved request for assign of pynts for %s"%task.title[:20]
       
    42             notification.message  = """ Request made by %s to assign %s pynts to %s for the task %s has been approved by %s<br />
       
    43                                     %s if you want the view/assign pynts page of the task.<br />"""%(reviewer_url, pynts, user_url, task_url, admin_url, pynts_url)
       
    44 
       
    45         else:
       
    46             notification.sub = "Rejected request for assign of pynts for %s"%task.title[:20]
       
    47             notification.message = """ Request made by %s to assign %s pynts to %s for the task %s has been rejected by %s.<br /> """%(reviewer_url, pynts, user_url, task_url, admin_url)
       
    48             if remarks:
       
    49                 notification.remarks = remarks
       
    50                 notification.message += "Reason: %s<br />"%remarks
       
    51             notification.message += "<br />"
       
    52 
       
    53     elif role == "MT":
       
    54 
       
    55         notification.task = task
       
    56         notification.sent_from = sent_from
       
    57 
       
    58         task_url= '<a href="/task/view/tid=%s">%s</a>'%(task.id, task.title)
       
    59         requested_reviewer_url = '<a href="/user/view/uid=%s">%s</a>'%(requested_by.id, requested_by.username)
       
    60         new_reviewer = sent_from
       
    61         new_reviewer_url = '<a href="/user/view/uid=%s">%s</a>'%(new_reviewer.id, new_reviewer.username)
       
    62         
       
    63         if reply:
       
    64             notification.sub = "New reviewer for the task %s"%task.title[:20]
       
    65             notification.message = "%s has accepted the request made by %s, asking him act as a reviewer for the task %s<br />"%(new_reviewer_url, requested_reviewer_url, task_url)
       
    66             notification.message += "He can be contacted on %s"%new_reviewer.email
       
    67 
       
    68         else:
       
    69             notification.sub = "%s rejected request to act as a reviewer"%new_reviewer.username
       
    70             notification.message = "%s has rejected your request asking him to act as a reviewer for %s.<br />"%(new_reviewer_url, task_url)
       
    71             if remarks:
       
    72                 notification.remarks = remarks
       
    73                 notification.message += "Remarks: %s<br />"%remarks
       
    74 
       
    75     elif role in ["DV", "MG", "AD"]:
       
    76 
       
    77         notification.sent_from = sent_from
       
    78         accepting_user = sent_from
       
    79         user_url = '<a href="/user/view/uid=%s">%s</a>'%(accepting_user.id, accepting_user.username) ## i mean the user who has accepted it
       
    80         requested_by_url = '<a href="/user/view/uid=%s">%s</a>'%(requested_by.id, requested_by.username)
       
    81         role_rights = dict(RIGHTS_CHOICES)[role]
       
    82         role_learn_url = "/about/%s"%role_rights.lower()
       
    83         a_or_an = "an" if role_rights == "AD" else "a"
       
    84 
       
    85         if reply:
       
    86             notification.sub = "New %s for the site"%role_rights
       
    87             notification.message = "%s has accepted request made by %s asking him to act as %s %s for the website.<br />"%(user_url, requested_by_url, a_or_an, role_rights)
       
    88         else:
       
    89             notification.sub = "Rejected your request to act as %s"%role_rights
       
    90             notification.message = "%s has rejected your request asking him to act as %s %s.<br />"%(user_url, a_or_an, role_rights)
       
    91             if remarks:
       
    92                 notification.remarks = remarks
       
    93                 notification.message += "Remarks: %s<br />"%remarks
       
    94 
       
    95     elif role == "NT":
       
    96 
       
    97         notification.task = task
       
    98         new_reviewer = sent_to
       
    99         reviewer_learn_url = '<sup><a href="/about/reviewer/">learn more</a></sup>'
       
   100         task_url= '<a href="/task/view/tid=%s">%s</a>'%(task.id, task.title)
       
   101 
       
   102         notification.sub = "You are reviewering the task %s"%task.title[:20]
       
   103         notification.message = "You have accepted to act as a reviewer%s for the task %s.<br />"%(reviewer_learn_url, task_url)
       
   104         notification.message += " Here is a list of other reviewers and their email addresses.<br /> <ul>"
       
   105 
       
   106         for a_reviewer in task.reviewers.exclude(id=new_reviewer.id):
       
   107             notification.message += "<li> %s - %s </li>"%(a_reviewer.username, a_reviewer.email)
       
   108         notification.message += "</ul>"
       
   109 
       
   110         working_users = task.assigned_users.all()
       
   111         if working_users:
       
   112             notification.message += "List of users working on the task.<br />"
       
   113             notification.message += "<ul>"
       
   114             for a_user in working_users:
       
   115                 notification.message += "<li> %s - %s </li>"%(a_user.username, a_user.email)
       
   116             notification.message += "</ul><br />"
       
   117         notification.message += "Happy Reviewering."
       
   118 
       
   119     elif role == "NU":
       
   120 
       
   121         start_here_url = '<a href="/about/starthere/" taget="_blank">click here</a>'
       
   122         notification.sub = "Welcome %s"%sent_to.username
       
   123         notification.message = "Welcome to PyTasks %s.<br />"%sent_to.username
       
   124         notification.message += "%s to know more."%start_here_url
       
   125 
       
   126     elif role in ["ND", "NG", "NA"]:
       
   127 
       
   128         rights_dict = dict(RIGHTS_CHOICES)
       
   129 
       
   130         if role == "ND":
       
   131             role_rights = rights_dict["DV"]
       
   132         elif role == "NG":
       
   133             role_rights = rights_dict["MG"]
       
   134         elif role == "NA":
       
   135             role_rights = rights_dict["AD"]
       
   136 
       
   137         requested_by_url = r'<a href="/user/view/uid=%s">%s</a>'%(requested_by.id, requested_by.username)
       
   138         role_learn_url = r'<a href="/about/%s" target="_blank">click here</a>'%role_rights.lower()
       
   139         a_or_an = "an" if role_rights == "Admin" else "a"
       
   140 
       
   141         notification.sub = "You are now %s %s"%(a_or_an, role_rights)
       
   142         notification.message = r"You have accepted the request made by %s asking you to act as %s %s in the site "%(requested_by_url, a_or_an, role_rights)
       
   143         notification.message += "and you are now %s %s in the site.<br /> %s to learn more on %s."%(a_or_an, role_rights, role_learn_url, role_rights)
       
   144 
       
   145 
       
   146     elif role in ["CM", "CD"]:
       
   147 
       
   148         notification.sent_from = sent_from
       
   149         notification.role = role
       
   150         notification.task = task
       
   151         notification.remarks = remarks
       
   152 
       
   153         reviewer = sent_from
       
   154         reviewer_url = '<a href="/user/view/uid=%s">%s</a>'%(reviewer.id, reviewer.username)
       
   155         task_url= '<a href="/task/view/tid=%s">%s</a>'%(task.id, task.title)
       
   156         
       
   157         if role == "CM":
       
   158             notification.sub = "%s has been marked complete"%task.title
       
   159             notification.message = "The task %s has been marked complete by %s.<br />"%(task_url, reviewer_url)
       
   160 
       
   161         elif role == "CD":
       
   162             notification.sub = "%s has been closed"%task.title
       
   163             notification.message = "The task %s has been closed by %s.<br />"%(task_url, reviewer_url)
       
   164 
       
   165         if remarks:
       
   166             notification.remarks = remarks
       
   167             notification.message += "<b>Remarks:</b> %s"%remarks
       
   168 
       
   169     elif role == "AU":
       
   170 
       
   171         notification.task = task
       
   172         notification.sent_from = sent_from
       
   173         added_user = sent_to
       
   174         reviewer = sent_from
       
   175         assigned_by_url = '<a href="/user/view/uid=%s">%s</a>'%(reviewer.id, reviewer.username)
       
   176         task_url= '<a href="/task/view/tid=%s">%s</a>'%(task.id, task.title)
       
   177 
       
   178         notification.sub = "Your claim for the task %s accepted."%task.title[:20]
       
   179         notification.message = "You have been selected to work on the task %s by %s.<br />"%(task_url, assigned_by_url)
       
   180         notification.message += "You can now start working on the task and will be pynted by the reviewers for your work.<br />"
       
   181 
       
   182         notification.message += " Here is a list of reviewers for the task and their email addresses.<br /> <ul>"
       
   183         for a_reviewer in task.reviewers.all():
       
   184             notification.message += "<li> %s - %s </li>"%(a_reviewer.username, a_reviewer.email)
       
   185         notification.message += "</ul>"
       
   186 
       
   187         working_users = task.assigned_users.exclude(id=added_user.id)
       
   188         if working_users:
       
   189             notification.message += "List of other users working on the task.<br />"
       
   190             notification.message += "<ul>"
       
   191             for a_user in working_users:
       
   192                 notification.message += "<li> %s - %s </li>"%(a_user.username, a_user.email)
       
   193             notification.message += "</ul><br />"
       
   194 
       
   195     elif role == "RU":
       
   196 
       
   197         notification.task = task
       
   198         notification.sent_from = sent_from
       
   199         removed_user = sent_to
       
   200         reviewer = sent_from
       
   201         removed_by_url = '<a href="/user/view/uid=%s">%s</a>'%(reviewer.id, reviewer.username)
       
   202         task_url = '<a href="/task/view/tid=%s">%s</a>'%(task.id, task.title)
       
   203         claim_url = '<a href="/task/claim/tid=%s">%s</a>'%(task.id, "clicking here")
       
   204 
       
   205         notification.sub = "You have been removed from working users of %s"%task.title[:20]
       
   206         notification.message = "%s has removed you from the working users list of %s.<br />"%(removed_by_url, task_url)
       
   207         notification.message += "if you want to work on the task again, you can claim the task by %s.<br />"%claim_url
       
   208         if remarks:
       
   209             notification.remarks = remarks
       
   210             notification.message += "<b>Reason: </b>%s"%(remarks)
       
   211 
       
   212     elif role == "DL":
       
   213 
       
   214         notification.sent_from = sent_from
       
   215         notification.task = task
       
   216         deleted_by_url = '<a href="/user/view/uid=%s">%s</a>'%(sent_from.id, sent_from.username)
       
   217 
       
   218         notification.sub = "Task deleted"
       
   219         notification.message = 'The unpublished task "%s" viewable by you has been deleted by its creator %s.<br />'%(task.title, deleted_by_url)
       
   220 
       
   221         if remarks:
       
   222             notification.remarks = remarks
       
   223             notification.message += "<b>Reason: </b>%s"%remarks
       
   224 
       
   225     elif role == "CL":
       
   226 
       
   227         notification.sent_from = sent_from
       
   228         notification.task = task
       
   229         notification.remarks = remarks
       
   230 
       
   231         claimed_by_url = '<a href="/user/view/uid=%s">%s</a>'%(sent_from.id, sent_from.username)
       
   232         claim_url = '<a href="/task/claim/tid=%s">claim</a>'%(task.id)
       
   233         task_url = '<a href="/task/view/tid=%s">%s</a>'%(task.id, task.title)
       
   234 
       
   235         notification.sub = 'New claim for the task "%s"'%(task.title[:20])
       
   236         notification.message = '%s has submitted a %s for the task "%s" reviewered by you.<br />'%(claimed_by_url, claim_url, task_url)
       
   237         notification.message += '<b>Claim proposal:</b> %s'%(remarks)
       
   238 
       
   239 
       
   240 
       
   241     notification.save()
       
   242 
       
   243 def mark_notification_read(notification_id):
       
   244     """
       
   245     makes a notification identified by the notification_id read.
       
   246     arguments:
       
   247         notification_id - a number denoting the id of the Notification object
       
   248     """
       
   249     try:
       
   250         notification = Notification.objects.get(id = notification_id)
       
   251     except Notification.DoesNotExist:
       
   252         return False
       
   253     notification.is_read = True
       
   254     notification.save()
       
   255     return True
       
   256 
       
   257 def delete_notification(notification_id):
       
   258     """
       
   259     deletes a notification identified by the notification_id.
       
   260     arguments:
       
   261         notification_id - a number denoting the id of the Notification object
       
   262     """
       
   263     try:
       
   264         notification = Notification.objects.get(id = notification_id)
       
   265     except Notification.DoesNotExist:
       
   266         return False
       
   267     notification.is_deleted = True
       
   268     notification.save()
       
   269     return True
       
   270 
       
   271 def get_notification(nid, user):
       
   272     """ if notification exists, and belongs to the current user, return it.
       
   273     else return None.
       
   274     """
       
   275 
       
   276     user_notifications = user.notification_sent_to.filter(is_deleted=False).order_by('sent_date')
       
   277     current_notifications = user_notifications.filter(id=nid)
       
   278     if user_notifications:
       
   279         current_notification = current_notifications[0]
       
   280 
       
   281         try:
       
   282             newer_notification = current_notification.get_next_by_sent_date(sent_to=user, is_deleted=False)
       
   283             newest_notification = user_notifications.reverse()[0]
       
   284             if newest_notification == newer_notification:
       
   285                 newest_notification = None
       
   286         except Notification.DoesNotExist:
       
   287             newest_notification, newer_notification = None, None
       
   288 
       
   289         try:
       
   290             older_notification = current_notification.get_previous_by_sent_date(sent_to=user, is_deleted=False)
       
   291             oldest_notification = user_notifications[0]
       
   292             if oldest_notification == older_notification:
       
   293                 oldest_notification = None
       
   294         except:
       
   295             oldest_notification, older_notification = None, None
       
   296 
       
   297         return newest_notification, newer_notification, current_notification, older_notification, oldest_notification
       
   298 
       
   299     else:
       
   300         return None, None, None, None, None