def _getVideosToDownload(self): ret = [] object_type = ContentType.objects.get_for_model(Committee) videos = Video.objects.filter(content_type__pk=object_type.id, group="mms").order_by("id") for video in videos: qs = get_videos_queryset(video, group="youtube_upload", ignoreHide=True) if qs.count() == 0: ret.append(video) return ret
def _getVideosToDownload(self): ret=[] object_type=ContentType.objects.get_for_model(Committee) videos=Video.objects.filter(content_type__pk=object_type.id,group='mms').order_by('id') for video in videos: qs=get_videos_queryset(video,group='youtube_upload',ignoreHide=True) if qs.count()==0: ret.append(video) return ret
class MemberResource(BaseResource): ''' The Parliament Member API ''' class Meta(BaseResource.Meta): queryset = Member.objects.all().select_related('current_party') allowed_methods = ['get'] ordering = [ 'name', 'is_current', 'bills_stats_proposed', 'bills_stats_pre', 'bills_stats_first', 'bills_stats_approved', ] filtering = dict( name=ALL, is_current=ALL, ) excludes = ['website', 'backlinks_enabled', 'area_of_residence'] list_fields = ['name', 'id', 'img_url'] include_absolute_url = True party_name = fields.CharField() party_url = fields.CharField() videos = fields.ToManyField(VideoResource, attribute=lambda b: get_videos_queryset(b.obj), null=True) links = fields.ToManyField( LinkResource, attribute=lambda b: Link.objects.for_model(b.obj), full=True, null=True) bills_uri = fields.CharField() agendas_uri = fields.CharField() def dehydrate_bills_uri(self, bundle): return '%s?%s' % (reverse( 'api_dispatch_list', kwargs={ 'resource_name': 'bill', 'api_name': 'v2', }), urllib.urlencode(dict(proposer=bundle.obj.id))) def dehydrate_gender(self, bundle): return bundle.obj.get_gender_display() def dehydrate_agendas_uri(self, bundle): return reverse('api_dispatch_detail', kwargs={ 'resource_name': 'member-agendas', 'api_name': 'v2', 'pk': bundle.obj.id }) def dehydrate_party_name(self, bundle): return bundle.obj.current_party.name def dehydrate_party_url(self, bundle): return bundle.obj.current_party.get_absolute_url() fields.ToOneField(PartyResource, 'current_party', full=True)
def _hideMemberAboutVideos(self, member): videos = get_videos_queryset(member, group='about') for video in videos: video.hide = True video.save()
def get_context_data(self, **kwargs): context = super(MemberDetailView, self).get_context_data(**kwargs) member = context['object'] d = Knesset.objects.current_knesset().start_date if self.request.user.is_authenticated(): p = self.request.user.profiles.get() watched = member in p.members cached_context = None else: watched = False cached_context = cache.get('mk_%d' % member.id) if cached_context is None: presence = {} self.calc_percentile(member, presence, 'average_weekly_presence_hours', 'average_weekly_presence_hours', 'average_weekly_presence_hours_percentile') self.calc_percentile(member, presence, 'average_monthly_committee_presence', 'average_monthly_committee_presence', 'average_monthly_committee_presence_percentile') bills_statistics = {} self.calc_bill_stats(member, bills_statistics, 'proposed') self.calc_bill_stats(member, bills_statistics, 'pre') self.calc_bill_stats(member, bills_statistics, 'first') self.calc_bill_stats(member, bills_statistics, 'approved') agendas = self.get_agenda_data(member) factional_discipline = VoteAction.objects.select_related( 'vote').filter(member=member, against_party=True, vote__time__gt=d) votes_against_own_bills = VoteAction.objects.select_related( 'vote').filter(member=member, against_own_bill=True, vote__time__gt=d) general_discipline_params = {'member': member, 'vote__time__gt': d} is_coalition = member.current_party.is_coalition if is_coalition: general_discipline_params['against_coalition'] = True else: general_discipline_params['against_opposition'] = True general_discipline = VoteAction.objects.filter( **general_discipline_params).select_related('vote') about_videos = get_videos_queryset(member, group='about')[:1] if len(about_videos): about_video = about_videos[0] about_video_embed_link = about_video.embed_link about_video_image_link = about_video.image_link else: about_video_embed_link = '' about_video_image_link = '' related_videos = get_videos_queryset(member, group='related') related_videos = related_videos.filter( Q(published__gt=date.today() - timedelta(days=30)) | Q(sticky=True) ).order_by('sticky').order_by('-published')[:5] actions = actor_stream(member) for a in actions: a.actor = member legislation_actions = actor_stream(member).filter( verb__in=('proposed', 'joined')) # this ugly code groups all the committee actions according to plenum and committee # it stop iterating when both committee and plenum actions reach the maximum (MEMBER_INITIAL_DATA) # it also stops iterating when reaching 20 iterations committee_actions_more = {'committee': False, 'plenum': False} committee_actions = {'committee': [], 'plenum': []} i = 0 for action in actor_stream(member).filter(verb='attended'): i = i + 1 if i == 20: break committee_type = (action and action.target and action.target.committee and action.target.committee.type) if committee_type in ['plenum', 'committee']: if len(committee_actions[committee_type]) == self.MEMBER_INITIAL_DATA: committee_actions_more[committee_type] = True if committee_actions_more['plenum'] == True and committee_actions_more[ 'committee'] == True: break else: committee_actions[committee_type].append(action) committees_presence = [] has_protocols_not_published = False committees = chain(member.committees.all(), member.chaired_committees.all(), ) for committee in committees: committee_member = committee.members_by_presence(ids=[member.id])[0] committees_presence.append({"committee": committee, "presence": committee_member.meetings_percentage}) if committee.protocol_not_published: has_protocols_not_published = True committees_presence.sort(cmp=lambda x, y: y["presence"] - x["presence"]) mmm_documents = member.mmm_documents.order_by('-publication_date') content_type = ContentType.objects.get_for_model(Member) num_followers = Follow.objects.filter( object_id=member.pk, content_type=content_type).count() protocol_part_annotation_actions = Action.objects.filter( actor_content_type=ContentType.objects.get_for_model(Person), actor_object_id__in=member.person.values_list('pk', flat=True), verb='got annotation for protocol part' ) # since parties are prefetch_releated, will list and slice them previous_parties = list(member.parties.all())[1:] cached_context = { 'watched_member': watched, 'num_followers': num_followers, 'actions_more': actions.count() > self.MEMBER_INITIAL_DATA, 'actions': actions[:self.MEMBER_INITIAL_DATA], 'legislation_actions_more': legislation_actions.count() > self.MEMBER_INITIAL_DATA, 'legislation_actions': legislation_actions[:self.MEMBER_INITIAL_DATA], 'committee_actions_more': committee_actions_more['committee'], 'committee_actions': committee_actions['committee'], 'plenum_actions_more': committee_actions_more['plenum'], 'plenum_actions': committee_actions['plenum'], 'mmm_documents_more': mmm_documents.count() > self.MEMBER_INITIAL_DATA, 'mmm_documents': mmm_documents[:self.MEMBER_INITIAL_DATA], 'bills_statistics': bills_statistics, 'agendas': agendas, 'presence': presence, 'current_knesset_start_date': date(2009, 2, 24), 'factional_discipline': factional_discipline, 'votes_against_own_bills': votes_against_own_bills, 'general_discipline': general_discipline, 'about_video_embed_link': about_video_embed_link, 'about_video_image_link': about_video_image_link, 'related_videos': related_videos, 'num_related_videos': related_videos.count(), 'INITIAL_DATA': self.MEMBER_INITIAL_DATA, 'previous_parties': previous_parties, 'committees_presence': committees_presence, 'protocol_part_annotation_actions': protocol_part_annotation_actions, 'has_protocols_not_published': has_protocols_not_published, } if not self.request.user.is_authenticated(): cache.set('mk_%d' % member.id, cached_context, settings.LONG_CACHE_TIME) context.update(cached_context) return context
def _getVideos(self, getVideosQuerysetParams, filterParams): return get_videos_queryset(**getVideosQuerysetParams).filter(**filterParams)
def get_context_data (self, **kwargs): context = super(MemberDetailView, self).get_context_data(**kwargs) member = context['object'] verbs = None if 'verbs' in self.request.GET: verbs_form = VerbsForm(self.request.GET) if verbs_form.is_valid(): verbs = verbs_form.cleaned_data['verbs'] if verbs==None: verbs = ('proposed', 'posted') verbs_form = VerbsForm({'verbs': verbs}) if self.request.user.is_authenticated(): p = self.request.user.get_profile() watched = member in p.members cached_context = None else: watched = False cached_context = cache.get('mk_%d_%s' % (member.id, '_'.join(verbs))) if cached_context is None: presence = {} self.calc_percentile(member, presence, 'average_weekly_presence_hours', 'average_weekly_presence_hours', 'average_weekly_presence_hours_percentile' ) self.calc_percentile(member, presence, 'average_monthly_committee_presence', 'average_monthly_committee_presence', 'average_monthly_committee_presence_percentile' ) bills_statistics = {} self.calc_bill_stats(member,bills_statistics,'proposed') self.calc_bill_stats(member,bills_statistics,'pre') self.calc_bill_stats(member,bills_statistics,'first') self.calc_bill_stats(member,bills_statistics,'approved') bills_tags = Tag.objects.usage_for_queryset(member.bills.all(),counts=True) #bills_tags.sort(key=lambda x:x.count,reverse=True) bills_tags = calculate_cloud(bills_tags) if self.request.user.is_authenticated(): agendas = Agenda.objects.get_selected_for_instance(member, user=self.request.user, top=3, bottom=3) else: agendas = Agenda.objects.get_selected_for_instance(member, user=None, top=3, bottom=3) agendas = agendas['top'] + agendas['bottom'] for agenda in agendas: agenda.watched=False if self.request.user.is_authenticated(): watched_agendas = self.request.user.get_profile().agendas for watched_agenda in watched_agendas: if watched_agenda in agendas: agendas[agendas.index(watched_agenda)].watched = True else: watched_agenda.score = watched_agenda.member_score(member) watched_agenda.watched = True agendas.append(watched_agenda) agendas.sort(key=attrgetter('score'), reverse=True) factional_discipline = VoteAction.objects.select_related( 'vote').filter(member = member, against_party=True) votes_against_own_bills = VoteAction.objects.select_related( 'vote').filter(member=member, against_own_bill=True) general_discipline_params = { 'member' : member } is_coalition = member.current_party.is_coalition if is_coalition: general_discipline_params['against_coalition'] = True else: general_discipline_params['against_opposition'] = True general_discipline = VoteAction.objects.filter( **general_discipline_params).select_related('vote') about_videos=get_videos_queryset(member,group='about')[:1] if len(about_videos): about_video=about_videos[0] about_video_embed_link=about_video.embed_link about_video_image_link=about_video.image_link else: about_video_embed_link='' about_video_image_link='' related_videos=get_videos_queryset(member,group='related') related_videos=related_videos.filter( Q(published__gt=date.today()-timedelta(days=30)) | Q(sticky=True) ).order_by('sticky').order_by('-published')[:5] actions = actor_stream(member).filter( verb__in=verbs) for a in actions: a.actor = member cached_context = {'watched_member': watched, 'actions':actions, 'verbs_form': verbs_form, 'bills_statistics':bills_statistics, 'bills_tags':bills_tags, 'agendas':agendas, 'presence':presence, 'factional_discipline':factional_discipline, 'votes_against_own_bills':votes_against_own_bills, 'general_discipline':general_discipline, 'about_video_embed_link':about_video_embed_link, 'about_video_image_link':about_video_image_link, 'related_videos':related_videos, 'num_related_videos':related_videos.count() } if not self.request.user.is_authenticated(): cache.set('mk_%d_%s' % (member.id, '_'.join(verbs)), cached_context, settings.LONG_CACHE_TIME) context.update(cached_context) return context
def _isVideoAlreadyUploaded(self,video): qs=get_videos_queryset(video,group='youtube_upload',ignoreHide=True) return qs.count()>0
class MemberResource(BaseResource): ''' The Parliament Member API ''' class Meta(BaseResource.Meta): queryset = Member.objects.exclude( current_party__isnull=True).select_related('current_party') allowed_methods = ['get'] ordering = [ 'name', 'is_current', 'bills_stats_proposed', 'bills_stats_pre', 'bills_stats_first', 'bills_stats_approved', ] filtering = dict( name=ALL, is_current=ALL, ) excludes = ['website', 'backlinks_enabled', 'area_of_residence'] list_fields = ['name', 'id', 'img_url', 'is_current'] include_absolute_url = True party_name = fields.CharField() party_url = fields.CharField() mmms_count = fields.IntegerField(null=True) votes_count = fields.IntegerField(null=True) video_about = fields.ToManyField( VideoResource, attribute=lambda b: get_videos_queryset(b.obj, group='about'), null=True, full=True) videos_related = fields.ToManyField( VideoResource, attribute=lambda b: get_videos_queryset(b.obj, group='related'), null=True) links = fields.ToManyField( LinkResource, attribute=lambda b: Link.objects.for_model(b.obj), full=True, null=True) bills_uri = fields.CharField() agendas_uri = fields.CharField() committees = fields.ListField() detailed_roles = fields.ToManyField( RoleResource, attribute=lambda b: Person.objects.get(mk=b.obj).roles.all(), full=True, null=True) fields.ToOneField(PartyResource, 'current_party', full=True) average_weekly_presence_rank = fields.IntegerField() def obj_get_list(self, bundle, **kwargs): simple = super(MemberResource, self).obj_get_list(bundle, **kwargs) if hasattr(bundle.request, 'GET'): # Grab a mutable copy. filters = bundle.request.GET.copy() # Update with the provided kwargs. filters.update(kwargs) name = filters.get('name') if name and not simple: try: return Member.objects.filter(person__aliases__name=name) except PersonAlias.DoesNotExist: return simple return simple def dehydrate_committees(self, bundle): temp_list = bundle.obj.committee_meetings.exclude( committee__type='plenum') temp_list = temp_list.values("committee", "committee__name").annotate( Count("id")).order_by('-id__count')[:5] return (map( lambda item: (item['committee__name'], reverse('committee-detail', args=[item['committee']])), temp_list)) def dehydrate_bills_uri(self, bundle): return '%s?%s' % (reverse( 'api_dispatch_list', kwargs={ 'resource_name': 'bill', 'api_name': 'v2', }), urllib.urlencode(dict(proposer=bundle.obj.id))) def dehydrate_gender(self, bundle): return bundle.obj.get_gender_display() def dehydrate_agendas_uri(self, bundle): return reverse('api_dispatch_detail', kwargs={ 'resource_name': 'member-agendas', 'api_name': 'v2', 'pk': bundle.obj.id }) def dehydrate_party_name(self, bundle): party = bundle.obj.current_party return party.name if party else None def dehydrate_party_url(self, bundle): party = bundle.obj.current_party return party.get_absolute_url() if party else None def dehydrate_mmms_count(self, bundle): _cache_key = 'api_v2_member_mmms_' + str(bundle.obj.pk) count = cache.get(_cache_key) if count is None: count = bundle.obj.mmm_documents.count() cache.set(_cache_key, count, 24 * 3600) return count def dehydrate_votes_count(self, bundle): _cache_key = 'api_v2_member_votes_' + str(bundle.obj.pk) count = cache.get(_cache_key) if count is None: count = bundle.obj.votes.count() cache.set(_cache_key, count, 24 * 3600) return count def dehydrate_average_weekly_presence_rank(self, bundle): ''' Calculate the distribution of presence and place the user on a 5 level scale ''' SCALE = 5 member = bundle.obj rel_location = cache.get('average_presence_location_%d' % member.id) if not rel_location: presence_list = sorted( map(lambda member: member.average_weekly_presence_hours, Member.objects.all())) presence_groups = int(math.ceil(len(presence_list) / float(SCALE))) # Generate cache for all members for mk in Member.objects.all(): avg = mk.average_weekly_presence_hours if avg: mk_location = 1 + (presence_list.index(avg) / presence_groups) else: mk_location = 0 cache.set('average_presence_location_%d' % mk.id, mk_location, 60 * 60 * 24) if mk.id == member.id: rel_location = mk_location return rel_location def build_filters(self, filters=None): if filters is None: filters = {} try: knesset = int(filters.get('knesset', 0)) except KeyError: knesset = 0 orm_filters = super(MemberResource, self).build_filters(filters) if knesset: knesset = Knesset.objects.get(number=knesset) orm_filters['parties__knesset'] = knesset return orm_filters
def _getMemberExistingVideosCount(self,ignoreHide,member,source_id,source_type): qs=get_videos_queryset(member,ignoreHide=ignoreHide) qs=qs.filter(source_id=source_id,source_type=source_type) return qs.count()
def _isVideoAlreadyUploaded(self, video): qs = get_videos_queryset(video, group='youtube_upload', ignoreHide=True) return qs.count() > 0
def _getMemberExistingVideosCount(self, ignoreHide, member, source_id, source_type): qs = get_videos_queryset(member, ignoreHide=ignoreHide) qs = qs.filter(source_id=source_id, source_type=source_type) return qs.count()
def _isVideoExists(self, video): return get_videos_queryset( video['content_object'], ignoreHide=True).filter(source_id=video['source_id']).count() > 0
def _get_committee_num_mms_videos(self, comm, group, ignoreHide, embed_link): return get_videos_queryset( comm, group=group, ignoreHide=ignoreHide).filter(embed_link=embed_link).count()
def get_context_data(self, **kwargs): context = super(MemberDetailView, self).get_context_data(**kwargs) member = context['object'] d = Knesset.objects.current_knesset().start_date if self.request.user.is_authenticated(): p = self.request.user.get_profile() watched = member in p.members cached_context = None else: watched = False cached_context = cache.get('mk_%d' % member.id) if cached_context is None: presence = {} self.calc_percentile(member, presence, 'average_weekly_presence_hours', 'average_weekly_presence_hours', 'average_weekly_presence_hours_percentile') self.calc_percentile( member, presence, 'average_monthly_committee_presence', 'average_monthly_committee_presence', 'average_monthly_committee_presence_percentile') bills_statistics = {} self.calc_bill_stats(member, bills_statistics, 'proposed') self.calc_bill_stats(member, bills_statistics, 'pre') self.calc_bill_stats(member, bills_statistics, 'first') self.calc_bill_stats(member, bills_statistics, 'approved') if self.request.user.is_authenticated(): agendas = Agenda.objects.get_selected_for_instance( member, user=self.request.user, top=3, bottom=3) else: agendas = Agenda.objects.get_selected_for_instance(member, user=None, top=3, bottom=3) agendas = agendas['top'] + agendas['bottom'] for agenda in agendas: agenda.watched = False agenda.totals = agenda.get_mks_totals(member) if self.request.user.is_authenticated(): watched_agendas = self.request.user.get_profile().agendas for watched_agenda in watched_agendas: if watched_agenda in agendas: agendas[agendas.index(watched_agenda)].watched = True else: watched_agenda.score = watched_agenda.member_score( member) watched_agenda.watched = True agendas.append(watched_agenda) agendas.sort(key=attrgetter('score'), reverse=True) factional_discipline = VoteAction.objects.select_related( 'vote').filter(member=member, against_party=True, vote__time__gt=d) votes_against_own_bills = VoteAction.objects.select_related( 'vote').filter(member=member, against_own_bill=True, vote__time__gt=d) general_discipline_params = {'member': member, 'vote__time__gt': d} is_coalition = member.current_party.is_coalition if is_coalition: general_discipline_params['against_coalition'] = True else: general_discipline_params['against_opposition'] = True general_discipline = VoteAction.objects.filter( **general_discipline_params).select_related('vote') about_videos = get_videos_queryset(member, group='about')[:1] if len(about_videos): about_video = about_videos[0] about_video_embed_link = about_video.embed_link about_video_image_link = about_video.image_link else: about_video_embed_link = '' about_video_image_link = '' related_videos = get_videos_queryset(member, group='related') related_videos = related_videos.filter( Q(published__gt=date.today() - timedelta(days=30)) | Q(sticky=True)).order_by('sticky').order_by('-published')[:5] actions = actor_stream(member) for a in actions: a.actor = member legislation_actions = actor_stream(member).filter( verb__in=('proposed', 'joined')) # this ugly code groups all the committee actions according to plenum and committee # it stop iterating when both committee and plenum actions reach the maximum (MEMBER_INITIAL_DATA) # it also stops iterating when reaching 20 iterations committee_actions_more = {'committee': False, 'plenum': False} committee_actions = {'committee': [], 'plenum': []} i = 0 for action in actor_stream(member).filter(verb='attended'): i = i + 1 if i == 20: break committee_type = (action and action.target and action.target.committee and action.target.committee.type) if committee_type in ['plenum', 'committee']: if len(committee_actions[committee_type] ) == self.MEMBER_INITIAL_DATA: committee_actions_more[committee_type] = True if committee_actions_more[ 'plenum'] == True and committee_actions_more[ 'committee'] == True: break else: committee_actions[committee_type].append(action) committees_presence = [] committees = chain( member.committees.all(), member.chaired_committees.all(), ) for committee in committees: committee_member = committee.members_by_presence( ids=[member.id])[0] committees_presence.append({ "committee": committee, "presence": committee_member.meetings_percentage }) committees_presence.sort( cmp=lambda x, y: y["presence"] - x["presence"]) mmm_documents = member.mmm_documents.order_by('-publication_date') content_type = ContentType.objects.get_for_model(Member) num_followers = Follow.objects.filter( object_id=member.pk, content_type=content_type).count() # since parties are prefetch_releated, will list and slice them previous_parties = list(member.parties.all())[1:] cached_context = { 'watched_member': watched, 'num_followers': num_followers, 'actions_more': actions.count() > self.MEMBER_INITIAL_DATA, 'actions': actions[:self.MEMBER_INITIAL_DATA], 'legislation_actions_more': legislation_actions.count() > self.MEMBER_INITIAL_DATA, 'legislation_actions': legislation_actions[:self.MEMBER_INITIAL_DATA], 'committee_actions_more': committee_actions_more['committee'], 'committee_actions': committee_actions['committee'], 'plenum_actions_more': committee_actions_more['plenum'], 'plenum_actions': committee_actions['plenum'], 'mmm_documents_more': mmm_documents.count() > self.MEMBER_INITIAL_DATA, 'mmm_documents': mmm_documents[:self.MEMBER_INITIAL_DATA], 'bills_statistics': bills_statistics, 'agendas': agendas, 'presence': presence, 'current_knesset_start_date': date(2009, 2, 24), 'factional_discipline': factional_discipline, 'votes_against_own_bills': votes_against_own_bills, 'general_discipline': general_discipline, 'about_video_embed_link': about_video_embed_link, 'about_video_image_link': about_video_image_link, 'related_videos': related_videos, 'num_related_videos': related_videos.count(), 'INITIAL_DATA': self.MEMBER_INITIAL_DATA, 'previous_parties': previous_parties, 'committees_presence': committees_presence, } if not self.request.user.is_authenticated(): cache.set('mk_%d' % member.id, cached_context, settings.LONG_CACHE_TIME) context.update(cached_context) return context
def get_context_data(self, **kwargs): context = super(MemberDetailView, self).get_context_data(**kwargs) member = context['object'] current_knesset_start_date = Knesset.objects.current_knesset( ).start_date if self.request.user.is_authenticated(): profile = self.request.user.profiles.get() watched = profile.is_watching_member(member) cached_context = None else: watched = False cached_context = cache.get('mk_%d' % member.id) if cached_context is None: presence = {} self.calc_percentile(member, presence, 'average_weekly_presence_hours', 'average_weekly_presence_hours', 'average_weekly_presence_hours_percentile') self.calc_percentile( member, presence, 'average_monthly_committee_presence', 'average_monthly_committee_presence', 'average_monthly_committee_presence_percentile') bills_statistics = {} # TODO: can move to an offline job self.calc_bill_stats(member, bills_statistics, 'proposed') self.calc_bill_stats(member, bills_statistics, 'pre') self.calc_bill_stats(member, bills_statistics, 'first') self.calc_bill_stats(member, bills_statistics, 'approved') agendas = self.get_agenda_data(member) # TODO: Move to model or service factional_discipline = VoteAction.objects.select_related( 'vote').filter(member=member, against_party=True, vote__time__gt=current_knesset_start_date) votes_against_own_bills = VoteAction.objects.select_related( 'vote').filter(member=member, against_own_bill=True, vote__time__gt=current_knesset_start_date) general_discipline_params = { 'member': member, 'vote__time__gt': current_knesset_start_date } is_coalition = member.current_party.is_coalition if is_coalition: general_discipline_params['against_coalition'] = True else: general_discipline_params['against_opposition'] = True general_discipline = VoteAction.objects.filter( **general_discipline_params).select_related('vote') about_videos = get_videos_queryset(member, group='about')[:1] if len(about_videos): about_video = about_videos[0] about_video_embed_link = about_video.embed_link about_video_image_link = about_video.image_link else: about_video_embed_link = '' about_video_image_link = '' related_videos = get_videos_queryset(member, group='related') related_videos = related_videos.filter( Q(published__gt=date.today() - timedelta(days=30)) | Q(sticky=True)).order_by('sticky').order_by('-published')[:5] actions = actor_stream(member) for a in actions: a.actor = member legislation_actions = actor_stream(member).filter( verb__in=('proposed', 'joined')) # this ugly code groups all the committee actions according to plenum and committee # it stop iterating when both committee and plenum actions reach the maximum (MEMBER_INITIAL_DATA) # it also stops iterating when reaching 20 iterations committee_actions_more = {'committee': False, 'plenum': False} committee_actions = {'committee': [], 'plenum': []} i = 0 for action in actor_stream(member).filter(verb='attended'): i = i + 1 if i == 20: # JESUS what language are we writing here? and is this a way to do a "limit"? break committee_type = (action and action.target and action.target.committee and action.target.committee.type) if committee_type in ['plenum', 'committee']: if len(committee_actions[committee_type] ) == self.MEMBER_INITIAL_DATA: committee_actions_more[committee_type] = True if committee_actions_more[ 'plenum'] == True and committee_actions_more[ 'committee'] == True: break else: committee_actions[committee_type].append(action) committees_presence = [] has_protocols_not_published = False committees = member.get_active_committees() for committee in committees: committee_member = committee.members_by_presence( ids=[member.id])[0] committees_presence.append({ "committee": committee, "presence": committee_member.meetings_percentage }) if committee.protocol_not_published: has_protocols_not_published = True committees_presence.sort( cmp=lambda x, y: y["presence"] - x["presence"]) mmm_documents = member.mmm_documents.order_by('-publication_date') content_type = ContentType.objects.get_for_model(Member) num_followers = Follow.objects.filter( object_id=member.pk, content_type=content_type).count() protocol_part_annotation_actions = Action.objects.filter( actor_content_type=ContentType.objects.get_for_model(Person), actor_object_id__in=member.person.values_list('pk', flat=True), verb='got annotation for protocol part') # since parties are prefetch_releated, will list and slice them previous_parties = list(member.parties.all())[1:] cached_context = { 'watched_member': watched, 'num_followers': num_followers, 'actions_more': actions.count() > self.MEMBER_INITIAL_DATA, 'actions': actions[:self.MEMBER_INITIAL_DATA], 'legislation_actions_more': legislation_actions.count() > self.MEMBER_INITIAL_DATA, 'legislation_actions': legislation_actions[:self.MEMBER_INITIAL_DATA], 'committee_actions_more': committee_actions_more['committee'], 'committee_actions': committee_actions['committee'], 'plenum_actions_more': committee_actions_more['plenum'], 'plenum_actions': committee_actions['plenum'], 'mmm_documents_more': mmm_documents.count() > self.MEMBER_INITIAL_DATA, 'mmm_documents': mmm_documents[:self.MEMBER_INITIAL_DATA], 'bills_statistics': bills_statistics, 'agendas': agendas, 'presence': presence, # 'current_knesset_start_date': date(2009, 2, 24), #obviously wrong, but does not look like used in template 'factional_discipline': factional_discipline, 'votes_against_own_bills': votes_against_own_bills, 'general_discipline': general_discipline, 'about_video_embed_link': about_video_embed_link, 'about_video_image_link': about_video_image_link, 'related_videos': related_videos, 'num_related_videos': related_videos.count(), 'INITIAL_DATA': self.MEMBER_INITIAL_DATA, 'previous_parties': previous_parties, 'committees_presence': committees_presence, 'protocol_part_annotation_actions': protocol_part_annotation_actions, 'has_protocols_not_published': has_protocols_not_published, } if not self.request.user.is_authenticated(): cache.set('mk_%d' % member.id, cached_context, settings.LONG_CACHE_TIME) context.update(cached_context) return context
class MemberResource(BaseResource): ''' The Parliament Member API ''' class Meta(BaseResource.Meta): queryset = Member.objects.exclude( current_party__isnull=True).select_related('current_party') allowed_methods = ['get'] ordering = [ 'name', 'is_current', 'bills_stats_proposed', 'bills_stats_pre', 'bills_stats_first', 'bills_stats_approved', ] filtering = dict( name=ALL, is_current=ALL, ) excludes = ['website', 'backlinks_enabled', 'area_of_residence'] list_fields = ['name', 'id', 'img_url', 'is_current'] include_absolute_url = True party_name = fields.CharField() party_url = fields.CharField() mmms_count = fields.IntegerField(null=True) votes_count = fields.IntegerField(null=True) video_about = fields.ToManyField( VideoResource, attribute=lambda b: get_videos_queryset(b.obj, group='about'), null=True, full=True) videos_related = fields.ToManyField( VideoResource, attribute=lambda b: get_videos_queryset(b.obj, group='related'), null=True) links = fields.ToManyField( LinkResource, attribute=lambda b: Link.objects.for_model(b.obj), full=True, null=True) bills_uri = fields.CharField() agendas_uri = fields.CharField() committees = fields.ListField() def dehydrate_committees(self, bundle): temp_list = bundle.obj.committee_meetings.values( "committee", "committee__name").annotate(Count("id")).order_by('-id__count')[:5] return (map( lambda item: (item['committee__name'], reverse('committee-detail', args=[item['committee']])), temp_list)) def dehydrate_bills_uri(self, bundle): return '%s?%s' % (reverse( 'api_dispatch_list', kwargs={ 'resource_name': 'bill', 'api_name': 'v2', }), urllib.urlencode(dict(proposer=bundle.obj.id))) def dehydrate_gender(self, bundle): return bundle.obj.get_gender_display() def dehydrate_agendas_uri(self, bundle): return reverse('api_dispatch_detail', kwargs={ 'resource_name': 'member-agendas', 'api_name': 'v2', 'pk': bundle.obj.id }) def dehydrate_party_name(self, bundle): return bundle.obj.current_party.name def dehydrate_party_url(self, bundle): return bundle.obj.current_party.get_absolute_url() def dehydrate_mmms_count(self, bundle): _cache_key = 'api_v2_member_mmms_' + str(bundle.obj.pk) count = cache.get(_cache_key) if count is None: count = bundle.obj.mmm_documents.count() cache.set(_cache_key, count, 24 * 3600) return count def dehydrate_votes_count(self, bundle): _cache_key = 'api_v2_member_votes_' + str(bundle.obj.pk) count = cache.get(_cache_key) if count is None: count = bundle.obj.votes.count() cache.set(_cache_key, count, 24 * 3600) return count fields.ToOneField(PartyResource, 'current_party', full=True) def build_filters(self, filters=None): if filters is None: filters = {} try: knesset = int(filters.get('knesset', 0)) except KeyError: knesset = 0 orm_filters = super(MemberResource, self).build_filters(filters) if knesset: knesset = Knesset.objects.get(number=knesset) orm_filters['parties__knesset'] = knesset return orm_filters
def get_context_data(self, **kwargs): context = super(MemberDetailView, self).get_context_data(**kwargs) member = context["object"] if self.request.user.is_authenticated(): p = self.request.user.get_profile() watched = member in p.members cached_context = None else: watched = False cached_context = cache.get("mk_%d" % member.id) if cached_context is None: presence = {} self.calc_percentile( member, presence, "average_weekly_presence_hours", "average_weekly_presence_hours", "average_weekly_presence_hours_percentile", ) self.calc_percentile( member, presence, "average_monthly_committee_presence", "average_monthly_committee_presence", "average_monthly_committee_presence_percentile", ) bills_statistics = {} self.calc_bill_stats(member, bills_statistics, "proposed") self.calc_bill_stats(member, bills_statistics, "pre") self.calc_bill_stats(member, bills_statistics, "first") self.calc_bill_stats(member, bills_statistics, "approved") if self.request.user.is_authenticated(): agendas = Agenda.objects.get_selected_for_instance(member, user=self.request.user, top=3, bottom=3) else: agendas = Agenda.objects.get_selected_for_instance(member, user=None, top=3, bottom=3) agendas = agendas["top"] + agendas["bottom"] for agenda in agendas: agenda.watched = False agenda.totals = agenda.get_mks_totals(member) if self.request.user.is_authenticated(): watched_agendas = self.request.user.get_profile().agendas for watched_agenda in watched_agendas: if watched_agenda in agendas: agendas[agendas.index(watched_agenda)].watched = True else: watched_agenda.score = watched_agenda.member_score(member) watched_agenda.watched = True agendas.append(watched_agenda) agendas.sort(key=attrgetter("score"), reverse=True) factional_discipline = VoteAction.objects.select_related("vote").filter(member=member, against_party=True) votes_against_own_bills = VoteAction.objects.select_related("vote").filter( member=member, against_own_bill=True ) general_discipline_params = {"member": member} is_coalition = member.current_party.is_coalition if is_coalition: general_discipline_params["against_coalition"] = True else: general_discipline_params["against_opposition"] = True general_discipline = VoteAction.objects.filter(**general_discipline_params).select_related("vote") about_videos = get_videos_queryset(member, group="about")[:1] if len(about_videos): about_video = about_videos[0] about_video_embed_link = about_video.embed_link about_video_image_link = about_video.image_link else: about_video_embed_link = "" about_video_image_link = "" related_videos = get_videos_queryset(member, group="related") related_videos = ( related_videos.filter(Q(published__gt=date.today() - timedelta(days=30)) | Q(sticky=True)) .order_by("sticky") .order_by("-published")[:5] ) actions = actor_stream(member) for a in actions: a.actor = member legislation_actions = actor_stream(member).filter(verb__in=("proposed", "joined")) committee_actions = actor_stream(member).filter(verb="attended") mmm_documents = member.mmm_documents.order_by("-publication_date") content_type = ContentType.objects.get_for_model(Member) num_followers = Follow.objects.filter(object_id=member.pk, content_type=content_type).count() cached_context = { "watched_member": watched, "num_followers": num_followers, "actions_more": actions.count() > self.MEMBER_INITIAL_DATA, "actions": actions[: self.MEMBER_INITIAL_DATA], "legislation_actions_more": legislation_actions.count() > self.MEMBER_INITIAL_DATA, "legislation_actions": legislation_actions[: self.MEMBER_INITIAL_DATA], "committee_actions_more": committee_actions.count() > self.MEMBER_INITIAL_DATA, "committee_actions": committee_actions[: self.MEMBER_INITIAL_DATA], "mmm_documents_more": mmm_documents.count() > self.MEMBER_INITIAL_DATA, "mmm_documents": mmm_documents[: self.MEMBER_INITIAL_DATA], "bills_statistics": bills_statistics, "agendas": agendas, "presence": presence, "current_knesset_start_date": date(2009, 2, 24), "factional_discipline": factional_discipline, "votes_against_own_bills": votes_against_own_bills, "general_discipline": general_discipline, "about_video_embed_link": about_video_embed_link, "about_video_image_link": about_video_image_link, "related_videos": related_videos, "num_related_videos": related_videos.count(), "INITIAL_DATA": self.MEMBER_INITIAL_DATA, } if not self.request.user.is_authenticated(): cache.set("mk_%d" % member.id, cached_context, settings.LONG_CACHE_TIME) context.update(cached_context) return context
def _isVideoExists(self,video): return get_videos_queryset(video['content_object'],ignoreHide=True).filter(source_id=video['source_id']).count()>0
def _hideMemberAboutVideos(self,member): videos=get_videos_queryset(member,group='about') for video in videos: video.hide=True video.save()
def _get_committee_num_mms_videos(self, comm, group, ignoreHide, embed_link): return get_videos_queryset(comm, group=group, ignoreHide=ignoreHide).filter(embed_link=embed_link).count()
def get_context_data(self, **kwargs): context = super(MemberDetailView, self).get_context_data(**kwargs) member = context['object'] if self.request.user.is_authenticated(): p = self.request.user.get_profile() watched = member in p.members cached_context = None else: watched = False cached_context = cache.get('mk_%d' % member.id) if cached_context is None: presence = {} self.calc_percentile(member, presence, 'average_weekly_presence_hours', 'average_weekly_presence_hours', 'average_weekly_presence_hours_percentile') self.calc_percentile(member, presence, 'average_monthly_committee_presence', 'average_monthly_committee_presence', 'average_monthly_committee_presence_percentile') bills_statistics = {} self.calc_bill_stats(member,bills_statistics,'proposed') self.calc_bill_stats(member,bills_statistics,'pre') self.calc_bill_stats(member,bills_statistics,'first') self.calc_bill_stats(member,bills_statistics,'approved') if self.request.user.is_authenticated(): agendas = Agenda.objects.get_selected_for_instance(member, user=self.request.user, top=3, bottom=3) else: agendas = Agenda.objects.get_selected_for_instance(member, user=None, top=3, bottom=3) agendas = agendas['top'] + agendas['bottom'] for agenda in agendas: agenda.watched=False agenda.totals = agenda.get_mks_totals(member) if self.request.user.is_authenticated(): watched_agendas = self.request.user.get_profile().agendas for watched_agenda in watched_agendas: if watched_agenda in agendas: agendas[agendas.index(watched_agenda)].watched = True else: watched_agenda.score = watched_agenda.member_score(member) watched_agenda.watched = True agendas.append(watched_agenda) agendas.sort(key=attrgetter('score'), reverse=True) factional_discipline = VoteAction.objects.select_related( 'vote').filter(member = member, against_party=True) votes_against_own_bills = VoteAction.objects.select_related( 'vote').filter(member=member, against_own_bill=True) general_discipline_params = { 'member' : member } is_coalition = member.current_party.is_coalition if is_coalition: general_discipline_params['against_coalition'] = True else: general_discipline_params['against_opposition'] = True general_discipline = VoteAction.objects.filter( **general_discipline_params).select_related('vote') about_videos=get_videos_queryset(member,group='about')[:1] if len(about_videos): about_video=about_videos[0] about_video_embed_link=about_video.embed_link about_video_image_link=about_video.image_link else: about_video_embed_link='' about_video_image_link='' related_videos=get_videos_queryset(member,group='related') related_videos=related_videos.filter( Q(published__gt=date.today()-timedelta(days=30)) | Q(sticky=True) ).order_by('sticky').order_by('-published')[:5] actions = actor_stream(member) for a in actions: a.actor = member legislation_actions = actor_stream(member).filter( verb__in=('proposed', 'joined')) committee_actions = actor_stream(member).filter(verb='attended') mmm_documents = member.mmm_documents.order_by('-publication_date') content_type = ContentType.objects.get_for_model(Member) num_followers = Follow.objects.filter(object_id=member.pk, content_type=content_type).count() cached_context = { 'watched_member': watched, 'num_followers': num_followers, 'actions_more': actions.count() > self.MEMBER_INITIAL_DATA, 'actions': actions[:self.MEMBER_INITIAL_DATA], 'legislation_actions_more': legislation_actions.count() > self.MEMBER_INITIAL_DATA, 'legislation_actions': legislation_actions[:self.MEMBER_INITIAL_DATA], 'committee_actions_more': committee_actions.count() > self.MEMBER_INITIAL_DATA, 'committee_actions': committee_actions[:self.MEMBER_INITIAL_DATA], 'mmm_documents_more': mmm_documents.count() > self.MEMBER_INITIAL_DATA, 'mmm_documents': mmm_documents[:self.MEMBER_INITIAL_DATA], 'bills_statistics': bills_statistics, 'agendas': agendas, 'presence': presence, 'current_knesset_start_date': date(2009, 2, 24), 'factional_discipline': factional_discipline, 'votes_against_own_bills': votes_against_own_bills, 'general_discipline': general_discipline, 'about_video_embed_link': about_video_embed_link, 'about_video_image_link': about_video_image_link, 'related_videos': related_videos, 'num_related_videos': related_videos.count(), 'INITIAL_DATA': self.MEMBER_INITIAL_DATA, } if not self.request.user.is_authenticated(): cache.set('mk_%d' % member.id, cached_context, settings.LONG_CACHE_TIME) context.update(cached_context) return context
def _getVideos(self, getVideosQuerysetParams, filterParams): return get_videos_queryset(**getVideosQuerysetParams).filter( **filterParams)
def get_context_data(self, **kwargs): context = super(MemberDetailView, self).get_context_data(**kwargs) member = context['object'] if self.request.user.is_authenticated(): p = self.request.user.get_profile() watched = member in p.members cached_context = None else: watched = False cached_context = cache.get('mk_%d' % member.id) if cached_context is None: presence = {} self.calc_percentile(member, presence, 'average_weekly_presence_hours', 'average_weekly_presence_hours', 'average_weekly_presence_hours_percentile') self.calc_percentile( member, presence, 'average_monthly_committee_presence', 'average_monthly_committee_presence', 'average_monthly_committee_presence_percentile') bills_statistics = {} self.calc_bill_stats(member, bills_statistics, 'proposed') self.calc_bill_stats(member, bills_statistics, 'pre') self.calc_bill_stats(member, bills_statistics, 'first') self.calc_bill_stats(member, bills_statistics, 'approved') if self.request.user.is_authenticated(): agendas = Agenda.objects.get_selected_for_instance( member, user=self.request.user, top=3, bottom=3) else: agendas = Agenda.objects.get_selected_for_instance(member, user=None, top=3, bottom=3) agendas = agendas['top'] + agendas['bottom'] for agenda in agendas: agenda.watched = False agenda.totals = agenda.get_mks_totals(member) if self.request.user.is_authenticated(): watched_agendas = self.request.user.get_profile().agendas for watched_agenda in watched_agendas: if watched_agenda in agendas: agendas[agendas.index(watched_agenda)].watched = True else: watched_agenda.score = watched_agenda.member_score( member) watched_agenda.watched = True agendas.append(watched_agenda) agendas.sort(key=attrgetter('score'), reverse=True) factional_discipline = VoteAction.objects.select_related( 'vote').filter(member=member, against_party=True) votes_against_own_bills = VoteAction.objects.select_related( 'vote').filter(member=member, against_own_bill=True) general_discipline_params = {'member': member} is_coalition = member.current_party.is_coalition if is_coalition: general_discipline_params['against_coalition'] = True else: general_discipline_params['against_opposition'] = True general_discipline = VoteAction.objects.filter( **general_discipline_params).select_related('vote') about_videos = get_videos_queryset(member, group='about')[:1] if len(about_videos): about_video = about_videos[0] about_video_embed_link = about_video.embed_link about_video_image_link = about_video.image_link else: about_video_embed_link = '' about_video_image_link = '' related_videos = get_videos_queryset(member, group='related') related_videos = related_videos.filter( Q(published__gt=date.today() - timedelta(days=30)) | Q(sticky=True)).order_by('sticky').order_by('-published')[:5] actions = actor_stream(member) for a in actions: a.actor = member legislation_actions = actor_stream(member).filter( verb__in=('proposed', 'joined')) committee_actions = actor_stream(member).filter(verb='attended') mmm_documents = member.mmm_documents.order_by('-publication_date') content_type = ContentType.objects.get_for_model(Member) num_followers = Follow.objects.filter( object_id=member.pk, content_type=content_type).count() # since parties are prefetch_releated, will list and slice them previous_parties = list(member.parties.all())[1:] cached_context = { 'watched_member': watched, 'num_followers': num_followers, 'actions_more': actions.count() > self.MEMBER_INITIAL_DATA, 'actions': actions[:self.MEMBER_INITIAL_DATA], 'legislation_actions_more': legislation_actions.count() > self.MEMBER_INITIAL_DATA, 'legislation_actions': legislation_actions[:self.MEMBER_INITIAL_DATA], 'committee_actions_more': committee_actions.count() > self.MEMBER_INITIAL_DATA, 'committee_actions': committee_actions[:self.MEMBER_INITIAL_DATA], 'mmm_documents_more': mmm_documents.count() > self.MEMBER_INITIAL_DATA, 'mmm_documents': mmm_documents[:self.MEMBER_INITIAL_DATA], 'bills_statistics': bills_statistics, 'agendas': agendas, 'presence': presence, 'current_knesset_start_date': date(2009, 2, 24), 'factional_discipline': factional_discipline, 'votes_against_own_bills': votes_against_own_bills, 'general_discipline': general_discipline, 'about_video_embed_link': about_video_embed_link, 'about_video_image_link': about_video_image_link, 'related_videos': related_videos, 'num_related_videos': related_videos.count(), 'INITIAL_DATA': self.MEMBER_INITIAL_DATA, 'previous_parties': previous_parties, } if not self.request.user.is_authenticated(): cache.set('mk_%d' % member.id, cached_context, settings.LONG_CACHE_TIME) context.update(cached_context) return context
def get_context_data(self, **kwargs): context = super(MemberDetailView, self).get_context_data(**kwargs) member = context['object'] user = self.request.user authenticated = user.is_authenticated() if authenticated: profile = user.get_profile() watched = member in profile.members cached_context = None else: watched = False cached_context = cache.get('mk_{}'.format(member.id)) if not cached_context: presence = {} self.calc_percentile(member, presence, 'average_weekly_presence_hours', 'average_weekly_presence_hours', 'average_weekly_presence_hours_percentile') self.calc_percentile(member, presence, 'average_monthly_committee_presence', 'average_monthly_committee_presence', 'average_monthly_committee_presence_percentile') bills_statistics = {} for s in ('proposed', 'pre', 'first', 'approved'): self.calc_bill_stats(member,bills_statistics, s) agendas = Agenda.objects.get_selected_for_instance(member, user=user if authenticated else None, top=3, bottom=3) for agenda in agendas: agenda.watched = False agenda.totals = agenda.get_mks_totals(member) if authenticated: for watched_agenda in profile.agendas: if watched_agenda in agendas: agendas[agendas.index(watched_agenda)].watched = True else: watched_agenda.score = watched_agenda.member_score(member) watched_agenda.watched = True agendas.append(watched_agenda) agendas.sort(key=attrgetter('score'), reverse=True) factional_discipline = VoteAction.objects.select_related( 'vote').filter(member=member, against_party=True) votes_against_own_bills = VoteAction.objects.select_related( 'vote').filter(member=member, against_own_bill=True) general_discipline_params = { 'member' : member } side = 'against_coalition' if member.current_party.is_coalition else 'against_opposition' general_discipline_params[side] = True general_discipline = VoteAction.objects.filter( **general_discipline_params).select_related('vote') about_videos = get_videos_queryset(member,group='about') try: about_video_embed_link=about_videos[0].embed_link about_video_image_link=about_videos[0].image_link except IndexError: about_video_embed_link='' about_video_image_link='' related_videos = get_videos_queryset(member,group='related').filter( Q(published__gt=date.today()-timedelta(days=30)) | Q(sticky=True) ).order_by('sticky').order_by('-published')[:5] actions = actor_stream(member) for a in actions: a.actor = member legislation_actions = actor_stream(member).filter( verb__in=('proposed', 'joined')) committee_actions = actor_stream(member).filter(verb='attended') mmm_documents = member.mmm_documents.order_by('-publication_date') content_type = ContentType.objects.get_for_model(Member) # since parties are prefetch_releated, will list and slice them previous_parties = list(member.parties.all())[1:] cached_context = { 'watched_member': watched, 'num_followers': Follow.objects.filter(object_id=member.pk, content_type=content_type).count(), 'actions_more': actions.count() > self.MEMBER_INITIAL_DATA, 'actions': actions[:self.MEMBER_INITIAL_DATA], 'legislation_actions_more': legislation_actions.count() > self.MEMBER_INITIAL_DATA, 'legislation_actions': legislation_actions[:self.MEMBER_INITIAL_DATA], 'committee_actions_more': committee_actions.count() > self.MEMBER_INITIAL_DATA, 'committee_actions': committee_actions[:self.MEMBER_INITIAL_DATA], 'mmm_documents_more': mmm_documents.count() > self.MEMBER_INITIAL_DATA, 'mmm_documents': mmm_documents[:self.MEMBER_INITIAL_DATA], 'bills_statistics': bills_statistics, 'agendas': agendas, 'presence': presence, 'current_knesset_start_date': date(2009, 2, 24), 'factional_discipline': factional_discipline, 'votes_against_own_bills': votes_against_own_bills, 'general_discipline': general_discipline, 'about_video_embed_link': about_video_embed_link, 'about_video_image_link': about_video_image_link, 'related_videos': related_videos, 'num_related_videos': related_videos.count(), 'INITIAL_DATA': self.MEMBER_INITIAL_DATA, 'previous_parties': previous_parties, } if not authenticated: cache.set('mk_{}'.format(member.id), cached_context, settings.LONG_CACHE_TIME) context.update(cached_context) return context