middha commited on
Commit
ebd18c8
Β·
verified Β·
1 Parent(s): 8815927

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +22 -31
app.py CHANGED
@@ -1,7 +1,5 @@
1
  import logging
2
  import os
3
- from logging.handlers import RotatingFileHandler
4
-
5
  from flask import (
6
  Flask, render_template, request, redirect,
7
  url_for, flash, jsonify, Response
@@ -15,33 +13,27 @@ from dotenv import load_dotenv
15
  from openai import OpenAI
16
  from datetime import datetime, timedelta
17
 
18
- # ─── Load environment variables ────────────────────────────────────────────────
19
  load_dotenv()
20
 
21
- # ─── Logging configuration ────────────────────────────────────────────────────
22
- import logging
23
- import os
24
-
25
- # ─── Logging to stdout only ───────────────────────────────────────────────────
26
  logging.basicConfig(
27
  level=logging.INFO,
28
  format="[%(asctime)s] %(levelname)s in %(module)s: %(message)s"
29
  )
30
- logger = logging.getLogger() # root logger
31
 
32
- # ─── Flask setup ───────────────────────────────────────────────────────────────
33
- from flask import Flask
34
  app = Flask(__name__)
35
  app.logger.handlers = logger.handlers
36
  app.logger.setLevel(logger.level)
37
 
38
- # ─── OpenAI client setup ──────────────────────────────────────────────────────
39
- # client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) # if you prefer v1 client
40
  OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
41
  if not OPENAI_API_KEY:
42
  app.logger.warning("OPENAI_API_KEY is not set in the environment")
43
 
44
- # ─── Database configuration ───────────────────────────────────────────────────
45
  app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///jobs.db"
46
  app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
47
  app.secret_key = os.getenv("SECRET_KEY", "your_secret_key_here")
@@ -49,7 +41,7 @@ app.secret_key = os.getenv("SECRET_KEY", "your_secret_key_here")
49
  db = SQLAlchemy(app)
50
  migrate = Migrate(app, db)
51
 
52
- # ─── Models ───────────────────────────────────────────────────────────────────
53
  class Job(db.Model):
54
  id = db.Column(db.Integer, primary_key=True)
55
  company = db.Column(db.String(100), nullable=False)
@@ -65,7 +57,7 @@ class Job(db.Model):
65
  def __repr__(self):
66
  return f"<Job {self.company} - {self.position}>"
67
 
68
- # ─── Helpers ──────────────────────────────────────────────────────────────────
69
  def convert_excel_serial_dates():
70
  updated = False
71
  for job in Job.query.all():
@@ -77,7 +69,7 @@ def convert_excel_serial_dates():
77
  job.date_applied = dt.strftime("%Y-%m-%d")
78
  updated = True
79
  except ValueError:
80
- continue
81
  if updated:
82
  db.session.commit()
83
  app.logger.info("Converted Excel serial dates to ISO strings")
@@ -91,7 +83,7 @@ def generate_interview_plan(job_description: str) -> str:
91
  {"role": "system", "content": "You are a helpful assistant."},
92
  {"role": "user", "content":
93
  f"Create an interview plan for the following job description. "
94
- f"Highlight key skills and requirements:\n{job_description}"
95
  },
96
  ],
97
  max_tokens=150
@@ -101,16 +93,14 @@ def generate_interview_plan(job_description: str) -> str:
101
  app.logger.exception("Error generating interview plan")
102
  return "Error generating interview plan. Please try again later."
103
 
104
- # ─── Auto-initialize DB ────────────────────────────────────────────────────────
105
-
106
- @app.before_serving
107
- def initialize_database():
108
  db.create_all()
109
  convert_excel_serial_dates()
110
  app.logger.info("Database initialized")
111
 
 
112
 
113
- # ─── Routes ───────────────────────────────────────────────────────────────────
114
  @app.route("/")
115
  def index():
116
  return redirect(url_for("jobs"))
@@ -135,8 +125,8 @@ def jobs():
135
  return redirect(url_for("jobs"))
136
  except SQLAlchemyError:
137
  app.logger.exception("Error adding job")
138
- flash("Error adding job. Check logs for details.")
139
- # GET
140
  search = request.args.get("search", "").strip()
141
  status_filter = request.args.get("status_filter", "").strip()
142
  sort_by = request.args.get("sort", "")
@@ -159,8 +149,8 @@ def jobs():
159
 
160
  jobs_list = query.all()
161
  counts = {
162
- "Applied": Job.query.filter_by(status="Applied").count(),
163
- "Rejected": Job.query.filter_by(status="Rejected").count(),
164
  "Interviewing": Job.query.filter_by(status="Interviewing").count()
165
  }
166
  return render_template(
@@ -191,7 +181,7 @@ def edit_job(job_id):
191
  return redirect(url_for("jobs"))
192
  except SQLAlchemyError:
193
  app.logger.exception("Error updating job")
194
- flash("Error updating job. Check logs for details.")
195
  db.session.rollback()
196
  return render_template("jobs.html", jobs=Job.query.all(), edit_job=job)
197
 
@@ -203,7 +193,7 @@ def delete_job(job_id):
203
  db.session.commit()
204
  except SQLAlchemyError:
205
  app.logger.exception("Error deleting job")
206
- flash("Error deleting job. Check logs for details.")
207
  db.session.rollback()
208
  return redirect(url_for("jobs"))
209
 
@@ -244,7 +234,7 @@ def prepme(job_id):
244
  model="gpt-4o-mini",
245
  messages=[
246
  {"role": "system", "content": "You are a career coach."},
247
- {"role": "user", "content": context},
248
  ],
249
  max_tokens=150
250
  )
