#4036 Updated build list to include an alert state (#5222)

* Updated build list to include an alert state

* Docstring issue fixed.

* Template filter name changed.

* Logic Moved to Models

* Lint issue Fixed.
master
Maksudul Haque 2019-02-21 03:03:21 +06:00 committed by Anthony
parent 5978dcfde0
commit 3218c808e8
4 changed files with 48 additions and 1 deletions

View File

@ -702,6 +702,14 @@ p.build-missing { font-size: .8em; color: #9d9a55; margin: 0 0 3px; }
#footer label { color: #BCC1C3; font-weight: normal; }
#footer input[type="text"], #footer input[type="email"] { padding: 4px; font-size: 12px; line-height: 16px; margin-bottom: 5px }
/* Warning Icon for Build List triggered */
.module-item.col-span a span.icon-warning:before {
font-family: FontAwesome;
font-size: .9em;
padding-right: .3em;
font-weight: normal;
content: "\f071";
}
/* utils */

View File

@ -2,6 +2,7 @@
"""Models for the builds app."""
import datetime
import logging
import os.path
import re
@ -31,6 +32,7 @@ from .constants import (
BRANCH,
BUILD_STATE,
BUILD_STATE_FINISHED,
BUILD_STATE_TRIGGERED,
BUILD_TYPES,
LATEST,
NON_REPOSITORY_VERSIONS,
@ -629,6 +631,12 @@ class Build(models.Model):
"""Return if build has a finished state."""
return self.state == BUILD_STATE_FINISHED
@property
def is_stale(self):
"""Return if build state is triggered & date more than 5m ago."""
mins_ago = timezone.now() - datetime.timedelta(minutes=5)
return self.state == BUILD_STATE_TRIGGERED and self.date < mins_ago
class BuildCommandResultMixin:

View File

@ -1,9 +1,11 @@
# -*- coding: utf-8 -*-
import datetime
import os
import mock
from django.test import TestCase
from django_dynamic_fixture import fixture, get
from django.utils import timezone
from readthedocs.builds.models import Build, Version
from readthedocs.doc_builder.config import load_yaml_config
@ -531,3 +533,32 @@ class BuildModelTests(TestCase):
build_two.save()
self.assertEqual(build_two._config, {})
self.assertEqual(build_two.config, {})
def test_build_is_stale(self):
now = timezone.now()
build_one = get(
Build,
project=self.project,
version=self.version,
date=now - datetime.timedelta(minutes=8),
state='finished'
)
build_two = get(
Build,
project=self.project,
version=self.version,
date=now - datetime.timedelta(minutes=6),
state='triggered'
)
build_three = get(
Build,
project=self.project,
version=self.version,
date=now - datetime.timedelta(minutes=2),
state='triggered'
)
self.assertFalse(build_one.is_stale)
self.assertTrue(build_two.is_stale)
self.assertFalse(build_three.is_stale)

View File

@ -4,7 +4,7 @@
{% for build in build_qs %}
<li class="module-item col-span">
<div id="build-{{ build.id }}">
<a href="{{ build.get_absolute_url }}"><span id="build-state">{% if build.state != 'finished' %}{{ build.get_state_display }} {% else %} {% if build.success %}{% trans "Passed" %}{% else %}{% trans "Failed" %}{% endif %}{% endif %}</span>
<a href="{{ build.get_absolute_url }}">{% if build.is_stale %}<span class="icon-warning" title="{% trans 'This build is still waiting to be built' %}"></span>{% endif %}<span id="build-state">{% if build.state != 'finished' %}{{ build.get_state_display }} {% else %} {% if build.success %}{% trans "Passed" %}{% else %}{% trans "Failed" %}{% endif %}{% endif %}</span>
<img src="{% static 'core/img/loader.gif' %}" class="build-loading hide">
<span class="quiet">{% if build.version %}{% blocktrans with build.version.slug as slug and build.type as type %}version {{ slug }} ({{ type }}){% endblocktrans %}{% endif %}</span><span class="quiet right">{% blocktrans with build.date|timesince as date %}{{ date }} ago{% endblocktrans %}</span>
</a>