views.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  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.AllowAny]
  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.AllowAny]
  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.AllowAny]
  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.AllowAny]
  52. filter_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.AllowAny]
  61. #filtred_backends = [django_filters.rest_framework.DjangoFilterBackend]
  62. #filterset_fields = ['id']
  63. @action(methods=['get'], detail=True, permission_classes=[permissions.AllowAny],
  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.AllowAny],
  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.AllowAny],
  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. # Collect references to orphaned objects BEFORE any deletion.
  142. # Django does not reverse-cascade from measurement → its FK targets,
  143. # so device_state and *_params objects must be deleted manually.
  144. dev_states = [
  145. instance.state.adc, instance.state.sync, instance.state.sdr,
  146. instance.state.grax, instance.state.gray, instance.state.graz,
  147. ]
  148. params = [
  149. instance.info.iadc, instance.info.isync, instance.info.isdr,
  150. instance.info.igrax, instance.info.igray, instance.info.igraz,
  151. ]
  152. state = instance.state
  153. info = instance.info
  154. # 1. Delete the measurement row first (avoids cascade surprises).
  155. self.perform_destroy(instance)
  156. # 2. Delete state + its device_state children.
  157. for ds in dev_states:
  158. try:
  159. ds.delete()
  160. except Exception:
  161. pass
  162. try:
  163. state.delete()
  164. except Exception:
  165. pass
  166. # 3. Delete measurement_info + its param children.
  167. for p in params:
  168. try:
  169. p.delete()
  170. except Exception:
  171. pass
  172. try:
  173. info.delete()
  174. except Exception:
  175. pass
  176. return Response(status=status.HTTP_204_NO_CONTENT)
  177. class measurement_data_ViewSet(viewsets.ModelViewSet):
  178. queryset = models.measurement_data.objects.all().order_by('-id',)
  179. serializer_class = serializers.measurement_data_Serializer
  180. permission_classes = [permissions.AllowAny]
  181. filtred_backends = [django_filters.rest_framework.DjangoFilterBackend]
  182. filterset_fields = ['measurement__id', 'data_num', 'averaging_num']
  183. # Create your views here.
  184. def post_list(request):
  185. return render(request, 'adc_interface/index.html', {})