diff --git a/app.py b/app.py index 0790170..dfcc0c6 100644 --- a/app.py +++ b/app.py @@ -1,5 +1,5 @@ import logging -from flask import Flask, render_template +from flask import Flask, render_template, redirect, url_for from flask_apscheduler import APScheduler from flask_graphql import GraphQLView from graphene import Schema @@ -63,6 +63,13 @@ def scrape_capacities(): fetch_capacities() +# Scrape classes every hour +@scheduler.task("interval", id="scrape_classes", seconds=3600) +def scrape_classes(): + logging.info("Scraping classes from group-fitness-classes...") + + fetch_classes(3) + # Scrape classes every hour @scheduler.task("interval", id="scrape_classes", seconds=3600) diff --git a/schema.graphql b/schema.graphql index 075191f..91103fa 100644 --- a/schema.graphql +++ b/schema.graphql @@ -38,6 +38,27 @@ type Capacity { updated: Int! } +type Class { + id: ID! + name: String! + description: String! + classInstances: [ClassInstance] +} + +type ClassInstance { + id: ID! + gymId: Int + classId: Int! + location: String! + instructor: String! + isCanceled: Boolean! + isVirtual: Boolean! + startTime: DateTime + endTime: DateTime + class_: Class + gym: Gym +} + enum CourtType { BASKETBALL VOLLEYBALL @@ -52,6 +73,8 @@ type CreateUser { user: User } +scalar DateTime + type EnterGiveaway { giveawayInstance: GiveawayInstance } @@ -117,6 +140,7 @@ type Gym { amenities: [Amenity] facilities: [Facility] hours: [OpenHours] + classes: [ClassInstance] } type Mutation { diff --git a/src/models/classes.py b/src/models/classes.py index f425509..4a563b1 100644 --- a/src/models/classes.py +++ b/src/models/classes.py @@ -33,7 +33,7 @@ class Class(Base): id = Column(Integer, primary_key=True) name = Column(String(), nullable=False) description = Column(String(), nullable=False) - gyms = relationship("ClassInstance", back_populates="class_") + class_instances = relationship("ClassInstance", back_populates="class_") def __init__(self, **kwargs): self.id = kwargs.get("id") @@ -60,7 +60,7 @@ class ClassInstance(Base): isVirtual = Column(Boolean(), nullable=False, default=False) start_time = Column(DateTime(), nullable=True) end_time = Column(DateTime(), nullable=True) - class_ = relationship("Class", back_populates="gyms") + class_ = relationship("Class", back_populates="class_instances") gym = relationship("Gym", back_populates="classes") def __init__(self, **kwargs): diff --git a/src/schema.py b/src/schema.py index 63efb19..54a1a06 100644 --- a/src/schema.py +++ b/src/schema.py @@ -119,6 +119,39 @@ class Price(SQLAlchemyObjectType): class Meta: model = PriceModel +# MARK: - Class + + +class Class(SQLAlchemyObjectType): + class Meta: + model = ClassModel + + class_instances = graphene.List(lambda: ClassInstance) + + def resolve_class_instances(self, info): + query = ClassInstance.get_query(info=info).filter(ClassInstanceModel.class_id == self.id) + return query + + + +# MARK: - Class Instance + + +class ClassInstance(SQLAlchemyObjectType): + class Meta: + model = ClassInstanceModel + + gym = graphene.Field(lambda: Gym) + class_ = graphene.Field(lambda: Class) + + def resolve_gym(self, info): + query = Gym.get_query(info=info).filter(GymModel.id == self.gym_id).first() + return query + + def resolve_class_(self, info): + query = Class.get_query(info=info).filter(ClassModel.id == self.class_id).first() + return query + # MARK: - Activity