def get_paginator(self, request, queryset, per_page, orphans=0, allow_empty_first_page=True): # Cloned # from conference.admin.TalkAdmin talks = cdata.talks_data(queryset.values_list('talk__id', flat=True)) self.cached_talks = dict([(x['id'], x) for x in talks]) sids = [s['id'] for t in talks for s in t['speakers']] profiles = cdata.profiles_data(sids) self.cached_profiles = dict([(x['id'], x) for x in profiles]) return super(P3TalkAdmin, self).get_paginator(request, queryset, per_page, orphans, allow_empty_first_page)
def get_paginator(self, request, queryset, per_page, orphans=0, allow_empty_first_page=True): # utilizzo dataaccess per fare una sola query verso il db, in questo # modo ho subito tutti i dati pronti (utile ad esempio per mostrare i # nomi degli speaker) talks = dataaccess.talks_data(queryset.values_list('id', flat=True)) self.cached_talks = dict([(x['id'], x) for x in talks]) sids = [ s['id'] for t in talks for s in t['speakers'] ] profiles = dataaccess.profiles_data(sids) self.cached_profiles = dict([(x['id'], x) for x in profiles]) return super(TalkAdmin, self).get_paginator(request, queryset, per_page, orphans, allow_empty_first_page)
def stats_list(self, request): qs = models.TalkSpeaker.objects\ .filter(talk__conference=settings.CONFERENCE)\ .order_by('speaker__user__first_name', 'speaker__user__last_name')\ .distinct()\ .values_list('speaker', flat=True) # precarico i profili per aiutare il template dataaccess.profiles_data(qs) speakers = dataaccess.speakers_data(qs) groups = {} for t, _ in models.TALK_TYPE: sids = set(qs.filter(talk__type=t)) data = [x for x in speakers if x['user'] in sids] if data: groups[t] = data return render_to_response( 'admin/conference/speaker/stats_list.html', { 'speakers': speakers, 'groups': groups, }, context_instance=template.RequestContext(request))
def stats_list(self, request): qs = models.TalkSpeaker.objects\ .filter(talk__conference=settings.CONFERENCE)\ .order_by('speaker__user__first_name', 'speaker__user__last_name')\ .distinct()\ .values_list('speaker', flat=True) # precarico i profili per aiutare il template dataaccess.profiles_data(qs) speakers = dataaccess.speakers_data(qs) groups = {} for t, _ in models.TALK_TYPE: sids = set(qs.filter(talk__type=t)) data = [ x for x in speakers if x['user'] in sids ] if data: groups[t] = data return render_to_response( 'admin/conference/speaker/stats_list.html', { 'speakers': speakers, 'groups': groups, }, context_instance=template.RequestContext(request) )
def profiles_data(uids): cached = zip(uids, profile_data.get_from_cache([ (x,) for x in uids ])) missing = [ x[0] for x in cached if x[1] is cache_me.CACHE_MISS ] preload = {} profiles = models.P3Profile.objects\ .filter(profile__in=missing)\ .select_related('profile__user') tags = cmodels.ConferenceTaggedItem.objects\ .filter( content_type=ContentType.objects.get_for_model(models.P3Profile), object_id__in=missing )\ .values('object_id', 'tag__name') speakers = models.SpeakerConference.objects\ .filter(speaker__in=missing) for p in profiles: preload[p.profile_id] = { 'profile': p, 'interests': set(), } for row in tags: preload[row['object_id']]['interests'].add(row['tag__name']) for spk in speakers: preload[spk.speaker_id]['speaker'] = spk cdata.profiles_data(missing) output = [] for ix, e in enumerate(cached): pid, val = e if val is cache_me.CACHE_MISS: val = profile_data(pid, preload=preload[pid]) output.append(val) return output
def profiles_data(uids): cached = zip(uids, profile_data.get_from_cache([(x, ) for x in uids])) missing = [x[0] for x in cached if x[1] is cache_me.CACHE_MISS] preload = {} profiles = models.P3Profile.objects\ .filter(profile__in=missing)\ .select_related('profile__user') tags = cmodels.ConferenceTaggedItem.objects\ .filter( content_type=ContentType.objects.get_for_model(models.P3Profile), object_id__in=missing )\ .values('object_id', 'tag__name') speakers = models.SpeakerConference.objects\ .filter(speaker__in=missing) for p in profiles: preload[p.profile_id] = { 'profile': p, 'interests': set(), } for row in tags: preload[row['object_id']]['interests'].add(row['tag__name']) for spk in speakers: preload[spk.speaker_id]['speaker'] = spk cdata.profiles_data(missing) output = [] for ix, e in enumerate(cached): pid, val = e if val is cache_me.CACHE_MISS: val = profile_data(pid, preload=preload[pid]) output.append(val) return output
def get_paginator(self, request, queryset, per_page, orphans=0, allow_empty_first_page=True): # utilizzo dataaccess per fare una sola query verso il db, in questo # modo ho subito tutti i dati pronti (utile ad esempio per mostrare i # nomi degli speaker) talks = dataaccess.talks_data(queryset.values_list('id', flat=True)) self.cached_talks = dict([(x['id'], x) for x in talks]) sids = [s['id'] for t in talks for s in t['speakers']] profiles = dataaccess.profiles_data(sids) self.cached_profiles = dict([(x['id'], x) for x in profiles]) return super(TalkAdmin, self).get_paginator(request, queryset, per_page, orphans, allow_empty_first_page)