Implement ticket submission

This commit is contained in:
Drew DeVault 2017-09-13 08:17:52 -04:00
parent 970d62a545
commit e4048c9efc
7 changed files with 53 additions and 146 deletions

View File

@ -74,31 +74,6 @@
class="nav-link"
href="#">closed tickets</a>
</li>
<li class="nav-item">
<a
class="nav-link"
href="#">board owner</a>
</li>
<li class="nav-item">
<a
class="nav-link"
href="#">can add</a>
</li>
<li class="nav-item">
<a
class="nav-link"
href="#">arbitrary tabs</a>
</li>
<li class="nav-item">
<a
class="nav-link"
href="#">users can also</a>
</li>
<li class="nav-item">
<a
class="nav-link"
href="#">add personal ones</a>
</li>
</ul>
<table class="table table-striped">
<thead>
@ -110,66 +85,18 @@
</tr>
</thead>
<tbody>
{% for n in range(0, 3) %}
{% for ticket in tracker.tickets %}
<tr>
<td><a href="#">#1289</a></td>
<td>Won't start weston-terminal if WLC_XWAYLAND != 0</td>
<td>3 days ago</td>
<td><a href="#">johalun</a></td>
</tr>
<tr>
<td><a href="#">#1287</a></td>
<td>Variable prefix of another variable</td>
<td>5 days ago</td>
<td><a href="#">emersion</a></td>
</tr>
<tr>
<td><a href="#">#1286</a></td>
<td>Remove titlebar in tabbed mode too</td>
<td>6 days ago</td>
<td><a href="#">ormung</a></td>
</tr>
<tr>
<td><a href="#">#1284</a></td>
<td>Memory leaks in swaybar</td>
<td>11 days ago</td>
<td><a href="#">4e554c4c</a></td>
</tr>
<tr>
<td><a href="#">#1278</a></td>
<td>Chromium (Aura) context menus do not hold window focus.</td>
<td>14 days ago</td>
<td><a href="#">Zach-Button</a></td>
</tr>
<tr>
<td><a href="#">#1266</a></td>
<td>Inconsistent Caps Lock behavior</td>
<td>19 days ago</td>
<td><a href="#">zasma</a></td>
</tr>
<tr>
<td><a href="#">#1260</a></td>
<td>Sway on Void</td>
<td>23 days ago</td>
<td><a href="#">julio641742</a></td>
</tr>
<tr>
<td><a href="#">#1245</a></td>
<td>swaygrab appears to interpret spaces in filename</td>
<td>Jun 19</td>
<td><a href="#">louisch</a></td>
</tr>
<tr>
<td><a href="#">#1230</a></td>
<td>Build failure - gcc: fatal error: cannot specify -o with -c, -S, or -E with multiple files</td>
<td>May 30</td>
<td><a href="#">ng-0</a></td>
</tr>
<tr>
<td><a href="#">#1229</a></td>
<td>sway floating &gt; spawns at the top left corner instead of at the middle of the screen</td>
<td>May 25</td>
<td><a href="#">narutowindy</a></td>
<td><a href="{{url_for(".ticket_GET",
owner="~" + tracker.owner.username,
name=name,
ticket_id=ticket.id)}}">#{{ticket.id}}</a></td>
<td>{{ ticket.title }}</td>
<td>{{ ticket.updated | date }}</td>
<td><a href="{{url_for(".ticket_GET",
owner="~" + tracker.owner.username,
name=name,
ticket_id=ticket.id)}}">{{ ticket.submitter.username }}</a></td>
</tr>
{% endfor %}
</tbody>

View File

@ -1,6 +1,7 @@
from .flagtype import FlagType
from .user import User
from .ticketaccess import TicketAccess
from .ticketstatus import TicketStatus, TicketResolution
from .tracker import Tracker
from .ticket import Ticket
from .ticketsubscription import TicketSubscription

View File

