#!/usr/bin/env python3 from datetime import datetime from common import membershipworks from lib.mw_models import Label, Member, MemberLabel, Transaction, database @database.atomic() def main(): print("Creating tables") database.create_tables([Label, Member, MemberLabel, Transaction]) print("Updating labels") labels = membershipworks._parse_flags()["labels"] Label.insert_many( [{"label_id": v, "label": k} for k, v in labels.items()] ).on_conflict(action="update", preserve=[Label.label]).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 labels for label, label_id in membershipworks._parse_flags()["labels"].items(): ml = MemberLabel(uid=member["Account ID"], label_id=label_id) if member[label]: ml.magic_save() else: ml.delete_instance() print("Getting/Updating transactions...") 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 if __name__ == "__main__": main()