diff --git a/src/c3nav/mapdata/migrations/0084_position_timeout.py b/src/c3nav/mapdata/migrations/0084_position_timeout.py new file mode 100644 index 00000000..4b9b6bd3 --- /dev/null +++ b/src/c3nav/mapdata/migrations/0084_position_timeout.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.8 on 2019-12-27 17:25 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mapdata', '0083_auto_20191227_1642'), + ] + + operations = [ + migrations.AddField( + model_name='position', + name='timeout', + field=models.PositiveSmallIntegerField(default=0, help_text='0 for no timeout', verbose_name='timeout (in seconds)'), + ), + ] diff --git a/src/c3nav/mapdata/models/locations.py b/src/c3nav/mapdata/models/locations.py index 18ff500d..1e8e7abb 100644 --- a/src/c3nav/mapdata/models/locations.py +++ b/src/c3nav/mapdata/models/locations.py @@ -1,5 +1,6 @@ import string from contextlib import suppress +from datetime import timedelta from decimal import Decimal from operator import attrgetter @@ -9,6 +10,7 @@ from django.core.validators import MaxValueValidator, MinValueValidator, RegexVa from django.db import models, transaction from django.db.models import FieldDoesNotExist, Prefetch from django.urls import reverse +from django.utils import timezone from django.utils.crypto import get_random_string from django.utils.functional import cached_property from django.utils.text import format_lazy @@ -497,6 +499,7 @@ class Position(models.Model): name = models.CharField(_('name'), max_length=32) secret = models.CharField(_('secret'), unique=True, max_length=32, default=get_position_secret) last_coordinates_update = models.DateTimeField(_('last coordinates update'), null=True) + timeout = models.PositiveSmallIntegerField(_('timeout (in seconds)'), default=0, help_text=_('0 for no timeout')) coordinates_id = models.CharField(_('coordinates'), null=True, max_length=48) api_secret = models.CharField(_('api secret'), max_length=64, default=get_position_api_secret) @@ -507,6 +510,14 @@ class Position(models.Model): verbose_name_plural = _('Dynamic position') default_related_name = 'dynamic_positions' + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + if self.timeout and self.last_coordinates_update: + end_time = self.last_coordinates_update + timedelta(seconds=self.timeout) + if timezone.now() >= end_time: + self.cordinates = None + self.last_coordinates_update = end_time + @classmethod def user_has_positions(cls, user): if not user.is_authenticated: diff --git a/src/c3nav/site/forms.py b/src/c3nav/site/forms.py index 6ce023b6..7ca1313b 100644 --- a/src/c3nav/site/forms.py +++ b/src/c3nav/site/forms.py @@ -54,7 +54,7 @@ class ReportUpdateForm(ModelForm): class PositionForm(ModelForm): class Meta: model = Position - fields = ['name'] + fields = ['name', 'timeout'] class PositionSetForm(Form):