from datetime import datetime from peewee import ( BooleanField, CompositeKey, DateField, DateTimeField, DecimalField, FixedCharField, ForeignKeyField, Model, MySQLDatabase, TextField, ) import passwords database = MySQLDatabase( **passwords.MEMBERSHIPWORKS_DB, **{"charset": "utf8", "sql_mode": "PIPES_AS_CONCAT", "use_unicode": True,} ) class BaseModel(Model): _csv_headers_override = {} _date_fields = {} def insert_instance(self): return self.insert(**self.__data__) def upsert_instance(self): return self.insert_instance().on_conflict( action="update", preserve=list(self._meta.fields.values()) ) def magic_save(self): if self._meta.primary_key is False: self.get_or_create(**self.__data__) else: self.upsert_instance().execute() @classmethod def _headers_map(cls): return {field.column_name: name for name, field in cls._meta.fields.items()} @classmethod def _remap_headers(cls, data): # print(data) hmap = cls._headers_map() hmap.update(cls._csv_headers_override) for k, v in data.items(): if k in hmap: yield hmap.get(k), v @classmethod def from_csv_dict(cls, data): data = data.copy() # parse date fields to datetime objects for field, fmt in cls._date_fields.items(): if data[field]: data[field] = datetime.strptime(str(data[field]), fmt) else: # convert empty string to None to make NULL in SQL data[field] = None return cls(**dict(cls._remap_headers(data))) class Meta: database = database class Label(BaseModel): label_id = FixedCharField(24, primary_key=True) label = TextField(null=True) class Meta: table_name = "labels" class Member(BaseModel): uid = FixedCharField(24, primary_key=True) year_of_birth = TextField(column_name="Year of Birth", null=True) account_name = TextField(column_name="Account Name", null=True) first_name = TextField(column_name="First Name", null=True) last_name = TextField(column_name="Last Name", null=True) phone = TextField(column_name="Phone", null=True) email = TextField(column_name="Email", null=True) address_street = TextField(column_name="Address (Street)", null=True) address_city = TextField(column_name="Address (City)", null=True) address_state_province = TextField( column_name="Address (State/Province)", null=True ) address_postal_code = TextField(column_name="Address (Postal Code)", null=True) address_country = TextField(column_name="Address (Country)", null=True) profile_description = TextField(column_name="Profile description", null=True) website = TextField(column_name="Website", null=True) fax = TextField(column_name="Fax", null=True) contact_person = TextField(column_name="Contact Person", null=True) password = TextField(column_name="Password", null=True) position_relation = TextField(column_name="Position/relation", null=True) parent_account_id = TextField(column_name="Parent Account ID", null=True) gift_membership_purchased_by = TextField( column_name="Gift Membership purchased by", null=True ) purchased_gift_membership_for = TextField( column_name="Purchased Gift Membership for", null=True ) closet_storage = TextField(column_name="Closet Storage #", null=True) storage_shelf = TextField(column_name="Storage Shelf #", null=True) personal_studio_space = TextField(column_name="Personal Studio Space #", null=True) access_permitted_shops_during_extended_hours = BooleanField( column_name="Access Permitted Shops During Extended Hours?", null=True ) access_front_door_and_studio_space_during_extended_hours = BooleanField( column_name="Access Front Door and Studio Space During Extended Hours?", null=True, ) access_wood_shop = BooleanField(column_name="Access Wood Shop?", null=True) access_metal_shop = BooleanField(column_name="Access Metal Shop?", null=True) access_storage_closet = BooleanField( column_name="Access Storage Closet?", null=True ) access_studio_space = BooleanField(column_name="Access Studio Space?", null=True) access_front_door = BooleanField(column_name="Access Front Door?", null=True) access_card_number = TextField(column_name="Access Card Number", null=True) access_card_facility_code = TextField( column_name="Access Card Facility Code", null=True ) auto_billing_id = TextField(column_name="Auto Billing ID", null=True) billing_method = TextField(column_name="Billing Method", null=True) renewal_date = DateField(column_name="Renewal Date", null=True) join_date = DateField(column_name="Join Date", null=True) admin_note = TextField(column_name="Admin note", null=True) profile_gallery_image_url = TextField( column_name="Profile gallery image URL", null=True ) business_card_image_url = TextField( column_name="Business card image URL", null=True ) instagram = TextField(column_name="Instagram", null=True) pinterest = TextField(column_name="Pinterest", null=True) youtube = TextField(column_name="Youtube", null=True) yelp = TextField(column_name="Yelp", null=True) google = TextField(column_name="Google+", null=True) bbb = TextField(column_name="BBB", null=True) twitter = TextField(column_name="Twitter", null=True) facebook = TextField(column_name="Facebook", null=True) linked_in = TextField(column_name="LinkedIn", null=True) do_not_show_street_address_in_profile = TextField( column_name="Do not show street address in profile", null=True ) do_not_list_in_directory = TextField( column_name="Do not list in directory", null=True ) how_did_you_hear = TextField(column_name="HowDidYouHear", null=True) authorize_charge = TextField(column_name="authorizeCharge", null=True) policy_agreement = TextField(column_name="policyAgreement", null=True) waiver_form_signed_and_on_file_date = DateField( column_name="Waiver form signed and on file date.", null=True ) membership_agreement_signed_and_on_file_date = DateField( column_name="Membership Agreement signed and on file date.", null=True ) ip_address = TextField(column_name="IP Address", null=True) audit_date = DateField(column_name="Audit Date", null=True) agreement_version = TextField(column_name="Agreement Version", null=True) paperwork_status = TextField(column_name="Paperwork status", null=True) membership_agreement_dated = BooleanField( column_name="Membership agreement dated", null=True ) membership_agreement_acknowledgement_page_filled_out = BooleanField( column_name="Membership Agreement Acknowledgement Page Filled Out", null=True ) membership_agreement_signed = BooleanField( column_name="Membership Agreement Signed", null=True ) liability_form_filled_out = BooleanField( column_name="Liability Form Filled Out", null=True ) _csv_headers_override = { "Account ID": "uid", "Please tell us how you heard about the Claremont MakerSpace and what tools or shops you are most excited to start using:": "how_did_you_hear", "Yes - I authorize TwinState MakerSpaces, Inc. to charge my credit card for the membership and other options that I have selected.": "authorize_charge", "I have read the Claremont MakerSpace Membership Agreement & Policies, and agree to all terms stated therein.": "policy_agreement", } _date_fields = { "Join Date": "%b %d, %Y", "Renewal Date": "%b %d, %Y", "Audit Date": "%m/%d/%Y", "Membership Agreement signed and on file date.": "%m/%d/%Y", "Waiver form signed and on file date.": "%m/%d/%Y", } class Meta: table_name = "members" class MemberLabel(BaseModel): uid = ForeignKeyField(Member, column_name="uid", backref="labels") label_id = ForeignKeyField(Label, backref="members") class Meta: table_name = "member_labels" primary_key = CompositeKey("label_id", "uid") class Transaction(BaseModel): sid = FixedCharField(27, null=True) uid = ForeignKeyField(Member, column_name="uid", backref="transactions", null=True) timestamp = DateTimeField() type = TextField(null=True) sum = DecimalField(13, 4, null=True) fee = DecimalField(13, 4, null=True) event_id = TextField(null=True) for_ = TextField(column_name="For", null=True) items = TextField(column_name="Items", null=True) discount_code = TextField(column_name="Discount Code", null=True) note = TextField(column_name="Note", null=True) name = TextField(column_name="Name", null=True) contact_person = TextField(column_name="Contact Person", null=True) full_address = TextField(column_name="Full Address", null=True) street = TextField(column_name="Street", null=True) city = TextField(column_name="City", null=True) state_province = TextField(column_name="State/Province", null=True) postal_code = TextField(column_name="Postal Code", null=True) country = TextField(column_name="Country", null=True) phone = TextField(column_name="Phone", null=True) email = TextField(column_name="Email", null=True) _csv_headers_override = {"_dp": "timestamp", "Transaction Type": "type"} @classmethod def from_csv_dict(cls, data): txn = data.copy() # can't use '%s' format string, have to use the special function txn["_dp"] = datetime.fromtimestamp(txn["_dp"]) return super().from_csv_dict(txn) class Meta: table_name = "transactions" primary_key = False