forked from CMS/memberPlumbing
90 lines
2.9 KiB
Python
Executable File
90 lines
2.9 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
from datetime import datetime
|
|
|
|
from .config import Config
|
|
from .mw_models import Member, Flag, MemberFlag, Transaction, database
|
|
|
|
|
|
@database.atomic()
|
|
def do_import(config):
|
|
membershipworks = config.membershipworks
|
|
print("Creating tables")
|
|
database.create_tables([Member, Flag, MemberFlag, Transaction])
|
|
|
|
print("Updating flags (labels, levels, and addons)")
|
|
flags = membershipworks._parse_flags()
|
|
Flag.insert_many(
|
|
[
|
|
{"id": v, "name": k, "type": typ[:-1]}
|
|
for typ, flags_of_type in flags.items()
|
|
for k, v in flags_of_type.items()
|
|
]
|
|
).on_conflict(action="update", preserve=[Flag.name, Flag.type]).execute()
|
|
|
|
print("Getting/Updating members...")
|
|
members = membershipworks.get_all_members()
|
|
for m in members:
|
|
# replace flags by booleans
|
|
for flag in [dek["lbl"] for dek in membershipworks.org_info["dek"]]:
|
|
if flag in m:
|
|
m[flag] = m[flag] == flag
|
|
|
|
for field_id, field in membershipworks._all_fields().items():
|
|
# convert checkboxes to real booleans
|
|
if field.get("typ") == 8 and field["lbl"] in m: # check box
|
|
m[field["lbl"]] = True if m[field["lbl"]] == "Y" else False
|
|
|
|
for member in members:
|
|
# create/update member
|
|
Member.from_csv_dict(member).magic_save()
|
|
|
|
# update member's flags
|
|
for type, flags in membershipworks._parse_flags().items():
|
|
if type != "folders": # currently no way to retrieve this info
|
|
for flag, id in flags.items():
|
|
ml = MemberFlag(uid=member["Account ID"], flag_id=id)
|
|
if member[flag]:
|
|
ml.magic_save()
|
|
else:
|
|
ml.delete_instance()
|
|
|
|
print("Getting/Updating transactions...")
|
|
# Deduping these is hard, so just recreate the data every time
|
|
Transaction.truncate_table()
|
|
now = datetime.now()
|
|
start_date = datetime(2010, 1, 1)
|
|
transactions_csv = membershipworks.get_transactions(start_date, now)
|
|
transactions_json = membershipworks.get_transactions(start_date, now, json=True)
|
|
# this is terrible, but as long as the dates are the same, should be fiiiine
|
|
transactions = [{**j, **v} for j, v in zip(transactions_csv, transactions_json)]
|
|
assert all(
|
|
[
|
|
t["Account ID"] == t.get("uid", "") and t["Payment ID"] == t.get("sid", "")
|
|
for t in transactions
|
|
]
|
|
)
|
|
|
|
for transaction in transactions:
|
|
Transaction.from_csv_dict(transaction).magic_save()
|
|
|
|
# TODO: folders, levels, addons
|
|
|
|
|
|
def main():
|
|
config = Config()
|
|
database.init(
|
|
**config.MEMBERSHIPWORKS_DB,
|
|
**{
|
|
"charset": "utf8",
|
|
"sql_mode": "PIPES_AS_CONCAT",
|
|
"use_unicode": True,
|
|
}
|
|
)
|
|
|
|
do_import(config)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|