diff --git a/apps/counter/api/mobile/serializers.py b/apps/counter/api/mobile/serializers.py new file mode 100644 index 0000000..e969437 --- /dev/null +++ b/apps/counter/api/mobile/serializers.py @@ -0,0 +1,36 @@ +from typing import Optional +from rest_framework import serializers +from counter.models import DeviceCount, DeviceInfo +from mosquito.models import DeviceInfo as MosquitoDeviceInfo + + +class DeviceInfoMobileSerializer(serializers.ModelSerializer): + device_name = serializers.SerializerMethodField() + status = serializers.SerializerMethodField() + coordinate = serializers.SerializerMethodField() + + class Meta: + model = DeviceInfo + fields = [ + 'device_id', + 'device_name', + 'status', + 'coordinate', + ] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.latest = None + self.cur_device = None + + def get_device_name(self, obj) -> Optional[str]: + qs = MosquitoDeviceInfo.objects.filter(device_id=obj.device_id) + if qs.count() > 0: + device = qs.first() + self.cur_device = device + return device.device_name + return None + + def get_status(self, obj) -> int: + return obj.online + diff --git a/apps/counter/api/mobile/urls.py b/apps/counter/api/mobile/urls.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/counter/api/mobile/views.py b/apps/counter/api/mobile/views.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/counter/api/serializers.py b/apps/counter/api/serializers.py index 9cb51d3..25492ee 100644 --- a/apps/counter/api/serializers.py +++ b/apps/counter/api/serializers.py @@ -30,18 +30,29 @@ def get_vol(device_id, cur_vol): return '{}{}'.format(round(vol, 1), '%') -def get_latest(device_id): - latest_key = 'device_latest_{}'.format(device_id) +def get_device_latest_by_cache(device_id, key="device_latest_{}"): + """ + Get latest device from cache + """ + latest_key = key.format(device_id) latest = cache.get(latest_key) if latest: return latest - latest = DeviceCount.objects.filter(device_id=device_id).order_by('-data_time')[0] + latest = DeviceCount.objects.filter(device_id=device_id).order_by('-data_time').first() + if latest is None: + return None s = DeviceCountBaseSerializer(latest) data = s.data - cache.set(latest_key, data, 60 * 10) + + # set cache before return + set_device_latest_cache(latest_key, data) return data +def set_device_latest_cache(key: str, value: serializers.ModelSerializer, timeout=60 * 10): + cache.set(key, value, timeout) + + class DeviceCountBaseSerializer(serializers.ModelSerializer): class Meta: model = DeviceCount @@ -262,20 +273,17 @@ class DeviceInfoSerializer(serializers.ModelSerializer): def get_device_name(self, obj): qs = MosquitoDeviceInfo.objects.filter(device_id=obj.device_id) if qs.count() > 0: - device = qs[0] + device = qs.first() self.cur_device = device return device.device_name return None - def get_status(self, obj): + @staticmethod + def get_status(obj): return obj.online def get_count(self, obj) -> str: - try: - # self.latest = DeviceCount.objects.filter(device_id=obj.device_id).order_by('-data_time')[0] - self.latest = get_latest(obj.device_id) - except IndexError: - self.latest = None + self.latest = get_device_latest_by_cache(obj.device_id) if self.latest: return self.latest['count'] return '0'