diff --git a/apps/counter/mixins/role.py b/apps/counter/mixins/role.py index 13d0ce7..a6d03c2 100644 --- a/apps/counter/mixins/role.py +++ b/apps/counter/mixins/role.py @@ -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 diff --git a/apps/mosquito/admin.py b/apps/mosquito/admin.py index 3df91fa..855c316 100644 --- a/apps/mosquito/admin.py +++ b/apps/mosquito/admin.py @@ -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) diff --git a/apps/mosquito/api/pagination.py b/apps/mosquito/api/pagination.py index 48ae220..bf94af3 100644 --- a/apps/mosquito/api/pagination.py +++ b/apps/mosquito/api/pagination.py @@ -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 \ No newline at end of file + max_page_size = 1000 diff --git a/apps/mosquito/api/views.py b/apps/mosquito/api/views.py index 452063c..c791c86 100644 --- a/apps/mosquito/api/views.py +++ b/apps/mosquito/api/views.py @@ -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) diff --git a/apps/mosquito/models.py b/apps/mosquito/models.py index ee36d20..350de01 100644 --- a/apps/mosquito/models.py +++ b/apps/mosquito/models.py @@ -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='台站编号') diff --git a/apps/mosquito/tasks.py b/apps/mosquito/tasks.py index 793cd91..0903f47 100644 --- a/apps/mosquito/tasks.py +++ b/apps/mosquito/tasks.py @@ -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: