Esempio n. 1
0
def get_db_channels(locale, paging, with_video_counts=False, add_tracking=None, **filters):
    channels = models.Channel.query.filter_by(public=True, deleted=False).\
        join(models.User).\
        outerjoin(
            models.ChannelLocaleMeta,
            ((models.ChannelLocaleMeta.channel == models.Channel.id) &
             (models.ChannelLocaleMeta.locale == locale))).\
        options(lazyload('category_rel'), contains_eager(models.Channel.owner_rel))

    if filters.get('channels'):
        channels = channels.filter(models.Channel.id.in_(filters['channels']))
    if filters.get('category'):
        channels = _filter_by_category(channels, models.Channel, filters['category'])
    if filters.get('query'):
        channels = channels.filter(func.lower(models.Channel.title).
                                   like('%%%s%%' % filters['query'].lower()))

    if filters.get('date_order'):
        channels = channels.order_by(desc(models.Channel.date_added))

    if with_video_counts:
        channels = channels.outerjoin(
            models.VideoInstance,
            (models.VideoInstance.channel == models.Channel.id) &
            (models.VideoInstance.deleted == False)
        ).with_entities(models.Channel, func.count(models.VideoInstance.id)).\
            group_by(models.Channel.id, models.User.id)
    else:
        channels = channels.with_entities(models.Channel, null())

    total = channels.count()
    offset, limit = paging
    items = [
        channel_dict(channel, position,
                     video_count=video_count,
                     add_tracking=add_tracking)
        for position, (channel, video_count) in
        enumerate(channels.offset(offset).limit(limit), offset)
    ]

    return items, total
Esempio n. 2
0
def get_local_videos(loc, paging, with_channel=True, with_comments=False, include_invisible=False,
                     readonly_db=False, add_tracking=None, **filters):
    session = readonly_session if readonly_db else db.session
    videos = session.query(
        models.VideoInstance,
        func.count(models.VideoInstanceComment.id) if with_comments else null(),
    ).join(
        models.Video, models.Video.id == models.VideoInstance.video).\
        filter(models.VideoInstance.deleted == False).\
        options(contains_eager(models.VideoInstance.video_rel)).\
        group_by(models.VideoInstance.id, models.Video.id)

    if with_comments:
        videos = videos.outerjoin(
            models.VideoInstanceComment,
            models.VideoInstanceComment.video_instance == models.VideoInstance.id)

    if include_invisible is False:
        videos = videos.filter(models.Video.visible == True)
    if with_channel:
        videos = videos.join(
            models.Channel,
            models.Channel.id == models.VideoInstance.channel
        ).options(lazyload(
            models.VideoInstance.video_channel,
            models.Channel.category_rel))

    if filters.get('channel'):
        filters.setdefault('channels', [filters['channel']])

    if filters.get('channels'):
        videos = videos.filter(models.VideoInstance.channel.in_(filters['channels']))

    if filters.get('owner'):
        # Check we haven't already joined Channel
        if not with_channel:
            videos = videos.join(
                models.Channel,
                models.Channel.id == models.VideoInstance.channel)
        videos = videos.filter(models.Channel.owner == filters['owner'])

    if filters.get('category'):
        videos = _filter_by_category(videos, models.VideoInstance, filters['category'][0])

    if filters.get('position_order'):
        videos = videos.order_by(models.VideoInstance.position)

    if filters.get('star_order'):
        videos = videos.outerjoin(
            models.VideoInstanceLocaleMeta,
            (models.VideoInstanceLocaleMeta.video_instance == models.VideoInstance.id) &
            (models.VideoInstanceLocaleMeta.locale == loc))
        videos = videos.group_by(models.VideoInstance.id, models.Video.id, models.VideoInstanceLocaleMeta.star_count).\
            order_by(desc(models.VideoInstanceLocaleMeta.star_count))

    if filters.get('date_order'):
        videos = videos.order_by(desc(models.VideoInstance.date_added)).\
            order_by(desc(models.Video.date_published))

    total = videos.count()
    offset, limit = paging
    videos = videos.offset(offset).limit(limit)
    data = []
    for position, (video, comment_count) in enumerate(videos, offset):
        item = video_dict(video)
        item['position'] = position
        if comment_count is not None:
            item['comments'] = dict(count=comment_count)
        if with_channel:
            item['channel'] = channel_dict(video.video_channel)
        if add_tracking:
            add_tracking(item)
        data.append(item)
    return data, total