politikorama/app/model/representative.py

77 lines
2.4 KiB
Python

# encoding: utf-8
from app import admin, db
from app.model.model import Model, View
from app.model.country import CountryModel
class RepresentativeModel(db.Model, Model):
__tablename__ = "representative"
id = db.Column(db.Integer, primary_key=True)
code = db.Column(db.String(2000), unique=True)
name = db.Column(db.String(2000))
slug = db.Column(db.String(2000))
active = db.Column(db.Boolean, default=False)
picture = db.Column(db.String(2000))
nationality_id = db.Column(db.Integer, db.ForeignKey("country.id"))
nationality = db.relationship(
"CountryModel", foreign_keys=[nationality_id], backref=db.backref("representatives", lazy="dynamic")
)
sex = db.Column(db.String(1))
birth_date = db.Column(db.Date)
birth_place = db.Column(db.String(2000))
job = db.Column(db.String(2000))
@property
def parpol(self):
"""
A representative is maybe part of a political party.
"""
# Active one first
for membership in [membership for membership in self.memberships if membership.end is None]:
if membership.entity.type.code == "PARPOL":
return membership.entity.name
# Else old one
for membership in sorted(self.memberships, key=lambda x: x.start, reverse=True):
if membership.entity.type.code == "PARPOL":
return membership.entity.name
@property
def is_female(self):
return self.sex == "F"
@property
def is_active(self):
"""
A representative is active if she has at least one membership not ended.
"""
for membership in self.memberships:
if membership.end is None:
return True
return False
@property
def score(self):
total = 0
for decision in self.decisions:
if decision.value == decision.recommendation.value:
total += decision.recommendation.weight
else:
total -= decision.recommendation.weight
return total
def __repr__(self):
return self.name
class AdminView(View):
column_default_sort = "name"
column_exclude_list = ["picture"]
column_filters = ["name", "nationality.name"]
def on_model_change(self, form, model, is_created):
model.slug = slugify(model.name)
admin.add_view(AdminView(RepresentativeModel, db.session, name="Representative", category="CRUD"))