otf-api 0.2.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- otf_api/__init__.py +70 -0
- otf_api/__version__.py +1 -0
- otf_api/api.py +143 -0
- otf_api/classes_api.py +44 -0
- otf_api/member_api.py +380 -0
- otf_api/models/__init__.py +63 -0
- otf_api/models/auth.py +141 -0
- otf_api/models/base.py +7 -0
- otf_api/models/responses/__init__.py +60 -0
- otf_api/models/responses/bookings.py +130 -0
- otf_api/models/responses/challenge_tracker_content.py +38 -0
- otf_api/models/responses/challenge_tracker_detail.py +68 -0
- otf_api/models/responses/classes.py +57 -0
- otf_api/models/responses/enums.py +87 -0
- otf_api/models/responses/favorite_studios.py +106 -0
- otf_api/models/responses/latest_agreement.py +21 -0
- otf_api/models/responses/member_detail.py +134 -0
- otf_api/models/responses/member_membership.py +25 -0
- otf_api/models/responses/member_purchases.py +135 -0
- otf_api/models/responses/out_of_studio_workout_history.py +41 -0
- otf_api/models/responses/performance_summary_detail.py +77 -0
- otf_api/models/responses/performance_summary_list.py +67 -0
- otf_api/models/responses/studio_detail.py +111 -0
- otf_api/models/responses/studio_services.py +57 -0
- otf_api/models/responses/telemetry.py +53 -0
- otf_api/models/responses/telemetry_hr_history.py +34 -0
- otf_api/models/responses/telemetry_max_hr.py +13 -0
- otf_api/models/responses/total_classes.py +8 -0
- otf_api/models/responses/workouts.py +78 -0
- otf_api/performance_api.py +54 -0
- otf_api/py.typed +0 -0
- otf_api/studios_api.py +96 -0
- otf_api/telemetry_api.py +95 -0
- otf_api-0.2.0.dist-info/AUTHORS.md +9 -0
- otf_api-0.2.0.dist-info/LICENSE +21 -0
- otf_api-0.2.0.dist-info/METADATA +28 -0
- otf_api-0.2.0.dist-info/RECORD +38 -0
- otf_api-0.2.0.dist-info/WHEEL +4 -0
@@ -0,0 +1,106 @@
|
|
1
|
+
from datetime import datetime
|
2
|
+
|
3
|
+
from pydantic import Field
|
4
|
+
|
5
|
+
from otf_api.models.base import OtfBaseModel
|
6
|
+
|
7
|
+
|
8
|
+
class Location(OtfBaseModel):
|
9
|
+
location_id: int = Field(..., alias="locationId")
|
10
|
+
location_uuid: str = Field(..., alias="locationUUId")
|
11
|
+
studio_id: int = Field(..., alias="studioId")
|
12
|
+
mbo_location_id: int = Field(..., alias="mboLocationId")
|
13
|
+
mbo_studio_id: int = Field(..., alias="mboStudioId")
|
14
|
+
latitude: float
|
15
|
+
longitude: float
|
16
|
+
address1: str
|
17
|
+
address2: str | None = None
|
18
|
+
city: str
|
19
|
+
state: str
|
20
|
+
phone: str
|
21
|
+
postal_code: str = Field(..., alias="postalCode")
|
22
|
+
|
23
|
+
|
24
|
+
class StudioLocation(OtfBaseModel):
|
25
|
+
bill_to_address: str = Field(..., alias="billToAddress")
|
26
|
+
bill_to_address2: str = Field(..., alias="billToAddress2")
|
27
|
+
bill_to_city: str = Field(..., alias="billToCity")
|
28
|
+
bill_to_state: str = Field(..., alias="billToState")
|
29
|
+
bill_to_postal_code: str = Field(..., alias="billToPostalCode")
|
30
|
+
bill_to_region: str = Field(..., alias="billToRegion")
|
31
|
+
bill_to_country_id: int = Field(..., alias="billToCountryId")
|
32
|
+
bill_to_country: str = Field(..., alias="billToCountry")
|
33
|
+
ship_to_address: str = Field(..., alias="shipToAddress")
|
34
|
+
ship_to_address2: str | None = Field(..., alias="shipToAddress2")
|
35
|
+
ship_to_city: str = Field(..., alias="shipToCity")
|
36
|
+
ship_to_state: str = Field(..., alias="shipToState")
|
37
|
+
ship_to_postal_code: str = Field(..., alias="shipToPostalCode")
|
38
|
+
ship_to_region: str = Field(..., alias="shipToRegion")
|
39
|
+
ship_to_country_id: int = Field(..., alias="shipToCountryId")
|
40
|
+
ship_to_country: str = Field(..., alias="shipToCountry")
|
41
|
+
physical_address: str = Field(..., alias="physicalAddress")
|
42
|
+
physical_address2: str | None = Field(..., alias="physicalAddress2")
|
43
|
+
physical_city: str = Field(..., alias="physicalCity")
|
44
|
+
physical_state: str = Field(..., alias="physicalState")
|
45
|
+
physical_postal_code: str = Field(..., alias="physicalPostalCode")
|
46
|
+
physical_region: str = Field(..., alias="physicalRegion")
|
47
|
+
physical_country_id: int = Field(..., alias="physicalCountryId")
|
48
|
+
physical_country: str = Field(..., alias="physicalCountry")
|
49
|
+
phone_number: str = Field(..., alias="phoneNumber")
|
50
|
+
latitude: str
|
51
|
+
longitude: str
|
52
|
+
|
53
|
+
|
54
|
+
class FavoriteStudio(OtfBaseModel):
|
55
|
+
studio_id: int = Field(..., alias="studioId")
|
56
|
+
studio_uuid: str = Field(..., alias="studioUUId")
|
57
|
+
mbo_studio_id: int = Field(..., alias="mboStudioId")
|
58
|
+
studio_name: str = Field(..., alias="studioName")
|
59
|
+
area_id: int | None = Field(..., alias="areaId")
|
60
|
+
market_id: int | None = Field(..., alias="marketId")
|
61
|
+
state_id: int | None = Field(..., alias="stateId")
|
62
|
+
studio_physical_location_id: int = Field(..., alias="studioPhysicalLocationId")
|
63
|
+
studio_number: str = Field(..., alias="studioNumber")
|
64
|
+
description: str | None = None
|
65
|
+
studio_version: str | None = Field(..., alias="studioVersion")
|
66
|
+
studio_token: str = Field(..., alias="studioToken")
|
67
|
+
studio_status: str = Field(..., alias="studioStatus")
|
68
|
+
open_date: datetime = Field(..., alias="openDate")
|
69
|
+
studio_type_id: int = Field(..., alias="studioTypeId")
|
70
|
+
pos_type_id: int | None = Field(..., alias="posTypeId")
|
71
|
+
logo_url: str | None = Field(..., alias="logoUrl")
|
72
|
+
page_color1: str | None = Field(..., alias="pageColor1")
|
73
|
+
page_color2: str | None = Field(..., alias="pageColor2")
|
74
|
+
page_color3: str | None = Field(..., alias="pageColor3")
|
75
|
+
page_color4: str | None = Field(..., alias="pageColor4")
|
76
|
+
accepts_visa_master_card: bool = Field(..., alias="acceptsVisaMasterCard")
|
77
|
+
accepts_american_express: bool = Field(..., alias="acceptsAmericanExpress")
|
78
|
+
accepts_discover: bool = Field(..., alias="acceptsDiscover")
|
79
|
+
accepts_ach: bool = Field(..., alias="acceptsACH")
|
80
|
+
sms_package_enabled: bool | None = Field(..., alias="smsPackageEnabled")
|
81
|
+
allows_dashboard_access: bool | None = Field(..., alias="allowsDashboardAccess")
|
82
|
+
pricing_level: str | None = Field(..., alias="pricingLevel")
|
83
|
+
contact_email: str = Field(..., alias="contactEmail")
|
84
|
+
time_zone: str = Field(..., alias="timeZone")
|
85
|
+
environment: str
|
86
|
+
allows_cr_waitlist: bool = Field(..., alias="allowsCRWaitlist")
|
87
|
+
cr_waitlist_flag_last_updated: datetime = Field(..., alias="crWaitlistFlagLastUpdated")
|
88
|
+
is_integrated: bool = Field(..., alias="isIntegrated")
|
89
|
+
created_by: str = Field(..., alias="createdBy")
|
90
|
+
created_date: datetime = Field(..., alias="createdDate")
|
91
|
+
updated_date: datetime = Field(..., alias="updatedDate")
|
92
|
+
is_deleted: bool = Field(..., alias="isDeleted")
|
93
|
+
locations: list[Location]
|
94
|
+
studio_location: StudioLocation = Field(..., alias="studioLocation")
|
95
|
+
|
96
|
+
|
97
|
+
class FavoriteStudioList(OtfBaseModel):
|
98
|
+
studios: list[FavoriteStudio]
|
99
|
+
|
100
|
+
@property
|
101
|
+
def studio_ids(self) -> list[int]:
|
102
|
+
return [studio.studio_id for studio in self.studios]
|
103
|
+
|
104
|
+
@property
|
105
|
+
def studio_uuids(self) -> list[str]:
|
106
|
+
return [studio.studio_uuid for studio in self.studios]
|
@@ -0,0 +1,21 @@
|
|
1
|
+
from datetime import datetime
|
2
|
+
|
3
|
+
from pydantic import Field
|
4
|
+
|
5
|
+
from otf_api.models.base import OtfBaseModel
|
6
|
+
|
7
|
+
|
8
|
+
class LatestAgreement(OtfBaseModel):
|
9
|
+
file_url: str = Field(..., alias="fileUrl")
|
10
|
+
agreement_id: int = Field(..., alias="agreementId")
|
11
|
+
agreement_uuid: str = Field(..., alias="agreementUUId")
|
12
|
+
agreement_datetime: datetime = Field(..., alias="agreementDatetime")
|
13
|
+
agreement_type_id: int = Field(..., alias="agreementTypeId")
|
14
|
+
platform: None
|
15
|
+
locale: str
|
16
|
+
version: str
|
17
|
+
created_by: str = Field(..., alias="createdBy")
|
18
|
+
created_date: datetime = Field(..., alias="createdDate")
|
19
|
+
updated_by: str = Field(..., alias="updatedBy")
|
20
|
+
updated_date: datetime = Field(..., alias="updatedDate")
|
21
|
+
is_deleted: bool = Field(..., alias="isDeleted")
|
@@ -0,0 +1,134 @@
|
|
1
|
+
from datetime import date, datetime
|
2
|
+
from typing import Any
|
3
|
+
|
4
|
+
from pydantic import Field
|
5
|
+
|
6
|
+
from otf_api.models.base import OtfBaseModel
|
7
|
+
|
8
|
+
|
9
|
+
class Address(OtfBaseModel):
|
10
|
+
member_address_uuid: str = Field(..., alias="memberAddressUUId")
|
11
|
+
memberaddress_uuid: str = Field(..., alias="memberaddressUUId")
|
12
|
+
type: str
|
13
|
+
address1: str
|
14
|
+
address2: str | None = None
|
15
|
+
suburb: str | None = None
|
16
|
+
territory: str
|
17
|
+
postal_code: str = Field(..., alias="postalCode")
|
18
|
+
country: str
|
19
|
+
|
20
|
+
|
21
|
+
class MemberCreditCard(OtfBaseModel):
|
22
|
+
name_on_card: str = Field(..., alias="nameOnCard")
|
23
|
+
cc_type: str = Field(..., alias="ccType")
|
24
|
+
cc_last4: str = Field(..., alias="ccLast4")
|
25
|
+
|
26
|
+
|
27
|
+
class PhysicalCountryDetails(OtfBaseModel):
|
28
|
+
country_code: str = Field(..., alias="countryCode")
|
29
|
+
description: str
|
30
|
+
|
31
|
+
|
32
|
+
class StudioLocation(OtfBaseModel):
|
33
|
+
physical_country_id: int = Field(..., alias="physicalCountryId")
|
34
|
+
physical_country_details: PhysicalCountryDetails = Field(..., alias="physicalCountryDetails")
|
35
|
+
|
36
|
+
|
37
|
+
class StudioPartner(OtfBaseModel):
|
38
|
+
studio_acs_id: str = Field(..., alias="studioAcsId")
|
39
|
+
|
40
|
+
|
41
|
+
class HomeStudio(OtfBaseModel):
|
42
|
+
studio_id: int = Field(..., alias="studioId")
|
43
|
+
studio_uuid: str = Field(..., alias="studioUUId")
|
44
|
+
studio_name: str = Field(..., alias="studioName")
|
45
|
+
studio_number: str = Field(..., alias="studioNumber")
|
46
|
+
mbo_studio_id: int = Field(..., alias="mboStudioId")
|
47
|
+
time_zone: str = Field(..., alias="timeZone")
|
48
|
+
is_integrated: bool = Field(..., alias="isIntegrated")
|
49
|
+
studio_status: str = Field(..., alias="studioStatus")
|
50
|
+
studio_location: StudioLocation = Field(..., alias="studioLocation")
|
51
|
+
studio_partner: StudioPartner = Field(..., alias="studioPartner")
|
52
|
+
|
53
|
+
|
54
|
+
class MemberProfile(OtfBaseModel):
|
55
|
+
member_profile_uuid: str = Field(..., alias="memberProfileUUId")
|
56
|
+
unit_of_measure: str = Field(..., alias="unitOfMeasure")
|
57
|
+
max_hr_type: str = Field(..., alias="maxHrType")
|
58
|
+
manual_max_hr: int = Field(..., alias="manualMaxHr")
|
59
|
+
formula_max_hr: int = Field(..., alias="formulaMaxHr")
|
60
|
+
automated_hr: int = Field(..., alias="automatedHr")
|
61
|
+
member_optin_flow_type_id: int = Field(..., alias="memberOptinFlowTypeId")
|
62
|
+
|
63
|
+
|
64
|
+
class MemberClassSummary(OtfBaseModel):
|
65
|
+
total_classes_booked: int = Field(..., alias="totalClassesBooked")
|
66
|
+
total_classes_attended: int = Field(..., alias="totalClassesAttended")
|
67
|
+
total_intro: int = Field(..., alias="totalIntro")
|
68
|
+
total_ot_live_classes_booked: int = Field(..., alias="totalOTLiveClassesBooked")
|
69
|
+
total_ot_live_classes_attended: int = Field(..., alias="totalOTLiveClassesAttended")
|
70
|
+
total_classes_used_hrm: int = Field(..., alias="totalClassesUsedHRM")
|
71
|
+
total_studios_visited: int = Field(..., alias="totalStudiosVisited")
|
72
|
+
first_visit_date: datetime = Field(..., alias="firstVisitDate")
|
73
|
+
last_class_visited_date: datetime = Field(..., alias="lastClassVisitedDate")
|
74
|
+
last_class_booked_date: datetime = Field(..., alias="lastClassBookedDate")
|
75
|
+
last_class_studio_visited: int = Field(..., alias="lastClassStudioVisited")
|
76
|
+
|
77
|
+
|
78
|
+
class MemberDetail(OtfBaseModel):
|
79
|
+
member_id: int = Field(..., alias="memberId")
|
80
|
+
member_uuid: str = Field(..., alias="memberUUId")
|
81
|
+
cognito_id: str = Field(..., alias="cognitoId")
|
82
|
+
home_studio_id: int = Field(..., alias="homeStudioId")
|
83
|
+
mbo_studio_id: int = Field(..., alias="mboStudioId")
|
84
|
+
mbo_id: str = Field(..., alias="mboId")
|
85
|
+
mbo_unique_id: int = Field(..., alias="mboUniqueId")
|
86
|
+
mbo_status: str = Field(..., alias="mboStatus")
|
87
|
+
user_name: str = Field(..., alias="userName")
|
88
|
+
first_name: str = Field(..., alias="firstName")
|
89
|
+
last_name: str = Field(..., alias="lastName")
|
90
|
+
email: str
|
91
|
+
profile_picture_url: None = Field(..., alias="profilePictureUrl")
|
92
|
+
alternate_emails: None = Field(..., alias="alternateEmails")
|
93
|
+
address_line1: None = Field(..., alias="addressLine1")
|
94
|
+
address_line2: None = Field(..., alias="addressLine2")
|
95
|
+
city: None
|
96
|
+
state: None
|
97
|
+
postal_code: None = Field(..., alias="postalCode")
|
98
|
+
phone_number: str = Field(..., alias="phoneNumber")
|
99
|
+
home_phone: str = Field(..., alias="homePhone")
|
100
|
+
work_phone: None = Field(..., alias="workPhone")
|
101
|
+
phone_type: None = Field(..., alias="phoneType")
|
102
|
+
birth_day: date | str = Field(..., alias="birthDay")
|
103
|
+
cc_last4: str = Field(..., alias="ccLast4")
|
104
|
+
cc_type: str = Field(..., alias="ccType")
|
105
|
+
gender: str
|
106
|
+
liability: None
|
107
|
+
locale: str
|
108
|
+
weight: int
|
109
|
+
weight_measure: str = Field(..., alias="weightMeasure")
|
110
|
+
height: int
|
111
|
+
height_measure: str = Field(..., alias="heightMeasure")
|
112
|
+
max_hr: int = Field(..., alias="maxHr")
|
113
|
+
intro_neccessary: bool = Field(..., alias="introNeccessary")
|
114
|
+
online_signup: None = Field(..., alias="onlineSignup")
|
115
|
+
year_imported: int = Field(..., alias="yearImported")
|
116
|
+
is_member_verified: bool = Field(..., alias="isMemberVerified")
|
117
|
+
lead_prospect: bool = Field(..., alias="leadProspect")
|
118
|
+
created_by: str = Field(..., alias="createdBy")
|
119
|
+
created_date: datetime = Field(..., alias="createdDate")
|
120
|
+
updated_by: str = Field(..., alias="updatedBy")
|
121
|
+
updated_date: datetime = Field(..., alias="updatedDate")
|
122
|
+
is_deleted: bool = Field(..., alias="isDeleted")
|
123
|
+
addresses: list[Address] | None = None
|
124
|
+
member_credit_card: MemberCreditCard | None = Field(None, alias="memberCreditCard")
|
125
|
+
home_studio: HomeStudio = Field(..., alias="homeStudio")
|
126
|
+
member_profile: MemberProfile = Field(..., alias="memberProfile")
|
127
|
+
member_referrer: None = Field(..., alias="memberReferrer")
|
128
|
+
otf_acs_id: str = Field(..., alias="otfAcsId")
|
129
|
+
member_class_summary: MemberClassSummary | None = Field(None, alias="memberClassSummary")
|
130
|
+
|
131
|
+
def __init__(self, **data: Any):
|
132
|
+
super().__init__(**data)
|
133
|
+
if self.birth_day and isinstance(self.birth_day, str):
|
134
|
+
self.birth_day = datetime.strptime(self.birth_day, "%Y-%m-%d").date() # noqa
|
@@ -0,0 +1,25 @@
|
|
1
|
+
from datetime import datetime
|
2
|
+
|
3
|
+
from pydantic import Field
|
4
|
+
|
5
|
+
from otf_api.models.base import OtfBaseModel
|
6
|
+
|
7
|
+
|
8
|
+
class MemberMembership(OtfBaseModel):
|
9
|
+
member_membership_id: int = Field(..., alias="memberMembershipId")
|
10
|
+
member_membership_uuid: str = Field(..., alias="memberMembershipUUId")
|
11
|
+
membership_id: int = Field(..., alias="membershipId")
|
12
|
+
member_id: int = Field(..., alias="memberId")
|
13
|
+
payment_date: datetime = Field(..., alias="paymentDate")
|
14
|
+
active_date: datetime = Field(..., alias="activeDate")
|
15
|
+
expiration_date: datetime = Field(..., alias="expirationDate")
|
16
|
+
mbo_description_id: str = Field(..., alias="mboDescriptionId")
|
17
|
+
current: bool
|
18
|
+
count: int
|
19
|
+
remaining: int
|
20
|
+
name: str
|
21
|
+
created_by: str = Field(..., alias="createdBy")
|
22
|
+
created_date: datetime = Field(..., alias="createdDate")
|
23
|
+
updated_by: str = Field(..., alias="updatedBy")
|
24
|
+
updated_date: datetime = Field(..., alias="updatedDate")
|
25
|
+
is_deleted: bool = Field(..., alias="isDeleted")
|
@@ -0,0 +1,135 @@
|
|
1
|
+
from datetime import datetime
|
2
|
+
|
3
|
+
from pydantic import Field
|
4
|
+
|
5
|
+
from otf_api.models.base import OtfBaseModel
|
6
|
+
|
7
|
+
|
8
|
+
class Location(OtfBaseModel):
|
9
|
+
phone: str
|
10
|
+
latitude: str
|
11
|
+
longitude: str
|
12
|
+
address1: str
|
13
|
+
address2: str | None = None
|
14
|
+
city: str
|
15
|
+
state: str
|
16
|
+
postal_code: str = Field(..., alias="postalCode")
|
17
|
+
|
18
|
+
|
19
|
+
class Currency(OtfBaseModel):
|
20
|
+
currency_alphabetic_code: str = Field(..., alias="currencyAlphabeticCode")
|
21
|
+
|
22
|
+
|
23
|
+
class DefaultCurrency(OtfBaseModel):
|
24
|
+
currency_id: int = Field(..., alias="currencyId")
|
25
|
+
currency: Currency
|
26
|
+
|
27
|
+
|
28
|
+
class Country(OtfBaseModel):
|
29
|
+
country_id: int = Field(..., alias="countryId")
|
30
|
+
country_code: str = Field(..., alias="countryCode")
|
31
|
+
description: str
|
32
|
+
country_currency_code: str = Field(..., alias="countryCurrencyCode")
|
33
|
+
default_currency: DefaultCurrency = Field(..., alias="defaultCurrency")
|
34
|
+
|
35
|
+
|
36
|
+
class StudioLocation(OtfBaseModel):
|
37
|
+
studio_location_id: int = Field(..., alias="studioLocationId")
|
38
|
+
bill_to_address: str = Field(..., alias="billToAddress")
|
39
|
+
bill_to_address2: str = Field(..., alias="billToAddress2")
|
40
|
+
bill_to_city: str = Field(..., alias="billToCity")
|
41
|
+
bill_to_state: str = Field(..., alias="billToState")
|
42
|
+
bill_to_postal_code: str = Field(..., alias="billToPostalCode")
|
43
|
+
bill_to_region: str = Field(..., alias="billToRegion")
|
44
|
+
bill_to_country_id: int = Field(..., alias="billToCountryId")
|
45
|
+
bill_to_country: str = Field(..., alias="billToCountry")
|
46
|
+
ship_to_address: str = Field(..., alias="shipToAddress")
|
47
|
+
ship_to_address2: None = Field(..., alias="shipToAddress2")
|
48
|
+
ship_to_city: str = Field(..., alias="shipToCity")
|
49
|
+
ship_to_state: str = Field(..., alias="shipToState")
|
50
|
+
ship_to_postal_code: str = Field(..., alias="shipToPostalCode")
|
51
|
+
ship_to_region: str = Field(..., alias="shipToRegion")
|
52
|
+
ship_to_country_id: int = Field(..., alias="shipToCountryId")
|
53
|
+
ship_to_country: str = Field(..., alias="shipToCountry")
|
54
|
+
physical_address: str = Field(..., alias="physicalAddress")
|
55
|
+
physical_address2: None = Field(..., alias="physicalAddress2")
|
56
|
+
physical_city: str = Field(..., alias="physicalCity")
|
57
|
+
physical_state: str = Field(..., alias="physicalState")
|
58
|
+
physical_postal_code: str = Field(..., alias="physicalPostalCode")
|
59
|
+
physical_region: str = Field(..., alias="physicalRegion")
|
60
|
+
physical_country_id: int = Field(..., alias="physicalCountryId")
|
61
|
+
physical_country: str = Field(..., alias="physicalCountry")
|
62
|
+
phone_number: str = Field(..., alias="phoneNumber")
|
63
|
+
latitude: str
|
64
|
+
longitude: str
|
65
|
+
country: Country
|
66
|
+
|
67
|
+
|
68
|
+
class Studio(OtfBaseModel):
|
69
|
+
studio_id: int = Field(..., alias="studioId")
|
70
|
+
studio_uuid: str = Field(..., alias="studioUUId")
|
71
|
+
mbo_studio_id: int = Field(..., alias="mboStudioId")
|
72
|
+
studio_name: str = Field(..., alias="studioName")
|
73
|
+
area_id: int = Field(..., alias="areaId")
|
74
|
+
market_id: int = Field(..., alias="marketId")
|
75
|
+
state_id: int = Field(..., alias="stateId")
|
76
|
+
studio_physical_location_id: int = Field(..., alias="studioPhysicalLocationId")
|
77
|
+
studio_number: str = Field(..., alias="studioNumber")
|
78
|
+
description: str
|
79
|
+
studio_version: str = Field(..., alias="studioVersion")
|
80
|
+
studio_token: str = Field(..., alias="studioToken")
|
81
|
+
studio_status: str = Field(..., alias="studioStatus")
|
82
|
+
open_date: datetime = Field(..., alias="openDate")
|
83
|
+
studio_type_id: int = Field(..., alias="studioTypeId")
|
84
|
+
pos_type_id: int = Field(..., alias="posTypeId")
|
85
|
+
tax_inclusive_pricing: bool = Field(..., alias="taxInclusivePricing")
|
86
|
+
tax_rate: str = Field(..., alias="taxRate")
|
87
|
+
logo_url: str = Field(..., alias="logoUrl")
|
88
|
+
page_color1: str = Field(..., alias="pageColor1")
|
89
|
+
page_color2: str = Field(..., alias="pageColor2")
|
90
|
+
page_color3: str = Field(..., alias="pageColor3")
|
91
|
+
page_color4: str = Field(..., alias="pageColor4")
|
92
|
+
accepts_visa_master_card: bool = Field(..., alias="acceptsVisaMasterCard")
|
93
|
+
accepts_american_express: bool = Field(..., alias="acceptsAmericanExpress")
|
94
|
+
accepts_discover: bool = Field(..., alias="acceptsDiscover")
|
95
|
+
accepts_ach: bool = Field(..., alias="acceptsACH")
|
96
|
+
sms_package_enabled: bool = Field(..., alias="smsPackageEnabled")
|
97
|
+
allows_dashboard_access: bool = Field(..., alias="allowsDashboardAccess")
|
98
|
+
pricing_level: str = Field(..., alias="pricingLevel")
|
99
|
+
contact_email: str = Field(..., alias="contactEmail")
|
100
|
+
royalty_rate: str = Field(..., alias="royaltyRate")
|
101
|
+
commission_percent: str = Field(..., alias="commissionPercent")
|
102
|
+
marketing_fund_rate: str = Field(..., alias="marketingFundRate")
|
103
|
+
time_zone: str = Field(..., alias="timeZone")
|
104
|
+
environment: str
|
105
|
+
allows_cr_waitlist: bool = Field(..., alias="allowsCRWaitlist")
|
106
|
+
cr_waitlist_flag_last_updated: datetime = Field(..., alias="crWaitlistFlagLastUpdated")
|
107
|
+
is_integrated: bool = Field(..., alias="isIntegrated")
|
108
|
+
locations: list[Location]
|
109
|
+
studio_location: StudioLocation = Field(..., alias="studioLocation")
|
110
|
+
|
111
|
+
|
112
|
+
class MemberPurchase(OtfBaseModel):
|
113
|
+
member_purchase_id: int = Field(..., alias="memberPurchaseId")
|
114
|
+
member_purchase_uuid: str = Field(..., alias="memberPurchaseUUId")
|
115
|
+
studio_id: int = Field(..., alias="studioId")
|
116
|
+
name: str
|
117
|
+
price: str
|
118
|
+
member_purchase_date_time: datetime = Field(..., alias="memberPurchaseDateTime")
|
119
|
+
member_purchase_type: str = Field(..., alias="memberPurchaseType")
|
120
|
+
status: str
|
121
|
+
member_service_id: int | None = Field(..., alias="memberServiceId")
|
122
|
+
member_membership_id: int | None = Field(..., alias="memberMembershipId")
|
123
|
+
member_fee_id: None = Field(..., alias="memberFeeId")
|
124
|
+
pos_contract_id: int | None = Field(..., alias="posContractId")
|
125
|
+
pos_product_id: int = Field(..., alias="posProductId")
|
126
|
+
pos_description_id: int | None = Field(..., alias="posDescriptionId")
|
127
|
+
pos_pmt_ref_no: int | None = Field(..., alias="posPmtRefNo")
|
128
|
+
pos_sale_id: int = Field(..., alias="posSaleId")
|
129
|
+
quantity: int
|
130
|
+
member_id: int = Field(..., alias="memberId")
|
131
|
+
studio: Studio
|
132
|
+
|
133
|
+
|
134
|
+
class MemberPurchaseList(OtfBaseModel):
|
135
|
+
data: list[MemberPurchase]
|
@@ -0,0 +1,41 @@
|
|
1
|
+
from datetime import datetime
|
2
|
+
|
3
|
+
from pydantic import Field
|
4
|
+
|
5
|
+
from otf_api.models.base import OtfBaseModel
|
6
|
+
|
7
|
+
|
8
|
+
class WorkoutType(OtfBaseModel):
|
9
|
+
id: int
|
10
|
+
display_name: str = Field(..., alias="displayName")
|
11
|
+
icon: str
|
12
|
+
|
13
|
+
|
14
|
+
class OutOfStudioWorkoutHistory(OtfBaseModel):
|
15
|
+
workout_date: datetime = Field(..., alias="workoutDate")
|
16
|
+
start_time: datetime = Field(..., alias="startTime")
|
17
|
+
end_time: datetime = Field(..., alias="endTime")
|
18
|
+
duration_unit: str = Field(..., alias="durationUnit")
|
19
|
+
duration: float
|
20
|
+
total_calories: int = Field(..., alias="totalCalories")
|
21
|
+
hr_percent_max: int = Field(..., alias="hrPercentMax")
|
22
|
+
distance_unit: str = Field(..., alias="distanceUnit")
|
23
|
+
total_distance: float = Field(..., alias="totalDistance")
|
24
|
+
splat_points: int = Field(..., alias="splatPoints")
|
25
|
+
target_heart_rate: int = Field(..., alias="targetHeartRate")
|
26
|
+
red_zone_seconds: int = Field(..., alias="redZoneSeconds")
|
27
|
+
orange_zone_seconds: int = Field(..., alias="orangeZoneSeconds")
|
28
|
+
green_zone_seconds: int = Field(..., alias="greenZoneSeconds")
|
29
|
+
blue_zone_seconds: int = Field(..., alias="blueZoneSeconds")
|
30
|
+
grey_zone_seconds: int = Field(..., alias="greyZoneSeconds")
|
31
|
+
total_steps: int = Field(..., alias="totalSteps")
|
32
|
+
has_detailed_data: bool = Field(..., alias="hasDetailedData")
|
33
|
+
workout_type: WorkoutType = Field(..., alias="workoutType")
|
34
|
+
member_uuid: str = Field(..., alias="memberUUId")
|
35
|
+
workout_uuid: str = Field(..., alias="workoutUUId")
|
36
|
+
avg_heartrate: int = Field(..., alias="avgHeartrate")
|
37
|
+
max_heartrate: int = Field(..., alias="maxHeartrate")
|
38
|
+
|
39
|
+
|
40
|
+
class OutOfStudioWorkoutHistoryList(OtfBaseModel):
|
41
|
+
data: list[OutOfStudioWorkoutHistory]
|
@@ -0,0 +1,77 @@
|
|
1
|
+
from pydantic import BaseModel, Field
|
2
|
+
|
3
|
+
|
4
|
+
class ZoneTimeMinutes(BaseModel):
|
5
|
+
gray: int
|
6
|
+
blue: int
|
7
|
+
green: int
|
8
|
+
orange: int
|
9
|
+
red: int
|
10
|
+
|
11
|
+
|
12
|
+
class HeartRate(BaseModel):
|
13
|
+
max_hr: int
|
14
|
+
peak_hr: int
|
15
|
+
peak_hr_percent: int
|
16
|
+
avg_hr: int
|
17
|
+
avg_hr_percent: int
|
18
|
+
|
19
|
+
|
20
|
+
class PerformanceMetricFloat(BaseModel):
|
21
|
+
display_value: float
|
22
|
+
display_unit: str
|
23
|
+
metric_value: float
|
24
|
+
|
25
|
+
|
26
|
+
class PerformanceMetricString(BaseModel):
|
27
|
+
display_value: str
|
28
|
+
display_unit: str
|
29
|
+
metric_value: str
|
30
|
+
|
31
|
+
|
32
|
+
class BaseEquipment(BaseModel):
|
33
|
+
avg_pace: PerformanceMetricString
|
34
|
+
avg_speed: PerformanceMetricFloat
|
35
|
+
max_pace: PerformanceMetricString
|
36
|
+
max_speed: PerformanceMetricFloat
|
37
|
+
moving_time: PerformanceMetricString
|
38
|
+
total_distance: PerformanceMetricFloat
|
39
|
+
|
40
|
+
|
41
|
+
class Treadmill(BaseEquipment):
|
42
|
+
avg_incline: PerformanceMetricFloat
|
43
|
+
elevation_gained: PerformanceMetricFloat
|
44
|
+
max_incline: PerformanceMetricFloat
|
45
|
+
|
46
|
+
|
47
|
+
class Rower(BaseEquipment):
|
48
|
+
avg_cadence: PerformanceMetricFloat
|
49
|
+
avg_power: PerformanceMetricFloat
|
50
|
+
max_cadence: PerformanceMetricFloat
|
51
|
+
|
52
|
+
|
53
|
+
class EquipmentData(BaseModel):
|
54
|
+
treadmill: Treadmill
|
55
|
+
rower: Rower
|
56
|
+
|
57
|
+
|
58
|
+
class Details(BaseModel):
|
59
|
+
calories_burned: int
|
60
|
+
splat_points: int
|
61
|
+
step_count: int
|
62
|
+
active_time_seconds: int
|
63
|
+
zone_time_minutes: ZoneTimeMinutes
|
64
|
+
heart_rate: HeartRate
|
65
|
+
equipment_data: EquipmentData
|
66
|
+
|
67
|
+
|
68
|
+
class Class(BaseModel):
|
69
|
+
starts_at_local: str
|
70
|
+
name: str
|
71
|
+
|
72
|
+
|
73
|
+
class PerformanceSummaryDetail(BaseModel):
|
74
|
+
id: str
|
75
|
+
details: Details
|
76
|
+
ratable: bool
|
77
|
+
class_: Class = Field(..., alias="class")
|
@@ -0,0 +1,67 @@
|
|
1
|
+
from pydantic import Field
|
2
|
+
|
3
|
+
from otf_api.models.base import OtfBaseModel
|
4
|
+
|
5
|
+
|
6
|
+
class ZoneTimeMinutes(OtfBaseModel):
|
7
|
+
gray: int
|
8
|
+
blue: int
|
9
|
+
green: int
|
10
|
+
orange: int
|
11
|
+
red: int
|
12
|
+
|
13
|
+
|
14
|
+
class Details(OtfBaseModel):
|
15
|
+
calories_burned: int
|
16
|
+
splat_points: int
|
17
|
+
step_count: int
|
18
|
+
active_time_seconds: int
|
19
|
+
zone_time_minutes: ZoneTimeMinutes
|
20
|
+
|
21
|
+
|
22
|
+
class Coach(OtfBaseModel):
|
23
|
+
image_url: str | None = None
|
24
|
+
first_name: str
|
25
|
+
|
26
|
+
|
27
|
+
class Studio(OtfBaseModel):
|
28
|
+
id: str
|
29
|
+
license_number: str
|
30
|
+
name: str
|
31
|
+
|
32
|
+
|
33
|
+
class Class(OtfBaseModel):
|
34
|
+
ot_base_class_uuid: str | None = None
|
35
|
+
starts_at_local: str
|
36
|
+
name: str
|
37
|
+
coach: Coach
|
38
|
+
studio: Studio
|
39
|
+
|
40
|
+
|
41
|
+
class CoachRating(OtfBaseModel):
|
42
|
+
id: str
|
43
|
+
description: str
|
44
|
+
value: int
|
45
|
+
|
46
|
+
|
47
|
+
class ClassRating(OtfBaseModel):
|
48
|
+
id: str
|
49
|
+
description: str
|
50
|
+
value: int
|
51
|
+
|
52
|
+
|
53
|
+
class Ratings(OtfBaseModel):
|
54
|
+
coach: CoachRating
|
55
|
+
class_: ClassRating = Field(..., alias="class")
|
56
|
+
|
57
|
+
|
58
|
+
class PerformanceSummaryEntry(OtfBaseModel):
|
59
|
+
performance_summary_id: str = Field(..., alias="id")
|
60
|
+
details: Details
|
61
|
+
ratable: bool
|
62
|
+
class_: Class = Field(..., alias="class")
|
63
|
+
ratings: Ratings | None = None
|
64
|
+
|
65
|
+
|
66
|
+
class PerformanceSummaryList(OtfBaseModel):
|
67
|
+
summaries: list[PerformanceSummaryEntry]
|