Skip to content

Commit 75a32d2

Browse files
authored
fix: Link to reviews from search status column (ietf-tools#3955)
* fix: Link to reviews from search status column Fixes ietf-tools#3953 * fix: Make the notices about exceeded state times less obtrusive * Fix tests
1 parent b265bac commit 75a32d2

5 files changed

Lines changed: 42 additions & 28 deletions

File tree

ietf/doc/templatetags/ballot_icon.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -204,18 +204,18 @@ def state_age_colored(doc):
204204
goal1 = 14
205205
goal2 = 28
206206
if days > goal2:
207-
class_name = "badge bg-danger"
207+
class_name = "text-danger"
208208
elif days > goal1:
209-
class_name = "badge bg-warning"
209+
class_name = "text-warning"
210210
else:
211-
class_name = "badge bg-success"
211+
# don't show a badge when things are in the green; clutters display
212+
# class_name = "text-success"
213+
return ""
212214
if days > goal1:
213-
title = ' title="Goal is <%d days"' % (goal1,)
215+
title = ' title="In state for %d day%s; goal is <%d days."' % (days, 's' if days != 1 else '', goal1,)
214216
else:
215217
title = ''
216-
return mark_safe('<span class="%s"%s>for %d day%s</span>' % (
217-
class_name, title, days,
218-
's' if days != 1 else ''))
218+
return mark_safe('<span class="%s"><i class="bi bi-hourglass-split"%s></i></span>' % (class_name, title))
219219
else:
220220
return ""
221221

@@ -233,4 +233,4 @@ def auth48_alert_badge(doc):
233233
if rfced_state == 'auth48':
234234
return mark_safe('<span class="badge bg-info" title="AUTH48">AUTH48</span>')
235235

236-
return ''
236+
return ''

ietf/doc/templatetags/ietf_filters.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -719,20 +719,20 @@ def action_holder_badge(action_holder):
719719
''
720720
721721
>>> action_holder_badge(DocumentActionHolderFactory(time_added=datetime.datetime.now() - datetime.timedelta(days=16)))
722-
'<span class="badge bg-danger" title="Goal is &lt;15 days">for 16 days</span>'
722+
'<span class="text-danger"><i class="bi bi-hourglass-split" title="In state for 16 days; goal is &lt;15 days."></i></span>'
723723
724724
>>> action_holder_badge(DocumentActionHolderFactory(time_added=datetime.datetime.now() - datetime.timedelta(days=30)))
725-
'<span class="badge bg-danger" title="Goal is &lt;15 days">for 30 days</span>'
725+
'<span class="text-danger"><i class="bi bi-hourglass-split" title="In state for 30 days; goal is &lt;15 days."></i></span>'
726726
727727
>>> settings.DOC_ACTION_HOLDER_AGE_LIMIT_DAYS = old_limit
728728
"""
729729
age_limit = settings.DOC_ACTION_HOLDER_AGE_LIMIT_DAYS
730730
age = (datetime.datetime.now() - action_holder.time_added).days
731731
if age > age_limit:
732-
return mark_safe('<span class="badge bg-danger" title="Goal is &lt;%d days">for %d day%s</span>' % (
733-
age_limit,
732+
return mark_safe('<span class="text-danger"><i class="bi bi-hourglass-split" title="In state for %d day%s; goal is &lt;%d days."></i></span>' % (
734733
age,
735-
's' if age != 1 else ''))
734+
's' if age != 1 else '',
735+
age_limit))
736736
else:
737737
return '' # no alert needed
738738

ietf/doc/tests.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -356,8 +356,8 @@ def test_recent_drafts(self):
356356
self.assertEqual(r.status_code, 200)
357357
q = PyQuery(r.content)
358358
self.assertEqual(len(q('td.doc')),3)
359-
self.assertEqual(q('td.status span.badge.bg-warning').text(),"for 15 days")
360-
self.assertEqual(q('td.status span.badge.bg-danger').text(),"for 29 days")
359+
self.assertTrue(q('td.status span.text-warning *[title*="%s"]' % "for 15 days"))
360+
self.assertTrue(q('td.status span.text-danger *[title*="%s"]' % "for 29 days"))
361361
for ah in [draft.action_holders.first() for draft in drafts]:
362362
self.assertContains(r, escape(ah.name))
363363

@@ -1297,8 +1297,8 @@ def test_edit_authors_edit_fields(self):
12971297
@staticmethod
12981298
def _pyquery_select_action_holder_string(q, s):
12991299
"""Helper to use PyQuery to find an action holder in the draft HTML"""
1300-
# selector grabs the action holders heading and finds siblings with a div containing the search string
1301-
return q('th:contains("Action Holder") ~ td>div:contains("%s")' % s)
1300+
# selector grabs the action holders heading and finds siblings with a div containing the search string (also in any title attribute)
1301+
return q('th:contains("Action Holder") ~ td>div:contains("%s"), th:contains("Action Holder") ~ td>div *[title*="%s"]' % (s, s))
13021302

13031303
@mock.patch.object(Document, 'action_holders_enabled', return_value=False, new_callable=mock.PropertyMock)
13041304
def test_document_draft_hides_action_holders(self, mock_method):
@@ -2852,4 +2852,4 @@ def test_pdfized(self):
28522852
self.should_succeed(dict(name=rfc.name,rev=f'{r:02d}'))
28532853
for ext in ('pdf','txt','html','anythingatall'):
28542854
self.should_succeed(dict(name=rfc.name,rev=f'{r:02d}',ext=ext))
2855-
self.should_404(dict(name=rfc.name,rev='02'))
2855+
self.should_404(dict(name=rfc.name,rev='02'))

ietf/doc/utils_search.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from ietf.doc.expire import expirable_drafts
1010
from ietf.doc.utils import augment_docs_and_user_with_user_info
1111
from ietf.meeting.models import SessionPresentation, Meeting, Session
12+
from ietf.review.utils import review_assignments_to_list_for_docs
1213

1314
def wrap_value(v):
1415
return lambda: v
@@ -112,7 +113,7 @@ def fill_in_document_table_attributes(docs, have_telechat_date=False):
112113

113114
if d.get_state_slug() != "rfc":
114115
d.milestones = [ m for (t, s, v, m) in sorted(((m.time, m.state.slug, m.desc, m) for m in d.groupmilestone_set.all() if m.state_id == "active")) ]
115-
d.reviewed_by_teams = sorted(set(r.team.acronym for r in d.reviewrequest_set.filter(state__in=["assigned","accepted","part-completed","completed"]).distinct().select_related('team')))
116+
d.review_assignments = review_assignments_to_list_for_docs([d]).get(d.name, [])
116117

117118
e = d.latest_event_cache.get('started_iesg_process', None)
118119
d.balloting_started = e.time if e else datetime.datetime.min
@@ -255,4 +256,4 @@ def num(i):
255256
else:
256257
d["sort"] = h["key"]
257258

258-
return (docs, meta)
259+
return (docs, meta)

ietf/templates/doc/search/status_columns.html

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,27 @@
4646
<br>
4747
Due date: {{ doc.duedate }}
4848
{% endif %}
49-
{% if doc.reviewed_by_teams %}
49+
{% if doc.review_assignments %}
5050
<br>
51-
Review{{ doc.reviewed_by_teams|pluralize }}:
52-
{% spaceless %}
53-
{% for acronym in doc.reviewed_by_teams %}
54-
<a href="{% url "ietf.group.views.group_home" acronym=acronym %}">{{ acronym }}</a>{% if not forloop.last %},{% endif %}
55-
{% endfor %}
56-
{% endspaceless %}
51+
Review{{ doc.review_assignments|pluralize }}:
52+
{% for review_assignment in doc.review_assignments %}
53+
{% if review_assignment.state_id == "completed" or review_assignment.state_id == "part-completed" %}
54+
<span title="{{ review_assignment.review_request.team.acronym|upper }} {{ review_assignment.review_request.type.name }} review {% if review_assignment.reviewed_rev and review_assignment.reviewed_rev != current_rev or review_assignment.review_request.doc.name != current_doc_name %}of {% if review_assignment.review_request.doc.name != current_doc_name %}{{ review_assignment.review_request.doc.name }}{% endif %}-{{ review_assignment.reviewed_rev }}{% endif %}: {{review_assignment.result}}"
55+
class="badge {% if review_assignment.result.name|slice:5|slugify == 'ready' %}bg-success{% elif review_assignment.result.name|slice:9|slugify == 'not-ready' %}bg-danger{% elif review_assignment.result.name|slice:10|slugify == 'has-issues' %}bg-warning{% else %}bg-info{% endif %}">
56+
{% else %}
57+
<span title="Incomplete, due {{ review_assignment.review_request.deadline|date:"Y-m-d" }}" class="badge bg-secondary">
58+
{% endif %}
59+
<a class="text-reset text-decoration-none" href="{% if review_assignment.review %}{% url 'ietf.doc.views_doc.document_main' review_assignment.review.name %}{% else %}{% url 'ietf.doc.views_review.review_request' review_assignment.review_request.doc.name review_assignment.review_request.pk %}{% endif %}">
60+
{{ review_assignment.review_request.team.acronym }}
61+
{% if review_assignment.review_request.type|slugify == "last-call" %}
62+
LC
63+
{% elif review_assignment.review_request.type|slugify != "telechat" %}
64+
{{ review_assignment.review_request.type }}
65+
{% endif %}
66+
</a>
67+
</span>
68+
69+
{% endfor %}
5770
{% endif %}
5871
{% for m in doc.milestones %}
5972
{% if forloop.first %}<br>{% endif %}
@@ -79,4 +92,4 @@
7992
<span class="text-muted">Updated by {{ doc.updated_by_list|join:", "|urlize_ietf_docs }}</span>
8093
{% endif %}
8194
{% endif %}
82-
</td>
95+
</td>

0 commit comments

Comments
 (0)