politikorama/app/controller/admin/membership.py

120 lines
4.8 KiB
Python

# encoding: utf-8
from datetime import datetime
from flask import current_app, g, request, redirect, url_for
from flask_admin import BaseView, expose
from slugify import slugify
from sqlalchemy import or_
from app.form.admin import ImportForm
from app.controller.admin.importer import default_import
from app.model.entity import EntityModel
from app.model.membership import MembershipModel
from app.model.representative_origin import RepresentativeOriginModel
from app.model.role import RoleModel
class ImportMembershipView(BaseView):
@expose("/", methods=["GET", "POST"])
def index(self):
g.what = {
"title": "Import memberships",
"description": "Importing memberships will add unknown ones and update"
" known ones. If a membership is not present in imported file it"
" will not be deleted.",
"endpoint": "memberships.index",
"formats": [
"File format accepted is CSV (Comma Separated Values).",
"First line represents column headers.",
"Other lines are values:",
"One column MUST be 'reference'",
"One column MUST be 'representative_reference'",
"One column MUST be 'entity_reference'",
"One column MUST be 'role_code'",
"One column MUST be 'role'",
"One column MUST be 'start'",
"One column COULD be 'end'",
],
"examples": [
"reference,representative_reference,entity_reference,role_code,role,start,end",
"12,23,34,MBR,Member,2020-01-01,",
"45,67,89,PDT,President,2018-01-01,2019-12-31",
],
}
headers = {
"reference": None,
"representative_reference": None,
"entity_reference": None,
"role_code": None,
"role": None,
"start": None,
"end": "optional",
}
reader = default_import(headers)
if len(g.errors) == 0 and reader is not None:
for row in reader:
role = RoleModel.query.filter_by(
code=row[headers["role_code"]].upper()
).first()
if role is None:
role = RoleModel(
code=row[headers["role_code"]].upper(),
name=row[headers["role"]],
slug=slugify(row[headers["role"]]),
)
role.save()
entity = EntityModel.query.filter_by(
reference=row[headers["entity_reference"]].upper()
).first()
if entity is None:
g.messages.append("UNKNOWN entity :"
f"{row[headers['entity_reference']].upper()}"
)
continue
representative_origin = RepresentativeOriginModel.query.filter_by(
reference=row[headers["representative_reference"]].upper(),
).first()
if representative_origin is None:
g.messages.append("UNKNOWN representative :"
f"{row[headers['representative_reference']].upper()}"
)
continue
if row[headers["start"]] != "":
start = datetime.strptime(
row[headers["start"]], "%Y-%m-%d"
).date()
else:
start = None
end = None
if headers["end"] is not None:
if row[headers["end"]] != "":
end = datetime.strptime(
row[headers["end"]], "%Y-%m-%d"
).date()
membership = MembershipModel.query.filter_by(
reference=row[headers["reference"]].upper()
).first()
if membership is None:
membership = MembershipModel(
representative_id = representative_origin.representative_id,
entity_id = entity.id,
reference = row[headers["reference"]].upper(),
role_id = role.id,
start = start,
end = end,
active = True if end is None else False,
)
g.messages.append(
f"{role.name} added"
f" for {representative_origin.representative.first_name}"
f" {representative_origin.representative.last_name}."
)
membership.save()
return self.render("admin/import.html")