views.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. from rest_framework import viewsets
  2. from utils.page import MyPageNumberPagination
  3. from rest_framework.filters import OrderingFilter
  4. from django_filters.rest_framework import DjangoFilterBackend
  5. from rest_framework.response import Response
  6. from rest_framework import status
  7. from rest_framework.parsers import MultiPartParser, FormParser
  8. from rest_framework.views import APIView
  9. import os
  10. import uuid
  11. from django.conf import settings
  12. from .models import Users, AcademicProfile, ResearchGroup, GroupMembership
  13. from .filter import UsersFilter, AcademicProfileFilter, ResearchGroupFilter, GroupMembershipFilter
  14. from .serializers import UsersGetSerializer,UsersPostSerializer
  15. from .serializers import AcademicProfileGetSerializer, AcademicProfilePostSerializer
  16. class UserprofileViewSet(viewsets.ModelViewSet):
  17. """
  18. 用户档案视图集
  19. retrieve:
  20. Response a data list (get)
  21. list:
  22. Response a data list (all)
  23. create:
  24. Create a data line (post)
  25. delete:
  26. Delete a data line (delete)
  27. partial_update:
  28. Partial_update a data (patch:partial_update)
  29. update:
  30. Update a data (put:update)
  31. """
  32. fliter_backends = (DjangoFilterBackend, OrderingFilter)
  33. ordering_fields = ('create_time', 'update_time')
  34. filterset_class = UsersFilter
  35. pagination_class = MyPageNumberPagination
  36. def get_project(self):
  37. try:
  38. # 表格通道
  39. if 'pk' in self.kwargs:
  40. id = self.kwargs.get('pk')
  41. return id
  42. else:
  43. # 用户通道
  44. user = self.request.auth
  45. if user.roles == 'USR':
  46. return user.user_id
  47. else:
  48. return None
  49. except:
  50. return None
  51. def get_queryset(self):
  52. project_id = self.get_project()
  53. if project_id:
  54. return Users.objects.filter(user_id=project_id)
  55. else:
  56. return Users.objects.all()
  57. def get_serializer_class(self):
  58. if self.action in ['list','retrieve']:
  59. return UsersGetSerializer
  60. elif self.action in ['create', 'update', 'partial_update']:
  61. return UsersPostSerializer
  62. else:
  63. return UsersGetSerializer
  64. def create(self, request, *args, **kwargs):
  65. serializer = self.get_serializer(data=request.data)
  66. serializer.is_valid(raise_exception=True)
  67. serializer.save()
  68. headers = self.get_success_headers(serializer.data)
  69. return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
  70. # 表格的写法
  71. def update(self, request, *args, **kwargs):
  72. if 'pk' in self.kwargs:
  73. qs = self.get_object()
  74. serializer = self.get_serializer(qs, data=request.data, partial=True)
  75. serializer.is_valid(raise_exception=True)
  76. serializer.save()
  77. return Response(serializer.data, status=status.HTTP_200_OK, headers=self.get_success_headers(serializer.data))
  78. else:
  79. # 没有qs,应该是管理员和用户更新自己的信息
  80. qs = request.auth
  81. serializer = self.get_serializer(qs, data=request.data, partial=True)
  82. serializer.is_valid(raise_exception=True)
  83. serializer.save()
  84. return Response(serializer.data, status=status.HTTP_200_OK, headers=self.get_success_headers(serializer.data))
  85. def partial_update(self, request, *args, **kwargs):
  86. qs = self.get_object()
  87. serializer = self.get_serializer(qs, data=request.data, partial=True)
  88. serializer.is_valid(raise_exception=True)
  89. serializer.save()
  90. return Response(serializer.data)
  91. def destroy(self, request, *args, **kwargs):
  92. qs = self.get_object()
  93. qs.is_delete = True
  94. qs.save()
  95. return Response(status=status.HTTP_204_NO_CONTENT)
  96. class AvatarUploadView(APIView):
  97. parser_classes = [MultiPartParser]
  98. def post(self, request):
  99. avatar_file = request.FILES.get('avatar')
  100. if not avatar_file:
  101. return Response({"error": "未上传头像文件"}, status=400)
  102. # 生成唯一文件名
  103. ext = os.path.splitext(avatar_file.name)[1]
  104. filename = f"{uuid.uuid4().hex}{ext}"
  105. # 目标目录
  106. avatars_dir = os.path.join(settings.MEDIA_ROOT, 'avatars')
  107. # 确保目录存在
  108. if not os.path.exists(avatars_dir):
  109. os.makedirs(avatars_dir)
  110. # 保存文件
  111. save_path = os.path.join(avatars_dir, filename)
  112. with open(save_path, 'wb+') as destination:
  113. for chunk in avatar_file.chunks():
  114. destination.write(chunk)
  115. # 返回相对路径(前端会拼接完整URL)
  116. avatar_url = f"/avatars/{filename}"
  117. # 更新用户头像
  118. user = request.auth
  119. user.avatar = avatar_url
  120. user.save()
  121. # 传递 request 到序列化器上下文
  122. serializer = UsersGetSerializer(user, context={'request': request})
  123. return Response(serializer.data)
  124. class AcademicProfileViewSet(viewsets.ModelViewSet):
  125. """
  126. 学术资料视图集
  127. retrieve:
  128. Response a data list (get)
  129. list:
  130. Response a data list (all)
  131. create:
  132. Create a data line (post)
  133. delete:
  134. Delete a data line (delete)
  135. partial_update:
  136. Partial_update a data (patch:partial_update)
  137. update:
  138. Update a data (put:update)
  139. """
  140. fliter_backends = (DjangoFilterBackend, OrderingFilter)
  141. ordering_fields = ('create_time', 'update_time')
  142. filterset_class = AcademicProfileFilter
  143. pagination_class = MyPageNumberPagination
  144. def get_project(self):
  145. try:
  146. # 表格通道
  147. if 'pk' in self.kwargs:
  148. id = self.kwargs.get('pk')
  149. return id
  150. else:
  151. # 用户通道
  152. user = self.request.auth
  153. if user.roles == 'USR':
  154. # id= AcademicProfile.objects.filter(user=user).first().id
  155. return user.user_id
  156. else:
  157. return None
  158. except:
  159. return None
  160. def get_queryset(self):
  161. project_id = self.get_project()
  162. if project_id:
  163. return AcademicProfile.objects.filter(user_id=project_id)
  164. else:
  165. return AcademicProfile.objects.all()
  166. def get_serializer_class(self):
  167. if self.action in ['list','retrieve']:
  168. return AcademicProfileGetSerializer
  169. elif self.action in ['create', 'update', 'partial_update']:
  170. return AcademicProfilePostSerializer
  171. else:
  172. return AcademicProfileGetSerializer
  173. def update(self, request, *args, **kwargs):
  174. if 'pk' in self.kwargs:
  175. qs = self.get_object()
  176. serializer = self.get_serializer(qs, data=request.data, partial=True)
  177. serializer.is_valid(raise_exception=True)
  178. serializer.save()
  179. return Response(serializer.data, status=status.HTTP_200_OK, headers=self.get_success_headers(serializer.data))
  180. else:
  181. # 没有qs,应该是管理员和用户更新自己的信息
  182. qs = request.auth
  183. AcademicProfile_obj = AcademicProfile.objects.filter(user=qs).first()
  184. if not AcademicProfile_obj:
  185. AcademicProfile_obj = AcademicProfile.objects.create(user=qs)
  186. serializer = self.get_serializer(AcademicProfile_obj, data=request.data, partial=True)
  187. serializer.is_valid(raise_exception=True)
  188. serializer.save()
  189. return Response(serializer.data, status=status.HTTP_200_OK, headers=self.get_success_headers(serializer.data))
  190. def create(self, request, *args, **kwargs):
  191. return super().create(request, *args, **kwargs)
  192. def partial_update(self, request, *args, **kwargs):
  193. return super().partial_update(request, *args, **kwargs)
  194. def destroy(self, request, *args, **kwargs):
  195. return super().destroy(request, *args, **kwargs)