예제 #1
0
파일: backend.py 프로젝트: fk-lx/mygpo
    def _get_obj_fun(self, action):
        url, op = action

        podcast = self.podcasts.get(url,
                podcast_for_url(url, create=True))

        state = podcast_state_for_user_podcast(self.user, podcast)

        fun = self.operations[op]
        return (state, fun)
예제 #2
0
파일: podcast.py 프로젝트: fk-lx/mygpo
def remove_tag(request, podcast):
    podcast_state = podcast_state_for_user_podcast(request.user, podcast)

    tag_str = request.GET.get('tag', '')
    if not tag_str:
        return HttpResponseBadRequest()

    remove_podcast_tags(podcast_state, tag_str)

    if request.GET.get('next', '') == 'mytags':
        return HttpResponseRedirect('/tags/')

    return HttpResponseRedirect(get_podcast_link_target(podcast))
예제 #3
0
파일: podcast.py 프로젝트: fk-lx/mygpo
def history(request, podcast):
    """ shows the subscription history of the user """

    user = request.user
    state = podcast_state_for_user_podcast(user, podcast)
    history = list(state.actions)

    def _set_objects(h):
        dev = user.get_device(h.device)
        return proxy_object(h, device=dev)
    history = map(_set_objects, history)

    return render(request, 'podcast-history.html', {
        'history': history,
        'podcast': podcast,
    })
예제 #4
0
파일: models.py 프로젝트: fk-lx/mygpo
    def unsubscribe(self, user, device):
        """ unsubscribes user from the current podcast on one or more devices """
        from mygpo.db.couchdb.podcast_state import unsubscribe_on_device, \
            podcast_state_for_user_podcast
        state = podcast_state_for_user_podcast(user, self)

        # accept devices, and also lists and tuples of devices
        devices = device if isinstance(device, (list, tuple)) else [device]

        for device in devices:

            try:
                unsubscribe_on_device(state, device)
                subscription_changed.send(sender=self, user=user, device=device,
                                          subscribed=False)
            except Unauthorized as ex:
                raise SubscriptionException(ex)
예제 #5
0
파일: podcast.py 프로젝트: fk-lx/mygpo
def unsubscribe_all(request, podcast):
    """ unsubscribe all of the user's devices from the podcast """

    user = request.user
    state = podcast_state_for_user_podcast(user, podcast)

    dev_ids = state.get_subscribed_device_ids()
    devs = user.get_devices(dev_ids)
    # ungroup groups
    devs = [dev[0] if isinstance(dev, list) else dev for dev in devs]

    try:
        podcast.unsubscribe(user, devs)
    except (SubscriptionException, DeviceDoesNotExist, ValueError) as e:
        messages.error(request, str(e))

    return HttpResponseRedirect(get_podcast_link_target(podcast))
예제 #6
0
파일: podcast.py 프로젝트: fk-lx/mygpo
def flattr_podcast(request, podcast):
    """ Flattrs a podcast, records an event and redirects to the podcast """

    user = request.user
    site = RequestSite(request)

    # do flattring via the tasks queue, but wait for the result
    task = flattr_thing.delay(user, podcast.get_id(), site.domain,
            request.is_secure(), 'Podcast')
    success, msg = task.get()

    if success:
        action = SubscriptionAction()
        action.action = 'flattr'
        state = podcast_state_for_user_podcast(request.user, podcast)
        add_subscription_action(state, action)
        messages.success(request, _("Flattr\'d"))

    else:
        messages.error(request, msg)

    return HttpResponseRedirect(get_podcast_link_target(podcast))
예제 #7
0
파일: settings.py 프로젝트: fk-lx/mygpo
 def podcast_settings(user, url):
     podcast = podcast_for_url(url)
     if not podcast:
         raise Http404
     obj = podcast_state_for_user_podcast(user, podcast)
     return obj, obj, udb
예제 #8
0
파일: settings.py 프로젝트: fk-lx/mygpo
 def post(self, request, podcast_id):
     podcast = podcast_by_id(podcast_id)
     state = podcast_state_for_user_podcast(request.user, podcast)
     set_podcast_privacy_settings(state, self.public)
     return HttpResponseRedirect(reverse('privacy'))
