2026-03-05 12:13:22 -06:00
|
|
|
from flask import Blueprint, jsonify, request
|
|
|
|
|
from ..models import Project, Deliverable
|
|
|
|
|
from ..extensions import db
|
2026-03-06 00:03:06 -06:00
|
|
|
from datetime import date, datetime
|
2026-03-05 12:13:22 -06:00
|
|
|
|
|
|
|
|
projects_bp = Blueprint('projects', __name__)
|
|
|
|
|
|
2026-03-06 00:03:06 -06:00
|
|
|
|
2026-03-05 12:13:22 -06:00
|
|
|
@projects_bp.route('/projects', methods=['GET'])
|
|
|
|
|
def get_projects():
|
|
|
|
|
projects = Project.query.order_by(Project.created_at.desc()).all()
|
|
|
|
|
return jsonify([p.to_dict() for p in projects])
|
|
|
|
|
|
2026-03-06 00:03:06 -06:00
|
|
|
|
2026-03-05 12:13:22 -06:00
|
|
|
@projects_bp.route('/projects/<int:id>', methods=['GET'])
|
|
|
|
|
def get_project(id):
|
|
|
|
|
project = Project.query.get_or_404(id)
|
|
|
|
|
return jsonify(project.to_dict())
|
|
|
|
|
|
2026-03-06 00:03:06 -06:00
|
|
|
|
2026-03-05 12:13:22 -06:00
|
|
|
@projects_bp.route('/projects', methods=['POST'])
|
|
|
|
|
def create_project():
|
|
|
|
|
data = request.get_json()
|
|
|
|
|
project = Project(
|
|
|
|
|
name=data['name'],
|
|
|
|
|
color=data.get('color', '#C9A84C'),
|
|
|
|
|
description=data.get('description', ''),
|
2026-03-05 13:28:07 -06:00
|
|
|
drive_url=data.get('drive_url', ''),
|
2026-03-05 12:13:22 -06:00
|
|
|
)
|
|
|
|
|
db.session.add(project)
|
|
|
|
|
db.session.flush()
|
2026-03-06 00:03:06 -06:00
|
|
|
|
2026-03-05 12:13:22 -06:00
|
|
|
for d in data.get('deliverables', []):
|
|
|
|
|
if d.get('title') and d.get('due_date'):
|
|
|
|
|
db.session.add(Deliverable(
|
|
|
|
|
project_id=project.id,
|
|
|
|
|
title=d['title'],
|
|
|
|
|
due_date=date.fromisoformat(d['due_date']),
|
|
|
|
|
status=d.get('status', 'upcoming'),
|
|
|
|
|
))
|
2026-03-06 00:03:06 -06:00
|
|
|
|
2026-03-05 12:13:22 -06:00
|
|
|
db.session.commit()
|
|
|
|
|
return jsonify(project.to_dict()), 201
|
|
|
|
|
|
2026-03-06 00:03:06 -06:00
|
|
|
|
2026-03-05 12:13:22 -06:00
|
|
|
@projects_bp.route('/projects/<int:id>', methods=['PATCH'])
|
|
|
|
|
def update_project(id):
|
|
|
|
|
project = Project.query.get_or_404(id)
|
|
|
|
|
data = request.get_json()
|
2026-03-05 13:28:07 -06:00
|
|
|
for field in ('name', 'color', 'description', 'drive_url'):
|
2026-03-05 12:13:22 -06:00
|
|
|
if field in data:
|
|
|
|
|
setattr(project, field, data[field])
|
|
|
|
|
db.session.commit()
|
|
|
|
|
return jsonify(project.to_dict())
|
|
|
|
|
|
2026-03-06 00:03:06 -06:00
|
|
|
|
|
|
|
|
@projects_bp.route('/projects/<int:id>/archive', methods=['PATCH'])
|
|
|
|
|
def archive_project(id):
|
|
|
|
|
project = Project.query.get_or_404(id)
|
|
|
|
|
project.archived_at = datetime.utcnow()
|
|
|
|
|
db.session.commit()
|
|
|
|
|
return jsonify(project.to_dict())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@projects_bp.route('/projects/<int:id>/unarchive', methods=['PATCH'])
|
|
|
|
|
def unarchive_project(id):
|
|
|
|
|
project = Project.query.get_or_404(id)
|
|
|
|
|
project.archived_at = None
|
|
|
|
|
db.session.commit()
|
|
|
|
|
return jsonify(project.to_dict())
|
|
|
|
|
|
|
|
|
|
|
2026-03-05 12:13:22 -06:00
|
|
|
@projects_bp.route('/projects/<int:id>', methods=['DELETE'])
|
|
|
|
|
def delete_project(id):
|
|
|
|
|
project = Project.query.get_or_404(id)
|
|
|
|
|
db.session.delete(project)
|
|
|
|
|
db.session.commit()
|
|
|
|
|
return jsonify({'message': 'Project deleted'}), 200
|