xj-study 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. xj_study/__init__.py +0 -0
  2. xj_study/admin.py +67 -0
  3. xj_study/apis/__init__.py +0 -0
  4. xj_study/apis/study_stage_api.py +47 -0
  5. xj_study/apis/study_subject_api.py +48 -0
  6. xj_study/apis/study_task_api.py +85 -0
  7. xj_study/apis/study_unit_api.py +47 -0
  8. xj_study/apis/study_user_stage_api.py +65 -0
  9. xj_study/apis/study_user_subject_api.py +65 -0
  10. xj_study/apis/study_user_task_api.py +89 -0
  11. xj_study/apis/study_user_unit_api.py +65 -0
  12. xj_study/apps.py +8 -0
  13. xj_study/migrations/0001_initial.py +211 -0
  14. xj_study/migrations/0002_subject_stage_task_description.py +28 -0
  15. xj_study/migrations/__init__.py +0 -0
  16. xj_study/models.py +208 -0
  17. xj_study/services/__init__.py +0 -0
  18. xj_study/services/study_stage_service.py +126 -0
  19. xj_study/services/study_subject_service.py +135 -0
  20. xj_study/services/study_task_service.py +150 -0
  21. xj_study/services/study_unit_service.py +126 -0
  22. xj_study/services/study_user_stage_service.py +186 -0
  23. xj_study/services/study_user_subject_service.py +164 -0
  24. xj_study/services/study_user_task_service.py +287 -0
  25. xj_study/services/study_user_unit_service.py +186 -0
  26. xj_study/urls.py +55 -0
  27. xj_study/utils/__init__.py +0 -0
  28. xj_study/utils/custom_response.py +121 -0
  29. xj_study/utils/custom_tool.py +891 -0
  30. xj_study/utils/j_transform_type.py +111 -0
  31. xj_study/utils/parse_json.py +27 -0
  32. xj_study/utils/request_params_wrapper.py +76 -0
  33. xj_study-0.1.0.dist-info/METADATA +396 -0
  34. xj_study-0.1.0.dist-info/RECORD +36 -0
  35. xj_study-0.1.0.dist-info/WHEEL +5 -0
  36. xj_study-0.1.0.dist-info/top_level.txt +1 -0
