diff --git a/src/backoffice/locale/de/LC_MESSAGES/django.po b/src/backoffice/locale/de/LC_MESSAGES/django.po index 92b964a40d211ed8b986a36e680e5f5c26df885a..c237b885c5dc97eddd5b0cf9a3036971dc8ce12d 100644 --- a/src/backoffice/locale/de/LC_MESSAGES/django.po +++ b/src/backoffice/locale/de/LC_MESSAGES/django.po @@ -1302,11 +1302,28 @@ msgid "ScheduleSource__last_import" msgstr "" # use translation from core -msgid "ScheduleSource__is_due" +msgid "ScheduleSource__import_frequency" msgstr "" -# use translation from core msgid "ScheduleSource__has_running_import" +msgstr "laufender Import" + +msgid "ScheduleSource__is_due" +msgstr "ist fällig" + +msgid "ScheduleSource__beyond_deadline" +msgstr "über Deadline" + +msgid "ScheduleSource__latest_import" +msgstr "aktuellster Import" + +msgid "start" +msgstr "" + +msgid "end" +msgstr "" + +msgid "state" msgstr "" msgid "Self-organized content" diff --git a/src/backoffice/locale/en/LC_MESSAGES/django.po b/src/backoffice/locale/en/LC_MESSAGES/django.po index 31e3eb49a08090b6301a26d621b860da132f6bb8..9faebeab3c712d14ab7e47e3056693802d3e35b4 100644 --- a/src/backoffice/locale/en/LC_MESSAGES/django.po +++ b/src/backoffice/locale/en/LC_MESSAGES/django.po @@ -1309,11 +1309,28 @@ msgid "ScheduleSource__last_import" msgstr "" # use translation from core -msgid "ScheduleSource__is_due" +msgid "ScheduleSource__import_frequency" msgstr "" -# use translation from core msgid "ScheduleSource__has_running_import" +msgstr "import running" + +msgid "ScheduleSource__is_due" +msgstr "is due" + +msgid "ScheduleSource__beyond_deadline" +msgstr "beyond deadline" + +msgid "ScheduleSource__latest_import" +msgstr "latest import" + +msgid "start" +msgstr "" + +msgid "end" +msgstr "" + +msgid "state" msgstr "" msgid "Self-organized content" diff --git a/src/backoffice/templates/backoffice/schedules_index.html b/src/backoffice/templates/backoffice/schedules_index.html index 62c2d74e4c817f8913452576601a080c08cc3a2b..d3f899751982df2d412472643c01844b90544932 100644 --- a/src/backoffice/templates/backoffice/schedules_index.html +++ b/src/backoffice/templates/backoffice/schedules_index.html @@ -11,7 +11,7 @@ <div class="row row-cols-1 row-cols-md-3 g-4"> {% for source in sources %} - {% with source.imports.first as latest %} + {% with source.latest_import as latest %} <div class="col"> <div class="card{% if source.has_running_import %} border-primary{% elif source.is_due %} border-warning{% endif %}"> <div class="card-header{% if source.has_running_import %} text-bg-primary{% elif source.is_due %} text-bg-warning{% endif %}"> @@ -31,17 +31,37 @@ <span class="text-muted small">{% trans "ScheduleSource__last_import" %}:</span><br> {{ source.last_import|naturaltime|default:"-/-" }} </p> - {% if source.is_due %} + <p> + <span class="text-muted small">{% trans "ScheduleSource__import_frequency" %}:</span><br> + {% if source.frequency %}{{ source.frequency|naturaltimespan }} + {% else %}-/-{% endif %} + </p> + {% if source.has_running_import %} + <p class="text-primary"> + <i class="bi bi-house-gear"></i> {% trans "ScheduleSource__has_running_import" %} + </p> + {% elif source.is_due %} <p class="text-warning"> <i class="bi bi-clock-history"></i> {% trans "ScheduleSource__is_due" %} </p> {% endif %} - {% if source.has_running_import %} - <p class="text-primary"> - <i class="bi bi-house-gear"></i> {% trans "ScheduleSource__has_running_import" %} + {% if latest.is_beyond_deadline %} + <p class="text-danger"> + <i class="bi bi-hourglass-bottom"></i> {% trans "ScheduleSource__beyond_deadline" %} </p> {% endif %} </div> + <div class="card-footer"> + <p> + <span class="text-muted small fw-bold">{% trans "ScheduleSource__latest_import" %}</span><br> + <span class="text-muted small">{% trans "start" %}:</span> + <abbr title="{{ latest.start }}">{{ latest.start|naturaltime|default:"-/-" }}</abbr><br> + <span class="text-muted small">{% trans "end" %}:</span> + <abbr title="{{ latest.end }}">{{ latest.end|naturaltime|default:"-/-" }}</abbr><br> + <span class="text-muted small">{% trans "state" %}:</span> + {{ latest.get_state_display }}<br> + </p> + </div> </div> </div> {% endwith %} diff --git a/src/core/models/schedules.py b/src/core/models/schedules.py index 7eb8738f37459e3f836f16a9d2e41a61b9a3d900..b6e321540fdc925887983ce2631eff731e2af01d 100644 --- a/src/core/models/schedules.py +++ b/src/core/models/schedules.py @@ -103,9 +103,14 @@ class ScheduleSource(models.Model): timespan_since_last_import = timezone.now() - self.last_import return timespan_since_last_import >= self.import_frequency + @property + def latest_import(self) -> Optional['ScheduleSourceImport']: + result = self.imports.order_by('-start').first() + return result + @property def has_running_import(self): - latest_import = self.imports.order_by('-start').first() + latest_import = self.latest_import if latest_import is None: # no import at all, therefore no running one return False @@ -115,8 +120,7 @@ class ScheduleSource(models.Model): return False # check that timeout has not passed yet - deadline = latest_import.start + self.import_timeout - return timezone.now() < deadline + return latest_import.is_beyond_deadline def _get_or_create_speaker( self, @@ -746,6 +750,11 @@ class ScheduleSourceImport(models.Model): def is_success(self): return self.state in self.SUCCESS_STATES + @property + def is_beyond_deadline(self): + deadline = self.start + self.schedule_source.import_timeout + return timezone.now() < deadline + @property def text_color_class(self): if self.state == ScheduleSourceImport.State.WARNING: