def inviteSubjects(data, id, request): logger = logging.getLogger(__name__) logger.info("Invite subjects") logger.info(data) subjectInvitations = data["subjectInvitations"] es = experiment_sessions.objects.get(id=id) logger.info(es.canceled) if len(subjectInvitations) == 0 or es.canceled: return JsonResponse({"status":"fail", "mailResult":{"error_message":"Error: Refresh the page","mail_count":0},"userFails":0,"es_min":es.json_esd(False)}, safe=False) status = "success" userFails = [] #list of users failed to add userSuccesses = [] #list of users add userPkList = [] #list of primary keys of added users p = parameters.objects.first() subjectText = "" subjectText = p.invitationTextSubject messageText = es.getInvitationEmail() # #add users to session user_list = [] userPkList = [] for i in subjectInvitations: try: userPkList.append(i['id']) es.addUser(i['id'], request.user, False) user_list.append({"email" : i['email'], "variables": [{"name" : "first name", "text" : i["first_name"]}]}) except IntegrityError: userFails.append(i) status = "fail" memo = f'Send invitations for session: {es.id}' mail_result = send_mass_email_service(user_list, subjectText, messageText, memo) if(mail_result["error_message"] != ""): status = "fail" es.save() #store invitation storeInvitation(id, userPkList, subjectText, messageText, mail_result['mail_count'], mail_result['error_message']) invitationCount = es.experiment_session_invitations_set.count() return JsonResponse({"status":status, "mailResult":mail_result, "userFails":userFails, "invitationCount":invitationCount, "es_min":es.json_esd(True)}, safe=False)
def sendEmail(request, data): logger = logging.getLogger(__name__) logger.info(f"Send message to all active users {data}") if request.user.is_superuser: params = parameters.objects.first() subjectText = data["subject"] messageText = data["text"] users_list = User.objects.filter(is_active=True, profile__email_confirmed='yes', profile__type__id=2) #debug #users_list = users_list[:5] # emailList = [] user_list = [] for user in users_list: user_list.append({"email" : user.email, "variables": [{"name" : "first name", "text" : user.first_name}, {"name" : "contact email", "text" : params.labManager.email}]}) memo = f'Send message to all active users' mail_result = send_mass_email_service(user_list, subjectText, messageText, memo) #logger.info(emailList) else: logger.info("Send message to all active users error, not super user : user " + str(request.user.id)) mail_result = {"mail_count":0, "error_message":"You are not an elevated user."} return JsonResponse({"mailResult":mail_result}, safe=False)
def cancelSession(data, id): ''' Cancel session :param data: empty {} :type data:dict :param id:Experiment Session ID :type id:int ''' logger = logging.getLogger(__name__) logger.info("Cancel Session") logger.info(data) es = experiment_sessions.objects.get(id=id) if es.allowEdit(): es.canceled = True params = parameters.objects.first() subjectText = params.cancelationTextSubject messageText = es.getCancelationEmail() user_list = [] userPkList = [] for i in es.getConfirmedEmailList(): userPkList.append(i['user_id']) user_list.append({"email" : i['user_email'], "variables": [{"name" : "first name", "text" : i["user_first_name"]}]}) memo = f'Cancel session: {es.id}' mail_result = send_mass_email_service(user_list, subjectText, messageText, memo) logger.info(userPkList) es.save() else: logger.info("Cancel Session:Failed, not allowed") mail_result = {"mail_count":0, "error_message":"Session cannot be canceled. Subjects have already attended."} return JsonResponse({"status":"success", "session" : es.json(), "mailResult":mail_result}, safe=False)
def sendReminderEmail(self): logger = logging.getLogger(__name__) #don't send remind if it has already been sent if self.reminder_email_sent: logger.warning(f"Send Reminder emails error already sent: session {self.experiment_session}, session day {self.id}") return {"emailList": [], "status":"fail"} #don't send reminder if session canceled if self.experiment_session.canceled: logger.warning(f"Send Reminder emails error session canceled: session {self.experiment_session}, session day {self.id}") return {"emailList": [], "status":"fail"} self.reminder_email_sent = True self.save() p = parameters.objects.first() logger.info(f"Send Reminder emails to: session {self.experiment_session}, session day {self.id}") users_list = self.experiment_session_day_users_set.filter(confirmed=True).select_related("user") if len(users_list) == 0: logger.info(f"No confirmed users for session {self.experiment_session}") return {"emailList": users_list, "status":"success"} logger.info(users_list) user_list = [] for i in users_list: user_list.append({'email':i.user.email, 'variables':[{'name':'first name', 'text':i.user.first_name}]}) logger.info(user_list) memo = f"Send reminders for session day: {self.id}" mail_result = send_mass_email_service(user_list, p.reminderTextSubject, self.getReminderEmail(), memo) logger.info(mail_result) #store the number of reminders sent self.reminder_email_sent_count = mail_result.get("mail_count", 0) self.save() return {"emailList": users_list, "status":"success"}
def sendMessage(data, id): logger = logging.getLogger(__name__) logger.info(f"Send Message: {data}") params = parameters.objects.first() subjectText = data["subject"] messageText = data["text"] es = experiment_sessions.objects.get(id=id) user_list = [] userPkList = [] for i in es.getConfirmedEmailList(): userPkList.append(i['user_id']) user_list.append({"email" : i['user_email'], "variables": [{"name" : "first name", "text" : i["user_first_name"]}, {"name" : "contact email", "text" : params.labManager.email}]}) memo = f'Send message to session: {es.id}' mail_result = send_mass_email_service(user_list, subjectText, messageText, memo) #logger.info(userPkList) #store message result m = experiment_session_messages() m.experiment_session = es m.subjectText = subjectText m.messageText = messageText m.mailResultSentCount = mail_result['mail_count'] m.mailResultErrorText = mail_result['error_message'] m.save() m.users.add(*userPkList) m.save() message_count = es.experiment_session_messages_set.count() return JsonResponse({"mailResult":mail_result, "messageCount":message_count}, safe=False)
def send_reset(request, data): logger = logging.getLogger(__name__) params = parameters.objects.first() #convert form into dictionary form_data_dict = {} for field in data["formData"]: form_data_dict[field["name"]] = field["value"] form = passwordResetForm(form_data_dict) if form.is_valid(): username = form.cleaned_data['username'] user_list = User.objects.filter(email=username.lower()) #logger.info(user_list) if user_list.count() != 1: logger.info(f"passwordResetView user not found {username}") return JsonResponse( { "status": "error", "message": "Account not found." }, safe=False) else: user = user_list.first() user.profile.password_reset_key = uuid.uuid4() user.profile.save() user_list = [{ "email": user.email, "variables": [{ "name": "first name", "text": user.first_name }, { "name": "email", "text": user.email }, { "name": "reset link", "text": params.siteURL + reverse('passwordResetChange', args=(user.profile.password_reset_key, )) }, { "name": "contact email", "text": params.labManager.email }] }] memo = f"Password reset for: {user}" mail_result = send_mass_email_service( user_list, params.passwordResetTextSubject, params.passwordResetText, memo) if mail_result.get("mail_count", -1) > 0: logger.info(f"Reset password for {username}") return JsonResponse({"status": "success"}, safe=False) logger.info( f"Reset password failed for {username} : {mail_result}") return JsonResponse( { "status": "error", "message": "There was a problem sending the email. Please try again." }, safe=False) else: logger.info(f"send_reset Reset password validation error") return JsonResponse( { "status": "validation", "errors": dict(form.errors.items()) }, safe=False)
def getManuallyAddSubject(data,id,request_user,ignoreConstraints): ''' Manually add a subject to a session :param data: Form data{"user":{"id":user id}, "sendInvitation":True/False} :type data: dict :param id: Experiment session id :type id: int :param request_user: User requesting the manual add :type id: django.contrib.auth.models.User :param ignoreConstraints: Bypass recuritment check when adding :type id: boolean ''' logger = logging.getLogger(__name__) logger.info("Manually add subject") logger.info(data) es = experiment_sessions.objects.get(id=id) p = parameters.objects.first() if es.canceled: return JsonResponse({"status":"fail","mailResult":{"errorMessage":"Error: Refresh the page","mailCount":0},"user":"","es_min":es.json_esd(False)}, safe=False) u = data["user"] sendInvitation = data["sendInvitation"] status = "success" failed = False #check that user does not violate recruitment constraints if not ignoreConstraints: u_list = es.getValidUserList_forward_check([{'id':u["id"]}],True,0,0,[],False,1) if len(u_list) == 0: failed=True elif es.checkUserInSession(User.objects.get(id = u["id"])): failed=True mail_result = {"mail_count":0, "error_message":""} if not failed: subjectText="" messageText="" es.addUser(u["id"],request_user,True) es.save() if sendInvitation: user_list = [] subjectText = p.invitationTextSubject messageText = es.getInvitationEmail() user_list.append({"email" : u['email'], "variables": [{"name" : "first name", "text" : u["first_name"]}]}) memo = f'Manual invitation for session: {es.id}' mail_result = send_mass_email_service(user_list, subjectText, messageText, memo) else: mail_result = {"mail_count":0, "error_message":""} #store invitation storeInvitation(id,[u["id"]], subjectText, messageText, mail_result['mail_count'], mail_result['error_message']) else: status = "fail" invitationCount=es.experiment_session_invitations_set.count() return JsonResponse({"status":status, "mailResult":mail_result, "user":u, "invitationCount":invitationCount, "es_min":es.json_esd(True)}, safe=False)