|
import logging
|
|
from datetime import datetime
|
|
from fastapi import APIRouter, Request
|
|
from fastapi.responses import HTMLResponse, RedirectResponse
|
|
from devplacepy.database import get_table
|
|
from devplacepy.templating import templates
|
|
from devplacepy.utils import generate_uid, get_current_user, require_user
|
|
|
|
logger = logging.getLogger(__name__)
|
|
router = APIRouter()
|
|
|
|
|
|
def get_projects_list(tab: str = "recent", search: str = "", user_uid: str = None):
|
|
projects = get_table("projects")
|
|
users = get_table("users")
|
|
all_projects = list(projects.all())
|
|
|
|
if user_uid:
|
|
all_projects = [p for p in all_projects if p["user_uid"] == user_uid]
|
|
|
|
if search:
|
|
search_lower = search.lower()
|
|
all_projects = [
|
|
p for p in all_projects
|
|
if search_lower in p.get("title", "").lower()
|
|
or search_lower in p.get("description", "").lower()
|
|
]
|
|
|
|
for p in all_projects:
|
|
author = users.find_one(uid=p["user_uid"])
|
|
p["author_name"] = author["username"] if author else "Unknown"
|
|
|
|
if tab == "released":
|
|
all_projects = [p for p in all_projects if p.get("status") == "Released"]
|
|
elif tab == "popular":
|
|
all_projects.sort(key=lambda p: int(p.get("stars", 0)), reverse=True)
|
|
elif tab == "new":
|
|
all_projects.sort(key=lambda p: p.get("created_at", ""), reverse=True)
|
|
else:
|
|
all_projects.sort(key=lambda p: p.get("created_at", ""), reverse=True)
|
|
|
|
return all_projects
|
|
|
|
|
|
@router.get("", response_class=HTMLResponse)
|
|
async def projects_page(
|
|
request: Request,
|
|
tab: str = "recent",
|
|
search: str = "",
|
|
user_uid: str = None,
|
|
):
|
|
user = get_current_user(request)
|
|
projects = get_projects_list(tab, search, user_uid)
|
|
users = get_table("users")
|
|
total_members = len(list(users.all()))
|
|
|
|
return templates.TemplateResponse("projects.html", {
|
|
"request": request,
|
|
"user": user,
|
|
"projects": projects,
|
|
"current_tab": tab,
|
|
"search": search,
|
|
"total_count": len(projects),
|
|
"total_members": total_members,
|
|
})
|
|
|
|
|
|
@router.post("/create")
|
|
async def create_project(request: Request):
|
|
user = require_user(request)
|
|
form = await request.form()
|
|
title = form.get("title", "").strip()
|
|
description = form.get("description", "").strip()
|
|
release_date = form.get("release_date", "")
|
|
demo_date = form.get("demo_date", "")
|
|
project_type = form.get("project_type", "software")
|
|
platforms = form.get("platforms", "").strip()
|
|
status = form.get("status", "In Development")
|
|
|
|
if not title or not description:
|
|
return RedirectResponse(url="/projects", status_code=302)
|
|
|
|
projects = get_table("projects")
|
|
uid = generate_uid()
|
|
projects.insert({
|
|
"uid": uid,
|
|
"user_uid": user["uid"],
|
|
"title": title,
|
|
"description": description,
|
|
"release_date": release_date or None,
|
|
"demo_date": demo_date or None,
|
|
"project_type": project_type,
|
|
"platforms": platforms,
|
|
"status": status,
|
|
"stars": 0,
|
|
"created_at": datetime.utcnow().isoformat(),
|
|
})
|
|
|
|
logger.info(f"Project {uid} created by {user['username']}")
|
|
return RedirectResponse(url="/projects", status_code=302)
|