增加气象台设备后台管理,以及对气象台接口进行权限控制
This commit is contained in:
parent
c6bedda01e
commit
14a0c60778
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -37,8 +37,9 @@ 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'
|
||||||
page_query_param = 'page'
|
page_query_param = 'page'
|
||||||
max_page_size = 1000
|
max_page_size = 1000
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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='台站编号')
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Reference in New Issue