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

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 counter.models import DeviceInfo
from mosquito.models import WeatherStationInfo
class RoleMixin(object):
@ -20,3 +21,15 @@ class DeviceListMixin(object):
cache.set('device_list', device_list, 60 * 60)
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 .models import Mosquito, MosqPost, Org, DeviceInfo
from .models import Mosquito, MosqPost, Org, DeviceInfo, WeatherStationInfo
class MosquitoAdmin(admin.ModelAdmin):
@ -26,7 +26,14 @@ class OrgAdmin(admin.ModelAdmin):
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(MosqPost, MosqPostAdmin)
admin.site.register(DeviceInfo, DeviceAdmin)
admin.site.register(Org, OrgAdmin)
admin.site.register(WeatherStationInfo, WeatherStationAdmin)

View File

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

View File

@ -14,7 +14,7 @@ from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.permissions import IsAuthenticated
from rest_framework.filters import SearchFilter, OrderingFilter
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 .pagination import PostLimitOffsetPagination, DeviceLogHistoryPagination, WeatherlogHistoryPagination
from .serializers import (
@ -106,7 +106,7 @@ class DeviceTempLogListAPIView(ListAPIView, RoleMixin, DeviceListMixin):
return queryset
class WeatherLogListAPIView(ListAPIView, RoleMixin, DeviceListMixin):
class WeatherLogListAPIView(ListAPIView, RoleMixin, WeatherStationDeviceListMixin):
serializer_class = WeatherLogSerializer
permission_classes = [IsAuthenticated]
filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter)
@ -122,6 +122,11 @@ class WeatherLogListAPIView(ListAPIView, RoleMixin, DeviceListMixin):
end = self.request.GET.get('end')
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:
# device_id or device_name
qs = queryset.filter(device_id__icontains=device)

View File

@ -118,6 +118,23 @@ class DeviceTempLog(models.Model):
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):
data_time = models.DateTimeField(blank=True, null=True, 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 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):
if x.count > y.count: