Example #1
0
    def get_api_url(self):
        """
        Returns what api url the recipient of this notification should
        query for the latest data. This is team dependent if the team
        has a custom base url.
        """
        from teams.models import Application

        if self.language:
            url = universal_url('api:subtitles', kwargs={
                'video_id': self.language.video.video_id,
                'language_code': self.language.language_code
            })
            if self.version:
                url += '?version_no={}'.format(self.version.version_number)
            return url
        elif self.video:
            return universal_url('api:video-detail', kwargs={
                'video_id': self.video.video_id,
            })
        elif self.application_pk:
            application = Application.objects.get(pk=self.application_pk)
            return universal_url('api:team-application-detail', kwargs={
                'team_slug': application.team.slug,
                'id': application.id,
            })
        else:
            return None
Example #2
0
 def test_universal_urls(self):
     from localeurl.utils import universal_url
     domain = Site.objects.get_current().domain
     vid = self.video.video_id
     self.assertEqual(
         "http://%s/videos/%s/info/" % (domain, vid),
         universal_url("videos:video", kwargs={"video_id": vid}))
     self.assertEqual("http://%s/videos/%s/info/" % (domain, vid),
                      universal_url("videos:video", args=(vid, )))
Example #3
0
 def test_universal_urls(self):
     domain = settings.HOSTNAME
     vid = 'test-video-id'
     correct_url = "%s://%s/videos/%s/info/" % (
         DEFAULT_PROTOCOL, domain, vid)
     self.assertEqual(correct_url,
                      universal_url("videos:video",
                                    kwargs={"video_id":vid}))
     self.assertEqual(correct_url,
                      universal_url("videos:video", args=(vid,)))
Example #4
0
 def test_universal_urls(self):
     domain = Site.objects.get_current().domain
     vid = self.video.video_id
     correct_url = "%s://%s/videos/%s/info/" % (DEFAULT_PROTOCOL, domain,
                                                vid)
     self.assertEqual(
         correct_url, universal_url("videos:video",
                                    kwargs={"video_id": vid}))
     self.assertEqual(correct_url,
                      universal_url("videos:video", args=(vid, )))
Example #5
0
    def send_messages(self, note, user_list):
        subject = fmt(_(u'%(user)s added a note while editing %(title)s'),
                      user=unicode(note.user),
                      title=self.video.title_display())

        tasks_url = universal_url('teams:team_tasks',
                                  kwargs={
                                      'slug': self.team.slug,
                                  })
        filter_query = '?team_video={0}&assignee=anyone&lang={1}'
        filter_query = filter_query.format(self.team_video.pk,
                                           self.language_code)
        data = {
            'note_user': unicode(note.user),
            'body': note.body,
            'tasks_url': tasks_url + filter_query,
            'video': self.video.title_display(),
            'language': translation.get_language_label(self.language_code),
        }
        email_template = ("messages/email/"
                          "task-team-editor-note-notifiction.html")
        message_template = 'messages/task-team-editor-note.html'

        for user in user_list:
            send_templated_email(user,
                                 subject,
                                 email_template,
                                 data,
                                 fail_silently=not settings.DEBUG)

            Message.objects.create(user=user,
                                   subject=subject,
                                   message_type="S",
                                   content=render_to_string(
                                       message_template, data))
Example #6
0
def youtube_oauth_callback(request):
    """
    Stores the oauth tokes. We identify which team this belongs to
    since we've passed the pk on the state param for the authorize request
    """
    import atom
    code = request.GET.get("code", None)
    if code is None:
        raise Exception("No code in youtube oauth callback")
    state = request.GET.get("state", None)
    if state is None:
        raise Exception("No state in youtube oauth callback")
    values = state.split("-")
    team_pk = values[0]
    if len(values) > 1:
        project_pk = values[1]
    team = Team.objects.get(pk=team_pk)

    base = "https://accounts.google.com/o/oauth2/token"
    state = team.pk

    params = {
        "client_id": settings.YOUTUBE_CLIENT_ID,
        "client_secret": settings.YOUTUBE_CLIENT_SECRET,
        "redirect_uri": universal_url("accountlinker:youtube-oauth-callback"),
        "code": code,
        "grant_type": "authorization_code",
    }

    response = requests.post(
        base,
        data=params,
        headers={"Content-Type": "application/x-www-form-urlencoded"})
    if response.status_code != 200:
        logger.error("Error on requesting Youtube Oauth token",
                     extra={
                         "data": {
                             "sent_params": params,
                             "original_request": request,
                         },
                     })

    content = json.loads(response.content)
    bridge = YouTubeApiBridge(content['access_token'],
                              content['refresh_token'], None)
    feed = bridge.GetUserFeed(username='******')
    author = [x for x in feed.get_elements() if type(x) == atom.data.Author][0]

    # make sure we don't store multiple auth tokes for the same account
    account, created = ThirdPartyAccount.objects.get_or_create(
        type=VIDEO_TYPE_YOUTUBE,
        username=author.name.text,
        defaults={
            'oauth_refresh_token': content['refresh_token'],
            'oauth_access_token': content['access_token'],
        })
    team.third_party_accounts.add(account)
    return redirect(
        reverse("teams:third-party-accounts", kwargs={"slug": team.slug}))
