43 lines
1.8 KiB
Python
43 lines
1.8 KiB
Python
# retoor <retoor@molodetz.nl>
|
|
import hashlib
|
|
|
|
from fastapi import APIRouter, Request
|
|
|
|
from molodetz import config
|
|
from molodetz.database import admin_uids_ordered, insert_join_request
|
|
from molodetz.dependencies import json_or_form
|
|
from molodetz.models import JoinForm
|
|
from molodetz.responses import action_result, respond
|
|
from molodetz.schemas.joins import JoinPageOut
|
|
from molodetz.seo import base_seo_context
|
|
from molodetz.seo_meta_text import description_for
|
|
from molodetz.utils.audit import record
|
|
from molodetz.utils.notifications import create_notification
|
|
from molodetz.utils.request_meta import client_ip
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
def _seo(request):
|
|
return base_seo_context(request, "Binnen", description_for("binnen"), breadcrumbs=[("Molodetz", "/"), ("Binnen", "/binnen")])
|
|
|
|
|
|
@router.get("")
|
|
async def join_page(request: Request):
|
|
submitted = request.query_params.get("ok") == "1"
|
|
return respond(request, "binnen.html", {"submitted": submitted, "errors": [], "form": {}, "seo": _seo(request)}, model=JoinPageOut)
|
|
|
|
|
|
@router.post("")
|
|
async def join_submit(request: Request):
|
|
data = await json_or_form(request, JoinForm)
|
|
if data.website:
|
|
record(request, "join.request.honeypot", result="denied")
|
|
return action_result(request, "/binnen?ok=1")
|
|
ip_hash = hashlib.sha256(f"{config.SECRET_KEY}:{client_ip(request)}".encode()).hexdigest()[:24]
|
|
row = insert_join_request(data.name, data.contact, data.repo_url, data.message, ip_hash)
|
|
record(request, "join.request.create", payload={"uid": row["uid"]}, targets=[("join_request", row["uid"])])
|
|
for uid in admin_uids_ordered():
|
|
create_notification(uid, "join.request", f"{data.name} wil meeschrijven", "/admin/joins")
|
|
return action_result(request, "/binnen?ok=1", data={"uid": row["uid"]})
|