mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-09-08 08:28:15 -04:00
Adding a template to create a User Story issue
This commit is contained in:
78
.github/ISSUE_TEMPLATE/issue_template.yaml
vendored
Normal file
78
.github/ISSUE_TEMPLATE/issue_template.yaml
vendored
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
name: "User Story Template"
|
||||||
|
|
||||||
|
about: "Use this template for creating user stories."
|
||||||
|
|
||||||
|
title: "User Story: [Brief description of the user story]"
|
||||||
|
|
||||||
|
labels:
|
||||||
|
- "Type: User Story"
|
||||||
|
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: '**User Story:**'
|
||||||
|
- type: textarea
|
||||||
|
id: userType
|
||||||
|
attributes:
|
||||||
|
label: "As a [type of user],"
|
||||||
|
description: "Describe the type of user involved in this story."
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: actionFeature
|
||||||
|
attributes:
|
||||||
|
label: "I want [an action or feature],"
|
||||||
|
description: "Describe the desired action or feature from the user's perspective."
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: benefitValue
|
||||||
|
attributes:
|
||||||
|
label: "So that [benefit or value]."
|
||||||
|
description: "Describe the benefit or value the user expects from the action or feature."
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: '**Acceptance Criteria:**'
|
||||||
|
- type: textarea
|
||||||
|
id: acceptanceCriteria
|
||||||
|
attributes:
|
||||||
|
label: "Detailed condition or criteria that must be met for the user story to be considered complete."
|
||||||
|
description: "List the acceptance criteria for the user story."
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: '**Tasks:**'
|
||||||
|
- type: textarea
|
||||||
|
id: tasks
|
||||||
|
attributes:
|
||||||
|
label: "List of specific tasks or sub-tasks that need to be done to implement the user story."
|
||||||
|
description: "Outline the tasks necessary to implement the user story."
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: '**Dependencies:**'
|
||||||
|
- type: textarea
|
||||||
|
id: dependencies
|
||||||
|
attributes:
|
||||||
|
label: "List any dependencies that need to be resolved before starting or completing this user story."
|
||||||
|
description: "Specify any dependencies related to the user story."
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: '**Notes:**'
|
||||||
|
- type: textarea
|
||||||
|
id: notes
|
||||||
|
attributes:
|
||||||
|
label: "Any additional information or context that might be useful for the team."
|
||||||
|
description: "Provide any extra notes or context for the user story."
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
@@ -585,7 +585,7 @@ def add_template_filters(application):
|
|||||||
format_mobile_network,
|
format_mobile_network,
|
||||||
format_yes_no,
|
format_yes_no,
|
||||||
square_metres_to_square_miles,
|
square_metres_to_square_miles,
|
||||||
convert_markdown_template
|
convert_markdown_template,
|
||||||
]:
|
]:
|
||||||
application.add_template_filter(fn)
|
application.add_template_filter(fn)
|
||||||
|
|
||||||
|
|||||||
@@ -26,18 +26,16 @@ from app.utils.time import parse_naive_dt
|
|||||||
|
|
||||||
|
|
||||||
def apply_html_class(tags, html_file):
|
def apply_html_class(tags, html_file):
|
||||||
|
|
||||||
new_html = html_file
|
new_html = html_file
|
||||||
|
|
||||||
for tag in tags:
|
for tag in tags:
|
||||||
|
|
||||||
element = tag[0]
|
element = tag[0]
|
||||||
class_name = tag[1]
|
class_name = tag[1]
|
||||||
|
|
||||||
soup = BeautifulSoup(new_html, 'html.parser')
|
soup = BeautifulSoup(new_html, "html.parser")
|
||||||
|
|
||||||
for xtag in soup.find_all(element):
|
for xtag in soup.find_all(element):
|
||||||
xtag['class'] = class_name
|
xtag["class"] = class_name
|
||||||
|
|
||||||
new_html = str(soup)
|
new_html = str(soup)
|
||||||
|
|
||||||
@@ -45,12 +43,11 @@ def apply_html_class(tags, html_file):
|
|||||||
|
|
||||||
|
|
||||||
def convert_markdown_template(mdf, test=False):
|
def convert_markdown_template(mdf, test=False):
|
||||||
|
|
||||||
content_text = ""
|
content_text = ""
|
||||||
|
|
||||||
if not test:
|
if not test:
|
||||||
APP_ROOT = get_root_path('notifications-admin')
|
APP_ROOT = get_root_path("notifications-admin")
|
||||||
file = 'app/content/' + mdf + '.md'
|
file = "app/content/" + mdf + ".md"
|
||||||
md_file = os.path.join(APP_ROOT, file)
|
md_file = os.path.join(APP_ROOT, file)
|
||||||
with open(md_file) as f:
|
with open(md_file) as f:
|
||||||
content_text = f.read()
|
content_text = f.read()
|
||||||
|
|||||||
@@ -138,16 +138,20 @@ def get_started_old():
|
|||||||
@main.route("/using-notify/get-started")
|
@main.route("/using-notify/get-started")
|
||||||
@user_is_logged_in
|
@user_is_logged_in
|
||||||
def get_started():
|
def get_started():
|
||||||
markdown = convert_markdown_template('get-started')
|
markdown = convert_markdown_template("get-started")
|
||||||
html_style = apply_html_class([['ol', 'usa-process-list'],
|
html_style = apply_html_class(
|
||||||
['li', 'usa-process-list__item padding-bottom-4 margin-top-2'],
|
[
|
||||||
['h2', 'usa-process-list__heading line-height-sans-3']],
|
["ol", "usa-process-list"],
|
||||||
markdown)
|
["li", "usa-process-list__item padding-bottom-4 margin-top-2"],
|
||||||
|
["h2", "usa-process-list__heading line-height-sans-3"],
|
||||||
|
],
|
||||||
|
markdown,
|
||||||
|
)
|
||||||
|
|
||||||
return render_template(
|
return render_template(
|
||||||
"views/get-started.html",
|
"views/get-started.html",
|
||||||
navigation_links=using_notify_nav(),
|
navigation_links=using_notify_nav(),
|
||||||
content=html_style
|
content=html_style,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -174,16 +174,23 @@ def test_format_delta():
|
|||||||
def test_jinja_format(fake_jinja_template):
|
def test_jinja_format(fake_jinja_template):
|
||||||
app = Flask("app")
|
app = Flask("app")
|
||||||
with app.app_context():
|
with app.app_context():
|
||||||
assert convert_markdown_template(fake_jinja_template, test=True) == "<p>True</p>"
|
assert (
|
||||||
|
convert_markdown_template(fake_jinja_template, test=True) == "<p>True</p>"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.usefixtures("fake_markdown_file")
|
@pytest.mark.usefixtures("fake_markdown_file")
|
||||||
def test_markdown_format(fake_markdown_file):
|
def test_markdown_format(fake_markdown_file):
|
||||||
app = Flask("app")
|
app = Flask("app")
|
||||||
with app.app_context():
|
with app.app_context():
|
||||||
assert convert_markdown_template(fake_markdown_file, test=True) == "<h1>Test</h1>"
|
assert (
|
||||||
|
convert_markdown_template(fake_markdown_file, test=True) == "<h1>Test</h1>"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.usefixtures("fake_soup_template")
|
@pytest.mark.usefixtures("fake_soup_template")
|
||||||
def test_soup_format(fake_soup_template):
|
def test_soup_format(fake_soup_template):
|
||||||
assert apply_html_class([['h1', 'testClass']], fake_soup_template) == '<h1 class="testClass">Test</h1>'
|
assert (
|
||||||
|
apply_html_class([["h1", "testClass"]], fake_soup_template)
|
||||||
|
== '<h1 class="testClass">Test</h1>'
|
||||||
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user