class SpeechesView(ModelListView): def document_filter(qs, view, filter_name, filter_extra, val): u = val.rstrip('/').split('/') if u[-4] == 'debates': # /debates/2013/2/15/ try: date = datetime.date(int(u[-3]), int(u[-2]), int(u[-1])) except ValueError: raise BadRequest("Invalid document URL") return qs.filter(document__document_type='D', document__date=date).order_by('sequence') elif u[-4] == 'committees': # /commmittees/national-defence/41-1/63/ try: meeting = CommitteeMeeting.objects.get(committee__slug=u[-3], session=u[-2], number=u[-1]) except (ValueError, CommitteeMeeting.DoesNotExist): raise BadRequest("Invalid debate/meeting URL") return qs.filter(document=meeting.evidence_id).order_by('sequence') document_filter.help = "the URL of the debate or committee meeting" filters = { 'procedural': APIFilters.dbfield( help="is this a short, routine procedural speech? True or False"), 'document': document_filter, 'politician': APIFilters.politician(), 'politician_membership': APIFilters.fkey(lambda u: {'member': u[-1]}), 'time': APIFilters.dbfield( filter_types=APIFilters.numeric_filters, help="e.g. time__range=2012-10-19 10:00,2012-10-19 11:00"), 'mentioned_politician': APIFilters.politician('mentioned_politicians'), 'mentioned_bill': APIFilters.fkey(lambda u: { 'bills__billinsession__session': u[-2], 'bills__number': u[-1] }, help="e.g. /bills/41-1/C-14/") } resource_name = 'Speeches' def get_qs(self, request): qs = Statement.objects.all().prefetch_related('politician') if 'document' not in request.GET: qs = qs.order_by('-time') return qs
class BallotListView(ModelListView): resource_name = 'Ballots' filters = { 'vote': APIFilters.fkey(lambda u: { 'votequestion__session': u[-2], 'votequestion__number': u[-1] }, help="e.g. /votes/41-1/472/"), 'politician': APIFilters.politician(), 'politician_membership': APIFilters.fkey(lambda u: {'member': u[-1]}, help="e.g. /politicians/roles/326/"), 'ballot': APIFilters.choices('vote', MemberVote), 'dissent': APIFilters.dbfield( 'dissent', help= "does this look like a vote against party line? not reliable for research. True, False" ) } def get_qs(self, request): return MemberVote.objects.all().select_related( 'votequestion').order_by('-votequestion__date', '-votequestion__number') def object_to_dict(self, obj): return obj.to_api_dict(representation='list')
class CommitteeListView(ModelListView): resource_name = 'Committees' filters = {'session': APIFilters.dbfield('sessions')} def get_qs(self, request): qs = Committee.objects.filter( parent__isnull=True, display=True).order_by('name_' + settings.LANGUAGE_CODE) if 'session' not in request.GET: session = Session.objects.filter(committeeinsession__isnull=False ).distinct().order_by('-start')[0] qs = qs.filter(sessions=session) return qs def get_html(self, request): committees = self.get_qs(request) recent_meetings = CommitteeMeeting.objects.order_by('-date')[:50] recent_studies = CommitteeActivity.objects.filter( study=True, committeemeeting__in=list( recent_meetings.values_list('id', flat=True))).distinct()[:12] return render( request, "committees/committee_list.html", { 'object_list': committees, 'title': 'House Committees', 'recent_studies': recent_studies })
class APIArchiveView(ModelListView): resource_name = 'House debates' filters = { 'session': APIFilters.dbfield(help='e.g. 41-1'), 'date': APIFilters.dbfield(help='e.g. date__range=2010-01-01,2010-09-01'), 'number': APIFilters.dbfield( help='each Hansard in a session is given a sequential #'), } def get_html(self, request, **kwargs): return self.get(request, **kwargs) def get_qs(self, request, **kwargs): return self.get_dated_items()[1]
class CurrentMPView(ModelListView): resource_name = 'Politicians' default_limit = 308 filters = { 'name': APIFilters.dbfield(help='e.g. Stephen Harper'), 'family_name': APIFilters.dbfield('name_family', help='e.g. Harper'), 'given_name': APIFilters.dbfield('name_given', help='e.g. Stephen'), 'include': APIFilters.noop( help= "'former' to show former MPs (since 94), 'all' for current and former" ) } def get_qs(self, request): if request.GET.get('include') == 'former': qs = Politician.objects.elected_but_not_current() elif request.GET.get('include') == 'all': qs = Politician.objects.elected() else: qs = Politician.objects.current() return qs.order_by('name_family') def get_html(self, request): t = loader.get_template('politicians/electedmember_list.html') c = RequestContext( request, { 'object_list': ElectedMember.objects.current().order_by( 'riding__province', 'politician__name_family').select_related( 'politician', 'riding', 'party'), 'title': 'Current Members of Parliament' }) return HttpResponse(t.render(c))
class CommitteeMeetingListView(ModelListView): resource_name = 'Committee meetings' filters = { 'number': APIFilters.dbfield( filter_types=APIFilters.numeric_filters, help="each meeting in a session is given a sequential #"), 'session': APIFilters.dbfield(help="e.g. 41-1"), 'date': APIFilters.dbfield(filter_types=APIFilters.numeric_filters, help="e.g. date__gt=2010-01-01"), 'in_camera': APIFilters.dbfield(help="closed to the public? True, False"), 'committee': APIFilters.fkey(lambda u: {'committee__slug': u[-1]}, help="e.g. /committees/aboriginal-affairs") } def get_qs(self, request): return CommitteeMeeting.objects.all().order_by('-date')
class BillListView(ModelListView): resource_name = 'Bills' filters = { 'session': APIFilters.dbfield(help="e.g. 41-1"), 'introduced': APIFilters.dbfield( filter_types=APIFilters.numeric_filters, help="date bill was introduced, e.g. introduced__gt=2010-01-01"), 'legisinfo_id': APIFilters.dbfield( help="integer ID assigned by parl.gc.ca's LEGISinfo"), 'number': APIFilters.dbfield('bill__number', help="a string, not an integer: e.g. C-10"), 'law': APIFilters.dbfield('bill__law', help="did it become law? True, False"), 'private_member_bill': APIFilters.dbfield('bill__privatemember', help="is it a private member's bill? True, False"), 'status_code': APIFilters.dbfield('bill__status_code'), 'sponsor_politician': APIFilters.politician('sponsor_politician'), 'sponsor_politician_membership': APIFilters.fkey(lambda u: {'sponsor_member': u[-1]}), } def get_qs(self, request): return BillInSession.objects.all().select_related( 'bill', 'sponsor_politician') def get_html(self, request): sessions = Session.objects.with_bills() len(sessions) # evaluate it bills = Bill.objects.filter(sessions=sessions[0]) votes = VoteQuestion.objects.select_related('bill').filter( session=sessions[0])[:6] t = loader.get_template('bills/index.html') c = { 'object_list': bills, 'session_list': sessions, 'votes': votes, 'session': sessions[0], 'title': 'Bills & Votes', 'recently_active': Bill.objects.recently_active() } return HttpResponse(t.render(c, request))
class VoteListView(ModelListView): resource_name = 'Votes' api_notes = mark_safe("""<p>What we call votes are <b>divisions</b> in official Parliamentary lingo. We refer to an individual person's vote as a <a href="/votes/ballots/">ballot</a>.</p> """) filters = { 'session': APIFilters.dbfield(help="e.g. 41-1"), 'yea_total': APIFilters.dbfield(filter_types=APIFilters.numeric_filters, help="# votes for"), 'nay_total': APIFilters.dbfield(filter_types=APIFilters.numeric_filters, help="# votes against, e.g. nay_total__gt=10"), 'paired_total': APIFilters.dbfield(filter_types=APIFilters.numeric_filters, help="paired votes are an odd convention that seem to have stopped in 2011"), 'date': APIFilters.dbfield(filter_types=APIFilters.numeric_filters, help="date__gte=2011-01-01"), 'number': APIFilters.dbfield(filter_types=APIFilters.numeric_filters, help="every vote in a session has a sequential number"), 'bill': APIFilters.fkey(lambda u: { 'bill__sessions': u[-2], 'bill__number': u[-1] }, help="e.g. /bills/41-1/C-10/"), 'result': APIFilters.choices('result', VoteQuestion) } def get_json(self, request, session_id=None): if session_id: return HttpResponseRedirect(urlresolvers.reverse('votes') + '?' + urlencode({'session': session_id})) return super(VoteListView, self).get_json(request) def get_qs(self, request): return VoteQuestion.objects.select_related(depth=1).order_by('-date', '-number') def get_html(self, request, session_id=None): if session_id: session = get_object_or_404(Session, pk=session_id) else: session = Session.objects.current() t = loader.get_template('bills/votequestion_list.html') c = RequestContext(request, { 'object_list': self.get_qs(request).filter(session=session), 'session': session, 'title': 'Votes for the %s' % session }) return HttpResponse(t.render(c))
def inner(qs, *args, **kwargs): if qs.model == Politician: return APIFilters.dbfield(field_name)(qs, *args, **kwargs) else: return APIFilters.dbfield('politician__' + field_name)( qs, *args, **kwargs)
def inner(qs, *args, **kwargs): if qs.model == Politician: return APIFilters.dbfield(field_name)(qs, *args, **kwargs) else: return APIFilters.dbfield('politician__' + field_name)(qs, *args, **kwargs)