Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
Binary file not shown.
Binary file not shown.
Binary file not shown.
Empty file.
Binary file added .chroma_db/chroma.sqlite3
Binary file not shown.
Binary file added app.db
Binary file not shown.
446 changes: 446 additions & 0 deletions app/database.py

Large diffs are not rendered by default.

1,436 changes: 1,436 additions & 0 deletions app/generate_data.py

Large diffs are not rendered by default.

3 changes: 1 addition & 2 deletions app/models/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
from flask_login import UserMixin
from werkzeug.security import generate_password_hash, check_password_hash
from datetime import datetime
from app.models.assessment import Assessment

class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
Expand All @@ -26,4 +25,4 @@ def check_password(self, password):
return check_password_hash(self.password_hash, password)

def get_assessments(self):
return self.assessments.order_by(Assessment.created_at.desc())
return self.assessments.order_by(Assessment.created_at.desc())
28 changes: 25 additions & 3 deletions app/routes/main.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,35 @@
from flask import Blueprint, render_template
from flask_login import login_required
from flask import Blueprint, render_template, request, url_for
from flask_login import login_required, current_user
from app.services.chromadb_service import ChromaDBService
from app.models.assessment import Assessment
from app import db

main = Blueprint('main', __name__)

# Initialize ChromaDB service
chromadb_service = ChromaDBService()

@main.route('/')
def index():
return render_template('index.html')

@main.route('/dashboard')
@login_required
def dashboard():
return render_template('dashboard.html')
# Get the user's assessments with the Assessment model
assessments = current_user.assessments.order_by(Assessment.created_at.desc()).limit(10).all()
return render_template('dashboard.html', assessments=assessments)

@main.route('/search', methods=['GET', 'POST'])
def search():
if request.method == 'POST':
query = request.form.get('search_query')
results = chromadb_service.search_assessments(query)
return render_template('search_results.html', results=results)
return render_template('search.html')

@main.route('/assessment/<int:assessment_id>')
@login_required
def assessment_detail(assessment_id):
assessment = Assessment.query.get_or_404(assessment_id)
return render_template('assessment_detail.html', assessment=assessment)
75 changes: 75 additions & 0 deletions app/services/chromadb_service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import chromadb
from chromadb.config import Settings
from app.models.assessment import Assessment
from app import db

class ChromaDBService:
def __init__(self):
self.client = chromadb.PersistentClient(path=".chroma_db")
self.collection = self.client.get_or_create_collection(name="employee_assessments")

def sync_assessments(self):
assessments = Assessment.query.all()
documents = []
metadatas = []
ids = []

for assessment in assessments:
text_content = f"""
Employee: {assessment.employee_name}
Position: {assessment.position}
Strengths: {assessment.strengths}
Areas for Improvement: {assessment.areas_for_improvement}
Goals: {assessment.goals}
Comments: {assessment.comments}
"""

documents.append(text_content)
metadatas.append({
"assessment_id": str(assessment.id),
"employee_name": assessment.employee_name,
"position": assessment.position,
"department": assessment.department,
"review_period": assessment.review_period,
"performance_rating": assessment.performance_rating
})
ids.append(str(assessment.id))

self.collection.add(
documents=documents,
metadatas=metadatas,
ids=ids
)

def search_assessments(self, query, limit=5):
results = self.collection.query(
query_texts=[query],
n_results=limit
)
return results

def get_assessment_by_id(self, assessment_id):
return Assessment.query.get(int(assessment_id))

def sync_new_assessment(self, assessment):
text_content = f"""
Employee: {assessment.employee_name}
Position: {assessment.position}
Strengths: {assessment.strengths}
Areas for Improvement: {assessment.areas_for_improvement}
Goals: {assessment.goals}
Comments: {assessment.comments}
"""

self.collection.add(
documents=[text_content],
metadatas=[{
"assessment_id": str(assessment.id),
"employee_name": assessment.employee_name,
"position": assessment.position,
"department": assessment.department,
"review_period": assessment.review_period,
"performance_rating": assessment.performance_rating
}],
ids=[str(assessment.id)]
)
37 changes: 37 additions & 0 deletions app/templates/assessment_detail.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
{% extends "base.html" %}

{% block title %}Assessment Detail{% endblock %}

{% block content %}
<div class="container">
<div class="card">
<div class="card-header">
<h3>{{ assessment.employee_name }}</h3>
</div>
<div class="card-body">
<h5 class="card-title">{{ assessment.position }}</h5>
<p class="card-text">
<strong>Department:</strong> {{ assessment.department }}<br>
<strong>Review Period:</strong> {{ assessment.review_period }}<br>
<strong>Performance Rating:</strong> {{ assessment.performance_rating }}/5
</p>
<div class="mb-3">
<h6>Strengths</h6>
<p>{{ assessment.strengths }}</p>
</div>
<div class="mb-3">
<h6>Areas for Improvement</h6>
<p>{{ assessment.areas_for_improvement }}</p>
</div>
<div class="mb-3">
<h6>Goals</h6>
<p>{{ assessment.goals }}</p>
</div>
<div class="mb-3">
<h6>Comments</h6>
<p>{{ assessment.comments }}</p>
</div>
</div>
</div>
</div>
{% endblock %}
111 changes: 35 additions & 76 deletions app/templates/dashboard.html
Original file line number Diff line number Diff line change
@@ -1,87 +1,46 @@
{% extends "base.html" %}

