Merge lp:~rvb/maas/nel-ui into lp:~maas-committers/maas/trunk

Proposed by Raphaël Badin
Status: Merged
Approved by: Raphaël Badin
Approved revision: no longer in the source branch.
Merged at revision: 3056
Proposed branch: lp:~rvb/maas/nel-ui
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 149 lines (+40/-20)
4 files modified
src/maasserver/static/css/components/table_list.css (+4/-0)
src/maasserver/templates/maasserver/node_event_list_snippet.html (+7/-10)
src/maasserver/testing/factory.py (+6/-3)
src/maasserver/views/tests/test_nodes.py (+23/-7)
To merge this branch: bzr merge lp:~rvb/maas/nel-ui
Reviewer Review Type Date Requested Status
Jeroen T. Vermeulen (community) Approve
Review via email: mp+235584@code.launchpad.net

Commit message

Improve the node event log UI: display the event time as "time since", use proper dash sign in display, add support for debug-level events.

Description of the change

To post a comment you must log in.
Revision history for this message
Jeroen T. Vermeulen (jtv) wrote :

Wow. The GTF didn't have any entries for NEL yet. Thanks for filling that gap.

I was wondering what you meant by “proper dash sign” — this kind of dash is called an emdash. The shorter one is an endash. They're both proper, just for different situations. I love them both. :)

Two very minor notes:

1. Could you break that long line in the template?

2. Would it be worth displaying a timezone?

review: Approve
Revision history for this message
Raphaël Badin (rvb) wrote :

> I was wondering what you meant by “proper dash sign” — this kind of dash is
> called an emdash. The shorter one is an endash. They're both proper, just
> for different situations. I love them both. :)

The template was using '--' before this change. Hence me using the word 'proper'.

> Two very minor notes:
>
> 1. Could you break that long line in the template?

Done.

> 2. Would it be worth displaying a timezone?

I've added it (in the full date you get when hovering over a "1 day ago" display).

