Implement ticket submission
This commit is contained in:
parent
bb22b8d791
commit
970d62a545
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"""
|
||||
|
|
Loading…
Reference in New Issue