from datetime import datetime from peewee import (BooleanField, FixedCharField, CompositeKey, DateField, DateTimeField, DecimalField, 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