100 lines
2.8 KiB
Python
100 lines
2.8 KiB
Python
from django.db import models
|
|
from django.utils.translation import gettext_lazy as _
|
|
from django.contrib.postgres.fields import ArrayField
|
|
|
|
from statistics import mean
|
|
|
|
class Person(models.Model):
|
|
# generic stuff
|
|
first_name = models.CharField(max_length=256)
|
|
last_name = models.CharField(max_length=256)
|
|
|
|
# personal information
|
|
phone_number = models.CharField(max_length=256)
|
|
address = models.CharField(max_length=256)
|
|
city = models.CharField(max_length=256)
|
|
state = models.CharField(max_length=256)
|
|
|
|
class GeneralAssembly(models.Model):
|
|
class Color(models.TextChoices):
|
|
RED = 'RED', _('Red')
|
|
WHITE = 'WHI', _('White')
|
|
BLUE = 'BLU', _('Blue')
|
|
NONE = 'NON', _('None')
|
|
|
|
color = models.CharField(
|
|
max_length=3,
|
|
choices=Color.choices,
|
|
default=Color.NONE,
|
|
)
|
|
docket = models.ArrayField(BillTeam)
|
|
|
|
class Committee(models.Model):
|
|
number = models.IntegerField(default=1)
|
|
docket = models.ArrayField(BillTeam)
|
|
general_assembly = models.ForeignKey(GeneralAssembly)
|
|
|
|
class RollCallVoteResult(models.Model):
|
|
all_for = models.IntegerField()
|
|
all_against = models.IntegerField()
|
|
all_abstaining = models.IntegerField()
|
|
|
|
class RankingVoteResult(models.Model):
|
|
def average(self):
|
|
return mean(
|
|
[vote.average for vote in self.rankingvotes_set.all()]
|
|
)
|
|
|
|
class RankingVotes(models.Model):
|
|
field1 = models.IntegerField()
|
|
field2 = models.IntegerField()
|
|
field3 = models.IntegerField()
|
|
field4 = models.IntegerField()
|
|
field5 = models.IntegerField()
|
|
result = models.ForeignKey(RankingVoteResult)
|
|
|
|
def average(self):
|
|
return sum(
|
|
self.field1,
|
|
self.field2,
|
|
self.field3,
|
|
self.field4,
|
|
self.field5
|
|
) / 5
|
|
|
|
class BillVoteResults(models.Model):
|
|
plenary = models.ForeignKey(RollCallVoteResult)
|
|
general_assembly = models.ForeignKey(RollCallVoteResult)
|
|
committee = models.ForeignKey(RankingVoteResult)
|
|
|
|
class Bill(models.Model):
|
|
title = models.CharField(max_length=256)
|
|
text = models.TextField()
|
|
topic = models.CharField(max_length=256)
|
|
votes = models.ForeignKey(BillVoteResults)
|
|
|
|
class BillTeam(models.Model):
|
|
class Color(models.TextChoices):
|
|
RED = 'RED', _('Red')
|
|
WHITE = 'WHI', _('White')
|
|
BLUE = 'BLU', _('Blue')
|
|
NONE = 'NON', _('None')
|
|
|
|
color = models.CharField(
|
|
max_length=3,
|
|
choices=Color.choices,
|
|
default=Color.NONE,
|
|
)
|
|
delegates = models.ManyToManyField(Person)
|
|
country = models.TextField(blank=True)
|
|
bill = models.ForeignKey(Bill)
|
|
committee = models.ForeignKey(Committee)
|
|
|
|
class MUNConference(models.Model):
|
|
name = models.CharField(max_length=256)
|
|
docket = models.ArrayField(BillTeam) # plenary docket
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|