user.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. import hashlib
  2. from django.contrib.auth.hashers import make_password, check_password
  3. from django_restql.fields import DynamicSerializerMethodField
  4. from rest_framework import serializers
  5. from rest_framework.decorators import action, permission_classes
  6. from rest_framework.permissions import IsAuthenticated
  7. from django.db import connection
  8. from application import dispatch
  9. from dvadmin.system.models import Users, Role, Dept
  10. from dvadmin.system.views.role import RoleSerializer
  11. from dvadmin.utils.json_response import ErrorResponse, DetailResponse
  12. from dvadmin.utils.serializers import CustomModelSerializer
  13. from dvadmin.utils.validator import CustomUniqueValidator
  14. from dvadmin.utils.viewset import CustomModelViewSet
  15. def recursion(instance, parent, result):
  16. new_instance = getattr(instance, parent, None)
  17. res = []
  18. data = getattr(instance, result, None)
  19. if data:
  20. res.append(data)
  21. if new_instance:
  22. array = recursion(new_instance, parent, result)
  23. res += (array)
  24. return res
  25. class UserSerializer(CustomModelSerializer):
  26. """
  27. 用户管理-序列化器
  28. """
  29. dept_name = serializers.CharField(source='dept.name', read_only=True)
  30. role_info = DynamicSerializerMethodField()
  31. class Meta:
  32. model = Users
  33. read_only_fields = ["id"]
  34. exclude = ["password"]
  35. extra_kwargs = {
  36. "post": {"required": False},
  37. }
  38. def get_role_info(self, instance, parsed_query):
  39. roles = instance.role.all()
  40. # You can do what ever you want in here
  41. # `parsed_query` param is passed to BookSerializer to allow further querying
  42. serializer = RoleSerializer(
  43. roles,
  44. many=True,
  45. parsed_query=parsed_query
  46. )
  47. return serializer.data
  48. class UsersInitSerializer(CustomModelSerializer):
  49. """
  50. 初始化获取数信息(用于生成初始化json文件)
  51. """
  52. def save(self, **kwargs):
  53. instance = super().save(**kwargs)
  54. role_key = self.initial_data.get('role_key', [])
  55. role_ids = Role.objects.filter(key__in=role_key).values_list('id', flat=True)
  56. instance.role.set(role_ids)
  57. dept_key = self.initial_data.get('dept_key', None)
  58. dept_id = Dept.objects.filter(key=dept_key).first()
  59. instance.dept = dept_id
  60. instance.save()
  61. return instance
  62. class Meta:
  63. model = Users
  64. fields = ["username", "email", 'mobile', 'avatar', "name", 'gender', 'user_type', "dept", 'user_type',
  65. 'first_name', 'last_name', 'email', 'is_staff', 'is_active', 'creator', 'dept_belong_id',
  66. 'password', 'last_login', 'is_superuser']
  67. read_only_fields = ['id']
  68. extra_kwargs = {
  69. 'creator': {'write_only': True},
  70. 'dept_belong_id': {'write_only': True}
  71. }
  72. class UserCreateSerializer(CustomModelSerializer):
  73. """
  74. 用户新增-序列化器
  75. """
  76. username = serializers.CharField(
  77. max_length=50,
  78. validators=[
  79. CustomUniqueValidator(queryset=Users.objects.all(), message="账号必须唯一")
  80. ],
  81. )
  82. password = serializers.CharField(
  83. required=False,
  84. )
  85. def validate_password(self, value):
  86. """
  87. 对密码进行验证
  88. """
  89. password = self.initial_data.get("password")
  90. if password:
  91. return make_password(value)
  92. return value
  93. def save(self, **kwargs):
  94. data = super().save(**kwargs)
  95. data.dept_belong_id = data.dept_id
  96. data.save()
  97. data.post.set(self.initial_data.get("post", []))
  98. return data
  99. class Meta:
  100. model = Users
  101. fields = "__all__"
  102. read_only_fields = ["id"]
  103. extra_kwargs = {
  104. "post": {"required": False},
  105. }
  106. class UserUpdateSerializer(CustomModelSerializer):
  107. """
  108. 用户修改-序列化器
  109. """
  110. username = serializers.CharField(
  111. max_length=50,
  112. validators=[
  113. CustomUniqueValidator(queryset=Users.objects.all(), message="账号必须唯一")
  114. ],
  115. )
  116. # password = serializers.CharField(required=False, allow_blank=True)
  117. mobile = serializers.CharField(
  118. max_length=50,
  119. validators=[
  120. CustomUniqueValidator(queryset=Users.objects.all(), message="手机号必须唯一")
  121. ],
  122. allow_blank=True
  123. )
  124. def save(self, **kwargs):
  125. data = super().save(**kwargs)
  126. data.dept_belong_id = data.dept_id
  127. data.save()
  128. data.post.set(self.initial_data.get("post", []))
  129. return data
  130. class Meta:
  131. model = Users
  132. read_only_fields = ["id", "password"]
  133. fields = "__all__"
  134. extra_kwargs = {
  135. "post": {"required": False, "read_only": True},
  136. }
  137. class UserInfoUpdateSerializer(CustomModelSerializer):
  138. """
  139. 用户修改-序列化器
  140. """
  141. mobile = serializers.CharField(
  142. max_length=50,
  143. validators=[
  144. CustomUniqueValidator(queryset=Users.objects.all(), message="手机号必须唯一")
  145. ],
  146. allow_blank=True
  147. )
  148. def update(self, instance, validated_data):
  149. return super().update(instance, validated_data)
  150. class Meta:
  151. model = Users
  152. fields = ['email', 'avatar', 'name', 'gender']
  153. extra_kwargs = {
  154. "post": {"required": False, "read_only": True},
  155. }
  156. class ExportUserProfileSerializer(CustomModelSerializer):
  157. """
  158. 用户导出 序列化器
  159. """
  160. last_login = serializers.DateTimeField(
  161. format="%Y-%m-%d %H:%M:%S", required=False, read_only=True
  162. )
  163. is_active = serializers.SerializerMethodField(read_only=True)
  164. dept_name = serializers.CharField(source="dept.name", default="")
  165. dept_owner = serializers.CharField(source="dept.owner", default="")
  166. gender = serializers.CharField(source="get_gender_display", read_only=True)
  167. def get_is_active(self, instance):
  168. return "启用" if instance.is_active else "停用"
  169. class Meta:
  170. model = Users
  171. fields = (
  172. "username",
  173. "name",
  174. "email",
  175. "mobile",
  176. "gender",
  177. "is_active",
  178. "last_login",
  179. "dept_name",
  180. "dept_owner",
  181. )
  182. class UserProfileImportSerializer(CustomModelSerializer):
  183. password = serializers.CharField(required=True, max_length=50, error_messages={"required": "登录密码不能为空"})
  184. def save(self, **kwargs):
  185. data = super().save(**kwargs)
  186. password = hashlib.new(
  187. "md5", str(self.initial_data.get("password", "admin123456")).encode(encoding="UTF-8")
  188. ).hexdigest()
  189. data.set_password(password)
  190. data.save()
  191. return data
  192. class Meta:
  193. model = Users
  194. exclude = (
  195. "post",
  196. "user_permissions",
  197. "groups",
  198. "is_superuser",
  199. "date_joined",
  200. )
  201. class UserViewSet(CustomModelViewSet):
  202. """
  203. 用户接口
  204. list:查询
  205. create:新增
  206. update:修改
  207. retrieve:单例
  208. destroy:删除
  209. """
  210. queryset = Users.objects.exclude(is_superuser=1).all()
  211. serializer_class = UserSerializer
  212. create_serializer_class = UserCreateSerializer
  213. update_serializer_class = UserUpdateSerializer
  214. filter_fields = ["^name", "~username", "^mobile", "is_active", "dept", "user_type", "$dept__name"]
  215. # filter_fields = {
  216. # "name": ["icontains"],
  217. # "mobile": ["iregex"],
  218. # "username": ["icontains"],
  219. # "is_active": ["icontains"],
  220. # "dept": ["exact"],
  221. # "user_type": ["exact"],
  222. # "dept__name": ["icontains"],
  223. # }
  224. search_fields = ["username", "name", "gender", "dept__name", "role__name"]
  225. # 导出
  226. export_field_label = {
  227. "username": "用户账号",
  228. "name": "用户名称",
  229. "email": "用户邮箱",
  230. "mobile": "手机号码",
  231. "gender": "用户性别",
  232. "is_active": "帐号状态",
  233. "last_login": "最后登录时间",
  234. "dept_name": "部门名称",
  235. "dept_owner": "部门负责人",
  236. }
  237. export_serializer_class = ExportUserProfileSerializer
  238. # 导入
  239. import_serializer_class = UserProfileImportSerializer
  240. import_field_dict = {
  241. "username": "登录账号",
  242. "name": "用户名称",
  243. "email": "用户邮箱",
  244. "mobile": "手机号码",
  245. "gender": {
  246. "title": "用户性别",
  247. "choices": {
  248. "data": {"未知": 2, "男": 1, "女": 0},
  249. }
  250. },
  251. "is_active": {
  252. "title": "帐号状态",
  253. "choices": {
  254. "data": {"启用": True, "禁用": False},
  255. }
  256. },
  257. "password": "登录密码",
  258. "dept": {"title": "部门", "choices": {"queryset": Dept.objects.filter(status=True), "values_name": "name"}},
  259. "role": {"title": "角色", "choices": {"queryset": Role.objects.filter(status=True), "values_name": "name"}},
  260. }
  261. @action(methods=["GET"], detail=False, permission_classes=[IsAuthenticated])
  262. def user_info(self, request):
  263. """获取当前用户信息"""
  264. user = request.user
  265. result = {
  266. "id": user.id,
  267. "username": user.username,
  268. "name": user.name,
  269. "mobile": user.mobile,
  270. "user_type": user.user_type,
  271. "gender": user.gender,
  272. "email": user.email,
  273. "avatar": user.avatar,
  274. "dept": user.dept_id,
  275. "is_superuser": user.is_superuser,
  276. "role": user.role.values_list('id', flat=True),
  277. }
  278. if hasattr(connection, 'tenant'):
  279. result['tenant_id'] = connection.tenant and connection.tenant.id
  280. result['tenant_name'] = connection.tenant and connection.tenant.name
  281. dept = getattr(user, 'dept', None)
  282. if dept:
  283. result['dept_info'] = {
  284. 'dept_id': dept.id,
  285. 'dept_name': dept.name
  286. }
  287. role = getattr(user, 'role', None)
  288. if role:
  289. result['role_info'] = role.values('id', 'name', 'key')
  290. return DetailResponse(data=result, msg="获取成功")
  291. @action(methods=["PUT"], detail=False, permission_classes=[IsAuthenticated])
  292. def update_user_info(self, request):
  293. """修改当前用户信息"""
  294. serializer = UserInfoUpdateSerializer(request.user, data=request.data, request=request)
  295. serializer.is_valid(raise_exception=True)
  296. serializer.save()
  297. return DetailResponse(data=None, msg="修改成功")
  298. @action(methods=["PUT"], detail=True, permission_classes=[IsAuthenticated])
  299. def change_password(self, request, *args, **kwargs):
  300. """密码修改"""
  301. data = request.data
  302. old_pwd = data.get("oldPassword")
  303. new_pwd = data.get("newPassword")
  304. new_pwd2 = data.get("newPassword2")
  305. if old_pwd is None or new_pwd is None or new_pwd2 is None:
  306. return ErrorResponse(msg="参数不能为空")
  307. if new_pwd != new_pwd2:
  308. return ErrorResponse(msg="两次密码不匹配")
  309. verify_password = check_password(old_pwd, self.request.user.password)
  310. if not verify_password:
  311. verify_password = check_password(hashlib.md5(old_pwd.encode(encoding='UTF-8')).hexdigest(), self.request.user.password)
  312. if verify_password:
  313. request.user.password = make_password(new_pwd)
  314. request.user.save()
  315. return DetailResponse(data=None, msg="修改成功")
  316. else:
  317. return ErrorResponse(msg="旧密码不正确")
  318. @action(methods=["PUT"], detail=True, permission_classes=[IsAuthenticated])
  319. def reset_to_default_password(self, request, *args, **kwargs):
  320. """恢复默认密码"""
  321. instance = Users.objects.filter(id=kwargs.get("pk")).first()
  322. if instance:
  323. instance.set_password(dispatch.get_system_config_values("base.default_password"))
  324. instance.save()
  325. return DetailResponse(data=None, msg="密码重置成功")
  326. else:
  327. return ErrorResponse(msg="未获取到用户")
  328. @action(methods=["PUT"], detail=True)
  329. def reset_password(self, request, pk):
  330. """
  331. 密码重置
  332. """
  333. instance = Users.objects.filter(id=pk).first()
  334. data = request.data
  335. new_pwd = data.get("newPassword")
  336. new_pwd2 = data.get("newPassword2")
  337. if instance:
  338. if new_pwd != new_pwd2:
  339. return ErrorResponse(msg="两次密码不匹配")
  340. else:
  341. instance.password = make_password(new_pwd)
  342. instance.save()
  343. return DetailResponse(data=None, msg="修改成功")
  344. else:
  345. return ErrorResponse(msg="未获取到用户")