Beispiel #1
0
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')
Beispiel #2
0
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
Beispiel #3
0
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))
Beispiel #4
0
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))
Beispiel #5
0
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')