# 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(20), unique=True) name = db.Column(db.String(200)) slug = db.Column(db.String(200)) 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"))