Esempio n. 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')
Esempio n. 2
0
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
            })
Esempio n. 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))
Esempio n. 4
0
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]
Esempio n. 5
0
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))
Esempio n. 6
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))
Esempio n. 7
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')
Esempio n. 8
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
Esempio n. 9
0
 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)
Esempio n. 10
0
class CurrentMPView(ModelListView):

    resource_name = 'Politicians'

    default_limit = 308

    # The API stuff here is a bit of a hack: because of the database schema, it makes sense
    # to internally use ElectedMembers in order to add more fields to the default response,
    # but for former politicians we use Politician objects, so... hacking.
    def _politician_prepend_filter(field_name, help):
        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)

        inner.help = help
        return inner

    filters = {
        'name':
        _politician_prepend_filter('name', help='e.g. Stephen Harper'),
        'family_name':
        _politician_prepend_filter('name_family', help='e.g. Harper'),
        'given_name':
        _politician_prepend_filter('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=None):
        if request and request.GET.get('include') == 'former':
            qs = Politician.objects.elected_but_not_current().order_by(
                'name_family')
        elif request and request.GET.get('include') == 'all':
            qs = Politician.objects.elected().order_by('name_family')
        else:
            qs = ElectedMember.objects.current().order_by(
                'riding__province', 'politician__name_family').select_related(
                    'politician', 'riding', 'party')
        return qs

    def object_to_dict(self, obj):
        if isinstance(obj, ElectedMember):
            return dict(
                name=obj.politician.name,
                url=obj.politician.get_absolute_url(),
                current_party={"short_name": {
                    "en": obj.party.short_name
                }},
                current_riding={
                    "province": obj.riding.province,
                    "name": {
                        "en": obj.riding.dashed_name
                    }
                },
                image=obj.politician.headshot.url
                if obj.politician.headshot else None,
            )
        else:
            return super(CurrentMPView, self).object_to_dict(obj)

    def get_html(self, request):
        t = loader.get_template('politicians/electedmember_list.html')
        c = {
            'object_list': self.get_qs(),
            'title': 'Current Members of Parliament'
        }
        return HttpResponse(t.render(c, request))
Esempio n. 11
0
 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)