예제 #9
0
파일: tests.py 프로젝트: fk-lx/mygpo
    def test_merge(self):

        p1 = Podcast()
        p1.urls = ['http://example.com/podcast1.rss']
        p1.save()

        p2 = Podcast()
        p2.urls = ['http://example.com/podcast2.rss']
        p2.save()


        e1 = Episode()
        e1.title = 'Episode 1'
        e1.podcast = p1.get_id()
        e1.urls = ['http://example.com/podcast1/e1.mp3']
        e1.save()

        e2 = Episode()
        e2.title = 'Episode 2'
        e2.podcast = p1.get_id()
        e2.urls = ['http://example.com/podcast1/e2.mp3']
        e2.save()

        e3 = Episode()
        e3.title = 'Episode 3'
        e3.podcast = p2.get_id()
        e3.urls = ['http://example.com/podcast2/e2.mp3']
        e3.save()

        e4 = Episode()
        e4.title = 'Episode 4'
        e4.podcast = p2.get_id()
        e4.urls = ['http://example.com/podcast2/e3.mp3']
        e4.save()

        user = User()
        user.username = '******'
        user.email = '*****@*****.**'
        user.set_password('secret')

        device1 = Device()
        device1.uid = 'dev1'

        device2 = Device()
        device2.uid = 'dev2'

        user.devices.append(device1)
        user.devices.append(device2)
        user.save()


        p1.subscribe(user, device1)
        time.sleep(1)
        p1.unsubscribe(user, device1)
        time.sleep(1)
        p1.subscribe(user, device1)
        p2.subscribe(user, device2)

        s1 = episode_state_for_user_episode(user, e1)
        add_episode_actions(s1, [EpisodeAction(action='play',
                    upload_timestamp=get_timestamp(datetime.utcnow()))])

        s3 = episode_state_for_user_episode(user, e3)
        add_episode_actions(s3, [EpisodeAction(action='play',
                    upload_timestamp=get_timestamp(datetime.utcnow()))])

        # we need that for later
        e3_id = e3._id

        actions = Counter()

        # decide which episodes to merge
        groups = [(0, [e1]), (1, [e2, e3]), (2, [e4])]

        # carry out the merge
        pm = PodcastMerger([p1, p2], actions, groups)
        pm.merge()

        e1 = episode_by_id(e1._id)
        es1 = episode_state_for_user_episode(user, e1)
        self.assertEqual(len(es1.actions), 1)

        # check if merged episode's id can still be accessed
        e3 = episode_by_id(e3_id)
        es3 = episode_state_for_user_episode(user, e3)
        self.assertEqual(len(es3.actions), 1)

        p1 = podcast_by_id(p1.get_id())
        ps1 = podcast_state_for_user_podcast(user, p1)
        self.assertEqual(len(ps1.get_subscribed_device_ids()), 2)

        self.assertEqual(len(list(episodes_for_podcast(p1))), 3)
예제 #10
0
파일: podcast.py 프로젝트: fk-lx/mygpo
def show(request, podcast):
    """ Shows a podcast detail page """

    podcast = check_restrictions(podcast)

    current_site = RequestSite(request)
    num_episodes = 20
    episodes = episode_list(podcast, request.user, limit=num_episodes)
    user = request.user

    max_listeners = max([e.listeners for e in episodes] + [0])

    episode = None

    if episodes:
        episode = episodes[0]
        episodes = episodes[1:]

    if podcast.group:
        group = PodcastGroup.get(podcast.group)
        rel_podcasts = filter(lambda x: x != podcast, group.podcasts)
    else:
        rel_podcasts = []

    tags, has_tagged = get_tags(podcast, user)

    if user.is_authenticated():
        state = podcast_state_for_user_podcast(user, podcast)
        subscribed_devices = state.get_subscribed_device_ids()
        subscribed_devices = user.get_devices(subscribed_devices)

        subscribe_targets = podcast.subscribe_targets(user)

        has_history = bool(state.actions)
        is_public = state.settings.get('public_subscription', True)
        can_flattr = request.user.get_wksetting(FLATTR_TOKEN) and podcast.flattr_url

    else:
        has_history = False
        is_public = False
        subscribed_devices = []
        subscribe_targets = []
        can_flattr = False

    is_publisher = check_publisher_permission(user, podcast)

    episodes_total = podcast.episode_count or 0
    num_pages = episodes_total / num_episodes
    page_list = get_page_list(1, num_pages, 1, 15)

    return render(request, 'podcast.html', {
        'tags': tags,
        'has_tagged': has_tagged,
        'url': current_site,
        'has_history': has_history,
        'podcast': podcast,
        'is_public': is_public,
        'devices': subscribed_devices,
        'related_podcasts': rel_podcasts,
        'can_subscribe': len(subscribe_targets) > 0,
        'subscribe_targets': subscribe_targets,
        'episode': episode,
        'episodes': episodes,
        'max_listeners': max_listeners,
        'can_flattr': can_flattr,
        'is_publisher': is_publisher,
        'page_list': page_list,
        'current_page': 1,
    })
예제 #11
0
파일: podcast.py 프로젝트: fk-lx/mygpo
def set_public(request, podcast, public):
    state = podcast_state_for_user_podcast(request.user, podcast)
    set_podcast_privacy_settings(state, public)
    return HttpResponseRedirect(get_podcast_link_target(podcast))