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.
Files changed (38) hide show
  1. otf_api/__init__.py +70 -0
  2. otf_api/__version__.py +1 -0
  3. otf_api/api.py +143 -0
  4. otf_api/classes_api.py +44 -0
  5. otf_api/member_api.py +380 -0
  6. otf_api/models/__init__.py +63 -0
  7. otf_api/models/auth.py +141 -0
  8. otf_api/models/base.py +7 -0
  9. otf_api/models/responses/__init__.py +60 -0
  10. otf_api/models/responses/bookings.py +130 -0
  11. otf_api/models/responses/challenge_tracker_content.py +38 -0
  12. otf_api/models/responses/challenge_tracker_detail.py +68 -0
  13. otf_api/models/responses/classes.py +57 -0
  14. otf_api/models/responses/enums.py +87 -0
  15. otf_api/models/responses/favorite_studios.py +106 -0
  16. otf_api/models/responses/latest_agreement.py +21 -0
  17. otf_api/models/responses/member_detail.py +134 -0
  18. otf_api/models/responses/member_membership.py +25 -0
  19. otf_api/models/responses/member_purchases.py +135 -0
  20. otf_api/models/responses/out_of_studio_workout_history.py +41 -0
  21. otf_api/models/responses/performance_summary_detail.py +77 -0
  22. otf_api/models/responses/performance_summary_list.py +67 -0
  23. otf_api/models/responses/studio_detail.py +111 -0
  24. otf_api/models/responses/studio_services.py +57 -0
  25. otf_api/models/responses/telemetry.py +53 -0
  26. otf_api/models/responses/telemetry_hr_history.py +34 -0
  27. otf_api/models/responses/telemetry_max_hr.py +13 -0
  28. otf_api/models/responses/total_classes.py +8 -0
  29. otf_api/models/responses/workouts.py +78 -0
  30. otf_api/performance_api.py +54 -0
  31. otf_api/py.typed +0 -0
  32. otf_api/studios_api.py +96 -0
  33. otf_api/telemetry_api.py +95 -0
  34. otf_api-0.2.0.dist-info/AUTHORS.md +9 -0
  35. otf_api-0.2.0.dist-info/LICENSE +21 -0
  36. otf_api-0.2.0.dist-info/METADATA +28 -0
  37. otf_api-0.2.0.dist-info/RECORD +38 -0
  38. 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]