implement position timeout

This commit is contained in:
Laura Klünder 2019-12-27 18:31:54 +01:00
parent f7b830ca6a
commit 92be350b8c
3 changed files with 30 additions and 1 deletions

View file

@ -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)'),
),
]

View file

@ -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:

View file

@ -54,7 +54,7 @@ class ReportUpdateForm(ModelForm):
class PositionForm(ModelForm):
class Meta:
model = Position
fields = ['name']
fields = ['name', 'timeout']
class PositionSetForm(Form):