views.py 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. from warnings import filters
  2. from django.shortcuts import render
  3. from django.contrib.auth.models import Group, User
  4. from rest_framework import permissions, viewsets
  5. from rest_framework.views import APIView
  6. from rest_framework.response import Response
  7. from rest_framework.parsers import JSONParser,ParseError
  8. from rest_framework import status
  9. from rest_framework import generics
  10. from . import engine
  11. import threading
  12. import django_filters.rest_framework
  13. from rest_framework.decorators import action
  14. from django.conf import settings
  15. from django.shortcuts import get_object_or_404
  16. from . import models
  17. from . import serializers
  18. eng = 0
  19. lock = threading.Lock()
  20. class UserViewSet(viewsets.ModelViewSet):
  21. """
  22. API endpoint that allows users to be viewed or edited.
  23. """
  24. queryset = User.objects.all().order_by('-date_joined')
  25. serializer_class = serializers.UserSerializer
  26. permission_classes = [permissions.IsAuthenticated]
  27. class device_ViewSet(viewsets.ModelViewSet):
  28. """
  29. API endpoint that allows users to be viewed or edited.
  30. """
  31. queryset = models.device.objects.all().order_by('-time_creation',)
  32. serializer_class = serializers.device_Serializer
  33. permission_classes = [permissions.IsAuthenticated]
  34. filtred_backends = [django_filters.rest_framework.DjangoFilterBackend]
  35. filterset_fields = ['device_type', 'brend', 'serial_model']
  36. class measurement_info_Viewset(viewsets.ModelViewSet):
  37. """
  38. API endpoint that allows users to be viewed or edited.
  39. """
  40. queryset = models.measurement_info.objects.all().order_by('-id',)
  41. serializer_class = serializers.measurement_info_Serializer
  42. permission_classes = [permissions.IsAuthenticated]
  43. filtred_backends = [django_filters.rest_framework.DjangoFilterBackend]
  44. filterset_fields = ['id', 'infostr']
  45. class state_Viewset(viewsets.ModelViewSet):
  46. """
  47. API endpoint that allows users to be viewed or edited.
  48. """
  49. queryset = models.state.objects.all().order_by('-id',)
  50. serializer_class = serializers.state_Serializer
  51. permission_classes = [permissions.IsAuthenticated]
  52. filtred_backends = [django_filters.rest_framework.DjangoFilterBackend]
  53. filterset_fields = ['id_measurement']
  54. class measurement_ViewSet(viewsets.ModelViewSet):
  55. """
  56. API endpoint that allows users to be viewed or edited.
  57. """
  58. queryset = models.measurement.objects.all().order_by('-id',)
  59. serializer_class = serializers.measurement_post_Serializer
  60. permission_classes = [permissions.IsAuthenticated]
  61. #filtred_backends = [django_filters.rest_framework.DjangoFilterBackend]
  62. #filterset_fields = ['id']
  63. @action(methods=['get'], detail=True, permission_classes=[permissions.IsAuthenticated],
  64. url_path='data', url_name='data')
  65. def data(self, request, pk=None):
  66. try:
  67. measurement = models.measurement.objects.get(id=pk)
  68. except models.measurement.DoesNotExist:
  69. return Response(
  70. {
  71. "status": f"Measurement {pk} does not exist!"
  72. },
  73. status=status.HTTP_404_NOT_FOUND,
  74. )
  75. if(measurement.state.data_ready != True):
  76. return Response(
  77. {
  78. "status": "Data isn't ready!"
  79. },
  80. status=status.HTTP_403_FORBIDDEN,
  81. )
  82. data_num = request.GET.get('data_num', None)
  83. averaging_num = request.GET.get('averaging_num', None)
  84. if(data_num == None):
  85. if(averaging_num == None):
  86. queryset = models.measurement_data.objects.filter(measurement_id=pk).order_by('-id',)
  87. else:
  88. queryset = models.measurement_data.objects.filter(measurement_id=pk, averaging_num=averaging_num).order_by('-id',)
  89. else:
  90. if(averaging_num == None):
  91. queryset = models.measurement_data.objects.filter(measurement_id=pk, data_num=data_num).order_by('-id',)
  92. else:
  93. queryset = models.measurement_data.objects.filter(measurement_id=pk, data_num=data_num, averaging_num=averaging_num).order_by('-id',)
  94. serializer = serializers.measurement_data_Serializer(queryset, many=True)
  95. return Response(serializer.data)
  96. @action(methods=['get'], detail=True, permission_classes=[permissions.IsAuthenticated],
  97. url_path='state', url_name='state')
  98. def state(self, request, pk=None):
  99. queryset = models.measurement.objects.all().order_by('-id',)
  100. measurement = get_object_or_404(queryset, id=pk)
  101. serializer = serializers.state_Serializer(measurement.state)
  102. return Response(serializer.data)
  103. @action(methods=['get'], detail=True, permission_classes=[permissions.IsAuthenticated],
  104. url_path='info', url_name='info')
  105. def info(self, request, pk=None):
  106. queryset = models.measurement.objects.all().order_by('-id',)
  107. measurement = get_object_or_404(queryset, id=pk)
  108. serializer = serializers.measurement_info_Serializer(measurement.info)
  109. return Response(serializer.data)
  110. def create(self, request, *args, **kwargs):
  111. serializer = serializers.measurement_post_Serializer(data=request.data)
  112. serializer.is_valid(raise_exception=True)
  113. #state_ser = serializers.state_Serializer(state)
  114. # Сохранение объекта (ID инкрементируется автоматически)
  115. adc = models.device_state.objects.create()
  116. sync = models.device_state.objects.create()
  117. sdr = models.device_state.objects.create()
  118. grax = models.device_state.objects.create()
  119. gray = models.device_state.objects.create()
  120. graz = models.device_state.objects.create()
  121. self.perform_create(serializer)
  122. mid = serializer.data['id']
  123. instance = models.measurement.objects.get(id=mid)
  124. instance.state = models.state.objects.create(id_measurement=mid, adc=adc, sync=sync, sdr=sdr, grax=grax, gray=gray, graz=graz)
  125. print(settings.BASE_DIR)
  126. instance.save()
  127. eng = engine.EngineDict[instance.info.engine](instance, lock)
  128. # Форматирование ответа
  129. headers = self.get_success_headers(serializer.data)
  130. return Response(
  131. {
  132. "status": "created",
  133. "measurement_id": mid,
  134. "basedir": str(settings.BASE_DIR)
  135. },
  136. status=status.HTTP_201_CREATED,
  137. headers=headers
  138. )
  139. def destroy(self, request, *args, **kwargs):
  140. instance = self.get_object()
  141. instance.state.delete()
  142. instance.info.delete()
  143. instance.info.iadc.delete()
  144. instance.info.isync.delete()
  145. instance.info.isdr.delete()
  146. instance.info.igrax.delete()
  147. instance.info.igray.delete()
  148. instance.info.igraz.delete()
  149. instance.state.adc.delete()
  150. instance.state.sync.delete()
  151. instance.state.sdr.delete()
  152. instance.state.grax.delete()
  153. instance.state.gray.delete()
  154. instance.state.graz.delete()
  155. self.perform_destroy(instance)
  156. return Response(status=status.HTTP_204_NO_CONTENT)
  157. class measurement_data_ViewSet(viewsets.ModelViewSet):
  158. queryset = models.measurement_data.objects.all().order_by('-id',)
  159. serializer_class = serializers.measurement_data_Serializer
  160. permission_classes = [permissions.IsAuthenticated]
  161. filtred_backends = [django_filters.rest_framework.DjangoFilterBackend]
  162. filterset_fields = ['measurement__id', 'data_num', 'averaging_num']
  163. # Create your views here.
  164. def post_list(request):
  165. return render(request, 'adc_interface/index.html', {})