def send_welcome_email(email_address): """ Send a welcome email. Rendered as a separate function to enable testing. """ sources = get_source_labels_and_configs() params = { 'newsletter': email_address.user.member.newsletter, 'public_sharing_url': full_url(reverse('public-data:home')), 'sources': [ s for s in sources if s[0] != 'data_selfie' and not getattr(email_address.user, s[0]).is_connected ], 'research_data_management_url': full_url(reverse('my-member-research-data')), 'data_selfie_url': full_url(reverse('activities:data-selfie:upload')), } plain = render_to_string('email/welcome.txt', params) html = render_to_string('email/welcome.html', params) send_mail('Welcome to Open Humans!', plain, settings.DEFAULT_FROM_EMAIL, [email_address.email], html_message=html)
def send_emails(project_id, project_members, subject, message, all_members=False): """ Sends emails from project coordinator to project members. """ project = DataRequestProject.objects.get(id=project_id) template = engines["django"].from_string(message) logger.info("Sending {0} emails".format(len(project_members))) if all_members: project_members = project.project_members.filter_active().all() for project_member in project_members: if isinstance(project_member, str): # As the instance was passed as json, we need to lookup the db # object project_member = DataRequestProjectMember.objects.get( project_member_id=project_member) context = { "message": template.render( {"PROJECT_MEMBER_ID": project_member.project_member_id}), "project": project.name, "username": project_member.member.user.username, "activity_management_url": full_url( reverse("activity-management", kwargs={"source": project.slug})), "project_message_form": full_url( reverse("activity-messaging", kwargs={"source": project.slug})), } plain = render_to_string("email/project-message.txt", context) headers = {"Reply-To": project.contact_email} email_from = "{} <{}>".format(project.name, "*****@*****.**") mail = EmailMultiAlternatives( subject, plain, email_from, [project_member.member.primary_email.email], headers=headers, ) mail.send()
def send_withdrawal_email(project, erasure_requested): """ Email a project to notify them that a member has withdrawn. """ params = { "withdrawn_url": full_url( reverse_lazy( "direct-sharing:withdrawn-members", kwargs={"slug": project.slug} ) ), "project": project, "erasure_requested": erasure_requested, } plain = render_to_string("email/notify-withdrawal.txt", params) html = render_to_string("email/notify-withdrawal.html", params) email = EmailMultiAlternatives( "Open Humans notification: member withdrawal", plain, settings.DEFAULT_FROM_EMAIL, [project.contact_email], ) email.attach_alternative(html, "text/html") email.send()
def send_connection_email(self): user = self.request.user connection_name = self.app.verbose_name activity_url = full_url( reverse('activity-management', kwargs={'source': source_to_url_slug(self.source)})) send_connection_email(user, connection_name, activity_url)
def start_task(user, source, force=False): """ Send a task to data-processing. """ task_url = '{}/'.format( urlparse.urljoin(settings.DATA_PROCESSING_URL, source)) try: task_req = requests.post( task_url, params={'key': settings.PRE_SHARED_KEY}, json={ 'oh_user_id': user.id, 'oh_base_url': full_url('/data-import/'), 'force': force, }) except requests.exceptions.RequestException: logger.error('Error in sending request to data processing') error_message = 'Error in call to Open Humans Data Processing.' if 'task_req' in locals() and not task_req.status_code == 200: logger.error('Non-200 response from data processing') error_message = 'Open Humans Data Processing not returning 200.' if 'error_message' in locals(): if not settings.TESTING: client.captureMessage(error_message) return 'error'
def get_source_project(self, obj): return full_url( reverse( "api:project", kwargs={"pk": obj.parent_project_data_file.direct_sharing_project.id}, ) )
def access_token_post_save_cb(sender, instance, created, raw, update_fields, **kwargs): """ Email a user to notify them of any new incoming connections. This signal is only used for projects using our deprecated OAuth2 method: American Gut, Harvard Personal Genome Project, and Wild Life of Our Homes. """ if raw or not created: return # This separates our custom OAuth2 apps from direct sharing projects. try: app_label, _ = [ x for x in get_source_labels_and_configs() if x[1].verbose_name == instance.application.name ][0] except IndexError: return # only notify the user the first time they connect if AccessToken.objects.filter(application=instance.application, user=instance.user).count() > 1: return url_slug = source_to_url_slug(app_label) activity_url = full_url( reverse('activity-management', kwargs={'source': url_slug})) send_connection_email(user=instance.user, connection_name=instance.application.name, activity_url=activity_url)
def get_file_datatypes(self, obj): """ Get links to DataType API endpoints for file DataTypes """ return [ full_url(reverse("api:datatype", kwargs={"pk": dt.id})) for dt in obj.datatypes.all() ]
def get_exchange_member(self, obj): """ Returns a link to the member exchange endpoint to further retrieve a user's files. """ # Pass through the access token access_token = self.context["request"].GET["access_token"] exchange_member = reverse("exchange-member") return "{0}?project_member_id={1}&access_token={2}".format( full_url(exchange_member), obj.project_member_id, access_token)
def send_messages(self, project): template = engines['django'].from_string(self.cleaned_data['message']) subject = '[Open Humans Project Message] ' if 'subject' in self.cleaned_data and self.cleaned_data['subject']: subject += self.cleaned_data['subject'] else: subject += 'From "{}"'.format(project.name) if self.cleaned_data['all_members']: project_members = project.project_members.filter( message_permission=True) else: project_members = self.cleaned_data['project_member_ids'] for project_member in project_members: context = { 'message': template.render( {'PROJECT_MEMBER_ID': project_member.project_member_id}), 'project': project.name, 'username': project_member.member.user.username, 'activity_management_url': full_url( reverse('activity-management', kwargs={'source': project.slug})), 'project_message_form': full_url( reverse('activity-messaging', kwargs={'source': project.slug})), } plain = render_to_string('email/project-message.txt', context) headers = {'Reply-To': project.contact_email} mail = EmailMultiAlternatives( subject, plain, '{} <{}>'.format(project.name, '*****@*****.**'), [project_member.member.primary_email.email], headers=headers) mail.send()
def send_welcome_email(email_address): """ Send a welcome email. Rendered as a separate function to enable testing. """ params = { 'newsletter': email_address.user.member.newsletter, 'add_data_url': full_url(reverse('add-data')), 'explore_share_url': full_url(reverse('explore-share')), 'public_sharing_url': full_url(reverse('public-data:home')), 'data_management_url': full_url(reverse('my-member-data')), } plain = render_to_string('email/welcome.txt', params) html = render_to_string('email/welcome.html', params) send_mail('Welcome to Open Humans!', plain, settings.DEFAULT_FROM_EMAIL, [email_address.email], html_message=html)
def send_emails(project_id, project_members, subject, message, all_members=False): """ Sends emails from project coordinator to project members. """ project = DataRequestProject.objects.get(id=project_id) template = engines["django"].from_string(message) logger.info("Sending {0} emails".format(len(project_members))) if all_members: project_members = project.project_members.filter_active().all() for project_member in project_members: if isinstance(project_member, str): # As the instance was passed as json, we need to lookup the db # object project_member = DataRequestProjectMember.objects.get( project_member_id=project_member ) context = { "message": template.render( {"PROJECT_MEMBER_ID": project_member.project_member_id} ), "project": project.name, "username": project_member.member.user.username, "activity_management_url": full_url( reverse("activity-management", kwargs={"source": project.slug}) ), "project_message_form": full_url( reverse("activity-messaging", kwargs={"source": project.slug}) ), } plain = render_to_string("email/project-message.txt", context) headers = {"Reply-To": project.contact_email} email_from = "{} <{}>".format(project.name, "*****@*****.**") mail = EmailMultiAlternatives( subject, plain, email_from, [project_member.member.primary_email.email], headers=headers, ) mail.send()
def get_exchange_member(self, obj): """ Returns a link to the member exchange endpoint to further retrieve a user's files. """ # Pass through the access token access_token = self.context["request"].GET["access_token"] exchange_member = reverse("exchange-member") return "{0}?project_member_id={1}&access_token={2}".format( full_url(exchange_member), obj.project_member_id, access_token )
def send_welcome_email(email_address): """ Send a welcome email. Rendered as a separate function to enable testing. """ params = { "newsletter": email_address.user.member.newsletter, "add_data_url": full_url(reverse("add-data")), "explore_share_url": full_url(reverse("explore-share")), "public_sharing_url": full_url(reverse("public-data:home")), "data_management_url": full_url(reverse("my-member-data")), } plain = render_to_string("email/welcome.txt", params) html = render_to_string("email/welcome.html", params) send_mail( "Welcome to Open Humans!", plain, settings.DEFAULT_FROM_EMAIL, [email_address.email], html_message=html, )
def send_connection_email(user, connection_name, activity_url): """ Email a user to notify them of a new connection. """ params = { 'user_name': user.member.name, 'connection_name': connection_name, 'activity_url': activity_url, 'is_public_data_participant': user.member.public_data_participant.enrolled, 'public_data_sharing_url': full_url(reverse('public-data:home')), } plain = render_to_string('email/notify-connection.txt', params) html = render_to_string('email/notify-connection.html', params) send_mail('Open Humans notification: {} connected'.format(connection_name), plain, settings.DEFAULT_FROM_EMAIL, [user.member.primary_email.email], html_message=html)
def user_social_auth_post_save_cb(sender, instance, created, raw, update_fields, **kwargs): """ Email a user to notify them of any new outgoing connections. """ if raw or not created: return # only notify the user the first time they connect if UserSocialAuth.objects.filter(provider=instance.provider, user=instance.user).count() > 1: return # Look up the related name and URL. Note, we've used app names that match # the UserSocialAuth 'provider' field in Python Social Auth. app_config = dict(get_source_labels_and_configs())[instance.provider] url_slug = source_to_url_slug(app_config.label) activity_url = full_url( reverse('activity-management', kwargs={'source': url_slug})) send_connection_email(user=instance.user, connection_name=app_config.verbose_name, activity_url=activity_url)
def get_profile_url(obj): return full_url( reverse("member-detail", kwargs={"slug": obj.user.username}))
def download_url(self, request): key = self.generate_key(request) url = full_url( reverse("data-management:datafile-download", args=(self.id, ))) return "{0}?key={1}".format(url, key)
def get_source_project(self, obj): return full_url( reverse("api:project", kwargs={"pk": obj.direct_sharing_project.id}))
def render(self, context): path = super(AbsoluteURLNode, self).render(context) return full_url(path)
def download_url(self): return full_url( reverse('data-management:datafile-download', args=(self.id, )))
def download_url(self, request): key = self.generate_key(request) url = full_url(reverse("data-management:datafile-download", args=(self.id,))) return "{0}?key={1}".format(url, key)