Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
125 changes: 121 additions & 4 deletions db_init.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
"""

import sys
import requests
import validators

from datetime import date, datetime

from labconnect import create_app, db
Expand All @@ -28,21 +31,84 @@
UserCourses,
UserDepartments,
UserMajors,
UserSavedOpportunities,
Codes,
)


def fetch_json_data(json_url):
response = requests.get(json_url)

if response.status_code != 200:
raise ValueError(f"Error: Received status code {response.status_code}")
try:
return response.json()
except requests.exceptions.JSONDecodeError:
raise ValueError("Error: Received invalid JSON response")


def insert_courses_from_json(session, courses_data):
# Fetch existing courses to avoid multiple queries
existing_courses = {course.code: course for course in session.query(Courses).all()}
new_courses = []

for course, course_info in courses_data.items():
course_name = course_info.get("name")
course_code = course_info.get("subj") + course_info.get("crse")

if len(course_code) != 8:
continue
if course_code in existing_courses:
# Update name if changed
existing_course = existing_courses[course_code]
if existing_course.name != course_name:
existing_course.name = course_name
else:
new_courses.append(Courses(code=course_code, name=course_name))

if new_courses:
session.add_all(new_courses)
session.commit()


def insert_schools_and_departments(session, schools_data):
for school_data in schools_data:
school_name = school_data.get("name")
school_description = ""

school = RPISchools()
school.name = school_name
school.description = school_description
session.add(school)
session.commit()
print(f"School '{school_name}' inserted into the database.")

for department_data in school_data.get("depts", []):
department_id = department_data.get("code")
department_name = department_data.get("name")
department_description = ""

department = RPIDepartments()
department.id = department_id
department.name = department_name
department.description = department_description
department.school_id = school_name
session.add(department)
session.commit()
print(f"Department '{department_name}' inserted into the database.")


app = create_app()


if len(sys.argv) < 2:
sys.exit("No argument or exsisting argument found")
sys.exit("No argument or existing argument found")

if sys.argv[1] == "start":
with app.app_context():
if db.inspect(db.engine).get_table_names():
print("Tables already exist.")
# clear the codes table
db.session.query(Codes).delete()
db.session.delete(Codes)
db.session.commit()
sys.exit()
db.create_all()
Expand All @@ -51,6 +117,58 @@
with app.app_context():
db.drop_all()

elif sys.argv[1] == "addCourses":
if len(sys.argv) < 3:
sys.exit("Error: No URL argument provided.")

json_url = sys.argv[2]

# Validate that json_url is a valid URL
if not validators.url(json_url):
sys.exit("Error: Invalid URL provided.")

with app.app_context():
db.create_all()

courses_data = fetch_json_data(json_url)
if not courses_data:
sys.exit("Failed to fetch courses data. Exiting...")

insert_courses_from_json(db.session, courses_data)

db.session.close()

elif sys.argv[1] == "addDept":

json_url = "https://raw.githubusercontent.com/quacs/quacs-data/master/semester_data/202409/schools.json"

with app.app_context():
db.create_all()

schools_data = fetch_json_data(json_url)
if not schools_data:
sys.exit("Failed to fetch schools data. Exiting...")

insert_schools_and_departments(db.session, schools_data)

db.session.close()

### PREVIOUS
# engine = create_engine(f"sqlite:///{os.path.join(basedir, 'database.db')}")
# Base.metadata.create_all(engine)
# Session = sessionmaker(bind=engine)
# session = Session()

# schools_data = load_json_data(JSON_FILE_PATH)
# if not schools_data:
# print("Failed to load JSON data. Exiting...")
# return

# insert_schools_and_departments(session, schools_data)

# session.close()


elif sys.argv[1] == "create":
with app.app_context():
db.create_all()
Expand Down Expand Up @@ -443,7 +561,6 @@
UserCourses,
UserDepartments,
UserMajors,
UserSavedOpportunities,
]

for table in tables:
Expand Down
37 changes: 37 additions & 0 deletions labconnect/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@

import sentry_sdk

# Import logging
from logging.config import dictConfig

# Import Flask modules
from flask import Flask
from flask_cors import CORS
Expand All @@ -27,10 +30,34 @@

def create_app() -> Flask:
# Create flask app object

app = Flask(__name__)

app.config.from_object(os.environ.get("CONFIG", "config.TestingConfig"))

# Logging configuration
dictConfig(
{
"version": 1,
"formatters": {
"default": {
"format": "[%(asctime)s] %(levelname)s in %(module)s: %(message)s",
}
},
"handlers": {
"wsgi": {
"class": "logging.StreamHandler",
"stream": "ext://flask.logging.wsgi_errors_stream",
"formatter": "default",
}
},
"root": {"level": "INFO", "handlers": ["wsgi"]},
}
)

app.logger.info("App logger initialized.")

# Sentry
sentry_sdk.init(
dsn=app.config["SENTRY_DSN"],
integrations=[FlaskIntegration()],
Expand All @@ -43,6 +70,8 @@ def create_app() -> Flask:
initialize_extensions(app)
register_blueprints(app)

app.logger.info("Returning App")

return app


Expand All @@ -59,8 +88,11 @@ def initialize_extensions(app) -> None:
jwt.init_app(app)
app.json = OrJSONProvider(app)

app.logger.info("Extensions initialized.")

with app.app_context():
db.create_all()
app.logger.info("Database tables created.")

@app.after_request
def refresh_expiring_jwts(response):
Expand All @@ -74,9 +106,11 @@ def refresh_expiring_jwts(response):
if type(data) is dict:
data["access_token"] = access_token
response.data = json.dumps(data)
app.logger.info("Access token refreshed for user.")
return response
except (RuntimeError, KeyError):
# Case where there is not a valid JWT. Just return the original respone
app.logger.debug("No valid JWT found; skipping refresh.")
return response


Expand All @@ -87,4 +121,7 @@ def register_blueprints(app) -> None:
from labconnect.main import main_blueprint

app.register_blueprint(main_blueprint)
app.logger.info("Main blueprint registered.")

app.register_blueprint(error_blueprint)
app.logger.info("Error blueprint registered.")
4 changes: 0 additions & 4 deletions labconnect/main/opportunity_routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -763,10 +763,6 @@ def editOpportunity(opportunity_id):
db.session.add(new_lead)

db.session.commit() # Commit all changes

# db.session.commit() # Commit all changes

db.session.commit()
return {"data": "Opportunity Updated"}, 200


Expand Down
1 change: 0 additions & 1 deletion labconnect/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,6 @@ class UserSavedOpportunities(db.Model):
user = db.relationship("User", back_populates="saved_opportunities")
opportunity = db.relationship("Opportunities", back_populates="saved_opportunities")


class Leads(db.Model):
__tablename__ = "leads"

Expand Down
Loading