mirror of https://git.sr.ht/~sircmpwn/hub.sr.ht
100 lines
3.7 KiB
Python
100 lines
3.7 KiB
Python
from sqlalchemy.sql import operators
|
|
from flask import Blueprint, render_template, request, session
|
|
from hubsrht.types import Project, Feature, Event, EventType, Visibility, User
|
|
from srht.database import db
|
|
from srht.flask import paginate_query
|
|
from srht.oauth import current_user, loginrequired
|
|
from srht.search import search_by
|
|
|
|
public = Blueprint("public", __name__)
|
|
|
|
@public.route("/")
|
|
def index():
|
|
if current_user:
|
|
notice = session.pop("notice", None)
|
|
projects = (Project.query
|
|
.filter(Project.owner_id == current_user.id)
|
|
.order_by(Project.updated.desc())
|
|
.limit(5)).all()
|
|
if any(projects):
|
|
events = (Event.query
|
|
.filter(Event.user_id == current_user.id)
|
|
.order_by(Event.created.desc())
|
|
.limit(2)).all()
|
|
return render_template("dashboard.html",
|
|
projects=projects, EventType=EventType, events=events,
|
|
notice=notice)
|
|
return render_template("new-user-dashboard.html", notice=notice)
|
|
|
|
features = (Feature.query
|
|
.join(Project, Feature.project_id == Project.id)
|
|
.join(User, Project.owner_id == User.id)
|
|
.filter(Project.visibility == Visibility.public)
|
|
.order_by(Feature.created.desc())
|
|
.limit(6)).all()
|
|
return render_template("index.html", features=features)
|
|
|
|
@public.route("/getting-started")
|
|
@loginrequired
|
|
def getting_started():
|
|
notice = session.pop("notice", None)
|
|
return render_template("new-user-dashboard.html", notice=notice)
|
|
|
|
@public.route("/projects")
|
|
def project_index():
|
|
projects = Project.query.filter(Project.visibility == Visibility.public)
|
|
|
|
search = request.args.get("search")
|
|
search_error = None
|
|
if search:
|
|
try:
|
|
projects = search_by(projects, search,
|
|
[Project.name, Project.description],
|
|
key_fns={"tag": lambda t:
|
|
Project.tags.any(t, operator=operators.ilike_op)},
|
|
term_map=lambda t: f"tag:{t[1:]}" if t.startswith("#") else t)
|
|
except ValueError as e:
|
|
search_error = str(e)
|
|
|
|
sort = request.args.get("sort")
|
|
if sort and sort == "recently-updated":
|
|
projects = projects.order_by(Project.updated.desc())
|
|
elif sort and sort == "longest-active":
|
|
projects = projects.order_by((Project.updated - Project.created).desc())
|
|
else:
|
|
projects = projects.order_by(Project.updated.desc())
|
|
|
|
projects, pagination = paginate_query(projects)
|
|
|
|
features = (Feature.query
|
|
.join(Project, Feature.project_id == Project.id)
|
|
.join(User, Project.owner_id == User.id)
|
|
.filter(Project.visibility == Visibility.public)
|
|
.order_by(Feature.created.desc())
|
|
.limit(5)).all()
|
|
|
|
tags = db.engine.execute("""
|
|
SELECT count(*) count, unnest(tags) tag
|
|
FROM project
|
|
GROUP BY tag
|
|
ORDER BY count DESC
|
|
LIMIT 12;
|
|
""")
|
|
tags = [(row[0], row[1]) for row in tags]
|
|
|
|
return render_template("project-index.html", projects=projects,
|
|
search=search, features=features, sort=sort, **pagination,
|
|
search_keys=["sort"], search_error=search_error,
|
|
tags=tags)
|
|
|
|
@public.route("/projects/featured")
|
|
def featured_projects():
|
|
features = (Feature.query
|
|
.join(Project, Feature.project_id == Project.id)
|
|
.join(User, Project.owner_id == User.id)
|
|
.filter(Project.visibility == Visibility.public)
|
|
.order_by(Feature.created.desc()))
|
|
features, pagination = paginate_query(features)
|
|
return render_template("featured-projects.html",
|
|
features=features, **pagination)
|