From ba946b317b739b71bf44c8b0d5d9174065333770 Mon Sep 17 00:00:00 2001 From: saadmk11 Date: Sun, 3 Feb 2019 19:40:29 +0600 Subject: [PATCH 1/5] Updated build list to include an alert state --- media/css/core.css | 8 ++++++++ readthedocs/core/templatetags/core_tags.py | 10 ++++++++++ readthedocs/templates/core/build_list_detailed.html | 6 +++++- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/media/css/core.css b/media/css/core.css index 44d0dbc7096..d07a81ec1c4 100644 --- a/media/css/core.css +++ b/media/css/core.css @@ -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 */ diff --git a/readthedocs/core/templatetags/core_tags.py b/readthedocs/core/templatetags/core_tags.py index a94e511acf0..825a7ea4ea7 100644 --- a/readthedocs/core/templatetags/core_tags.py +++ b/readthedocs/core/templatetags/core_tags.py @@ -2,11 +2,13 @@ """Template tags for core app.""" +import datetime import hashlib from urllib.parse import urlencode from django import template from django.conf import settings +from django.utils import timezone from django.utils.encoding import force_bytes, force_text from django.utils.safestring import mark_safe @@ -112,3 +114,11 @@ def key(d, key_name): @register.simple_tag def readthedocs_version(): return __version__ + + +@register.simple_tag +def get_past_time(mins): + """ + Subtracts provided minutes from current time. + """ + return timezone.now() - datetime.timedelta(minutes=int(mins)) diff --git a/readthedocs/templates/core/build_list_detailed.html b/readthedocs/templates/core/build_list_detailed.html index ee5bb8c442d..7f5728e3f93 100644 --- a/readthedocs/templates/core/build_list_detailed.html +++ b/readthedocs/templates/core/build_list_detailed.html @@ -1,10 +1,14 @@ {% load i18n %} {% load static %} +{% load core_tags %} + + {% get_past_time 5 as 5_mins_ago %} {% for build in build_qs %}
  • - {% if build.state != 'finished' %}{{ build.get_state_display }} {% else %} {% if build.success %}{% trans "Passed" %}{% else %}{% trans "Failed" %}{% endif %}{% endif %} + {% if build.state == 'triggered' and build.date < 5_mins_ago %} + {% endif %}{% if build.state != 'finished' %}{{ build.get_state_display }} {% else %} {% if build.success %}{% trans "Passed" %}{% else %}{% trans "Failed" %}{% endif %}{% endif %} {% if build.version %}{% blocktrans with build.version.slug as slug and build.type as type %}version {{ slug }} ({{ type }}){% endblocktrans %}{% endif %}{% blocktrans with build.date|timesince as date %}{{ date }} ago{% endblocktrans %} From 8609e948109659e9d03a9f362a819f7fad753f48 Mon Sep 17 00:00:00 2001 From: saadmk11 Date: Wed, 6 Feb 2019 00:26:16 +0600 Subject: [PATCH 2/5] Docstring issue fixed. --- readthedocs/core/templatetags/core_tags.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/readthedocs/core/templatetags/core_tags.py b/readthedocs/core/templatetags/core_tags.py index 825a7ea4ea7..2ec213cc9a5 100644 --- a/readthedocs/core/templatetags/core_tags.py +++ b/readthedocs/core/templatetags/core_tags.py @@ -118,7 +118,5 @@ def readthedocs_version(): @register.simple_tag def get_past_time(mins): - """ - Subtracts provided minutes from current time. - """ + """Subtracts provided minutes from current time.""" return timezone.now() - datetime.timedelta(minutes=int(mins)) From 3736b94255cf9349fbeb5632fd0cb1ade051a0a6 Mon Sep 17 00:00:00 2001 From: saadmk11 Date: Tue, 12 Feb 2019 21:28:22 +0600 Subject: [PATCH 3/5] Template filter name changed. --- readthedocs/core/templatetags/core_tags.py | 2 +- readthedocs/templates/core/build_list_detailed.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/readthedocs/core/templatetags/core_tags.py b/readthedocs/core/templatetags/core_tags.py index 2ec213cc9a5..732414b2105 100644 --- a/readthedocs/core/templatetags/core_tags.py +++ b/readthedocs/core/templatetags/core_tags.py @@ -117,6 +117,6 @@ def readthedocs_version(): @register.simple_tag -def get_past_time(mins): +def minutes_ago(mins): """Subtracts provided minutes from current time.""" return timezone.now() - datetime.timedelta(minutes=int(mins)) diff --git a/readthedocs/templates/core/build_list_detailed.html b/readthedocs/templates/core/build_list_detailed.html index 7f5728e3f93..cb230ff5384 100644 --- a/readthedocs/templates/core/build_list_detailed.html +++ b/readthedocs/templates/core/build_list_detailed.html @@ -2,7 +2,7 @@ {% load static %} {% load core_tags %} - {% get_past_time 5 as 5_mins_ago %} + {% minutes_ago 5 as 5_mins_ago %} {% for build in build_qs %}
  • From 284cecfc107da257e9abed36839f76084fcd89b1 Mon Sep 17 00:00:00 2001 From: saadmk11 Date: Wed, 13 Feb 2019 19:33:59 +0600 Subject: [PATCH 4/5] Logic Moved to Models --- readthedocs/builds/models.py | 11 +++++++ readthedocs/core/templatetags/core_tags.py | 8 ----- readthedocs/rtd_tests/tests/test_builds.py | 31 +++++++++++++++++++ .../templates/core/build_list_detailed.html | 6 +--- 4 files changed, 43 insertions(+), 13 deletions(-) diff --git a/readthedocs/builds/models.py b/readthedocs/builds/models.py index e44d426b381..49c34926748 100644 --- a/readthedocs/builds/models.py +++ b/readthedocs/builds/models.py @@ -2,6 +2,7 @@ """Models for the builds app.""" +import datetime import logging import os.path import re @@ -32,6 +33,7 @@ BRANCH, BUILD_STATE, BUILD_STATE_FINISHED, + BUILD_STATE_TRIGGERED, BUILD_TYPES, LATEST, NON_REPOSITORY_VERSIONS, @@ -630,6 +632,15 @@ def finished(self): """Return if build has a finished state.""" return self.state == BUILD_STATE_FINISHED + @property + def is_stale(self): + """ + Return True if build state is triggered + and build date is more than 5 mins ago. + """ + mins_ago = timezone.now() - datetime.timedelta(minutes=5) + return self.state == BUILD_STATE_TRIGGERED and self.date < mins_ago + class BuildCommandResultMixin: diff --git a/readthedocs/core/templatetags/core_tags.py b/readthedocs/core/templatetags/core_tags.py index 732414b2105..a94e511acf0 100644 --- a/readthedocs/core/templatetags/core_tags.py +++ b/readthedocs/core/templatetags/core_tags.py @@ -2,13 +2,11 @@ """Template tags for core app.""" -import datetime import hashlib from urllib.parse import urlencode from django import template from django.conf import settings -from django.utils import timezone from django.utils.encoding import force_bytes, force_text from django.utils.safestring import mark_safe @@ -114,9 +112,3 @@ def key(d, key_name): @register.simple_tag def readthedocs_version(): return __version__ - - -@register.simple_tag -def minutes_ago(mins): - """Subtracts provided minutes from current time.""" - return timezone.now() - datetime.timedelta(minutes=int(mins)) diff --git a/readthedocs/rtd_tests/tests/test_builds.py b/readthedocs/rtd_tests/tests/test_builds.py index afdbe46a3c9..e7e05bb0d73 100644 --- a/readthedocs/rtd_tests/tests/test_builds.py +++ b/readthedocs/rtd_tests/tests/test_builds.py @@ -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 @@ def test_do_not_reference_empty_configs(self): 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) diff --git a/readthedocs/templates/core/build_list_detailed.html b/readthedocs/templates/core/build_list_detailed.html index cb230ff5384..4f574b55b16 100644 --- a/readthedocs/templates/core/build_list_detailed.html +++ b/readthedocs/templates/core/build_list_detailed.html @@ -1,14 +1,10 @@ {% load i18n %} {% load static %} -{% load core_tags %} - - {% minutes_ago 5 as 5_mins_ago %} {% for build in build_qs %}
  • - {% if build.state == 'triggered' and build.date < 5_mins_ago %} - {% endif %}{% if build.state != 'finished' %}{{ build.get_state_display }} {% else %} {% if build.success %}{% trans "Passed" %}{% else %}{% trans "Failed" %}{% endif %}{% endif %} + {% if build.is_stale %}{% endif %}{% if build.state != 'finished' %}{{ build.get_state_display }} {% else %} {% if build.success %}{% trans "Passed" %}{% else %}{% trans "Failed" %}{% endif %}{% endif %} {% if build.version %}{% blocktrans with build.version.slug as slug and build.type as type %}version {{ slug }} ({{ type }}){% endblocktrans %}{% endif %}{% blocktrans with build.date|timesince as date %}{{ date }} ago{% endblocktrans %} From 4463c3f2c824debc8268a728056702745fbc0ef7 Mon Sep 17 00:00:00 2001 From: saadmk11 Date: Wed, 13 Feb 2019 20:01:11 +0600 Subject: [PATCH 5/5] Lint issue Fixed. --- readthedocs/builds/models.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/readthedocs/builds/models.py b/readthedocs/builds/models.py index 49c34926748..b41a000cdca 100644 --- a/readthedocs/builds/models.py +++ b/readthedocs/builds/models.py @@ -634,10 +634,7 @@ def finished(self): @property def is_stale(self): - """ - Return True if build state is triggered - and build date is more than 5 mins ago. - """ + """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