@ -1,7 +1,6 @@
import sqlalchemy as sa
from srht.database import Base
from todosrht.types import FlagType, TicketAccess
from enum import Enum
from todosrht.types import FlagType, TicketAccess, TicketStatus, TicketResolution
class Ticket(Base):
__tablename__ = 'ticket'
@ -12,6 +11,11 @@ class Ticket(Base):
tracker_id = sa.Column(sa.Integer, sa.ForeignKey("tracker.id"), nullable=False)
tracker = sa.orm.relationship("Tracker", backref=sa.orm.backref("tickets"))
dupe_of_id = sa.Column(sa.Integer, sa.ForeignKey("ticket.id"))
dupe_of = sa.orm.relationship("Ticket",
backref=sa.orm.backref("dupes"),
remote_side=[id])
submitter_id = sa.Column(sa.Integer, sa.ForeignKey("user.id"), nullable=False)
submitter = sa.orm.relationship("User", backref=sa.orm.backref("submitted"))
@ -19,6 +23,14 @@ class Ticket(Base):
description = sa.Column(sa.Unicode(16384), nullable=False)
user_agent = sa.Column(sa.Unicode(2048))
status = sa.Column(FlagType(TicketStatus),
nullable=False,
default=TicketStatus.reported)
resolution = sa.Column(FlagType(TicketResolution),
nullable=False,
default=TicketStatus.resolved)
user_perms = sa.Column(FlagType(TicketAccess),
default=TicketAccess.browse + TicketAccess.submit + TicketAccess.comment)
"""Permissions given to any logged in user"""

View File

@ -1,39 +0,0 @@
import sqlalchemy as sa
import sqlalchemy_utils as sau
from srht.database import Base
from todosrht.types import FlagType, TicketAccess
from enum import Enum
class TicketFieldType(Enum):
string = "string"
"""A single line of text"""
multiline = "multiline"
"""Multiple lines of text"""
markdown = "markdown"
"""Markdown text"""
# TODO: option, multioption, boolean
user_agent = "user_agent"
"""Value of User-Agent header when ticket is submitted"""
# TODO: decoded user agent fields
# TODO: user, user_list, git_tag, git_repo
class TicketField(Base):
"""
Represents a field given to the user to fill out. All tickets have a few
fields like name and submitter that cannot be changed.
"""
__tablename__ = 'ticket_field'
id = sa.Column(sa.Integer, primary_key=True)
created = sa.Column(sa.DateTime, nullable=False)
updated = sa.Column(sa.DateTime, nullable=False)
tracker_id = sa.Column(sa.Integer, sa.ForeignKey("tracker.id"), nullable=False)
tracker = sa.orm.relationship("Tracker", backref=sa.orm.backref("fields"))
label = sa.Column(sa.Unicode(1024))
field_type = sa.Column(sau.ChoiceType(TicketFieldType), nullable=False)
order = sa.Column(sa.Integer, nullable=False, default=0)
requried = sa.Column(sa.Boolean, nullable=False, default=False)
default_value = sa.Column(sa.Unicode(16384))
default_perms = sa.Column(FlagType(TicketAccess),
nullable=False,
default=TicketAccess.edit)
"""Users with this level of access to the ticket can edit this field"""

View File

@ -1,20 +0,0 @@
import sqlalchemy as sa
from srht.database import Base
class TicketFieldValue(Base):
"""Associates a ticket field with its values for a given ticket"""
__tablename__ = 'ticket_field_value'
id = sa.Column(sa.Integer, primary_key=True)
created = sa.Column(sa.DateTime, nullable=False)
updated = sa.Column(sa.DateTime, nullable=False)
ticket_id = sa.Column(sa.Integer, sa.ForeignKey("ticket.id"))
"""
Note: this can be None if the ticket was edited; we keep the row around for
the audit log and keep the association via the audit log table
"""
ticket = sa.orm.relationship("Ticket", backref=sa.orm.backref("fields"))
ticket_field_id = sa.Column(sa.Integer,
sa.ForeignKey("ticket_field.id"),
nullable=False)
ticket_field = sa.orm.relationship("TicketField")
string_value = sa.Column(sa.Unicode(16384))

View File

@ -0,0 +1,18 @@
from enum import IntFlag
class TicketStatus(IntFlag):
reported = 0
confirmed = 1
in_progress = 2
pending = 4
resolved = 8
shipped = 16
class TicketResolution(IntFlag):
unresolved = 0
fixed = 1
implemented = 2
wont_fix = 4
by_design = 8
invalid = 16
duplicate = 32

View File

@ -1,6 +1,6 @@
import sqlalchemy as sa
from srht.database import Base
from todosrht.types import TicketAccess, FlagType
from todosrht.types import FlagType, TicketAccess, TicketStatus, TicketResolution
class Tracker(Base):
__tablename__ = 'tracker'
@ -18,6 +18,14 @@ class Tracker(Base):
description = sa.Column(sa.Unicode(8192))
"""Markdown"""
enable_ticket_status = sa.Column(FlagType(TicketStatus),
nullable=False,
default=TicketStatus.resolved)
enable_ticket_resolution = sa.Column(FlagType(TicketStatus),
nullable=False,
default=TicketResolution.fixed | TicketResolution.duplicate)
default_user_perms = sa.Column(FlagType(TicketAccess),
nullable=False,
default=TicketAccess.browse + TicketAccess.submit + TicketAccess.comment)