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
=== modified file 'src/maasserver/static/css/components/table_list.css'
--- src/maasserver/static/css/components/table_list.css 2014-08-13 21:49:35 +0000
+++ src/maasserver/static/css/components/table_list.css 2014-09-23 09:46:17 +0000
@@ -42,6 +42,10 @@
42 text-align: right;42 text-align: right;
43 }43 }
4444
45table.list tr.debug {
46 color: #AAA;
47 }
48
45table.list tr.warning {49table.list tr.warning {
46 background-color: #FEEFB3;50 background-color: #FEEFB3;
47 }51 }
4852
=== modified file 'src/maasserver/templates/maasserver/node_event_list_snippet.html'
--- src/maasserver/templates/maasserver/node_event_list_snippet.html 2014-09-18 03:15:07 +0000
+++ src/maasserver/templates/maasserver/node_event_list_snippet.html 2014-09-23 09:46:17 +0000
@@ -4,23 +4,20 @@
4 <thead>4 <thead>
5 <tr>5 <tr>
6 <th>Level</th>6 <th>Level</th>
7 <th>Timestamp</th>7 <th>Emitted</th>
8 <th>Event</th>8 <th>Event</th>
9 </tr>9 </tr>
10 </thead>10 </thead>
11 <tbody>11 <tbody>
12 {% for event_item in event_list %}12 {% for event_item in event_list %}
13 <tr {% if event_item.type.level_str == 'WARNING' %} class="warning"13 <tr class="{{ event_item.type.level_str|lower }}" id="{{ event_item.id }}">
14 {% elif event_item.type.level_str == 'ERROR' %} class="error"
15 {% elif event_item.type.level_str == 'CRITICAL' %} class="critical"
16 {% endif %} id="{{ event_item.id }}">
17 <td width="10%">{{ event_item.type.level_str }}</td>14 <td width="10%">{{ event_item.type.level_str }}</td>
18 <td width="30%">{{ event_item.created|date:'Y-m-d H:i:s' }}</td>15 <td width="30%" title="{{ event_item.created|date:'r' }}">
16 {{ event_item.created|timesince }} ago
17 </td>
19 <td class="event_description">18 <td class="event_description">
20 {{ event_item.type.description }} 19 {{ event_item.type.description }}
21 {% if event_item.description %}20 {% if event_item.description %} &mdash; {{ event_item.description }}{% endif %}
22 -- {{ event_item.description }}
23 {% endif %}
24 </td>21 </td>
25 <td></td>22 <td></td>
26 </tr>23 </tr>
2724
=== modified file 'src/maasserver/testing/factory.py'
--- src/maasserver/testing/factory.py 2014-09-19 12:48:48 +0000
+++ src/maasserver/testing/factory.py 2014-09-23 09:46:17 +0000
@@ -989,16 +989,19 @@
989 description = factory.make_name('description')989 description = factory.make_name('description')
990 if level is None:990 if level is None:
991 level = random.choice([991 level = random.choice([
992 logging.ERROR, logging.WARNING, logging.INFO])992 logging.ERROR, logging.WARNING, logging.INFO, logging.DEBUG])
993 return EventType.objects.create(993 return EventType.objects.create(
994 name=name, description=description, level=level)994 name=name, description=description, level=level)
995995
996 def make_Event(self, node=None, type=None):996 def make_Event(self, node=None, type=None, description=None):
997 if node is None:997 if node is None:
998 node = self.make_Node()998 node = self.make_Node()
999 if type is None:999 if type is None:
1000 type = self.make_EventType()1000 type = self.make_EventType()
1001 return Event.objects.create(node=node, type=type)1001 if description is None:
1002 description = self.make_name('desc')
1003 return Event.objects.create(
1004 node=node, type=type, description=description)
10021005
1003 def make_LargeFile(self, content=None, size=512):1006 def make_LargeFile(self, content=None, size=512):
1004 """Create `LargeFile`.1007 """Create `LargeFile`.
10051008
=== modified file 'src/maasserver/views/tests/test_nodes.py'
--- src/maasserver/views/tests/test_nodes.py 2014-09-19 09:40:37 +0000
+++ src/maasserver/views/tests/test_nodes.py 2014-09-23 09:46:17 +0000
@@ -97,6 +97,10 @@
97 )97 )
9898
9999
100def normalize_text(text):
101 return ' '.join(text.split())
102
103
100class TestGenerateJSPowerTypes(MAASServerTestCase):104class TestGenerateJSPowerTypes(MAASServerTestCase):
101 def patch_power_types(self, enum):105 def patch_power_types(self, enum):
102 """Make `get_power_types` return the given `enum` dict."""106 """Make `get_power_types` return the given `enum` dict."""
@@ -1245,13 +1249,19 @@
1245 for _ in range(NodeView.number_of_events_shown)1249 for _ in range(NodeView.number_of_events_shown)
1246 ]1250 ]
1247 response = self.client.get(reverse('node-view', args=[node.system_id]))1251 response = self.client.get(reverse('node-view', args=[node.system_id]))
1248 self.assertIn("Latest node events", response.content)1252 self.assertIn("Latest node events", response.content.decode('utf8'))
1249 document = fromstring(response.content)1253 document = fromstring(response.content)
1250 events_displayed = document.xpath(1254 events_displayed = document.xpath(
1251 "//div[@id='node_event_list']//td[@class='event_description']")1255 "//div[@id='node_event_list']//td[@class='event_description']")
1252 self.assertItemsEqual(1256 self.assertItemsEqual(
1253 [event.type.description for event in events],1257 [
1254 [display.text_content().strip() for display in events_displayed]1258 event.type.description + ' \u2014 ' + event.description
1259 for event in events
1260 ],
1261 [
1262 normalize_text(display.text_content())
1263 for display in events_displayed
1264 ]
1255 )1265 )
12561266
1257 def test_node_view_doesnt_show_events_from_other_nodes(self):1267 def test_node_view_doesnt_show_events_from_other_nodes(self):
@@ -1275,7 +1285,7 @@
1275 factory.make_Event(node=node)1285 factory.make_Event(node=node)
1276 response = self.client.get(1286 response = self.client.get(
1277 reverse('node-view', args=[node.system_id]))1287 reverse('node-view', args=[node.system_id]))
1278 self.assertIn("Latest node events", response.content)1288 self.assertIn("Latest node events", response.content.decode('utf8'))
1279 document = fromstring(response.content)1289 document = fromstring(response.content)
1280 [events_section] = document.xpath("//li[@id='node-events']")1290 [events_section] = document.xpath("//li[@id='node-events']")
1281 self.assertIn(1291 self.assertIn(
@@ -1290,7 +1300,7 @@
1290 factory.make_Event(node=node)1300 factory.make_Event(node=node)
1291 response = self.client.get(1301 response = self.client.get(
1292 reverse('node-view', args=[node.system_id]))1302 reverse('node-view', args=[node.system_id]))
1293 self.assertIn("Latest node events", response.content)1303 self.assertIn("Latest node events", response.content.decode('utf8'))
1294 document = fromstring(response.content)1304 document = fromstring(response.content)
1295 [events_section] = document.xpath("//li[@id='node-events']")1305 [events_section] = document.xpath("//li[@id='node-events']")
1296 self.assertIn(1306 self.assertIn(
@@ -1370,8 +1380,14 @@
1370 events_displayed = document.xpath(1380 events_displayed = document.xpath(
1371 "//div[@id='node_event_list']//td[@class='event_description']")1381 "//div[@id='node_event_list']//td[@class='event_description']")
1372 self.assertItemsEqual(1382 self.assertItemsEqual(
1373 [event.type.description for event in events],1383 [
1374 [display.text_content().strip() for display in events_displayed]1384 event.type.description + ' \u2014 ' + event.description
1385 for event in events
1386 ],
1387 [
1388 normalize_text(display.text_content())
1389 for display in events_displayed
1390 ]
1375 )1391 )
13761392
1377 def test_event_log_is_paginated(self):1393 def test_event_log_is_paginated(self):