Skip to content

Commit

Permalink
Merge pull request #165 from cuappdev/joshua/reports
Browse files Browse the repository at this point in the history
Implemented reports model and mutation
  • Loading branch information
sophiestrausberg authored Oct 20, 2024
2 parents b835d0e + 1e40e3b commit 9c3167b
Show file tree
Hide file tree
Showing 7 changed files with 113 additions and 3 deletions.
4 changes: 2 additions & 2 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,12 @@ itsdangerous==2.0
jedi==0.18.2
Jinja2==3.0
lxml==4.9.2
Mako==1.0.9
Mako==1.2.0
MarkupSafe==2.1.1
marshmallow==3.0.0rc4
marshmallow-sqlalchemy==0.16.2
nodeenv==1.8.0
pandas==2.1.4
pandas==1.3.5
parso==0.8.3
platformdirs==3.10.0
pre-commit==1.18.3
Expand Down
26 changes: 26 additions & 0 deletions schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,10 @@ type CreateGiveaway {
giveaway: Giveaway
}

type CreateReport {
report: Report
}

type CreateUser {
user: User
}
Expand Down Expand Up @@ -141,12 +145,14 @@ type Gym {
facilities: [Facility]
hours: [OpenHours]
classes: [ClassInstance]
reports: [Report]
}

type Mutation {
createGiveaway(name: String!): CreateGiveaway
createUser(instagram: String, netId: String!): CreateUser
enterGiveaway(giveawayId: Int!, userNetId: String!): EnterGiveaway
createReport(createdAt: DateTime!, description: String!, gymId: Int!, issue: String!, userId: Int!): CreateReport
}

type OpenHours {
Expand Down Expand Up @@ -181,9 +187,29 @@ type Query {
activities: [Activity]
}

type Report {
id: ID!
createdAt: DateTime!
description: String!
gymId: Int!
issue: ReportType!
userId: Int!
gym: Gym
user: User
}

enum ReportType {
INACCURATE_EQUIPMENT
INCORRECT_HOURS
INACCURATE_DESCRIPTION
WAIT_TIMES_NOT_UPDATED
OTHER
}

type User {
id: ID!
instagram: String
netId: String!
giveaways: [Giveaway]
reports: [Report]
}
1 change: 1 addition & 0 deletions src/models/gym.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class Gym(Base):
facilities = relationship("Facility")
hours = relationship("OpenHours")
classes = relationship("ClassInstance", back_populates="gym")
reports = relationship("Report", back_populates="gym")
image_url = Column(String, nullable=True)
latitude = Column(Float, nullable=False)
longitude = Column(Float, nullable=False)
Expand Down
36 changes: 36 additions & 0 deletions src/models/report.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
from sqlalchemy import Column, Integer, ForeignKey, String, DateTime, Enum
from sqlalchemy.orm import relationship
from src.database import Base
import enum

class ReportType(enum.Enum):
INACCURATE_EQUIPMENT = 0
INCORRECT_HOURS = 1
INACCURATE_DESCRIPTION = 2
WAIT_TIMES_NOT_UPDATED = 3
OTHER = 4

class Report(Base):
"""
A report object.
Attributes:
- `id` The ID of the report.
- `user_id` The ID of the user who created the report.
- `issue` The issue reported (discrete options).
- `description` The description of the report.
- `created_at` The date and time the report was created.
- `gym_id` The ID of the gym associated with the report.
"""

__tablename__ = "report"

id = Column(Integer, primary_key=True)
created_at = Column(DateTime, nullable=False) # Timestamp for user submission
description = Column(String, nullable=False) # Text input
gym_id = Column(Integer, ForeignKey("gym.id"), nullable=False) # One to many relationship with gym
issue = Column(Enum(ReportType), nullable=False) # Discrete options (enumerate)
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
# Make relationship with gym and user
gym = relationship("Gym", back_populates="reports")
user = relationship("User", back_populates="reports")
1 change: 1 addition & 0 deletions src/models/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,6 @@ class User(Base):

id = Column(Integer, primary_key=True)
giveaways = relationship("Giveaway", secondary="giveaway_instance", back_populates="users")
reports = relationship("Report", back_populates="user")
instagram = Column(String, nullable=True)
net_id = Column(String, nullable=False)
46 changes: 46 additions & 0 deletions src/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
from src.models.user import User as UserModel
from src.models.giveaway import Giveaway as GiveawayModel
from src.models.giveaway import GiveawayInstance as GiveawayInstanceModel
from src.models.report import Report as ReportModel
from src.database import db_session


Expand Down Expand Up @@ -216,6 +217,22 @@ def resolve_get_users_by_giveaway_id(self, info, id):
users = [User.get_query(info).filter(UserModel.id == entry.user_id).first() for entry in entries]
return users

# MARK: - Report

class Report(SQLAlchemyObjectType):
class Meta:
model = ReportModel

gym = graphene.Field(lambda: Gym)
user = graphene.Field(lambda: User)

def resolve_gym(self, info):
query = Gym.get_query(info).filter(GymModel.id == self.gym_id).first()
return query

def resolve_user(self, info):
query = User.get_query(info).filter(UserModel.id == self.user_id).first()
return query

# MARK: - Mutation

Expand Down Expand Up @@ -288,11 +305,40 @@ def mutate(self, info, name):
db_session.commit()
return CreateGiveaway(giveaway=giveaway)

class CreateReport(graphene.Mutation):
class Arguments:
user_id = graphene.Int(required=True)
issue = graphene.String(required=True)
description = graphene.String(required=True)
created_at = graphene.DateTime(required=True)
gym_id = graphene.Int(required=True)

report = graphene.Field(Report)

def mutate(self, info, description, user_id, issue, created_at, gym_id):
# Check if user exists
user = User.get_query(info).filter(UserModel.id == user_id).first()
if not user:
raise GraphQLError("User with given ID does not exist.")
# Check if gym exists
gym = Gym.get_query(info).filter(GymModel.id == gym_id).first()
if not gym:
raise GraphQLError("Gym with given ID does not exist.")
# Check if issue is a valid enumeration
if issue not in ["INACCURATE_EQUIPMENT", "INCORRECT_HOURS", "INACCURATE_DESCRIPTION", "WAIT_TIMES_NOT_UPDATED", "OTHER"]:
raise GraphQLError("Issue is not a valid enumeration.")
report = ReportModel(description=description, user_id=user_id, issue=issue,
created_at=created_at, gym_id=gym_id)
db_session.add(report)
db_session.commit()
return CreateReport(report=report)


class Mutation(graphene.ObjectType):
create_giveaway = CreateGiveaway.Field(description="Creates a new giveaway.")
create_user = CreateUser.Field(description="Creates a new user.")
enter_giveaway = EnterGiveaway.Field(description="Enters a user into a giveaway.")
create_report = CreateReport.Field(description="Creates a new report.")


schema = graphene.Schema(query=Query, mutation=Mutation)
2 changes: 1 addition & 1 deletion src/scrapers/class_scraper.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ def fetch_classes(num_pages):
try:
gym_class = db_session.query(Class).filter(Class.name == class_name).first()
if gym_class is None:
Exception()
raise Exception("Gym class is none, creating new gym class")
except Exception:
gym_class = create_group_class(class_href)
class_instance.class_id = gym_class.id
Expand Down

0 comments on commit 9c3167b

Please sign in to comment.