49 lines
1.8 KiB
Python
49 lines
1.8 KiB
Python
|
from django.conf import settings
|
||
|
from django.core.management.base import BaseCommand
|
||
|
from django.db import transaction
|
||
|
|
||
|
from membershipworks.models import Member, Flag
|
||
|
from membershipworks import MembershipWorks
|
||
|
|
||
|
|
||
|
class Command(BaseCommand):
|
||
|
def flags_for_member(self, csv_member, all_flags):
|
||
|
# update member's flags
|
||
|
for flag in all_flags:
|
||
|
if flag.type != "folder": # currently no way to retrieve this info
|
||
|
if csv_member[flag.name] == flag.name:
|
||
|
yield flag
|
||
|
|
||
|
def update_flags(self, mw_flags) -> list[Flag]:
|
||
|
for typ, flags_of_type in mw_flags.items():
|
||
|
for name, id in flags_of_type.items():
|
||
|
flag = Flag(id=id, name=name, type=typ[:-1])
|
||
|
flag.save()
|
||
|
yield flag
|
||
|
|
||
|
@transaction.atomic()
|
||
|
def handle(self, *args, **options):
|
||
|
membershipworks = MembershipWorks()
|
||
|
membershipworks.login(
|
||
|
settings.MEMBERSHIPWORKS_USERNAME, settings.MEMBERSHIPWORKS_PASSWORD
|
||
|
)
|
||
|
|
||
|
print("Updating flags (labels, levels, and addons)")
|
||
|
flags = list(self.update_flags(membershipworks._parse_flags()))
|
||
|
|
||
|
print("Getting/Updating members...")
|
||
|
members = membershipworks.get_all_members()
|
||
|
for csv_member in members:
|
||
|
for field_id, field in membershipworks._all_fields().items():
|
||
|
# convert checkboxes to real booleans
|
||
|
if field.get("typ") == 8 and field["lbl"] in csv_member:
|
||
|
csv_member[field["lbl"]] = (
|
||
|
True if csv_member[field["lbl"]] == "Y" else False
|
||
|
)
|
||
|
|
||
|
# create/update member
|
||
|
member = Member.from_csv_dict(csv_member)
|
||
|
member.clean_fields()
|
||
|
member.save()
|
||
|
member.flags.set(self.flags_for_member(csv_member, flags))
|