120 lines
4.8 KiB
Python
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")
|