cmsmanage/membershipworks/models.py

210 lines
8.9 KiB
Python
Raw Normal View History

from typing import Optional
import django.core.mail.message
from django.conf import settings
from django.db import models
from django.db.models import Q, Count, BooleanField
class Flag(models.Model):
id = models.CharField(max_length=24, primary_key=True)
name = models.TextField(null=True)
type = models.CharField(max_length=6)
def __str__(self):
2022-02-11 13:48:47 -05:00
return f"{self.name} ({self.type})"
class Meta:
managed = False
2022-02-11 13:48:47 -05:00
db_table = "flag"
ordering = ("name",)
class MemberQuerySet(models.QuerySet):
@staticmethod
def has_flag(flag_type: str, flag_name: str):
return Count(
"uid",
filter=Q(flags__name=flag_name, flags__type=flag_type),
output_field=BooleanField(),
)
def with_is_active(self):
return self.annotate(
is_active=(
self.has_flag("folder", "Members")
| self.has_flag("folder", "CMS Staff")
)
& ~(
self.has_flag("label", "Account On Hold")
| self.has_flag("level", "CMS Membership on hold")
| self.has_flag("folder", "Former Members")
)
)
# TODO: is this still a temporal table?
class Member(models.Model):
objects = MemberQuerySet.as_manager()
uid = models.CharField(max_length=24, primary_key=True)
year_of_birth = models.TextField(db_column="Year of Birth", null=True)
account_name = models.TextField(db_column="Account Name", null=True)
first_name = models.TextField(db_column="First Name", null=True)
last_name = models.TextField(db_column="Last Name", null=True)
phone = models.TextField(db_column="Phone", null=True)
email = models.TextField(db_column="Email", null=True)
volunteer_email = models.TextField(db_column="Volunteer Email", null=True)
address_street = models.TextField(db_column="Address (Street)", null=True)
address_city = models.TextField(db_column="Address (City)", null=True)
address_state_province = models.TextField(
db_column="Address (State/Province)", null=True
)
address_postal_code = models.TextField(db_column="Address (Postal Code)", null=True)
address_country = models.TextField(db_column="Address (Country)", null=True)
profile_description = models.TextField(db_column="Profile description", null=True)
website = models.TextField(db_column="Website", null=True)
fax = models.TextField(db_column="Fax", null=True)
contact_person = models.TextField(db_column="Contact Person", null=True)
password = models.TextField(db_column="Password", null=True)
position_relation = models.TextField(db_column="Position/relation", null=True)
parent_account_id = models.TextField(db_column="Parent Account ID", null=True)
gift_membership_purchased_by = models.TextField(
db_column="Gift Membership purchased by", null=True
)
purchased_gift_membership_for = models.TextField(
db_column="Purchased Gift Membership for", null=True
)
closet_storage = models.TextField(db_column="Closet Storage #", null=True)
storage_shelf = models.TextField(db_column="Storage Shelf #", null=True)
2022-02-11 13:48:47 -05:00
personal_studio_space = models.TextField(
db_column="Personal Studio Space #", null=True
)
access_permitted_shops_during_extended_hours = models.BooleanField(
db_column="Access Permitted Shops During Extended Hours?"
)
normal_access_permitted_during_covid19_limited_operations = models.BooleanField(
db_column="Normal Access Permitted During COVID-19 Limited Operations"
)
access_permitted_during_covid19_staffed_period_only = models.BooleanField(
db_column="Access Permitted During COVID-19 Staffed Period Only"
)
access_front_door_and_studio_space_during_extended_hours = models.BooleanField(
db_column="Access Front Door and Studio Space During Extended Hours?"
)
access_wood_shop = models.BooleanField(db_column="Access Wood Shop?")
access_metal_shop = models.BooleanField(db_column="Access Metal Shop?")
access_storage_closet = models.BooleanField(db_column="Access Storage Closet?")
access_studio_space = models.BooleanField(db_column="Access Studio Space?")
access_front_door = models.BooleanField(db_column="Access Front Door?")
access_card_number = models.TextField(db_column="Access Card Number", null=True)
access_card_facility_code = models.TextField(
db_column="Access Card Facility Code", null=True
)
auto_billing_id = models.TextField(db_column="Auto Billing ID", null=True)
billing_method = models.TextField(db_column="Billing Method", null=True)
renewal_date = models.DateField(db_column="Renewal Date", null=True)
join_date = models.DateField(db_column="Join Date", null=True)
admin_note = models.TextField(db_column="Admin note", null=True)
profile_gallery_image_url = models.TextField(
db_column="Profile gallery image URL", null=True
)
business_card_image_url = models.TextField(
db_column="Business card image URL", null=True
)
instagram = models.TextField(db_column="Instagram", null=True)
pinterest = models.TextField(db_column="Pinterest", null=True)
youtube = models.TextField(db_column="Youtube", null=True)
yelp = models.TextField(db_column="Yelp", null=True)
google = models.TextField(db_column="Google+", null=True)
bbb = models.TextField(db_column="BBB", null=True)
twitter = models.TextField(db_column="Twitter", null=True)
facebook = models.TextField(db_column="Facebook", null=True)
linked_in = models.TextField(db_column="LinkedIn", null=True)
do_not_show_street_address_in_profile = models.TextField(
db_column="Do not show street address in profile", null=True
)
do_not_list_in_directory = models.TextField(
db_column="Do not list in directory", null=True
)
how_did_you_hear = models.TextField(db_column="HowDidYouHear", null=True)
authorize_charge = models.TextField(db_column="authorizeCharge", null=True)
policy_agreement = models.TextField(db_column="policyAgreement", null=True)
waiver_form_signed_and_on_file_date = models.DateField(
db_column="Waiver form signed and on file date.", null=True
)
membership_agreement_signed_and_on_file_date = models.DateField(
db_column="Membership Agreement signed and on file date.", null=True
)
ip_address = models.TextField(db_column="IP Address", null=True)
audit_date = models.DateField(db_column="Audit Date", null=True)
agreement_version = models.TextField(db_column="Agreement Version", null=True)
paperwork_status = models.TextField(db_column="Paperwork status", null=True)
2022-02-11 13:48:47 -05:00
membership_agreement_dated = models.BooleanField(
db_column="Membership agreement dated"
)
membership_agreement_acknowledgement_page_filled_out = models.BooleanField(
db_column="Membership Agreement Acknowledgement Page Filled Out"
)
membership_agreement_signed = models.BooleanField(
db_column="Membership Agreement Signed"
)
2022-02-11 13:48:47 -05:00
liability_form_filled_out = models.BooleanField(
db_column="Liability Form Filled Out"
)
self_certify_essential_business = models.BooleanField(
db_column="selfCertifyEssentialBusiness"
)
accepted_covid19_policy = models.BooleanField(db_column="Accepted COVID-19 Policy")
2022-02-11 13:48:47 -05:00
flags = models.ManyToManyField(Flag, through="MemberFlag", related_name="members")
def __str__(self):
return f"{self.account_name}"
class Meta:
managed = False
2022-02-11 13:48:47 -05:00
db_table = "members"
ordering = ("first_name", "last_name")
indexes = [
models.Index(fields=["account_name"]),
models.Index(fields=["first_name"]),
models.Index(fields=["last_name"]),
]
@classmethod
def from_user(cls, user) -> Optional["Member"]:
if hasattr(user, "ldap_user"):
return cls.objects.get(uid=user.ldap_user.attrs["employeeNumber"][0])
2023-02-02 22:33:13 -05:00
def sanitized_mailbox(self, name_ext: str = "", use_volunteer=False) -> str:
if use_volunteer and self.volunteer_email:
email = self.volunteer_email
2023-02-02 22:33:13 -05:00
elif self.email:
email = self.email
2023-02-02 22:33:13 -05:00
else:
raise Exception(f"No Email Address for user: {self.uid}")
if not self.account_name:
return email
return django.core.mail.message.sanitize_address(
(self.account_name + name_ext, email), settings.DEFAULT_CHARSET
)
class MemberFlag(models.Model):
member = models.ForeignKey(Member, on_delete=models.PROTECT, db_column="uid")
flag = models.ForeignKey(Flag, on_delete=models.PROTECT)
def __str__(self):
2022-02-11 13:48:47 -05:00
return f"{self.member} - {self.flag}"
class Meta:
managed = False
2022-02-11 13:48:47 -05:00
db_table = "memberflag"
constraints = [
2022-02-11 13:48:47 -05:00
models.UniqueConstraint(
fields=["member", "flag_id"], name="unique_member_flag"
)
]