hub.sr.ht/hubsrht/blueprints/public.py

90 lines
3.5 KiB
Python
Raw Permalink Normal View History

from sqlalchemy.sql import operators
from flask import Blueprint, render_template, request, session
2020-04-28 20:08:56 +02:00
from hubsrht.types import Project, Feature, Event, EventType, Visibility, User
from srht.database import db
2020-04-27 17:45:53 +02:00
from srht.flask import paginate_query
from srht.oauth import current_user, loginrequired
2020-04-28 18:00:15 +02:00
from srht.search import search_by
2020-03-24 15:26:15 +01:00
public = Blueprint("public", __name__)
@public.route("/")
def index():
if current_user:
notice = session.pop("notice", None)
2020-04-27 17:45:53 +02:00
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)
2020-04-27 17:45:53 +02:00
@public.route("/getting-started")
@loginrequired
def getting_started():
notice = session.pop("notice", None)
return render_template("new-user-dashboard.html", notice=notice)
2020-04-28 17:12:11 +02:00
@public.route("/projects")
def project_index():
projects = Project.query.filter(Project.visibility == Visibility.PUBLIC)
2020-04-28 18:00:15 +02:00
search = request.args.get("search")
search_error = None
2020-04-28 18:00:15 +02:00
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)
2020-04-28 18:00:15 +02:00
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())
2020-04-28 17:12:11 +02:00
projects, pagination = paginate_query(projects)
2020-04-28 18:00:15 +02:00
2020-04-28 20:08:56 +02:00
features = (Feature.query
.join(Project, Feature.project_id == Project.id)
.join(User, Project.owner_id == User.id)
.filter(Project.visibility == Visibility.PUBLIC)
2020-04-28 20:08:56 +02:00
.order_by(Feature.created.desc())
.limit(5)).all()
2020-04-28 18:00:15 +02:00
return render_template("project-index.html", projects=projects,
2020-08-21 17:58:30 +02:00
search=search, features=features, sort=sort, **pagination,
2021-11-28 11:26:59 +01:00
search_keys=["sort"], search_error=search_error)
2020-08-01 18:34:32 +02:00
@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)
2020-08-01 18:34:32 +02:00
.order_by(Feature.created.desc()))
features, pagination = paginate_query(features)
return render_template("featured-projects.html",
features=features, **pagination)