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