def get_videos_for_languages_haystack(self, languages): from utils.multi_query_set import MultiQuerySet languages.extend( [l[:l.find('-')] for l in languages if l.find('-') > -1]) languages = list(set(languages)) pairs_m, pairs_0, langs = [], [], [] for l1 in languages: langs.append(SQ(content='S_{0}'.format(l1))) for l0 in languages: if l1 != l0: pairs_m.append(self._lang_pair((l1, l0), "M")) pairs_0.append(self._lang_pair((l1, l0), "0")) qs_list = [] qs_list.append(self._filter(self._base_sqs(), pairs_m)) qs_list.append( self._exclude(self._filter(self._base_sqs(), pairs_0), pairs_m)) qs_list.append( self._exclude( self._base_sqs().filter(original_language__in=languages), pairs_m + pairs_0).order_by('has_lingua_franca')) qs_list.append( self._exclude(self._filter(self._base_sqs(), langs), pairs_m + pairs_0).exclude(original_language__in=languages)) qs_list.append( self._exclude(self._base_sqs(), langs + pairs_m + pairs_0).exclude(original_language__in=languages)) mqs = MultiQuerySet(*[qs for qs in qs_list if qs is not None]) # this is way more efficient than making a count from all the # constituent querysets. mqs.set_count(TeamVideo.objects.filter(team=self).count()) return qs_list, mqs
def load_popular_videos_volunteer(self, sort, request, user): sort_types = { 'today': 'today_views', 'week': 'week_views', 'month': 'month_views', 'year': 'year_views', 'total': 'total_views' } sort_field = sort_types.get(sort, 'week_views') rel, rest = self._get_volunteer_sqs(request, user) rel = rel.order_by('-%s' % sort_field)[:5] rest = rest.order_by('-%s' % sort_field)[:5] count = rel.count() + rest.count() mqs = MultiQuerySet(rel, rest) mqs.set_count(count) context = {'video_list': mqs} content = render_to_string('videos/_watch_page.html', context, RequestContext(request)) return {'content': content}
def load_popular_videos_volunteer(self, sort, request, user): sort_types = { 'today': 'today_views', 'week': 'week_views', 'month': 'month_views', 'year': 'year_views', 'total': 'total_views' } sort_field = sort_types.get(sort, 'week_views') rel, rest = self._get_volunteer_sqs(request, user) rel = rel.order_by('-%s' % sort_field)[:5] rest = rest.order_by('-%s' % sort_field)[:5] count = rel.count() + rest.count() mqs = MultiQuerySet(rel, rest) mqs.set_count(count) context = { 'video_list': mqs } content = render_to_string('videos/_watch_page.html', context, RequestContext(request)) return { 'content': content }
def load_latest_page_volunteer(self, page, request, user): rel, rest = self._get_volunteer_sqs(request, user) rel = rel.order_by('-created') rest = rest.order_by('-created') count = rel.count() + rest.count() mqs = MultiQuerySet(rel, rest) mqs.set_count(count) return render_page(page, mqs, request=request)
def load_requested_page_volunteer(self, page, request, user): user_langs = get_user_languages_from_request(request) rel, rest = self._get_volunteer_sqs(request, user) rel = rel.filter(requests_exact__in=user_langs) rest = rest.filter(requests_exact__in=user_langs) count = rel.count() + rest.count() mqs = MultiQuerySet(rel, rest) mqs.set_count(count) return render_page(page, mqs, request=request)
def load_featured_page_volunteer(self, page, request, user): rel, rest = self._get_volunteer_sqs(request, user) rel = rel.filter(featured__gt=datetime.datetime(datetime.MINYEAR, 1, 1)) \ .order_by('-featured') rest = rest.filter(featured__gt=datetime.datetime(datetime.MINYEAR, 1, 1)) \ .order_by('-featured') count = rel.count() + rest.count() mqs = MultiQuerySet(rel, rest) mqs.set_count(count) return render_page(page, mqs, request=request)
def test_slice_multiple(self): qs = list(Video.objects.all()) qs = qs + qs + qs mqs = MultiQuerySet(Video.objects.all(), Video.objects.all(), Video.objects.all()) self.assertEqual(qs[0:3], list(mqs[0:3]), "MQS[:3] failed.") self.assertEqual(qs[0:6], list(mqs[0:6]), "MQS[:6] (entire range) failed.") self.assertEqual(qs[0:7], list(mqs[0:7]), "MQS[:7] (out-of-bounds endpoint) failed.") self.assertEqual(qs[1:3], list(mqs[1:3]), "MQS[1:3] failed.") self.assertEqual(qs[1:6], list(mqs[1:6]), "MQS[1:6] (entire range) failed.") self.assertEqual(qs[1:7], list(mqs[1:7]), "MQS[1:7] (out-of-bounds endpoint) failed.") self.assertEqual(qs[3:3], list(mqs[3:3]), "MQS[3:3] failed.") self.assertEqual(qs[3:6], list(mqs[3:6]), "MQS[3:6] (entire range) failed.") self.assertEqual(qs[3:7], list(mqs[3:7]), "MQS[3:7] (out-of-bounds endpoint) failed.")
def test_full(self): self.assertEqual(list(Video.objects.all()), list(MultiQuerySet(Video.objects.all())), "Full, single MQS didn't match full QS.") self.assertEqual( list(Video.objects.all()), list( MultiQuerySet(Video.objects.none(), Video.objects.all(), Video.objects.none())), "Full MQS with blanks didn't match full QS.") self.assertEqual( list(Video.objects.all()) + list(Video.objects.all()), list( MultiQuerySet(Video.objects.none(), Video.objects.all(), Video.objects.none(), Video.objects.all())), "Double MQS with blanks didn't match double full QS.")
def load_popular_page_volunteer(self, page, sort, request, user): sort_types = { 'today': 'today_views', 'week' : 'week_views', 'month': 'month_views', 'year' : 'year_views', 'total': 'total_views' } sort_field = sort_types.get(sort, 'week_views') rel, rest = self._get_volunteer_sqs(request, user) rel = rel.order_by('-%s' % sort_field) rest = rest.order_by('-%s' % sort_field) count = rel.count() + rest.count() mqs = MultiQuerySet(rel, rest) mqs.set_count(count) return render_page(page, mqs, request=request)
def load_popular_page_volunteer(self, page, sort, request, user): sort_types = { 'today': 'today_views', 'week': 'week_views', 'month': 'month_views', 'year': 'year_views', 'total': 'total_views' } sort_field = sort_types.get(sort, 'week_views') rel, rest = self._get_volunteer_sqs(request, user) rel = rel.order_by('-%s' % sort_field) rest = rest.order_by('-%s' % sort_field) count = rel.count() + rest.count() mqs = MultiQuerySet(rel, rest) mqs.set_count(count) return render_page(page, mqs, request=request)
def get_videos_for_languages_haystack(self, languages): from utils.multi_query_set import MultiQuerySet languages.extend([l[:l.find('-')] for l in languages if l.find('-') > -1]) languages = list(set(languages)) pairs_m, pairs_0, langs = [], [], [] for l1 in languages: langs.append(SQ(content='S_{0}'.format(l1))) for l0 in languages: if l1 != l0: pairs_m.append(self._lang_pair((l1, l0), "M")) pairs_0.append(self._lang_pair((l1, l0), "0")) qs_list = [] qs_list.append(self._filter(self._base_sqs(), pairs_m)) qs_list.append(self._exclude(self._filter(self._base_sqs(), pairs_0), pairs_m)) qs_list.append(self._exclude( self._base_sqs().filter( original_language__in=languages), pairs_m + pairs_0).order_by('has_lingua_franca')) qs_list.append(self._exclude( self._filter(self._base_sqs(), langs), pairs_m + pairs_0).exclude(original_language__in=languages)) qs_list.append(self._exclude( self._base_sqs(), langs + pairs_m + pairs_0).exclude( original_language__in=languages)) mqs = MultiQuerySet(*[qs for qs in qs_list if qs is not None]) # this is way more efficient than making a count from all the # constituent querysets. mqs.set_count(TeamVideo.objects.filter(team=self).count()) return qs_list, mqs
def test_slice(self): qs = Video.objects.all() mqs = MultiQuerySet(Video.objects.all()) self.assertEqual(list(qs[0:1]), list(mqs[0:1]), "MQS[:1] failed.") self.assertEqual(list(qs[0:2]), list(mqs[0:2]), "MQS[:2] failed.") self.assertEqual(list(qs[0:3]), list(mqs[0:3]), "MQS[:3] (out-of-bounds endpoint) failed.") self.assertEqual(list(qs[1:3]), list(mqs[1:3]), "MQS[1:3] failed.") self.assertEqual(list(qs[2:3]), list(mqs[2:3]), "MQS[2:3] failed.") self.assertEqual(list(qs[1:1]), list(mqs[1:1]), "MQS[1:1] (empty slice) failed.")