xj_study/__init__.py ADDED
File without changes
xj_study/admin.py ADDED
@@ -0,0 +1,67 @@
1
+ from django.contrib import admin
2
+
3
+ from .models import StudySubject, StudyStage, StudyUnit, StudyTask, StudyUserSubject, StudyUserStage, StudyUserUnit, StudyUserTask
4
+
5
+
6
+ @admin.register(StudySubject)
7
+ class StudySubjectAdmin(admin.ModelAdmin):
8
+ list_display = ("id", "name", "enable", "subject_total_score", "subject_pass_score", "subject_weight_score", "open_time", "close_time", "publish_time", "icon", "sort", "create_time", "update_time")
9
+ list_filter = ("enable",)
10
+ search_fields = ("name",)
11
+ list_editable = ("name", "enable", "subject_total_score", "subject_pass_score", "subject_weight_score", "icon", "sort")
12
+
13
+
14
+ @admin.register(StudyStage)
15
+ class StudyStageAdmin(admin.ModelAdmin):
16
+ list_display = ("id", "subject", "name", "enable", "course_book", "stage_total_score", "stage_pass_score", "stage_weight_score", "open_time", "close_time", "publish_time", "icon", "sort", "create_time", "update_time")
17
+ list_filter = ("enable", "subject")
18
+ search_fields = ("name", "course_book")
19
+ list_editable = ("name", "enable", "course_book", "stage_total_score", "stage_pass_score", "stage_weight_score", "icon", "sort")
20
+
21
+
22
+ @admin.register(StudyUnit)
23
+ class StudyUnitAdmin(admin.ModelAdmin):
24
+ list_display = ("id", "stage", "name", "enable", "unit_total_score", "unit_pass_score", "unit_weight_score", "credit", "open_time", "close_time", "publish_time", "icon", "sort", "create_time", "update_time")
25
+ list_filter = ("enable", "stage")
26
+ search_fields = ("name", "unit_description")
27
+ list_editable = ("name", "enable", "unit_total_score", "unit_pass_score", "unit_weight_score", "credit", "icon", "sort")
28
+
29
+
30
+ @admin.register(StudyTask)
31
+ class StudyTaskAdmin(admin.ModelAdmin):
32
+ list_display = ("id", "unit", "name", "enable", "exam_url", "thread_id", "task_total_score", "task_pass_score", "task_weight_score", "time_limit", "open_time", "close_time", "publish_time", "icon", "sort", "create_time", "update_time")
33
+ list_filter = ("enable", "unit")
34
+ search_fields = ("name", "exam_url", "thread_id")
35
+ list_editable = ("name", "enable", "exam_url", "thread_id", "task_total_score", "task_pass_score", "task_weight_score", "time_limit", "icon", "sort")
36
+
37
+
38
+ @admin.register(StudyUserSubject)
39
+ class StudyUserSubjectAdmin(admin.ModelAdmin):
40
+ list_display = ("id", "user_id", "user_uuid", "subject", "user_subject_score", "user_subject_weight", "is_pass", "icon", "sort", "create_time", "update_time")
41
+ list_filter = ("is_pass", "subject")
42
+ search_fields = ("user_uuid",)
43
+ list_editable = ("user_subject_score", "is_pass", "icon", "sort")
44
+
45
+
46
+ @admin.register(StudyUserStage)
47
+ class StudyUserStageAdmin(admin.ModelAdmin):
48
+ list_display = ("id", "user_id", "user_uuid", "stage", "user_stage_score", "user_stage_weight", "is_pass", "icon", "sort", "create_time", "update_time")
49
+ list_filter = ("is_pass", "stage")
50
+ search_fields = ("user_uuid",)
51
+ list_editable = ("user_stage_score", "is_pass", "icon", "sort")
52
+
53
+
54
+ @admin.register(StudyUserUnit)
55
+ class StudyUserUnitAdmin(admin.ModelAdmin):
56
+ list_display = ("id", "user_id", "user_uuid", "unit", "user_unit_score", "user_unit_weight", "is_pass", "icon", "sort", "create_time", "update_time")
57
+ list_filter = ("is_pass", "unit")
58
+ search_fields = ("user_uuid",)
59
+ list_editable = ("user_unit_score", "is_pass", "icon", "sort")
60
+
61
+
62
+ @admin.register(StudyUserTask)
63
+ class StudyUserTaskAdmin(admin.ModelAdmin):
64
+ list_display = ("id", "user_id", "user_uuid", "task", "user_task_score", "user_task_weight", "is_pass", "start_time", "finish_time", "icon", "sort", "create_time", "update_time")
65
+ list_filter = ("is_pass", "task")
66
+ search_fields = ("user_uuid",)
67
+ list_editable = ("user_task_score", "is_pass", "icon", "sort")
File without changes
@@ -0,0 +1,47 @@
1
+ # encoding: utf-8
2
+ """
3
+ @project: study_stage_api
4
+ @synopsis: 学习阶段API接口(列表 / 详情)
5
+ """
6
+ from rest_framework.views import APIView
7
+ from ..services.study_stage_service import StudyStageService
8
+ from ..utils.custom_response import util_response
9
+ from ..utils.request_params_wrapper import request_params_wrapper
10
+
11
+
12
+ class StudyStageListAPI(APIView):
13
+
14
+ @request_params_wrapper
15
+ def get(self, *args, request_params, **kwargs):
16
+ """
17
+ 获取学习阶段列表
18
+ @param page: 页码,默认1
19
+ @param size: 每页数量,默认20
20
+ @param sort: 排序字段,默认-sort
21
+ @param search: 搜索关键词(名称/阶段描述模糊查询)
22
+ @param subject_id: 所属学科ID(精确查询)
23
+ @param enable: 是否启用(布尔)
24
+ """
25
+ data, error = StudyStageService.list(
26
+ query_params=request_params,
27
+ page=request_params.get('page', 1),
28
+ size=request_params.get('size', 20),
29
+ sort=request_params.get('sort', '-sort'),
30
+ )
31
+ if error:
32
+ return util_response(data=data, msg=error)
33
+ return util_response(data=data)
34
+
35
+
36
+ class StudyStageAPI(APIView):
37
+
38
+ @request_params_wrapper
39
+ def get(self, *args, request_params, **kwargs):
40
+ """
41
+ 获取学习阶段详情(含关联单元列表)
42
+ @param id: 阶段ID
43
+ """
44
+ data, error = StudyStageService.detail(stage_id=request_params.get('id'))
45
+ if error:
46
+ return util_response(data=data, msg=error)
47
+ return util_response(data=data)
@@ -0,0 +1,48 @@
1
+ # encoding: utf-8
2
+ """
3
+ @project: study_subject_api
4
+ @synopsis: 学科API接口(列表 / 详情)
5
+ """
6
+ from rest_framework.views import APIView
7
+ from ..services.study_subject_service import StudySubjectService
8
+ from ..utils.custom_response import util_response
9
+ from ..utils.request_params_wrapper import request_params_wrapper
10
+
11
+
12
+ class StudySubjectListAPI(APIView):
13
+
14
+ @request_params_wrapper
15
+ def get(self, *args, request_params, **kwargs):
16
+ """
17
+ 获取学科列表
18
+ @param page: 页码,默认1
19
+ @param size: 每页数量,默认20
20
+ @param sort: 排序字段,默认-sort
21
+ 可选值:id, -id, sort, -sort, name, -name, create_time, -create_time, update_time, -update_time
22
+ @param search: 搜索关键词(名称/学科描述模糊查询)
23
+ @param enable: 是否启用(布尔)
24
+ @param name: 学科名称(精确查询)
25
+ """
26
+ data, error = StudySubjectService.list(
27
+ query_params=request_params,
28
+ page=request_params.get('page', 1),
29
+ size=request_params.get('size', 20),
30
+ sort=request_params.get('sort', '-sort'),
31
+ )
32
+ if error:
33
+ return util_response(data=data, msg=error)
34
+ return util_response(data=data)
35
+
36
+
37
+ class StudySubjectAPI(APIView):
38
+
39
+ @request_params_wrapper
40
+ def get(self, *args, request_params, **kwargs):
41
+ """
42
+ 获取学科详情(含关联阶段列表)
43
+ @param id: 学科ID
44
+ """
45
+ data, error = StudySubjectService.detail(subject_id=request_params.get('id'))
46
+ if error:
47
+ return util_response(data=data, msg=error)
48
+ return util_response(data=data)
@@ -0,0 +1,85 @@
1
+ # encoding: utf-8
2
+ """
3
+ @project: study_task_api
4
+ @synopsis: 单元任务API接口(列表 / 详情 / 新增 / 修改)
5
+ """
6
+ from rest_framework.views import APIView
7
+ from ..services.study_task_service import StudyTaskService
8
+ from ..utils.custom_response import util_response
9
+ from ..utils.request_params_wrapper import request_params_wrapper
10
+
11
+
12
+ class StudyTaskListAPI(APIView):
13
+
14
+ @request_params_wrapper
15
+ def get(self, *args, request_params, **kwargs):
16
+ """
17
+ 获取单元任务列表
18
+ @param page: 页码,默认1
19
+ @param size: 每页数量,默认20
20
+ @param sort: 排序字段,默认-sort
21
+ @param search: 搜索关键词(名称/会话线程ID/任务描述模糊查询)
22
+ @param unit_id: 所属单元ID(精确查询)
23
+ @param enable: 是否启用(布尔)
24
+ @param thread_id: 会话线程ID(精确查询)
25
+ """
26
+ data, error = StudyTaskService.list(
27
+ query_params=request_params,
28
+ page=request_params.get('page', 1),
29
+ size=request_params.get('size', 20),
30
+ sort=request_params.get('sort', '-sort'),
31
+ )
32
+ if error:
33
+ return util_response(data=data, msg=error)
34
+ return util_response(data=data)
35
+
36
+
37
+ class StudyTaskAPI(APIView):
38
+
39
+ @request_params_wrapper
40
+ def get(self, *args, request_params, **kwargs):
41
+ """
42
+ 获取单元任务详情
43
+ @param id: 任务ID
44
+ """
45
+ data, error = StudyTaskService.detail(task_id=request_params.get('id'))
46
+ if error:
47
+ return util_response(data=data, msg=error)
48
+ return util_response(data=data)
49
+
50
+ @request_params_wrapper
51
+ def post(self, *args, request_params, **kwargs):
52
+ """
53
+ 新增单元任务
54
+ @param unit_id: 所属单元ID(必填)
55
+ @param name: 任务名称(必填)
56
+ @param task_description: 任务描述
57
+ @param exam_url: 考核回调地址
58
+ @param thread_id: 会话线程ID
59
+ @param enable: 是否启用
60
+ @param task_total_score: 任务总分
61
+ @param task_pass_score: 任务及格分
62
+ @param task_weight_score: 任务权重分(任务权重分 = (任务得分 ÷ 任务满分) × 任务权重分满分)
63
+ @param time_limit: 限时(秒)
64
+ @param open_time: 开放时间
65
+ @param close_time: 关闭时间
66
+ @param publish_time: 发布时间
67
+ @param icon: 图标
68
+ @param sort: 排序
69
+ """
70
+ data, error = StudyTaskService.create(params=request_params)
71
+ if error:
72
+ return util_response(data=data, msg=error)
73
+ return util_response(data={"id": data})
74
+
75
+ @request_params_wrapper
76
+ def put(self, *args, request_params, **kwargs):
77
+ """
78
+ 修改单元任务
79
+ @param id: 任务ID(必填)
80
+ @param 其它字段同新增
81
+ """
82
+ data, error = StudyTaskService.update(task_id=request_params.get('id'), params=request_params)
83
+ if error:
84
+ return util_response(data=data, msg=error)
85
+ return util_response(data={"rows": data})
@@ -0,0 +1,47 @@
1
+ # encoding: utf-8
2
+ """
3
+ @project: study_unit_api
4
+ @synopsis: 学习单元API接口(列表 / 详情)
5
+ """
6
+ from rest_framework.views import APIView
7
+ from ..services.study_unit_service import StudyUnitService
8
+ from ..utils.custom_response import util_response
9
+ from ..utils.request_params_wrapper import request_params_wrapper
10
+
11
+
12
+ class StudyUnitListAPI(APIView):
13
+
14
+ @request_params_wrapper
15
+ def get(self, *args, request_params, **kwargs):
16
+ """
17
+ 获取学习单元列表
18
+ @param page: 页码,默认1
19
+ @param size: 每页数量,默认20
20
+ @param sort: 排序字段,默认-sort
21
+ @param search: 搜索关键词(名称/描述模糊查询)
22
+ @param stage_id: 所属阶段ID(精确查询)
23
+ @param enable: 是否启用(布尔)
24
+ """
25
+ data, error = StudyUnitService.list(
26
+ query_params=request_params,
27
+ page=request_params.get('page', 1),
28
+ size=request_params.get('size', 20),
29
+ sort=request_params.get('sort', '-sort'),
30
+ )
31
+ if error:
32
+ return util_response(data=data, msg=error)
33
+ return util_response(data=data)
34
+
35
+
36
+ class StudyUnitAPI(APIView):
37
+
38
+ @request_params_wrapper
39
+ def get(self, *args, request_params, **kwargs):
40
+ """
41
+ 获取学习单元详情(含关联任务列表)
42
+ @param id: 单元ID
43
+ """
44
+ data, error = StudyUnitService.detail(unit_id=request_params.get('id'))
45
+ if error:
46
+ return util_response(data=data, msg=error)
47
+ return util_response(data=data)
@@ -0,0 +1,65 @@
1
+ # encoding: utf-8
2
+ """
3
+ @project: study_user_stage_api
4
+ @synopsis: 用户阶段记录API接口(列表 / 详情 / 修改)
5
+ @synopsis: 与外部用户系统不使用外键,仅用 user_id / user_uuid 关联
6
+ """
7
+ from rest_framework.views import APIView
8
+ from ..services.study_user_stage_service import StudyUserStageService
9
+ from ..utils.custom_response import util_response
10
+ from ..utils.request_params_wrapper import request_params_wrapper
11
+
12
+
13
+ class StudyUserStageListAPI(APIView):
14
+
15
+ @request_params_wrapper
16
+ def get(self, *args, request_params, **kwargs):
17
+ """
18
+ 获取用户阶段记录列表
19
+ @param page: 页码,默认1
20
+ @param size: 每页数量,默认20
21
+ @param sort: 排序字段,默认-create_time
22
+ @param search: 搜索关键词(user_uuid模糊查询)
23
+ @param user_id: 用户ID(精确查询)
24
+ @param user_uuid: 用户UUID(精确查询)
25
+ @param stage_id: 阶段ID(精确查询)
26
+ @param is_pass: 是否通过(布尔)
27
+ """
28
+ data, error = StudyUserStageService.list(
29
+ query_params=request_params,
30
+ page=request_params.get('page', 1),
31
+ size=request_params.get('size', 20),
32
+ sort=request_params.get('sort', '-create_time'),
33
+ )
34
+ if error:
35
+ return util_response(data=data, msg=error)
36
+ return util_response(data=data)
37
+
38
+
39
+ class StudyUserStageAPI(APIView):
40
+
41
+ @request_params_wrapper
42
+ def get(self, *args, request_params, **kwargs):
43
+ """
44
+ 获取用户阶段记录详情
45
+ @param id: 记录ID
46
+ """
47
+ data, error = StudyUserStageService.detail(record_id=request_params.get('id'))
48
+ if error:
49
+ return util_response(data=data, msg=error)
50
+ return util_response(data=data)
51
+
52
+ @request_params_wrapper
53
+ def put(self, *args, request_params, **kwargs):
54
+ """
55
+ 修改用户阶段记录
56
+ @param id: 记录ID(必填)
57
+ @param user_stage_score: 用户阶段得分
58
+ @param is_pass: 是否通过
59
+ @param icon: 图标
60
+ @param sort: 排序
61
+ """
62
+ data, error = StudyUserStageService.update(record_id=request_params.get('id'), params=request_params)
63
+ if error:
64
+ return util_response(data=data, msg=error)
65
+ return util_response(data={"rows": data})
@@ -0,0 +1,65 @@
1
+ # encoding: utf-8
2
+ """
3
+ @project: study_user_subject_api
4
+ @synopsis: 用户学科记录API接口(列表 / 详情 / 修改)
5
+ @synopsis: 与外部用户系统不使用外键,仅用 user_id / user_uuid 关联
6
+ """
7
+ from rest_framework.views import APIView
8
+ from ..services.study_user_subject_service import StudyUserSubjectService
9
+ from ..utils.custom_response import util_response
10
+ from ..utils.request_params_wrapper import request_params_wrapper
11
+
12
+
13
+ class StudyUserSubjectListAPI(APIView):
14
+
15
+ @request_params_wrapper
16
+ def get(self, *args, request_params, **kwargs):
17
+ """
18
+ 获取用户学科记录列表
19
+ @param page: 页码,默认1
20
+ @param size: 每页数量,默认20
21
+ @param sort: 排序字段,默认-create_time
22
+ @param search: 搜索关键词(user_uuid模糊查询)
23
+ @param user_id: 用户ID(精确查询)
24
+ @param user_uuid: 用户UUID(精确查询)
25
+ @param subject_id: 学科ID(精确查询)
26
+ @param is_pass: 是否通过(布尔)
27
+ """
28
+ data, error = StudyUserSubjectService.list(
29
+ query_params=request_params,
30
+ page=request_params.get('page', 1),
31
+ size=request_params.get('size', 20),
32
+ sort=request_params.get('sort', '-create_time'),
33
+ )
34
+ if error:
35
+ return util_response(data=data, msg=error)
36
+ return util_response(data=data)
37
+
38
+
39
+ class StudyUserSubjectAPI(APIView):
40
+
41
+ @request_params_wrapper
42
+ def get(self, *args, request_params, **kwargs):
43
+ """
44
+ 获取用户学科记录详情
45
+ @param id: 记录ID
46
+ """
47
+ data, error = StudyUserSubjectService.detail(record_id=request_params.get('id'))
48
+ if error:
49
+ return util_response(data=data, msg=error)
50
+ return util_response(data=data)
51
+
52
+ @request_params_wrapper
53
+ def put(self, *args, request_params, **kwargs):
54
+ """
55
+ 修改用户学科记录
56
+ @param id: 记录ID(必填)
57
+ @param user_subject_score: 用户学科得分
58
+ @param is_pass: 是否通过
59
+ @param icon: 图标
60
+ @param sort: 排序
61
+ """
62
+ data, error = StudyUserSubjectService.update(record_id=request_params.get('id'), params=request_params)
63
+ if error:
64
+ return util_response(data=data, msg=error)
65
+ return util_response(data={"rows": data})
@@ -0,0 +1,89 @@
1
+ # encoding: utf-8
2
+ """
3
+ @project: study_user_task_api
4
+ @synopsis: 用户任务记录API接口(列表 / 详情 / 开启 / 提交结果)
5
+ @synopsis: 与外部用户系统不使用外键,仅用 user_id / user_uuid 关联
6
+ """
7
+ from rest_framework.views import APIView
8
+ from ..services.study_user_task_service import StudyUserTaskService
9
+ from ..utils.custom_response import util_response
10
+ from ..utils.request_params_wrapper import request_params_wrapper
11
+
12
+
13
+ class StudyUserTaskListAPI(APIView):
14
+
15
+ @request_params_wrapper
16
+ def get(self, *args, request_params, **kwargs):
17
+ """
18
+ 获取用户任务记录列表
19
+ @param page: 页码,默认1
20
+ @param size: 每页数量,默认20
21
+ @param sort: 排序字段,默认-create_time
22
+ @param search: 搜索关键词(user_uuid模糊查询)
23
+ @param user_id: 用户ID(精确查询)
24
+ @param user_uuid: 用户UUID(精确查询)
25
+ @param task_id: 任务ID(精确查询)
26
+ @param is_pass: 是否通过(布尔)
27
+ """
28
+ data, error = StudyUserTaskService.list(
29
+ query_params=request_params,
30
+ page=request_params.get('page', 1),
31
+ size=request_params.get('size', 20),
32
+ sort=request_params.get('sort', '-create_time'),
33
+ )
34
+ if error:
35
+ return util_response(data=data, msg=error)
36
+ return util_response(data=data)
37
+
38
+
39
+ class StudyUserTaskAPI(APIView):
40
+
41
+ @request_params_wrapper
42
+ def get(self, *args, request_params, **kwargs):
43
+ """
44
+ 获取用户任务记录详情(含 task_snapshot 任务快照)
45
+ @param id: 记录ID
46
+ """
47
+ data, error = StudyUserTaskService.detail(record_id=request_params.get('id'))
48
+ if error:
49
+ return util_response(data=data, msg=error)
50
+ return util_response(data=data)
51
+
52
+
53
+ class StudyUserTaskStartAPI(APIView):
54
+
55
+ @request_params_wrapper
56
+ def post(self, *args, request_params, **kwargs):
57
+ """
58
+ 开启一条用户任务记录(学生开始作答时调用)
59
+ @param user_id: 用户ID(必填)
60
+ @param user_uuid: 用户UUID(必填)
61
+ @param task_id: 任务ID(必填)
62
+ """
63
+ data, error = StudyUserTaskService.start(params=request_params)
64
+ if error:
65
+ return util_response(data=data, msg=error)
66
+ return util_response(data={"id": data})
67
+
68
+
69
+ class StudyUserTaskSubmitAPI(APIView):
70
+
71
+ @request_params_wrapper
72
+ def post(self, *args, request_params, **kwargs):
73
+ """
74
+ 提交用户任务结果(外部考核回调整份提交 / 听写逐题进度同步)
75
+ 整份回调:
76
+ @param id: 记录ID(必填)
77
+ @param user_task_score: 用户任务得分
78
+ @param is_pass: 是否通过
79
+ @param task_snapshot: 任务快照(学生测试JSON数据)
80
+ 逐题进度(每完成一题计1分,答题记录合并进 task_snapshot 并级联累加权重):
81
+ @param id: 记录ID(必填,由 user_task_start 返回)
82
+ @param answer: 单题结果 {word_id, lemma?, input?, status: correct|wrong, listens?, accuracy?, proficiency?}
83
+ @param total: 任务总题量(可选,同步为任务满分,实现「多少题即多少分」)
84
+ @param wordbook_id: 词集ID(可选,记录进快照溯源)
85
+ """
86
+ data, error = StudyUserTaskService.submit(record_id=request_params.get('id'), params=request_params)
87
+ if error:
88
+ return util_response(data=data, msg=error)
89
+ return util_response(data={"rows": data})
@@ -0,0 +1,65 @@
1
+ # encoding: utf-8
2
+ """
3
+ @project: study_user_unit_api
4
+ @synopsis: 用户单元记录API接口(列表 / 详情 / 修改)
5
+ @synopsis: 与外部用户系统不使用外键,仅用 user_id / user_uuid 关联
6
+ """
7
+ from rest_framework.views import APIView
8
+ from ..services.study_user_unit_service import StudyUserUnitService
9
+ from ..utils.custom_response import util_response
10
+ from ..utils.request_params_wrapper import request_params_wrapper
11
+
12
+
13
+ class StudyUserUnitListAPI(APIView):
14
+
15
+ @request_params_wrapper
16
+ def get(self, *args, request_params, **kwargs):
17
+ """
18
+ 获取用户单元记录列表
19
+ @param page: 页码,默认1
20
+ @param size: 每页数量,默认20
21
+ @param sort: 排序字段,默认-create_time
22
+ @param search: 搜索关键词(user_uuid模糊查询)
23
+ @param user_id: 用户ID(精确查询)
24
+ @param user_uuid: 用户UUID(精确查询)
25
+ @param unit_id: 单元ID(精确查询)
26
+ @param is_pass: 是否通过(布尔)
27
+ """
28
+ data, error = StudyUserUnitService.list(
29
+ query_params=request_params,
30
+ page=request_params.get('page', 1),
31
+ size=request_params.get('size', 20),
32
+ sort=request_params.get('sort', '-create_time'),
33
+ )
34
+ if error:
35
+ return util_response(data=data, msg=error)
36
+ return util_response(data=data)
37
+
38
+
39
+ class StudyUserUnitAPI(APIView):
40
+
41
+ @request_params_wrapper
42
+ def get(self, *args, request_params, **kwargs):
43
+ """
44
+ 获取用户单元记录详情
45
+ @param id: 记录ID
46
+ """
47
+ data, error = StudyUserUnitService.detail(record_id=request_params.get('id'))
48
+ if error:
49
+ return util_response(data=data, msg=error)
50
+ return util_response(data=data)
51
+
52
+ @request_params_wrapper
53
+ def put(self, *args, request_params, **kwargs):
54
+ """
55
+ 修改用户单元记录
56
+ @param id: 记录ID(必填)
57
+ @param user_unit_score: 用户单元得分
58
+ @param is_pass: 是否通过
59
+ @param icon: 图标
60
+ @param sort: 排序
61
+ """
62
+ data, error = StudyUserUnitService.update(record_id=request_params.get('id'), params=request_params)
63
+ if error:
64
+ return util_response(data=data, msg=error)
65
+ return util_response(data={"rows": data})
xj_study/apps.py ADDED
@@ -0,0 +1,8 @@
1
+ from django.apps import AppConfig
2
+
3
+
4
+ class StudyConfig(AppConfig):
5
+ default_auto_field = 'django.db.models.BigAutoField'
6
+ name = 'xj_study'
7
+ verbose_name = 'Ⅳ 学习系统'
8
+ sort = 14