@@ -294,7 +284,8 @@ def download_jobs():
294
  headers={"Content-Disposition": "attachment;filename=jobs.csv"}
295
  )
296
 
297
- # ─── Application entry point ─────────────────────────────────────────────────
298
  if __name__ == "__main__":
299
  port = int(os.environ.get("PORT", 5000))
300
  app.run(host="0.0.0.0", port=port, debug=False)
 
 
1
  import logging
2
  import os
 
 
3
  from flask import (
4
  Flask, render_template, request, redirect,
5
  url_for, flash, jsonify, Response
 
13
  from openai import OpenAI
14
  from datetime import datetime, timedelta
15
 
16
+ # ─── 1) Load env vars ──────────────────────────────────────────────────────────
17
  load_dotenv()
18
 
19
+ # ─── 2) Logging to stdout ─────────────────────────────────────────────────────
 
 
 
 
20
  logging.basicConfig(
21
  level=logging.INFO,
22
  format="[%(asctime)s] %(levelname)s in %(module)s: %(message)s"
23
  )
24
+ logger = logging.getLogger()
25
 
26
+ # ─── 3) Flask setup ───────────────────────────────────────────────────────────
 
27
  app = Flask(__name__)
28
  app.logger.handlers = logger.handlers
29
  app.logger.setLevel(logger.level)
30
 
31
+ # ─── 4) OpenAI client setup ──────────────────────────────────────────────────
 
32
  OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
33
  if not OPENAI_API_KEY:
34
  app.logger.warning("OPENAI_API_KEY is not set in the environment")
35
 
36
+ # ─── 5) Database config ───────────────────────────────────────────────────────
37
  app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///jobs.db"
38
  app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
39
  app.secret_key = os.getenv("SECRET_KEY", "your_secret_key_here")
 
41
  db = SQLAlchemy(app)
42
  migrate = Migrate(app, db)
43
 
44
+ # ─── 6) Models ────────────────────────────────────────────────────────────────
45
  class Job(db.Model):
46
  id = db.Column(db.Integer, primary_key=True)
47
  company = db.Column(db.String(100), nullable=False)
 
57
  def __repr__(self):
58
  return f"<Job {self.company} - {self.position}>"
59
 
60
+ # ─── 7) Helpers ───────────────────────────────────────────────────────────────
61
  def convert_excel_serial_dates():
62
  updated = False
63
  for job in Job.query.all():
 
69
  job.date_applied = dt.strftime("%Y-%m-%d")
70
  updated = True
71
  except ValueError:
72
+ pass
73
  if updated:
74
  db.session.commit()
75
  app.logger.info("Converted Excel serial dates to ISO strings")
 
83
  {"role": "system", "content": "You are a helpful assistant."},
84
  {"role": "user", "content":
85
  f"Create an interview plan for the following job description. "
86
+ f"Highlight key skills and requirements:\n\n{job_description}"
87
  },
88
  ],
89
  max_tokens=150
 
93
  app.logger.exception("Error generating interview plan")
94
  return "Error generating interview plan. Please try again later."
95
 
96
+ # ─── 8) Immediate DB init ────────────────────────────────────────────────────
97
+ with app.app_context():
 
 
98
  db.create_all()
99
  convert_excel_serial_dates()
100
  app.logger.info("Database initialized")
101
 
102
+ # ─── 9) Routes ────────────────────────────────────────────────────────────────
103
 
 
104
  @app.route("/")
105
  def index():
106
  return redirect(url_for("jobs"))
 
125
  return redirect(url_for("jobs"))
126
  except SQLAlchemyError:
127
  app.logger.exception("Error adding job")
128
+ flash("Error adding job. See logs for details.")
129
+ # GET handling
130
  search = request.args.get("search", "").strip()
131
  status_filter = request.args.get("status_filter", "").strip()
132
  sort_by = request.args.get("sort", "")
 
149
 
150
  jobs_list = query.all()
151
  counts = {
152
+ "Applied": Job.query.filter_by(status="Applied").count(),
153
+ "Rejected": Job.query.filter_by(status="Rejected").count(),
154
  "Interviewing": Job.query.filter_by(status="Interviewing").count()
155
  }
156
  return render_template(
 
181
  return redirect(url_for("jobs"))
182
  except SQLAlchemyError:
183
  app.logger.exception("Error updating job")
184
+ flash("Error updating job. See logs for details.")
185
  db.session.rollback()
186
  return render_template("jobs.html", jobs=Job.query.all(), edit_job=job)
187
 
 
193
  db.session.commit()
194
  except SQLAlchemyError:
195
  app.logger.exception("Error deleting job")
196
+ flash("Error deleting job. See logs for details.")
197
  db.session.rollback()
198
  return redirect(url_for("jobs"))
199
 
 
234
  model="gpt-4o-mini",
235
  messages=[
236
  {"role": "system", "content": "You are a career coach."},
237
+ {"role": "user", "content": context}
238
  ],
239
  max_tokens=150
240
  )
 
284
  headers={"Content-Disposition": "attachment;filename=jobs.csv"}
285
  )
286
 
287
+ # ─── 10) Entry point ─────────────────────────────────────────────────────────
288
  if __name__ == "__main__":
289
  port = int(os.environ.get("PORT", 5000))
290
  app.run(host="0.0.0.0", port=port, debug=False)
291
+