diff --git a/apps/counter/api/views.py b/apps/counter/api/views.py index 8f28b9e..4d0cf9a 100644 --- a/apps/counter/api/views.py +++ b/apps/counter/api/views.py @@ -19,11 +19,12 @@ from .serializers import ( LogHistorySerializer, DeviceLogHistorySerializer, ) +from ..mixins.role import RoleMixin, DeviceListMixin from ..models import DeviceCount, DeviceInfo from mosquito.models import MosqPostStatistic, DevicePostStatistic -class DeviceLogListAPIView(ListAPIView): +class DeviceLogListAPIView(ListAPIView, RoleMixin, DeviceListMixin): serializer_class = DeviceCountSerializer permission_classes = [IsAuthenticated] filter_backends = [SearchFilter, OrderingFilter] @@ -31,14 +32,19 @@ class DeviceLogListAPIView(ListAPIView): search_fields = ['device_id'] def get_queryset(self, *args, **kwargs): + user_roles = self.get_role() queryset_list = DeviceCount.objects.get_queryset().order_by('-data_time') + if 'staff' in user_roles or 'admin' 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_list = queryset_list.filter(device_id__in=device_ids) device_id = self.request.GET.get('device_id') if device_id: queryset_list = queryset_list.filter(device_id__icontains=device_id) return queryset_list -class DeviceInfoListAPIView(ListAPIView): +class DeviceInfoListAPIView(ListAPIView, RoleMixin): serializer_class = DeviceInfoSerializer permission_classes = [IsAuthenticated] filter_backends = [SearchFilter, OrderingFilter] @@ -46,12 +52,11 @@ class DeviceInfoListAPIView(ListAPIView): search_fields = ['device_id', 'online'] def get_queryset(self, *args, **kwargs): - user = self.request.user - user_roles = user.role.split(',') + user_roles = self.get_role() queryset_list = DeviceInfo.objects.get_queryset().order_by('-online') if 'staff' in user_roles or 'admin' in user_roles: - queryset_ids = [query.device_id for query in queryset_list if query.org == user.org] - queryset_list = queryset_list.filter(device_id__in=queryset_ids) + device_ids = [query.device_id for query in queryset_list if query.org == self.request.user.org] + queryset_list = queryset_list.filter(device_id__in=device_ids) device_id = self.request.GET.get('device_id') status = self.request.GET.get('status') @@ -116,7 +121,7 @@ class LogHistoryListAPIView(ListAPIView): queryset = MosqPostStatistic.objects.all().order_by('-date') -class DeviceLogHistoryListAPIView(ListAPIView): +class DeviceLogHistoryListAPIView(ListAPIView, RoleMixin, DeviceListMixin): serializer_class = DeviceLogHistorySerializer permission_classes = [IsAuthenticated] filter_backends = [SearchFilter, OrderingFilter] @@ -131,12 +136,13 @@ class DeviceLogHistoryListAPIView(ListAPIView): # return queryset_list def get_queryset(self, *args, **kwargs): - user = self.request.user - user_roles = user.role.split(',') + user_roles = self.get_role() queryset_list = DevicePostStatistic.objects.get_queryset().order_by('-date') + if 'staff' in user_roles or 'admin' in user_roles: - queryset_ids = [query.device_id for query in queryset_list if query.org == user.org] - queryset_list = queryset_list.filter(device_id__in=queryset_ids) + device_list = self.get_device_list() + device_ids = [query.device_id for query in device_list if query.org == self.request.user.org] + queryset_list = queryset_list.filter(device_id__in=device_ids) device_id = self.request.GET.get('device_id') if device_id: diff --git a/apps/counter/mixins/role.py b/apps/counter/mixins/role.py new file mode 100644 index 0000000..ca2e330 --- /dev/null +++ b/apps/counter/mixins/role.py @@ -0,0 +1,16 @@ +from counter.models import DeviceInfo + + +class RoleMixin(object): + def get_role(self): + user = self.request.user + user_roles = user.role.split(',') + + return user_roles + + +class DeviceListMixin(object): + def get_device_list(self): + device_list = DeviceInfo.objects.get_queryset().order_by('-online') + + return device_list diff --git a/apps/counter/models.py b/apps/counter/models.py index 46fb422..431f50f 100644 --- a/apps/counter/models.py +++ b/apps/counter/models.py @@ -26,6 +26,14 @@ class DeviceCount(models.Model): verbose_name = '设备数据' verbose_name_plural = verbose_name + @property + def org(self): + try: + device_info2 = DeviceInfo2.objects.get(device_id=self.device_id) + return device_info2.org + except DeviceInfo2.DoesNotExist: + raise + def __str__(self): return '{0} at {1}'.format(self.device_id, self.data_time)