예제 #1
0
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)
예제 #2
0
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()
예제 #3
0
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()
예제 #4
0
 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)
예제 #5
0
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'
예제 #6
0
 def get_source_project(self, obj):
     return full_url(
         reverse(
             "api:project",
             kwargs={"pk": obj.parent_project_data_file.direct_sharing_project.id},
         )
     )
예제 #7
0
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()
예제 #8
0
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)
예제 #9
0
 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()
     ]
예제 #10
0
 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)
예제 #11
0
    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()
예제 #12
0
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)
예제 #13
0
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()
예제 #14
0
 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
     )
예제 #15
0
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,
    )
예제 #16
0
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,
    )
예제 #17
0
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)
예제 #18
0
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)
예제 #19
0
 def get_profile_url(obj):
     return full_url(
         reverse("member-detail", kwargs={"slug": obj.user.username}))
예제 #20
0
 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)
예제 #21
0
 def get_source_project(self, obj):
     return full_url(
         reverse("api:project",
                 kwargs={"pk": obj.direct_sharing_project.id}))
예제 #22
0
 def render(self, context):
     path = super(AbsoluteURLNode, self).render(context)
     return full_url(path)
예제 #23
0
 def render(self, context):
     path = super(AbsoluteURLNode, self).render(context)
     return full_url(path)
예제 #24
0
 def download_url(self):
     return full_url(
         reverse('data-management:datafile-download', args=(self.id, )))
예제 #25
0
 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)