diff --git a/src/pretix/base/models/devices.py b/src/pretix/base/models/devices.py index 8997da3fe3..108f3443b6 100644 --- a/src/pretix/base/models/devices.py +++ b/src/pretix/base/models/devices.py @@ -20,11 +20,13 @@ # . # import string +from datetime import timedelta from django.core.exceptions import ValidationError from django.db import models from django.db.models import Max from django.utils.crypto import get_random_string +from django.utils.timezone import now from django.utils.translation import gettext_lazy as _ from django_scopes import ScopedManager, scopes_disabled @@ -307,3 +309,8 @@ class DeviceLastSeen(models.Model): autosummarize=True ) ] + + @property + def is_recent(self): + # pretixSCAN/pretixPOS sync every 5 minutes, so 7 minutes can be considered "offline" + return now() - self.last_seen < timedelta(minutes=7) diff --git a/src/pretix/control/templates/pretixcontrol/organizers/devices.html b/src/pretix/control/templates/pretixcontrol/organizers/devices.html index 6597b3cfea..726bf8e0c5 100644 --- a/src/pretix/control/templates/pretixcontrol/organizers/devices.html +++ b/src/pretix/control/templates/pretixcontrol/organizers/devices.html @@ -118,6 +118,10 @@ {% endif %} + {{ d.device_id }} @@ -125,6 +129,7 @@ {% endif %} {{ d.name }} {% if d.revoked %}{% endif %} + {% if d.gate %}
{{ d.gate.name }} diff --git a/src/pretix/control/views/organizer.py b/src/pretix/control/views/organizer.py index ca6d5f11f8..768fbdd223 100644 --- a/src/pretix/control/views/organizer.py +++ b/src/pretix/control/views/organizer.py @@ -108,7 +108,9 @@ from pretix.base.services.export import ( init_organizer_exporters, multiexport, scheduled_organizer_export, ) from pretix.base.services.mail import mail, prefix_subject -from pretix.base.services.placeholders import prepare_sample_context_for_preview +from pretix.base.services.placeholders import ( + prepare_sample_context_for_preview, +) from pretix.base.templatetags.rich_text import markdown_compile_email from pretix.base.views.tasks import AsyncAction from pretix.control.forms.exports import ScheduledOrganizerExportForm @@ -1206,7 +1208,7 @@ class DeviceQueryMixin: def get_queryset(self): qs = self.request.organizer.devices.prefetch_related( 'limit_events', 'gate', - ).order_by('revoked', '-device_id') + ).select_related('last_seen').order_by('revoked', '-device_id') if 'device' in self.request_data and '__ALL' not in self.request_data: qs = qs.filter(