Example #7
0
def _generate_youtube_oauth_request_link(state_str=None):
    state_str = state_str or ""
    base = "https://accounts.google.com/o/oauth2/auth?"
    state = state_str

    params = {
        "client_id": settings.YOUTUBE_CLIENT_ID,
        "redirect_uri": universal_url("accountlinker:youtube-oauth-callback"),
        "scope": "https://gdata.youtube.com",
        "state": state,
        "response_type": "code",
        "approval_prompt": "force",
        "access_type": "offline",
    }
    return "%s%s" % (base, urllib.urlencode(params))
Example #8
0
def google_callback_url():
    return universal_url(
        'externalsites:google-callback',
        protocol_override=settings.OAUTH_CALLBACK_PROTOCOL)
Example #9
0
 def test_universal_urls(self):
     from localeurl.utils import universal_url
     domain= Site.objects.get_current().domain
     vid = self.video.video_id
     self.assertEqual("http://%s/videos/%s/info/" % (domain, vid) , universal_url( "videos:video", kwargs={"video_id":vid} ))
     self.assertEqual("http://%s/videos/%s/info/" % (domain, vid) , universal_url( "videos:video", args=(vid,) ))
Example #10
0
def send_video_comment_notification(comment_pk_or_instance, version_pk=None):
    """
    Comments can be attached to a video (appear in the videos:video (info)) page) OR
                                  sublanguage (appear in the videos:translation_history  page)
    Approval / Reviews notes are also stored as comments.

    """
    from comments.models import Comment
    from videos.models import Video
    from subtitles.models import SubtitleLanguage, SubtitleVersion

    if not isinstance(comment_pk_or_instance, Comment):
        try:
            comment = Comment.objects.get(pk=comment_pk_or_instance)
        except Comment.DoesNotExist:
            return
    else:
        comment = comment_pk_or_instance

    version = None

    if version_pk:
        try:
            version = SubtitleVersion.objects.get(pk=version_pk)
        except SubtitleVersion.DoesNotExist:
            pass

    ct = comment.content_object

    if isinstance(ct, Video):
        video = ct
        version = None
        language = None
    elif isinstance(ct, SubtitleLanguage):
        video = ct.video
        language = ct

    domain = settings.HOSTNAME
    protocol = getattr(settings, 'DEFAULT_PROTOCOL', 'https')

    if language:
        language_url = universal_url("videos:translation_history",
                                     kwargs={
                                         "video_id": video.video_id,
                                         "lang": language.language_code,
                                         "lang_id": language.pk,
                                     })
    else:
        language_url = None

    if version:
        version_url = universal_url(
            "videos:subtitleversion_detail",
            kwargs={
                'video_id': version.video.video_id,
                'lang': version.subtitle_language.language_code,
                'lang_id': version.subtitle_language.pk,
                'version_id': version.pk,
            })
    else:
        version_url = None

    subject = fmt(ugettext(u'%(user)s left a comment on the video %(title)s'),
                  user=unicode(comment.user),
                  title=video.title_display())

    followers = set(video.notification_list(comment.user))

    for user in followers:
        send_templated_email(
            user,
            subject,
            "messages/email/comment-notification.html", {
                "video": video,
                "user": user,
                "hash": user.hash_for_video(video.video_id),
                "commenter": unicode(comment.user),
                "commenter_url": comment.user.get_absolute_url(),
                "version_url": version_url,
                "language_url": language_url,
                "domain": domain,
                "version": version,
                "body": comment.content,
                "STATIC_URL": settings.STATIC_URL,
            },
            fail_silently=not settings.DEBUG)

    if language:
        obj = language
        object_pk = language.pk
        content_type = ContentType.objects.get_for_model(language)
        exclude = [
            u for u in language.followers.filter(notify_by_message=False)
        ]
        exclude.append(comment.user)
        message_followers = language.notification_list(exclude)
    else:
        obj = video
        object_pk = video.pk
        content_type = ContentType.objects.get_for_model(video)
        exclude = list(video.followers.filter(notify_by_message=False))
        exclude.append(comment.user)
        message_followers = video.notification_list(exclude)

    for user in message_followers:
        Message.objects.create(
            user=user,
            subject=subject,
            object_pk=object_pk,
            content_type=content_type,
            object=obj,
            message_type="S",
            content=render_to_string(
                'messages/new-comment.html', {
                    "video": video,
                    "language": language,
                    "commenter": unicode(comment.user),
                    "commenter_url": comment.user.get_absolute_url(),
                    "version_url": version_url,
                    "language_url": language_url,
                    "domain": domain,
                    "protocol": protocol,
                    "version": version,
                    "body": comment.content
                }))
