Adam Goldsmith
7f7c6484ea
Retroactively adding to the initial migration as this table already existed, just wasn't represented in the Django app yet
248 lines
11 KiB
Python
248 lines
11 KiB
Python
from typing import Optional
|
|
|
|
import django.core.mail.message
|
|
from django.conf import settings
|
|
from django.db import models
|
|
from django.db.models import Exists, OuterRef
|
|
|
|
|
|
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):
|
|
return f"{self.name} ({self.type})"
|
|
|
|
class Meta:
|
|
managed = False
|
|
db_table = "flag"
|
|
ordering = ("name",)
|
|
|
|
|
|
class MemberQuerySet(models.QuerySet):
|
|
# TODO: maybe rename to reflect EXISTS?
|
|
@staticmethod
|
|
def has_flag(flag_type: str, flag_name: str):
|
|
return Exists(
|
|
Flag.objects.filter(type=flag_type, name=flag_name, members=OuterRef("pk"))
|
|
)
|
|
|
|
# TODO: it should be fairly easy to reduce the number of EXISTS by
|
|
# merging the ORed flags
|
|
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)
|
|
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)
|
|
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"
|
|
)
|
|
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")
|
|
flags = models.ManyToManyField(Flag, through="MemberFlag", related_name="members")
|
|
|
|
def __str__(self):
|
|
return f"{self.account_name}"
|
|
|
|
class Meta:
|
|
managed = False
|
|
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])
|
|
|
|
def sanitized_mailbox(self, name_ext: str = "", use_volunteer=False) -> str:
|
|
if use_volunteer and self.volunteer_email:
|
|
email = self.volunteer_email
|
|
elif self.email:
|
|
email = self.email
|
|
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):
|
|
return f"{self.member} - {self.flag}"
|
|
|
|
class Meta:
|
|
managed = False
|
|
db_table = "memberflag"
|
|
constraints = [
|
|
models.UniqueConstraint(
|
|
fields=["member", "flag_id"], name="unique_member_flag"
|
|
)
|
|
]
|
|
|
|
|
|
class Transaction(models.Model):
|
|
sid = models.CharField(max_length=27, null=True, blank=True)
|
|
member = models.ForeignKey(
|
|
Member,
|
|
on_delete=models.PROTECT,
|
|
db_column="uid",
|
|
related_name="transactions",
|
|
null=True,
|
|
blank=True,
|
|
)
|
|
timestamp = models.DateTimeField()
|
|
type = models.TextField(null=True, blank=True)
|
|
sum = models.DecimalField(max_digits=13, decimal_places=4, null=True, blank=True)
|
|
fee = models.DecimalField(max_digits=13, decimal_places=4, null=True, blank=True)
|
|
event_id = models.TextField(null=True, blank=True)
|
|
for_what = models.TextField(db_column="For", null=True, blank=True)
|
|
items = models.TextField(db_column="Items", null=True, blank=True)
|
|
discount_code = models.TextField(db_column="Discount Code", null=True, blank=True)
|
|
note = models.TextField(db_column="Note", null=True, blank=True)
|
|
name = models.TextField(db_column="Name", null=True, blank=True)
|
|
contact_person = models.TextField(db_column="Contact Person", null=True, blank=True)
|
|
full_address = models.TextField(db_column="Full Address", null=True, blank=True)
|
|
street = models.TextField(db_column="Street", null=True, blank=True)
|
|
city = models.TextField(db_column="City", null=True, blank=True)
|
|
state_province = models.TextField(db_column="State/Province", null=True, blank=True)
|
|
postal_code = models.TextField(db_column="Postal Code", null=True, blank=True)
|
|
country = models.TextField(db_column="Country", null=True, blank=True)
|
|
phone = models.TextField(db_column="Phone", null=True, blank=True)
|
|
email = models.TextField(db_column="Email", null=True, blank=True)
|
|
|
|
def __str__(self):
|
|
return f"{self.type} [{self.member if self.member else self.name}] {self.timestamp}"
|
|
|
|
class Meta:
|
|
db_table = "transactions"
|