From 86c476a586094146119e2b1b1413d916ae19d933 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Wed, 5 Jul 2017 22:35:14 +0200 Subject: [PATCH] MapUpdate.last_update() and MapUpdate.lock() --- src/c3nav/mapdata/models/update.py | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/c3nav/mapdata/models/update.py b/src/c3nav/mapdata/models/update.py index f8f96a96..75621c2c 100644 --- a/src/c3nav/mapdata/models/update.py +++ b/src/c3nav/mapdata/models/update.py @@ -1,5 +1,8 @@ +from contextlib import contextmanager + from django.conf import settings -from django.db import models +from django.core.cache import cache +from django.db import models, transaction from django.utils.translation import ugettext_lazy as _ @@ -17,6 +20,24 @@ class MapUpdate(models.Model): default_related_name = 'mapupdates' get_latest_by = 'datetime' + @classmethod + def last_update(cls): + last_update = cache.get('mapdata:last_update', None) + if last_update is not None: + return last_update + with cls.lock(): + last_update = cls.objects.latest().datetime + cache.set('mapdata:last_update', last_update, 900) + return last_update + + @classmethod + @contextmanager + def lock(cls): + with transaction.atomic(): + yield cls.objects.select_for_update().earliest() + def save(self, **kwargs): if self.pk is not None: raise TypeError + super().save(**kwargs) + cache.set('mapdata:last_update', self.datetime, 900)