Thanks for the review!

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/maasserver/static/css/components/table_list.css'
2--- src/maasserver/static/css/components/table_list.css 2014-08-13 21:49:35 +0000
3+++ src/maasserver/static/css/components/table_list.css 2014-09-23 09:46:17 +0000
4@@ -42,6 +42,10 @@
5 text-align: right;
6 }
7
8+table.list tr.debug {
9+ color: #AAA;
10+ }
11+
12 table.list tr.warning {
13 background-color: #FEEFB3;
14 }
15
16=== modified file 'src/maasserver/templates/maasserver/node_event_list_snippet.html'
17--- src/maasserver/templates/maasserver/node_event_list_snippet.html 2014-09-18 03:15:07 +0000
18+++ src/maasserver/templates/maasserver/node_event_list_snippet.html 2014-09-23 09:46:17 +0000
19@@ -4,23 +4,20 @@
20 <thead>
21 <tr>
22 <th>Level</th>
23- <th>Timestamp</th>
24+ <th>Emitted</th>
25 <th>Event</th>
26 </tr>
27 </thead>
28 <tbody>
29 {% for event_item in event_list %}
30- <tr {% if event_item.type.level_str == 'WARNING' %} class="warning"
31- {% elif event_item.type.level_str == 'ERROR' %} class="error"
32- {% elif event_item.type.level_str == 'CRITICAL' %} class="critical"
33- {% endif %} id="{{ event_item.id }}">
34+ <tr class="{{ event_item.type.level_str|lower }}" id="{{ event_item.id }}">
35 <td width="10%">{{ event_item.type.level_str }}</td>
36- <td width="30%">{{ event_item.created|date:'Y-m-d H:i:s' }}</td>
37+ <td width="30%" title="{{ event_item.created|date:'r' }}">
38+ {{ event_item.created|timesince }} ago
39+ </td>
40 <td class="event_description">
41- {{ event_item.type.description }}
42- {% if event_item.description %}
43- -- {{ event_item.description }}
44- {% endif %}
45+ {{ event_item.type.description }}
46+ {% if event_item.description %} &mdash; {{ event_item.description }}{% endif %}
47 </td>
48 <td></td>
49 </tr>
50
51=== modified file 'src/maasserver/testing/factory.py'
52--- src/maasserver/testing/factory.py 2014-09-19 12:48:48 +0000
53+++ src/maasserver/testing/factory.py 2014-09-23 09:46:17 +0000
54@@ -989,16 +989,19 @@
55 description = factory.make_name('description')
56 if level is None:
57 level = random.choice([
58- logging.ERROR, logging.WARNING, logging.INFO])
59+ logging.ERROR, logging.WARNING, logging.INFO, logging.DEBUG])
60 return EventType.objects.create(
61 name=name, description=description, level=level)
62
63- def make_Event(self, node=None, type=None):
64+ def make_Event(self, node=None, type=None, description=None):
65 if node is None:
66 node = self.make_Node()
67 if type is None:
68 type = self.make_EventType()
69- return Event.objects.create(node=node, type=type)
70+ if description is None:
71+ description = self.make_name('desc')
72+ return Event.objects.create(
73+ node=node, type=type, description=description)
74
75 def make_LargeFile(self, content=None, size=512):
76 """Create `LargeFile`.
77
78=== modified file 'src/maasserver/views/tests/test_nodes.py'
79--- src/maasserver/views/tests/test_nodes.py 2014-09-19 09:40:37 +0000
80+++ src/maasserver/views/tests/test_nodes.py 2014-09-23 09:46:17 +0000
81@@ -97,6 +97,10 @@
82 )
83
84
85+def normalize_text(text):
86+ return ' '.join(text.split())
87+
88+
89 class TestGenerateJSPowerTypes(MAASServerTestCase):
90 def patch_power_types(self, enum):
91 """Make `get_power_types` return the given `enum` dict."""
92@@ -1245,13 +1249,19 @@
93 for _ in range(NodeView.number_of_events_shown)
94 ]
95 response = self.client.get(reverse('node-view', args=[node.system_id]))
96- self.assertIn("Latest node events", response.content)
97+ self.assertIn("Latest node events", response.content.decode('utf8'))
98 document = fromstring(response.content)
99 events_displayed = document.xpath(
100 "//div[@id='node_event_list']//td[@class='event_description']")
101 self.assertItemsEqual(
102- [event.type.description for event in events],
103- [display.text_content().strip() for display in events_displayed]
104+ [
105+ event.type.description + ' \u2014 ' + event.description
106+ for event in events
107+ ],
108+ [
109+ normalize_text(display.text_content())
110+ for display in events_displayed
111+ ]
112 )
113
114 def test_node_view_doesnt_show_events_from_other_nodes(self):
115@@ -1275,7 +1285,7 @@
116 factory.make_Event(node=node)
117 response = self.client.get(
118 reverse('node-view', args=[node.system_id]))
119- self.assertIn("Latest node events", response.content)
120+ self.assertIn("Latest node events", response.content.decode('utf8'))
121 document = fromstring(response.content)
122 [events_section] = document.xpath("//li[@id='node-events']")
123 self.assertIn(
124@@ -1290,7 +1300,7 @@
125 factory.make_Event(node=node)
126 response = self.client.get(
127 reverse('node-view', args=[node.system_id]))
128- self.assertIn("Latest node events", response.content)
129+ self.assertIn("Latest node events", response.content.decode('utf8'))
130 document = fromstring(response.content)
131 [events_section] = document.xpath("//li[@id='node-events']")
132 self.assertIn(
133@@ -1370,8 +1380,14 @@
134 events_displayed = document.xpath(
135 "//div[@id='node_event_list']//td[@class='event_description']")
136 self.assertItemsEqual(
137- [event.type.description for event in events],
138- [display.text_content().strip() for display in events_displayed]
139+ [
140+ event.type.description + ' \u2014 ' + event.description
141+ for event in events
142+ ],
143+ [
144+ normalize_text(display.text_content())
145+ for display in events_displayed
146+ ]
147 )
148
149 def test_event_log_is_paginated(self):