otf-api 0.2.2__py3-none-any.whl → 0.3.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 (49) hide show
  1. otf_api/__init__.py +12 -67
  2. otf_api/api.py +794 -36
  3. otf_api/cli/__init__.py +4 -0
  4. otf_api/cli/_utilities.py +60 -0
  5. otf_api/cli/app.py +177 -0
  6. otf_api/cli/bookings.py +231 -0
  7. otf_api/cli/prompts.py +162 -0
  8. otf_api/models/__init__.py +4 -8
  9. otf_api/models/auth.py +18 -12
  10. otf_api/models/base.py +205 -2
  11. otf_api/models/responses/__init__.py +6 -14
  12. otf_api/models/responses/body_composition_list.py +304 -0
  13. otf_api/models/responses/book_class.py +405 -0
  14. otf_api/models/responses/bookings.py +211 -37
  15. otf_api/models/responses/cancel_booking.py +93 -0
  16. otf_api/models/responses/challenge_tracker_content.py +6 -6
  17. otf_api/models/responses/challenge_tracker_detail.py +6 -6
  18. otf_api/models/responses/classes.py +205 -7
  19. otf_api/models/responses/enums.py +0 -35
  20. otf_api/models/responses/favorite_studios.py +5 -5
  21. otf_api/models/responses/latest_agreement.py +2 -2
  22. otf_api/models/responses/lifetime_stats.py +92 -0
  23. otf_api/models/responses/member_detail.py +17 -12
  24. otf_api/models/responses/member_membership.py +2 -2
  25. otf_api/models/responses/member_purchases.py +9 -9
  26. otf_api/models/responses/out_of_studio_workout_history.py +4 -4
  27. otf_api/models/responses/performance_summary_detail.py +1 -1
  28. otf_api/models/responses/performance_summary_list.py +13 -13
  29. otf_api/models/responses/studio_detail.py +10 -10
  30. otf_api/models/responses/studio_services.py +8 -8
  31. otf_api/models/responses/telemetry.py +6 -6
  32. otf_api/models/responses/telemetry_hr_history.py +6 -6
  33. otf_api/models/responses/telemetry_max_hr.py +3 -3
  34. otf_api/models/responses/total_classes.py +2 -2
  35. otf_api/models/responses/workouts.py +4 -4
  36. otf_api-0.3.0.dist-info/METADATA +55 -0
  37. otf_api-0.3.0.dist-info/RECORD +42 -0
  38. otf_api-0.3.0.dist-info/entry_points.txt +3 -0
  39. otf_api/__version__.py +0 -1
  40. otf_api/classes_api.py +0 -44
  41. otf_api/member_api.py +0 -380
  42. otf_api/performance_api.py +0 -54
  43. otf_api/studios_api.py +0 -96
  44. otf_api/telemetry_api.py +0 -95
  45. otf_api-0.2.2.dist-info/METADATA +0 -284
  46. otf_api-0.2.2.dist-info/RECORD +0 -38
  47. {otf_api-0.2.2.dist-info → otf_api-0.3.0.dist-info}/AUTHORS.md +0 -0
  48. {otf_api-0.2.2.dist-info → otf_api-0.3.0.dist-info}/LICENSE +0 -0
  49. {otf_api-0.2.2.dist-info → otf_api-0.3.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,405 @@
1
+ from datetime import datetime
2
+ from typing import Any
3
+
4
+ from pydantic import BaseModel, Field
5
+
6
+
7
+ class MemberProfile(BaseModel):
8
+ is_latest_agreement_signed: bool = Field(..., alias="isLatestAgreementSigned")
9
+
10
+
11
+ class StudioProfiles(BaseModel):
12
+ studio_id: int = Field(..., alias="studioId")
13
+ is_franchise_agreement_enabled: int = Field(..., alias="isFranchiseAgreementEnabled")
14
+
15
+
16
+ class HomeStudio(BaseModel):
17
+ studio_uuid: str = Field(..., alias="studioUUId")
18
+ studio_name: str = Field(..., alias="studioName")
19
+ description: str
20
+ contact_email: str = Field(..., alias="contactEmail")
21
+ status: str
22
+ logo_url: str = Field(..., alias="logoUrl")
23
+ time_zone: str = Field(..., alias="timeZone")
24
+ mbo_studio_id: int = Field(..., alias="mboStudioId")
25
+ studio_id: int = Field(..., alias="studioId")
26
+ allows_cr_waitlist: bool = Field(..., alias="allowsCRWaitlist")
27
+ cr_waitlist_flag_last_updated: datetime = Field(..., alias="crWaitlistFlagLastUpdated")
28
+ studio_profiles: StudioProfiles = Field(..., alias="studioProfiles")
29
+
30
+
31
+ class MemberService(BaseModel):
32
+ member_service_id: int = Field(..., alias="memberServiceId")
33
+ member_service_uuid: str = Field(..., alias="memberServiceUUId")
34
+ service_name: str = Field(..., alias="serviceName")
35
+ studio_id: int = Field(..., alias="studioId")
36
+ mbo_client_service_id: int = Field(..., alias="mboClientServiceId")
37
+ current: bool
38
+ member_id: int = Field(..., alias="memberId")
39
+ service_id: int = Field(..., alias="serviceId")
40
+ remaining: int
41
+ count: int
42
+ payment_date: datetime = Field(..., alias="paymentDate")
43
+ expiration_date: datetime = Field(..., alias="expirationDate")
44
+ active_date: datetime = Field(..., alias="activeDate")
45
+ created_by: str | None = Field(None, alias="createdBy")
46
+ created_date: datetime | None = Field(None, alias="createdDate")
47
+ updated_by: str | None = Field(None, alias="updatedBy")
48
+ updated_date: datetime | None = Field(None, alias="updatedDate")
49
+ is_deleted: bool = Field(..., alias="isDeleted")
50
+
51
+
52
+ class ServiceItem(BaseModel):
53
+ service_id: int = Field(..., alias="serviceId")
54
+ name: str
55
+ member_service: MemberService = Field(..., alias="MemberService")
56
+
57
+
58
+ class Member(BaseModel):
59
+ member_id: int = Field(..., alias="memberId")
60
+ member_uuid: str = Field(..., alias="memberUUId")
61
+ cognito_id: str = Field(..., alias="cognitoId")
62
+ home_studio_id: int = Field(..., alias="homeStudioId")
63
+ mbo_studio_id: int = Field(..., alias="mboStudioId")
64
+ mbo_id: str = Field(..., alias="mboId")
65
+ mbo_unique_id: int = Field(..., alias="mboUniqueId")
66
+ mbo_status: str = Field(..., alias="mboStatus")
67
+ user_name: str = Field(..., alias="userName")
68
+ first_name: str = Field(..., alias="firstName")
69
+ last_name: str = Field(..., alias="lastName")
70
+ email: str
71
+ profile_picture_url: None = Field(..., alias="profilePictureUrl")
72
+ alternate_emails: None = Field(..., alias="alternateEmails")
73
+ address_line1: None = Field(..., alias="addressLine1")
74
+ address_line2: None = Field(..., alias="addressLine2")
75
+ city: None
76
+ state: None
77
+ postal_code: None = Field(..., alias="postalCode")
78
+ phone_number: str = Field(..., alias="phoneNumber")
79
+ home_phone: str = Field(..., alias="homePhone")
80
+ work_phone: None = Field(..., alias="workPhone")
81
+ phone_type: None = Field(..., alias="phoneType")
82
+ birth_day: str = Field(..., alias="birthDay")
83
+ cc_last4: str = Field(..., alias="ccLast4")
84
+ cc_type: str = Field(..., alias="ccType")
85
+ gender: str
86
+ liability: None
87
+ locale: str
88
+ weight: int
89
+ weight_measure: str = Field(..., alias="weightMeasure")
90
+ height: int
91
+ height_measure: str = Field(..., alias="heightMeasure")
92
+ max_hr: int = Field(..., alias="maxHr")
93
+ intro_neccessary: bool = Field(..., alias="introNeccessary")
94
+ online_signup: None = Field(..., alias="onlineSignup")
95
+ year_imported: int = Field(..., alias="yearImported")
96
+ is_member_verified: bool = Field(..., alias="isMemberVerified")
97
+ lead_prospect: bool = Field(..., alias="leadProspect")
98
+ created_by: str | None = Field(None, alias="createdBy")
99
+ created_date: datetime | None = Field(None, alias="createdDate")
100
+ updated_by: str | None = Field(None, alias="updatedBy")
101
+ updated_date: datetime | None = Field(None, alias="updatedDate")
102
+ is_deleted: bool = Field(..., alias="isDeleted")
103
+ member_profile: MemberProfile = Field(..., alias="memberProfile")
104
+ home_studio: HomeStudio = Field(..., alias="homeStudio")
105
+ membership: None
106
+ service: list[ServiceItem]
107
+ notes: str
108
+
109
+
110
+ class Studio(BaseModel):
111
+ studio_uuid: str = Field(..., alias="studioUUId")
112
+ studio_name: str = Field(..., alias="studioName")
113
+ description: str
114
+ contact_email: str = Field(..., alias="contactEmail")
115
+ status: str
116
+ logo_url: str = Field(..., alias="logoUrl")
117
+ time_zone: str = Field(..., alias="timeZone")
118
+ mbo_studio_id: int = Field(..., alias="mboStudioId")
119
+ studio_id: int = Field(..., alias="studioId")
120
+ allows_cr_waitlist: bool = Field(..., alias="allowsCRWaitlist")
121
+ cr_waitlist_flag_last_updated: datetime = Field(..., alias="crWaitlistFlagLastUpdated")
122
+
123
+
124
+ class Location(BaseModel):
125
+ location_id: int = Field(..., alias="locationId")
126
+ location_uuid: str = Field(..., alias="locationUUId")
127
+
128
+
129
+ class Coach(BaseModel):
130
+ coach_uuid: str = Field(..., alias="coachUUId")
131
+ first_name: str = Field(..., alias="firstName")
132
+ last_name: str = Field(..., alias="lastName")
133
+ mbo_coach_id: int = Field(..., alias="mboCoachId")
134
+ name: str
135
+
136
+
137
+ class Class(BaseModel):
138
+ class_id: int = Field(..., alias="classId")
139
+ class_uuid: str = Field(..., alias="classUUId")
140
+ mbo_studio_id: int = Field(..., alias="mboStudioId")
141
+ mbo_class_id: int = Field(..., alias="mboClassId")
142
+ mbo_class_schedule_id: int = Field(..., alias="mboClassScheduleId")
143
+ mbo_program_id: int = Field(..., alias="mboProgramId")
144
+ studio_id: int = Field(..., alias="studioId")
145
+ coach_id: int = Field(..., alias="coachId")
146
+ location_id: int = Field(..., alias="locationId")
147
+ name: str
148
+ description: str
149
+ program_name: str = Field(..., alias="programName")
150
+ program_schedule_type: str = Field(..., alias="programScheduleType")
151
+ program_cancel_offset: int = Field(..., alias="programCancelOffset")
152
+ max_capacity: int = Field(..., alias="maxCapacity")
153
+ total_booked: int = Field(..., alias="totalBooked")
154
+ web_capacity: int = Field(..., alias="webCapacity")
155
+ web_booked: int = Field(..., alias="webBooked")
156
+ total_booked_waitlist: int = Field(..., alias="totalBookedWaitlist")
157
+ start_date_time: datetime = Field(..., alias="startDateTime")
158
+ end_date_time: datetime = Field(..., alias="endDateTime")
159
+ is_cancelled: bool = Field(..., alias="isCancelled")
160
+ substitute: bool
161
+ is_active: bool = Field(..., alias="isActive")
162
+ is_waitlist_available: bool = Field(..., alias="isWaitlistAvailable")
163
+ is_enrolled: bool = Field(..., alias="isEnrolled")
164
+ is_hide_cancel: bool = Field(..., alias="isHideCancel")
165
+ is_available: bool = Field(..., alias="isAvailable")
166
+ room_number: int = Field(..., alias="roomNumber")
167
+ created_by: str | None = Field(None, alias="createdBy")
168
+ created_date: datetime | None = Field(None, alias="createdDate")
169
+ updated_by: str | None = Field(None, alias="updatedBy")
170
+ updated_date: datetime | None = Field(None, alias="updatedDate")
171
+ is_deleted: bool = Field(..., alias="isDeleted")
172
+ studio: Studio
173
+ location: Location
174
+ coach: Coach
175
+ attributes: dict[str, Any]
176
+
177
+
178
+ class Class1(BaseModel):
179
+ mbo_studio_id: int = Field(..., alias="mboStudioId")
180
+ studio_uuid: str = Field(..., alias="studioUUId")
181
+
182
+
183
+ class CustomData(BaseModel):
184
+ otf_class: Class1 = Field(..., alias="class")
185
+
186
+
187
+ class SavedBooking(BaseModel):
188
+ class_booking_id: int = Field(..., alias="classBookingId")
189
+ class_booking_uuid: str = Field(..., alias="classBookingUUId")
190
+ studio_id: int = Field(..., alias="studioId")
191
+ class_id: int = Field(..., alias="classId")
192
+ is_intro: bool = Field(..., alias="isIntro")
193
+ member_id: int = Field(..., alias="memberId")
194
+ mbo_member_id: str = Field(..., alias="mboMemberId")
195
+ mbo_class_id: int = Field(..., alias="mboClassId")
196
+ mbo_visit_id: None = Field(..., alias="mboVisitId")
197
+ mbo_waitlist_entry_id: None = Field(..., alias="mboWaitlistEntryId")
198
+ mbo_sync_message: None = Field(..., alias="mboSyncMessage")
199
+ status: str
200
+ booked_date: datetime = Field(..., alias="bookedDate")
201
+ checked_in_date: None = Field(..., alias="checkedInDate")
202
+ cancelled_date: None = Field(..., alias="cancelledDate")
203
+ created_by: str | None = Field(None, alias="createdBy")
204
+ created_date: datetime | None = Field(None, alias="createdDate")
205
+ updated_by: str | None = Field(None, alias="updatedBy")
206
+ updated_date: datetime | None = Field(None, alias="updatedDate")
207
+ is_deleted: bool = Field(..., alias="isDeleted")
208
+ member: Member
209
+ otf_class: Class = Field(..., alias="class")
210
+ custom_data: CustomData = Field(..., alias="customData")
211
+ attributes: dict[str, Any]
212
+
213
+
214
+ class FieldModel(BaseModel):
215
+ xsi_nil: str = Field(..., alias="xsiNil")
216
+
217
+
218
+ class FacilitySquareFeet(BaseModel):
219
+ field_: FieldModel
220
+
221
+
222
+ class TreatmentRooms(BaseModel):
223
+ field_: FieldModel
224
+
225
+
226
+ class Location1(BaseModel):
227
+ site_id: str | Any = Field(..., alias="siteId")
228
+ business_description: str | Any = Field(..., alias="businessDescription")
229
+ additional_image_ur_ls: str | Any = Field(..., alias="additionalImageUrLs")
230
+ facility_square_feet: FacilitySquareFeet | Any = Field(..., alias="facilitySquareFeet")
231
+ treatment_rooms: TreatmentRooms | Any = Field(..., alias="treatmentRooms")
232
+ has_classes: str = Field(..., alias="hasClasses")
233
+ id: str
234
+ name: str
235
+ address: str
236
+ address2: str
237
+ tax1: str
238
+ tax2: str
239
+ tax3: str
240
+ tax4: str
241
+ tax5: str
242
+ phone: str
243
+ city: str
244
+ state_prov_code: str = Field(..., alias="stateProvCode")
245
+ postal_code: str = Field(..., alias="postalCode")
246
+ latitude: str
247
+ longitude: str
248
+
249
+
250
+ class MaxCapacity(BaseModel):
251
+ field_: FieldModel | Any
252
+
253
+
254
+ class WebCapacity(BaseModel):
255
+ field_: FieldModel | Any
256
+
257
+
258
+ class TotalBookedWaitlist(BaseModel):
259
+ field_: FieldModel | Any
260
+
261
+
262
+ class WebBooked(BaseModel):
263
+ field_: FieldModel | Any
264
+
265
+
266
+ class SemesterId(BaseModel):
267
+ field_: FieldModel | Any
268
+
269
+
270
+ class Program(BaseModel):
271
+ id: str
272
+ name: str
273
+ schedule_type: str = Field(..., alias="scheduleType")
274
+ cancel_offset: str = Field(..., alias="cancelOffset")
275
+
276
+
277
+ class DefaultTimeLength(BaseModel):
278
+ field_: FieldModel
279
+
280
+
281
+ class SessionType(BaseModel):
282
+ default_time_length: DefaultTimeLength = Field(..., alias="defaultTimeLength")
283
+ program_id: str = Field(..., alias="programId")
284
+ num_deducted: str = Field(..., alias="numDeducted")
285
+ id: str
286
+ name: str
287
+ site_id: str = Field(..., alias="siteId")
288
+ cross_regional_booking_performed: str = Field(..., alias="crossRegionalBookingPerformed")
289
+ available_for_add_on: str = Field(..., alias="availableForAddOn")
290
+
291
+
292
+ class ClassDescription(BaseModel):
293
+ id: str
294
+ name: str
295
+ description: str
296
+ prereq: str
297
+ notes: str
298
+ last_updated: datetime = Field(..., alias="lastUpdated")
299
+ program: Program
300
+ session_type: SessionType = Field(..., alias="sessionType")
301
+
302
+
303
+ class Staff(BaseModel):
304
+ email: str
305
+ mobile_phone: str = Field(..., alias="mobilePhone")
306
+ state: str
307
+ country: str
308
+ sort_order: str = Field(..., alias="sortOrder")
309
+ appointment_trn: str = Field(..., alias="appointmentTrn")
310
+ reservation_trn: str = Field(..., alias="reservationTrn")
311
+ independent_contractor: str = Field(..., alias="independentContractor")
312
+ always_allow_double_booking: str = Field(..., alias="alwaysAllowDoubleBooking")
313
+ id: str
314
+ name: str
315
+ first_name: str = Field(..., alias="firstName")
316
+ last_name: str = Field(..., alias="lastName")
317
+ bio: str
318
+ is_male: str = Field(..., alias="isMale")
319
+
320
+
321
+ class AgreementDate(BaseModel):
322
+ field_: FieldModel
323
+
324
+
325
+ class ReleasedBy(BaseModel):
326
+ field_: FieldModel
327
+
328
+
329
+ class Liability(BaseModel):
330
+ is_released: str = Field(..., alias="isReleased")
331
+ agreement_date: AgreementDate = Field(..., alias="agreementDate")
332
+ released_by: ReleasedBy = Field(..., alias="releasedBy")
333
+
334
+
335
+ class FirstAppointmentDate(BaseModel):
336
+ field_: FieldModel
337
+
338
+
339
+ class Client(BaseModel):
340
+ notes: str
341
+ mobile_provider: str = Field(..., alias="mobileProvider")
342
+ appointment_gender_preference: str = Field(..., alias="appointmentGenderPreference")
343
+ is_company: str = Field(..., alias="isCompany")
344
+ liability_release: str = Field(..., alias="liabilityRelease")
345
+ promotional_email_opt_in: str = Field(..., alias="promotionalEmailOptIn")
346
+ creation_date: datetime = Field(..., alias="creationDate")
347
+ liability: Liability
348
+ unique_id: str = Field(..., alias="uniqueId")
349
+ action: str
350
+ id: str
351
+ first_name: str = Field(..., alias="firstName")
352
+ last_name: str = Field(..., alias="lastName")
353
+ email: str
354
+ email_opt_in: str = Field(..., alias="emailOptIn")
355
+ address_line1: str = Field(..., alias="addressLine1")
356
+ address_line2: str = Field(..., alias="addressLine2")
357
+ city: str
358
+ state: str
359
+ postal_code: str = Field(..., alias="postalCode")
360
+ country: str
361
+ mobile_phone: str = Field(..., alias="mobilePhone")
362
+ home_phone: str = Field(..., alias="homePhone")
363
+ birth_date: datetime = Field(..., alias="birthDate")
364
+ first_appointment_date: FirstAppointmentDate = Field(..., alias="firstAppointmentDate")
365
+ referred_by: str = Field(..., alias="referredBy")
366
+ red_alert: str = Field(..., alias="redAlert")
367
+ is_prospect: str = Field(..., alias="isProspect")
368
+ contact_method: str = Field(..., alias="contactMethod")
369
+ member_uuid: str = Field(..., alias="memberUUId")
370
+
371
+
372
+ class MboClass(BaseModel):
373
+ class_schedule_id: str = Field(..., alias="classScheduleId")
374
+ location: Location1
375
+ max_capacity: MaxCapacity = Field(..., alias="maxCapacity")
376
+ web_capacity: WebCapacity = Field(..., alias="webCapacity")
377
+ total_booked: None = Field(..., alias="totalBooked")
378
+ total_booked_waitlist: TotalBookedWaitlist = Field(..., alias="totalBookedWaitlist")
379
+ web_booked: WebBooked = Field(..., alias="webBooked")
380
+ semester_id: SemesterId = Field(..., alias="semesterId")
381
+ is_canceled: str = Field(..., alias="isCanceled")
382
+ substitute: str
383
+ active: str
384
+ is_waitlist_available: str = Field(..., alias="isWaitlistAvailable")
385
+ is_enrolled: str = Field(..., alias="isEnrolled")
386
+ hide_cancel: str = Field(..., alias="hideCancel")
387
+ id: str
388
+ is_available: str = Field(..., alias="isAvailable")
389
+ start_date_time: datetime = Field(..., alias="startDateTime")
390
+ end_date_time: datetime = Field(..., alias="endDateTime")
391
+ class_description: ClassDescription = Field(..., alias="classDescription")
392
+ staff: Staff
393
+ class_uuid: str = Field(..., alias="classUUId")
394
+ client: Client
395
+
396
+
397
+ class MboResponseItem(BaseModel):
398
+ class_booking_uuid: str | Any = Field(..., alias="classBookingUUId")
399
+ action: str | Any
400
+ otf_class: MboClass | Any = Field(..., alias="class")
401
+
402
+
403
+ class BookClass(BaseModel):
404
+ saved_bookings: list[SavedBooking] = Field(..., alias="savedBookings")
405
+ mbo_response: list[MboResponseItem] = Field(..., alias="mboResponse")