增加气象台设备后台管理,以及对气象台接口进行权限控制

This commit is contained in:
VIJAY\vijay 2022-08-26 17:32:39 +08:00
parent c6bedda01e
commit 14a0c60778
6 changed files with 48 additions and 5 deletions

View File

@ -1,5 +1,6 @@
from django.core.cache import cache from django.core.cache import cache
from counter.models import DeviceInfo from counter.models import DeviceInfo
from mosquito.models import WeatherStationInfo
class RoleMixin(object): class RoleMixin(object):
@ -20,3 +21,15 @@ class DeviceListMixin(object):
cache.set('device_list', device_list, 60 * 60) cache.set('device_list', device_list, 60 * 60)
return device_list return device_list
class WeatherStationDeviceListMixin(object):
@staticmethod
def get_device_list():
if cache.get('device_list'):
device_list = cache.get('device_list')
else:
device_list = WeatherStationInfo.objects.get_queryset().order_by('-device_id')
cache.set('device_list', device_list, 60 * 60)
return device_list

View File

@ -1,5 +1,5 @@
from django.contrib import admin from django.contrib import admin
from .models import Mosquito, MosqPost, Org, DeviceInfo from .models import Mosquito, MosqPost, Org, DeviceInfo, WeatherStationInfo
class MosquitoAdmin(admin.ModelAdmin): class MosquitoAdmin(admin.ModelAdmin):
@ -26,7 +26,14 @@ class OrgAdmin(admin.ModelAdmin):
ordering = ['name'] ordering = ['name']
class WeatherStationAdmin(admin.ModelAdmin):
list_display = ['device_id', 'device_name', 'org']
list_filter = ['device_id', 'org']
ordering = ['device_id']
admin.site.register(Mosquito, MosquitoAdmin) admin.site.register(Mosquito, MosquitoAdmin)
admin.site.register(MosqPost, MosqPostAdmin) admin.site.register(MosqPost, MosqPostAdmin)
admin.site.register(DeviceInfo, DeviceAdmin) admin.site.register(DeviceInfo, DeviceAdmin)
admin.site.register(Org, OrgAdmin) admin.site.register(Org, OrgAdmin)
admin.site.register(WeatherStationInfo, WeatherStationAdmin)

View File

@ -37,6 +37,7 @@ class DeviceLogHistoryPagination(PageNumberPagination):
page_query_param = 'page' page_query_param = 'page'
max_page_size = 1000 max_page_size = 1000
class WeatherlogHistoryPagination(PageNumberPagination): class WeatherlogHistoryPagination(PageNumberPagination):
page_size = 10 page_size = 10
page_size_query_param = 'limit' page_size_query_param = 'limit'

View File

@ -14,7 +14,7 @@ from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.permissions import IsAuthenticated from rest_framework.permissions import IsAuthenticated
from rest_framework.filters import SearchFilter, OrderingFilter from rest_framework.filters import SearchFilter, OrderingFilter
from django.db.models import Q from django.db.models import Q
from counter.mixins.role import RoleMixin, DeviceListMixin from counter.mixins.role import RoleMixin, DeviceListMixin, WeatherStationDeviceListMixin
from ..models import Mosquito, MosqPost, DeviceTempLog, WeatherLog from ..models import Mosquito, MosqPost, DeviceTempLog, WeatherLog
from .pagination import PostLimitOffsetPagination, DeviceLogHistoryPagination, WeatherlogHistoryPagination from .pagination import PostLimitOffsetPagination, DeviceLogHistoryPagination, WeatherlogHistoryPagination
from .serializers import ( from .serializers import (
@ -106,7 +106,7 @@ class DeviceTempLogListAPIView(ListAPIView, RoleMixin, DeviceListMixin):
return queryset return queryset
class WeatherLogListAPIView(ListAPIView, RoleMixin, DeviceListMixin): class WeatherLogListAPIView(ListAPIView, RoleMixin, WeatherStationDeviceListMixin):
serializer_class = WeatherLogSerializer serializer_class = WeatherLogSerializer
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter) filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter)
@ -122,6 +122,11 @@ class WeatherLogListAPIView(ListAPIView, RoleMixin, DeviceListMixin):
end = self.request.GET.get('end') end = self.request.GET.get('end')
queryset = WeatherLog.objects.get_queryset().order_by('-data_time') queryset = WeatherLog.objects.get_queryset().order_by('-data_time')
if 'staff' in user_roles or 'manager' in user_roles:
device_list = self.get_device_list()
device_ids = [query.device_id for query in device_list if query.org == self.request.user.org]
queryset = queryset.filter(device_id__in=device_ids)
if device: if device:
# device_id or device_name # device_id or device_name
qs = queryset.filter(device_id__icontains=device) qs = queryset.filter(device_id__icontains=device)

View File

@ -118,6 +118,23 @@ class DeviceTempLog(models.Model):
return self.device_id return self.device_id
class WeatherStationInfo(models.Model):
device_id = models.CharField(unique=True, max_length=100, verbose_name='气象台ID')
device_name = models.CharField(max_length=100, blank=True, null=True, verbose_name='气象台名称')
longitude = models.FloatField(blank=True, null=True, verbose_name='经度')
latitude = models.FloatField(blank=True, null=True, verbose_name='维度')
org = models.ForeignKey(Org, verbose_name='所在组织', on_delete='PROTECT')
class Meta:
managed = False
db_table = 'weather_station_info'
verbose_name = '气象台设备'
verbose_name_plural = verbose_name
def __str__(self):
return self.device_id
class WeatherLog(models.Model): class WeatherLog(models.Model):
data_time = models.DateTimeField(blank=True, null=True, verbose_name='时间') data_time = models.DateTimeField(blank=True, null=True, verbose_name='时间')
device_id = models.CharField(max_length=100, verbose_name='台站编号') device_id = models.CharField(max_length=100, verbose_name='台站编号')

View File

@ -14,7 +14,7 @@ django.setup()
from counter.models import DeviceCount from counter.models import DeviceCount
from counter.models import DeviceInfo as D1 from counter.models import DeviceInfo as D1
from mosquito.models import MosqPostStatistic, DevicePostStatistic, DeviceInfo, Org from mosquito.models import MosqPostStatistic, DevicePostStatistic, DeviceInfo, Org, WeatherStationDeviceInfo
def max_count(x, y): def max_count(x, y):
if x.count > y.count: if x.count > y.count: