Implement ticket submission

This commit is contained in:
Drew DeVault 2017-09-13 08:02:25 -04:00
parent bb22b8d791
commit 970d62a545
3 changed files with 71 additions and 19 deletions

View File

@ -1,9 +1,10 @@
import re
import string
from flask import Blueprint, render_template, request, url_for, abort, redirect
from flask import session
from flask_login import current_user
from todosrht.decorators import loginrequired
from todosrht.types import Tracker, User
from todosrht.types import Tracker, User, Ticket
from srht.validation import Validation
from srht.database import db
@ -65,29 +66,79 @@ def create_POST():
owner="~" + current_user.username,
name=name))
@tracker.route("/<owner>/<path:name>")
def tracker_GET(owner, name):
def get_tracker(owner, name):
if owner.startswith("~"):
owner = User.query.filter(User.username == owner[1:]).first()
if not owner:
abort(404)
print(name)
return None
tracker = (Tracker.query
.filter(Tracker.owner_id == owner.id)
.filter(Tracker.name == name.lower())
).first()
if not tracker:
abort(404)
return tracker
else:
abort(404) # TODO
return render_template("tracker.html", tracker=tracker)
# TODO: org trackers
return None
@tracker.route("/<owner>/<path:name>")
def tracker_GET(owner, name):
tracker = get_tracker(owner, name)
if not tracker:
abort(404)
another = session.get("another") or False
if another:
del session["another"]
return render_template("tracker.html", tracker=tracker, another=another)
@tracker.route("/<owner>/<path:name>/configure")
@loginrequired
def tracker_configure_GET(owner, name):
pass
@tracker.route("/<owner>/<path:name>/submit")
@tracker.route("/<owner>/<path:name>/submit", methods=["POST"])
@loginrequired
def tracker_submit_GET(owner, name):
tracker = get_tracker(owner, name)
if not tracker:
abort(404)
valid = Validation(request)
title = valid.require("title", friendly_name="Title")
desc = valid.require("description", friendly_name="Description")
another = valid.optional("another")
valid.expect(not title or 3 < len(title) < 2048,
"Title must be between 3 and 2048 characters.",
field="title")
valid.expect(not desc or len(desc) < 2048,
"Description must be no more than 16384 characters.",
field="description")
if not valid.ok:
return render_template("tracker.html",
tracker=tracker,
**valid.kwargs), 400
ticket = Ticket()
ticket.submitter_id = current_user.id
ticket.tracker_id = tracker.id
ticket.user_agent = request.headers.get("User-Agent")
ticket.title = title
ticket.description = desc
db.session.add(ticket)
db.session.commit()
if another:
session["another"] = True
return redirect(url_for(".tracker_GET",
owner="~" + tracker.owner.username,
name=name))
else:
return redirect(url_for(".ticket_GET",
owner="~" + tracker.owner.username,
name=name,
ticket_id=ticket.id))
@tracker.route("/<owner>/<path:name>/<int:ticket_id>")
def ticket_GET(owner, name, ticket_id):
pass

View File

@ -12,26 +12,31 @@
<h3 style="margin-top: 1rem">Submit ticket</h3>
<form method="POST" action="{{
url_for(".tracker_submit_GET",
owner=tracker.owner.username,
owner="~" + tracker.owner.username,
name=tracker.name
)
}}">
<div class="form-group">
<div class="form-group {{ valid.cls("title") }}">
<label for="title">Title</label>
<input
type="text"
class="form-control"
maxlength="2048"
id="title"
name="title" />
name="title"
value="{{ title or "" }}" />
{{valid.summary("title")}}
</div>
<div class="form-group">
<div class="form-group {{ valid.cls("description") }}">
<label for="description">Description</label>
<textarea
class="form-control"
id="description"
name="description"
placeholder="Markdown supported"
rows="5"></textarea>
maxlength="16384"
rows="5">{{ description or "" }}</textarea>
{{valid.summary("description")}}
</div>
<button
type="submit"

View File

@ -20,21 +20,17 @@ class Ticket(Base):
user_agent = sa.Column(sa.Unicode(2048))
user_perms = sa.Column(FlagType(TicketAccess),
nullable=False,
default=TicketAccess.browse + TicketAccess.submit + TicketAccess.comment)
"""Permissions given to any logged in user"""
submitter_perms = sa.Column(FlagType(TicketAccess),
nullable=False,
default=TicketAccess.browse + TicketAccess.edit + TicketAccess.comment)
"""Permissions granted to submitters for their own tickets"""
committer_perms = sa.Column(FlagType(TicketAccess),
nullable=False,
default=TicketAccess.browse + TicketAccess.submit + TicketAccess.comment)
"""Permissions granted to people who have authored commits in the linked git repo"""
anonymous_perms = sa.Column(FlagType(TicketAccess),
nullable=False,
default=TicketAccess.browse)
"""Permissions granted to anonymous (non-logged in) users"""