Example #11
0
def _youtube_request_uri():
    if getattr(settings, 'YOUTUBE_CLIENT_FORCE_HTTPS', True):
        return universal_url("accountlinker:youtube-oauth-callback",
                             protocol_override='https')
    else:
        return universal_url("accountlinker:youtube-oauth-callback")
Example #12
0
def notify_comment_by_email(comment,
                            version=None,
                            moderator=None,
                            is_rejection=False):
    """
    Comments can be attached to a video (appear in the videos:video (info)) page) OR
                                  sublanguage (appear in the videos:translation_history  page)
    Since version rejection becomes comments for videos we also need to cater for this in the email
                                  
    """
    ct = comment.content_object
    if isinstance(ct, Video):
        video = ct
        version = None
        language = None
    elif isinstance(ct, SubtitleLanguage):
        video = ct.video
        language = ct

    domain = Site.objects.get_current().domain
    email_body = render_to_string(
        "comments/email/comment-notification.html", {
            "video": video,
            "version": version,
            "moderator": moderator,
            "domain": domain,
            "body": comment.content,
            "language": language,
            "is_rejection": is_rejection,
            "STATIC_URL": settings.STATIC_URL,
        })
    if language:
        language_url = universal_url("videos:translation_history",
                                     kwargs={
                                         "video_id": video.video_id,
                                         "lang": language.language,
                                         "lang_id": language.pk,
                                     })
    else:
        language_url = None
    if version:
        version_url = universal_url("videos:revision",
                                    kwargs={
                                        "pk": version.pk,
                                    })
    else:
        version_url = None
    user = moderator or comment.user
    user_url = universal_url("profiles:profile", args=(user.id, ))

    if is_rejection:
        subject = SUBJECT_EMAIL_VERSION_REJECTED % video.title_display()
    else:
        subject = SUBJECT_EMAIL_VIDEO_COMMENTED % (comment.user.username,
                                                   video.title_display())

    followers = set(video.notification_list(comment.user))
    if language:
        followers.update(language.notification_list(comment.user))
    for user in followers:
        send_templated_email_async.delay(
            user.email,
            subject,
            "comments/email/comment-notification.html", {
                "video": video,
                "commenter": unicode(comment.user),
                "commenter_url": comment.user.get_absolute_url(),
                "version_url": version_url,
                "language_url": language_url,
                "domain": domain,
                "version": version,
                "body": comment.content,
                "STATIC_URL": settings.STATIC_URL,
            },
            fail_silently=not settings.DEBUG)
Example #13
0
def notify_comment_by_email(comment,  version=None,  moderator=None, is_rejection=False):
    """
    Comments can be attached to a video (appear in the videos:video (info)) page) OR
                                  sublanguage (appear in the videos:translation_history  page)
    Since version rejection becomes comments for videos we also need to cater for this in the email
                                  
    """
    ct = comment.content_object
    if isinstance( ct, Video):
        video = ct
        version = None
        language = None
    elif isinstance(ct, SubtitleLanguage ):
        video = ct.video
        language = ct

    domain = Site.objects.get_current().domain
    email_body = render_to_string("comments/email/comment-notification.html", {
            "video": video,
            "version": version,
            "moderator": moderator,
            "domain":domain,
            "body": comment.content,
            "language":language,
            "is_rejection":is_rejection,
            "STATIC_URL": settings.STATIC_URL,
            })
    if language:
        language_url = universal_url("videos:translation_history", kwargs={
            "video_id": video.video_id,
            "lang": language.language,
            "lang_id": language.pk,
        })
    else:
        language_url = None
    if version:
        version_url = universal_url("videos:revision", kwargs={
            "pk": version.pk,
        })
    else:
        version_url = None
    user = moderator or comment.user    
    user_url = universal_url("profiles:profile", args=(user.id,))
    
    if is_rejection:
        subject = SUBJECT_EMAIL_VERSION_REJECTED  % video.title_display()
    else:
        subject = SUBJECT_EMAIL_VIDEO_COMMENTED  % (comment.user.username, video.title_display())

    followers = set(video.notification_list(comment.user))
    if language:
        followers.update(language.notification_list(comment.user))
    for user in followers:
        send_templated_email_async.delay(
            user.email,
            subject,
            "comments/email/comment-notification.html", 
            {
                "video": video,
                "commenter": unicode(comment.user),
                "commenter_url": comment.user.get_absolute_url(),
                "version_url":version_url,
                "language_url":language_url,
                "domain":domain,
                "version": version,
                "body": comment.content,
                "STATIC_URL": settings.STATIC_URL,
            }, 
            fail_silently=not settings.DEBUG)
Example #14
0
def universal_url(view_name, *args, **kwargs):
    return utils.universal_url(view_name, args=args, kwargs=kwargs)