def notifyAdminsOfMembershipCanceled(project, user): subject = "[%s] Membership Canceled" % project.short_name message = "User %s has decided to cancel his/her membership in project %s." % (user.username, project.short_name) for admin in list(project.getAdminGroup().user_set.all())+list(getSiteAdministrators()): notify(admin, subject, message)
def notifyAdmins(group_name, user_id, incomingRequest): user = get_object_or_404(User, pk=user_id) subject = "'%s' Data Access Request" % group_name message = "User '%s' has requested membership in group '%s'" % ( user.get_full_name(), group_name) message += '\nPlease process the request at: %s' \ % incomingRequest.build_absolute_uri(reverse('ac_process', kwargs={'group_name': group_name, 'user_id': user.id})) # user attributes message += "\n" message += "\nFirst Name: %s" % user.first_name message += "\nLast Name: %s" % user.last_name message += "\nUser Name: %s" % user.username message += "\nEmail: %s" % user.email # openid message += "\nOpenID is: %s" % user.profile.openid() # user profile attributes profile = UserProfile.objects.get(user=user) message += "\nInstitution: %s" % profile.institution message += "\nDepartment: %s" % profile.department message += "\nCity: %s" % profile.city message += "\nState: %s" % profile.state message += "\nCountry: %s" % profile.country for admin in getSiteAdministrators(): notify(admin, subject, message)
def notifyAdmins(group_name, user_id, incomingRequest): user = get_object_or_404(User, pk=user_id) subject = "'%s' Data Access Request" % group_name message = "User '%s' has requested membership in group '%s'" % (user.get_full_name(), group_name) message += "\nPlease process the request at: %s" % incomingRequest.build_absolute_uri( reverse("ac_process", kwargs={"group_name": group_name, "user_id": user.id}) ) # user attributes message += "\n" message += "\nFirst Name: %s" % user.first_name message += "\nLast Name: %s" % user.last_name message += "\nUser Name: %s" % user.username message += "\nEmail: %s" % user.email # openid message += "\nOpenID is: %s" % user.profile.openid() # user profile attributes profile = UserProfile.objects.get(user=user) message += "\nInstitution: %s" % profile.institution message += "\nDepartment: %s" % profile.department message += "\nCity: %s" % profile.city message += "\nState: %s" % profile.state message += "\nCountry: %s" % profile.country for admin in getSiteAdministrators(): notify(admin, subject, message)
def notifyAdminsOfUserRegistration(user,request): subject = "New User Registration" profile_url = reverse('user_profile_redirect', kwargs={'user_id': user.id}) # go to the right node profile_url = request.build_absolute_uri(profile_url) message = "User %s has created a new account." % user.get_full_name() message += "\nView home node profile at: %s" % profile_url # openid message += "\n\nOpenID is: %s" % user.profile.openid() # user attributes message += "\n\nFirst Name: %s" % user.first_name message += "\nLast Name: %s" % user.last_name message += "\nUser Name: %s" % user.username message += "\nEmail: %s" % user.email # user profile attributes profile = UserProfile.objects.get(user=user) message += "\n\nInstitution: %s" % profile.institution message += "\nDepartment: %s" % profile.department message += "\nCity: %s" % profile.city message += "\nState: %s" % profile.state message += "\nCountry: %s" % profile.country message += "\nSubscribe to COG email list? %s" % profile.subscribed message += "\nResearch Interests: %s" % profile.researchInterests message += "\nResearch Keywords: %s" % profile.researchKeywords for admin in getSiteAdministrators(): notify(admin, subject, message)
def notifyUserOfMembershipSelfCanceled(project, user): subject = "[%s] Membership Canceled" % project.short_name message = "As you requested, your membership in the ESGF-CoG Project: %s has been canceled." \ "\nPlease contact the [%s] project administrators if you did not " \ "request this action." % project.short_name notify(user, subject, message)
def notifyUserOfGroupRemoval(project, group, user): subject = "[%s] Permissions Group Modification" % project.short_name message = "Greetings %s. Your permissions in the ESGF-CoG Project: %s have changed." \ "\nYou have been removed from the %s permissions group." % (user.first_name, project.short_name, _getGroupDescription(group.name) ) notify(user, subject, message)
def notifyAdminsOfMembershipRequest(project, user, request): url = reverse('membership_list_requested', kwargs={'project_short_name': project.short_name.lower()}) url = request.build_absolute_uri(url) subject = "[%s] Membership Request" % project.short_name message = "User: %s has requested to join your ESGF-CoG Project: %s." \ "\nYou may process this membership request at: %s." \ % (user.username, project.short_name, url) for admin in list(project.getAdminGroup().user_set.all())+list(getSiteAdministrators()): notify(admin, subject, message)
def notifyAuthorOfProjectApproval(project, request): if project.author: url = project.home_page_url() url = request.build_absolute_uri(url) subject = "New Project Registration Confirmation" message = "Congratulations, the project you requested: %s has been approved by the node administrator(s).\n" \ "The project home page is: %s" \ % (project.short_name, url) notify(project.author, subject, message)
def notifyUser(group_name, user, permissions): subject = "'%s' Data Access Notification" % group_name message = "Your permissions in group '%s' have been updated" % group_name for (role, status) in permissions.items(): message += "\nRole: %s status=%s" % (role, status) notify(user, subject, message)
def notifyUserOfMembershipGranted(project, group, user, request): subject = "[%s] Membership Granted" % project.short_name message = "Welcome %s! You have been granted membership in the ESGF-CoG Project: %s," \ " and assigned to the %s permissions group." % (user.first_name, project.short_name, _getGroupDescription(group.name)) url = project.home_page_url() url = request.build_absolute_uri(url) message += "\nPlease login and collaborate with us at: %s." % url notify(user, subject, message)
def notifyUserOfRegistration(user): subject = "CoG Account Creation" message = "Thank you for creating a new ESGF-CoG account." message += "\n" message += "\nYour User Name is: %s" % user.username message += "\nYour OpenID is: %s" % user.profile.openid() message += "\n" message += "\nPlease note that you will need your OpenID to login." message += "\n" message += "\nCoG Tutorials: https://www.earthsystemcog.org/projects/cog/tutorials_web" message += "\n" message += "\nCoG Support: [email protected]" notify(user, subject, message)
def notifySiteAdminsOfProjectRequest(project, request): url = reverse('project_update', kwargs={'project_short_name': project.short_name.lower()}) url = request.build_absolute_uri(url) profile = reverse('user_profile_redirect', kwargs={'user_id': request.user.id}) # go to the right node profile = request.build_absolute_uri(profile) subject = "New Project Request" message = "Project Short Name: %s \n" \ "Project Description: %s \n" \ "Profile of Requester: %s \n" \ "Home Site of Requester: %s \n" \ "Process this Request: %s" % (project.short_name, project.description, profile, request.user.profile.site.name, url) for admin in getSiteAdministrators(): notify(admin, subject, message)
def email(self, comment, content_object, request): thread = comment.content_object project = thread.getProject() # check project forum notification flag if project.forumNotificationEnabled: # build email user = comment.user subject = "[%s] Forum posting" % project.short_name # thread url: http://localhost:8000/projects/TestProject/thread/2/ url = reverse('thread_detail', kwargs={ 'project_short_name':project.short_name.lower(), 'thread_id':thread.id }) url = request.build_absolute_uri(url) # specific comment url: http://localhost:8000/projects/TestProject/thread/2/?c=17 # a) send plain text email #message = "User: %s\n Thread: %s\n Comment: %s\n" % (user, url, comment.comment) # b) send html formatted email # parse comment content to build images full URLs message = comment.comment # src="/site_media/projects/testproject/Unknown.jpeg" groups = list( re.finditer('src=\"[^\"]+\"', message) ) paths = [] # list of (relpath, abspath) to replace after the full message is parsed for group in groups: relpath = message[group.start()+5:group.end()-1] abspath = request.build_absolute_uri(relpath) paths.append( (relpath, abspath) ) # replace all for path in paths: message = message.replace(path[0], path[1]) message = "User: %s<br/>Forum Thread: %s<p/>New Comment: %s" % (user, url, message) # send email for admin in project.getAdminGroup().user_set.all(): notify(admin, subject, message, mime_type='html')
def password_reset(request): # redirect to another node if necessary if redirectToIdp(): return HttpResponseRedirect(settings.IDP_REDIRECT + request.path) if request.method == 'GET': # optional GET parameters to pre-populate the form initial = {'openid': request.GET.get('openid', ''), 'email': request.GET.get('email', '')} form = PasswordResetForm(initial=initial) return render_password_reset_form(request, form) else: form = PasswordResetForm(request.POST) # check form is valid first if not form.is_valid(): print "Form is invalid: %s" % form.errors return render_password_reset_form(request, form) openid = form.cleaned_data.get('openid') email = form.cleaned_data.get('email') # the openid entered by the user MUST be found in the local database # otherwise we can neither change the password, nor we can redirect to a known node try: userOpenid = UserOpenID.objects.get(claimed_id=openid) user = userOpenid.user # 1) local user (i.e. user home node == this node) if isUserLocal(user): # 1a) this node issued this openid if isOpenidLocal(openid): if user.email == email: # generate new random password # prepend "AB1-" to satisfy mandatory requirements new_password = "******"+User.objects.make_random_password(length=8) # change password in database user.set_password(new_password) user.save() user.profile.last_password_update = datetime.datetime.now() user.profile.save() # update ESGF user object if settings.ESGF_CONFIG: esgfDatabaseManager.updatePassword(user, new_password) # logout user (if logged in) logout(request) # user profile url url = reverse('user_detail', kwargs={'user_id': user.id}) url = request.build_absolute_uri(url) # send email to user subject = "Password Reset" message = "Your new password has been set to: %s\n" % new_password message += "Your openid is: %s\n" % user.profile.openid() message += "For security reasons, please change this password as soon as you log in.\n" message += "To change your password, first log in with your openid and new password,\n" message += "then click on the 'My Profile' link on the top-right of each page,\n" message += "or visit the following URL: %s" % url notify(user, subject, message) # redirect to login page with special message return HttpResponseRedirect(reverse('login')+"?message=password_reset") else: return render_password_reset_form(request, form, "Invalid OpenID/email combination") # 1b) user used an external ESGF openid (for example, http://dkrz...) to login onto this node # (for example, http://www.earthsystemcog.org/...) else: idpurl = urlparse(openid) idpurl = "%s://%s/" % (idpurl.scheme, idpurl.netloc) message = "This OpenID was issued by another node." message += "<br/>Please reset your password at <a href='%s'>that node</a>." % idpurl return render_password_reset_form(request, form, message) # 2) non-local user: redirect request to peer node, post automatically else: site = user.profile.site redirect_url = 'http://%s%s?openid=%s&email=%s' % (site.domain, reverse('password_reset'), openid, email) # 2a) automatically redirect to peer node #redirect_url += "&post=true" # submit form automatically at that node #return HttpResponseRedirect(redirect_url) # 2b) show message on this node with link to peer node message = "This OpenID was issued by another ESG-CoG node." message += "<br/>Please use the <a href='%s'>Reset Password</a> page at that node." % redirect_url return render_password_reset_form(request, form, message) # openid not found except UserOpenID.DoesNotExist: message = "OpenID not found." message += "<br/>If your OpenID was issued by '%s'," % settings.ESGF_HOSTNAME message += "<br/>then please use the 'Forgot OpenID?' link below to retrieve the correct OpenID." message += "<br/>Otherwise, please reset your password on the ESGF-CoG node that issued your OpenID." return render_password_reset_form(request, form, message)