{% block title %}Dashboard{% endblock %}

{% block content %}
<div class="container">
<div class="d-flex justify-content-between align-items-center mb-4">
<h1>Dashboard</h1>
<a href="#" class="btn btn-primary">Create New Assessment</a>
</div>

<div class="container mt-4">
<div class="row">
<div class="col-md-4">
<div class="card mb-4">
<div class="card-body">
<h5 class="card-title">Recent Assessments</h5>
<h2 class="display-4">{{ current_user.assessments.count() }}</h2>
<p class="text-muted">Total assessments created</p>
<div class="col-md-12">
<div class="card">
<div class="card-header">
<h2>Employee Assessments Dashboard</h2>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card mb-4">
<div class="card-body">
<h5 class="card-title">Pending Reviews</h5>
<h2 class="display-4">0</h2>
<p class="text-muted">Assessments awaiting review</p>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card mb-4">
<div class="card-body">
<h5 class="card-title">Completed Reviews</h5>
<h2 class="display-4">0</h2>
<p class="text-muted">Finalized assessments</p>
</div>
</div>
</div>
</div>

<div class="card">
<div class="card-header">
<h5 class="mb-0">Recent Assessments</h5>
</div>
<div class="card-body">
{% if current_user.assessments.count() > 0 %}
<div class="table-responsive">
<table class="table table-hover">
<thead>
<tr>
<th>Employee Name</th>
<th>Position</th>
<th>Department</th>
<th>Review Period</th>
<th>Rating</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
{% for assessment in current_user.get_assessments().limit(5).all() %}
<tr>
<td>{{ assessment.employee_name }}</td>
<td>{{ assessment.position }}</td>
<td>{{ assessment.department }}</td>
<td>{{ assessment.review_period }}</td>
<td>
<span class="badge bg-{{ 'success' if assessment.performance_rating >= 4 else 'warning' if assessment.performance_rating >= 3 else 'danger' }}">
{{ assessment.performance_rating }}/5
</span>
</td>
<td>
<a href="#" class="btn btn-sm btn-outline-primary">View</a>
<a href="#" class="btn btn-sm btn-outline-secondary">Edit</a>
</td>
</tr>
<div class="row mb-4">
<div class="col-md-6">
<form action="{{ url_for('main.search') }}" method="POST">
<div class="input-group">
<input type="text" class="form-control" name="search_query" placeholder="Search assessments...">
<button class="btn btn-primary" type="submit">Search</button>
</div>
</form>
</div>
</div>

<div class="row">
{% for assessment in assessments %}
<div class="col-md-4 mb-4">
<div class="card">
<div class="card-body">
<h5 class="card-title">{{ assessment.employee_name }}</h5>
<p class="card-text">
<strong>Position:</strong> {{ assessment.position }}<br>
<strong>Department:</strong> {{ assessment.department }}<br>
<strong>Review Period:</strong> {{ assessment.review_period }}<br>
<strong>Rating:</strong> {{ assessment.performance_rating }}/5
</p>
<a href="{{ url_for('main.assessment_detail', assessment_id=assessment.id) }}" class="btn btn-primary">View Details</a>
</div>
</div>
</div>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
{% else %}
<p class="text-center mb-0">No assessments found. Create your first assessment to get started!</p>
{% endif %}
</div>
</div>
</div>
{% endblock %}
{% endblock %}
35 changes: 35 additions & 0 deletions app/templates/search_results.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{% extends "base.html" %}

{% block content %}
<div class="container mt-4">
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-header">
<h2>Search Results</h2>
</div>
<div class="card-body">
{% if results and results['documents'] %}
<div class="list-group">
{% for i in range(results['documents']|length) %}
<div class="list-group-item list-group-item-action">
<h5 class="mb-1">{{ results['metadatas'][0][i]['employee_name'] }}</h5>
<p class="mb-1">
<strong>Position:</strong> {{ results['metadatas'][0][i]['position'] }}<br>
<strong>Department:</strong> {{ results['metadatas'][0][i]['department'] }}<br>
<strong>Rating:</strong> {{ results['metadatas'][0][i]['performance_rating'] }}/5
</p>
<a href="{{ url_for('main.assessment_detail', assessment_id=results['metadatas'][0][i]['assessment_id']) }}"
class="btn btn-primary btn-sm">View Details</a>
</div>
{% endfor %}
</div>
{% else %}
<p class="text-muted">No results found for your search.</p>
{% endif %}
</div>
</div>
</div>
</div>
</div>
{% endblock %}
Loading