77 lines
2.4 KiB
Python
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"))
|