diff --git a/docassemble/GithubFeedbackForm/data/questions/browse_feedback_sessions.yml b/docassemble/GithubFeedbackForm/data/questions/browse_feedback_sessions.yml index ce45e5c..55cd159 100644 --- a/docassemble/GithubFeedbackForm/data/questions/browse_feedback_sessions.yml +++ b/docassemble/GithubFeedbackForm/data/questions/browse_feedback_sessions.yml @@ -24,38 +24,35 @@ question: | subquestion: | ${ action_button_html(url_action('toggle_archived'), label="Show archived" if not show_archived else "Hide archived", color="secondary")} - ${ tabbed_templates_html("Feedback tabs", reviews_table_template, feedback_select_template)} -help: - label: | - View Panelists - content: | - ${ view_panelists } + ${ tabbed_templates_html("Feedback tabs", reviews_table_template, feedback_select_template, view_panelists)} --- template: reviews_table_template subject: Review Scores content: | ${ collapse_template(what_are_reviews_template) } - Interview file | Version | Number of reviews | Average Score - -------------- |---------|-------------------|--------------- + + + % for review_agg in get_good_or_bad(): - ${ review_agg['interview'] } | ${ review_agg['version'] } | ${ review_agg['count'] } | ${ str(round(review_agg['average'] * 1000)/1000) } + % endfor + +
Interview fileVersionNumber of reviewsAverage Score
${ review_agg['interview'] }${ review_agg['version'] }${ review_agg['count'] }${ str(round(review_agg['average'] * 1000)/1000) }
--- template: feedback_select_template subject: Open answer feedback content: | - % for interview, review_list in text_reviews.items(): -

In ${ interview }

+ % for idx, (interview, review_list) in enumerate(text_reviews.items()): +
+ ${ fa_icon("caret-down") }${ fa_icon("caret-right") } In ${ interview } +
% for review in review_list: % if review['archived']: - **ARCHIVED** +

ARCHIVED

% endif - - On ${ review['datetime'] }: - - > ${ review['body'] } - +

On ${ review['datetime'] }:

+
${ markdown_to_html(review['body']) }
% if not review.get('html_url'): % if review.get('github_user'): ${ action_button_html(prefill_github_issue_url(repo_owner=review.get('github_user'), repo_name=review.get('github_repo_name'), title="User feedback", body=review['body'], label=al_github_label), label="Make a github issue") } @@ -63,8 +60,7 @@ content: | ${ action_button_html(prefill_github_issue_url(repo_name=interview.split(":")[0].replace(".", "-"), title="User feedback", body=review['body'], label=al_github_label), label="Make a github issue") } % endif % else: - [Link to Github issue](${ review.get('html_url') }) - + Link to GitHub issue % endif % if review.get('session_id'): ${ action_button_html(url_action('open_session', interview=review['interview'], session_id=review.get('session_id')), label='Open Session', color='secondary') } @@ -72,11 +68,10 @@ content: | % if not review['archived']: ${ action_button_html(url_action('mark_as_archived', feedback_id=review['id']), label="Archive", color="danger")} % endif - - --- - +
% endfor - +
+
% endfor --- template: what_are_reviews_template @@ -92,6 +87,7 @@ content: | affect people's reviews. --- template: view_panelists +subject: View Panelists content: | % for email_and_time in potential_panelists(): % if isinstance(email_and_time[0], bytes): diff --git a/docassemble/GithubFeedbackForm/feedback_on_server.py b/docassemble/GithubFeedbackForm/feedback_on_server.py index fd554f1..bd6fa3f 100644 --- a/docassemble/GithubFeedbackForm/feedback_on_server.py +++ b/docassemble/GithubFeedbackForm/feedback_on_server.py @@ -25,6 +25,7 @@ from alembic.config import Config from alembic import command from docassemble.base.util import DARedis, log +from docassemble.base.filter import markdown_to_html from docassemble.base.sql import alchemy_url, connect_args __all__ = [ @@ -37,6 +38,7 @@ "get_all_feedback_info", "save_good_or_bad", "get_good_or_bad", + "markdown_to_html", ] redis_panel_emails_key = "docassemble-GithubFeedbackForm:panel_emails" @@ -211,6 +213,7 @@ def get_all_feedback_info(interview=None, include_archived=False) -> Iterable: stmt = stmt.where(feedback_session_table.c.interview == interview) if not include_archived: stmt = stmt.where(feedback_session_table.c.archived == False) + stmt = stmt.order_by(desc(feedback_session_table.c.datetime)) with engine.begin() as conn: results = conn.execute(stmt) # Turn into literal dict because DA is too eager to save / load SQLAlchemy objects into the interview SQL diff --git a/pyproject.toml b/pyproject.toml index 5c91454..d84858a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,6 +48,7 @@ dev = [ "docassemble.base>=1.4", "docassemble.webapp", "mypy", + "pytest", "types-requests", "testcontainers", ]