from flask import Blueprint, jsonify, request from ..models import Project, Deliverable from ..extensions import db from datetime import date, datetime, timezone projects_bp = Blueprint('projects', __name__) @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]) @projects_bp.route('/projects/', methods=['GET']) def get_project(id): project = Project.query.get_or_404(id) return jsonify(project.to_dict()) @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', ''), drive_url=data.get('drive_url', ''), ) db.session.add(project) db.session.flush() 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'), )) db.session.commit() return jsonify(project.to_dict()), 201 @projects_bp.route('/projects/', methods=['PATCH']) def update_project(id): project = Project.query.get_or_404(id) data = request.get_json() for field in ('name', 'color', 'description', 'drive_url'): if field in data: setattr(project, field, data[field]) db.session.commit() return jsonify(project.to_dict()) @projects_bp.route('/projects//archive', methods=['PATCH']) def archive_project(id): project = Project.query.get_or_404(id) project.archived_at = datetime.now(timezone.utc) db.session.commit() return jsonify(project.to_dict()) @projects_bp.route('/projects//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()) @projects_bp.route('/projects/', 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