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
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