17. “All of the receipts of 650-odd MPs,
redacted and unredacted, are for sale
at a price of £300,000, so I am told.
The price is going up because of the
interest in the subject.”
Sir Stuart Bell, MP
Newsnight, 30th March
39. class Party(models.Model):
name = models.CharField(max_length=100)
class Constituency(models.Model):
name = models.CharField(max_length=100)
class MP(models.Model):
name = models.CharField(max_length=100)
party = models.ForeignKey(Party)
constituency = models.ForeignKey(Constituency)
guardian_url = models.CharField(max_length=255,
blank=True)
guardian_image_url = models.CharField(max_length=255,
blank=True)
40. class FinancialYear(models.Model):
name = models.CharField(max_length=10)
class Document(models.Model):
title = models.CharField(max_length=100, blank=True)
filename = models.CharField(max_length=100)
mp = models.ForeignKey(MP)
financial_year = models.ForeignKey(FinancialYear)
class Page(models.Model):
document = models.ForeignKey(Document)
page_number = models.IntegerField()
41. class User(models.Model):
created = models.DateTimeField(auto_now_add = True)
username = models.TextField(max_length = 100)
password_hash = models.CharField(max_length = 128, blank=True)
class LineItemCategory(models.Model):
order = models.IntegerField(default = 0)
name = models.CharField(max_length = 32)
class LineItem(models.Model):
user = models.ForeignKey(User)
page = models.ForeignKey(Page)
type = models.CharField(max_length = 16, choices = (
('claim', 'claim'), ('proof', 'proof'),
), db_index = True)
date = models.DateField(null = True, blank = True)
amount = models.DecimalField(max_digits=20, decimal_places=2)
description = models.CharField(max_length = 255, blank = True)
created = models.DateTimeField(auto_now_add = True, db_index = True)
categories = models.ManyToManyField(LineItemCategory, blank=True)
42. class Vote(models.Model):
user = models.ForeignKey(User, related_name = 'votes')
page = models.ForeignKey(Page, related_name = 'votes')
obsolete = models.BooleanField(default = False)
vote_type = models.CharField(max_length = 32, blank = True)
ip_address = models.CharField(max_length = 32)
created = models.DateTimeField(auto_now_add = True)
class TypeVote(Vote):
type = models.CharField(max_length = 10, choices = (
('claim', 'Claim'), ('proof', 'Proof'),
('blank', 'Blank'), ('other', 'Other')
))
class InterestingVote(Vote):
status = models.CharField(max_length = 10, choices = (
('no', 'Not interesting'), ('yes', 'Interesting'),
('known', 'Interesting but known'), ('very', 'Investigate this!'),
))
70. SELECT
COUNT(DISTINCT `expenses_page`.`id`)
FROM
`expenses_page` LEFT OUTER JOIN `expenses_vote` ON (
`expenses_page`.`id` = `expenses_vote`.`page_id`
) WHERE `expenses_vote`.`id` IS NULL
78. def next_global(request):
# Next unreviewed page from the whole site
all_unreviewed_pages = Page.objects.filter(
is_reviewed = False
).order_by('?')
if all_unreviewed_pages:
return Redirect(
all_unreviewed_pages[0].get_absolute_url()
)
else:
return HttpResponse(
'All pages have been reviewed!'
)