views.py 8.0 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
  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. #
  86. # def update(self, request, *args, **kwargs):
  87. # qs = request.auth
  88. # serializer = self.get_serializer(qs, data=request.data, partial=True)
  89. # serializer.is_valid(raise_exception=True)
  90. # serializer.save()
  91. # return Response(serializer.data, status=status.HTTP_200_OK, headers=self.get_success_headers(serializer.data))
  92. def partial_update(self, request, *args, **kwargs):
  93. qs = self.get_object()
  94. serializer = self.get_serializer(qs, data=request.data, partial=True)
  95. serializer.is_valid(raise_exception=True)
  96. serializer.save()
  97. return Response(serializer.data)
  98. def destroy(self, request, *args, **kwargs):
  99. qs = self.get_object()
  100. qs.is_delete = True
  101. qs.save()
  102. return Response(status=status.HTTP_204_NO_CONTENT)
  103. class AvatarUploadView(APIView):
  104. parser_classes = [MultiPartParser]
  105. def post(self, request):
  106. avatar_file = request.FILES.get('avatar')
  107. if not avatar_file:
  108. return Response({"error": "未上传头像文件"}, status=400)
  109. # 生成唯一文件名
  110. ext = os.path.splitext(avatar_file.name)[1]
  111. filename = f"{uuid.uuid4().hex}{ext}"
  112. # 目标目录
  113. avatars_dir = os.path.join(settings.MEDIA_ROOT, 'avatars')
  114. # 确保目录存在
  115. if not os.path.exists(avatars_dir):
  116. os.makedirs(avatars_dir)
  117. # 保存文件
  118. save_path = os.path.join(avatars_dir, filename)
  119. with open(save_path, 'wb+') as destination:
  120. for chunk in avatar_file.chunks():
  121. destination.write(chunk)
  122. # 返回相对路径(前端会拼接完整URL)
  123. avatar_url = f"/avatars/{filename}"
  124. # 更新用户头像
  125. user = request.auth
  126. user.avatar = avatar_url
  127. user.save()
  128. # 传递 request 到序列化器上下文
  129. serializer = UsersGetSerializer(user, context={'request': request})
  130. return Response(serializer.data)
  131. class AcademicProfileViewSet(viewsets.ModelViewSet):
  132. """
  133. 学术资料视图集
  134. retrieve:
  135. Response a data list (get)
  136. list:
  137. Response a data list (all)
  138. create:
  139. Create a data line (post)
  140. delete:
  141. Delete a data line (delete)
  142. partial_update:
  143. Partial_update a data (patch:partial_update)
  144. update:
  145. Update a data (put:update)
  146. """
  147. fliter_backends = (DjangoFilterBackend, OrderingFilter)
  148. ordering_fields = ('create_time', 'update_time')
  149. filterset_class = AcademicProfileFilter
  150. pagination_class = MyPageNumberPagination
  151. def get_project(self):
  152. try:
  153. id = self.kwargs.get('pk')
  154. return id
  155. except:
  156. return None
  157. def get_queryset(self):
  158. project_id = self.get_project()
  159. if project_id:
  160. return AcademicProfile.objects.filter(user_id=project_id)
  161. else:
  162. return AcademicProfile.objects.all()
  163. def get_serializer_class(self):
  164. if self.action in ['list','retrieve']:
  165. return UsersGetSerializer
  166. elif self.action in ['create', 'update', 'partial_update']:
  167. return UsersPostSerializer
  168. else:
  169. return UsersGetSerializer
  170. def create(self, request, *args, **kwargs):
  171. serializer = self.get_serializer(data=request.data)
  172. serializer.is_valid(raise_exception=True)
  173. serializer.save()
  174. headers = self.get_success_headers(serializer.data)
  175. return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
  176. # 表格的写法
  177. # def update(self, request, *args, **kwargs):
  178. # qs = self.get_object()
  179. # serializer = self.get_serializer(qs, data=request.data, partial=True)
  180. # serializer.is_valid(raise_exception=True)
  181. # self.perform_update(serializer)
  182. # return Response(serializer.data)
  183. #
  184. def update(self, request, *args, **kwargs):
  185. qs = request.auth
  186. serializer = self.get_serializer(qs, 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 partial_update(self, request, *args, **kwargs):
  191. qs = self.get_object()
  192. serializer = self.get_serializer(qs, data=request.data, partial=True)
  193. serializer.is_valid(raise_exception=True)
  194. serializer.save()