From 9d6fd9f43e18f82ac80437f9f29d52e320d681e0 Mon Sep 17 00:00:00 2001 From: yankuai Date: Mon, 27 Apr 2020 19:44:50 +0800 Subject: [PATCH 1/3] add ocr test --- .idea/.gitignore | 8 +++ .../inspectionProfiles/profiles_settings.xml | 6 ++ .idea/misc.xml | 7 +++ .idea/modules.xml | 8 +++ .idea/nocode_backend.iml | 27 +++++++++ .idea/vcs.xml | 6 ++ common/consts.py | 1 + common/utils.py | 2 +- nocode_backend/settings.py | 10 +++- ocr/api/ocr_result.py | 2 +- ocr/api/project.py | 24 +++++--- ocr/tests/__init__.py | 0 ocr/tests/test_project.py | 60 +++++++++++++++++++ ocr/tests/test_result.py | 60 +++++++++++++++++++ user_manager/api/auth.py | 1 + user_manager/api/user_management.py | 1 + 16 files changed, 212 insertions(+), 11 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/nocode_backend.iml create mode 100644 .idea/vcs.xml create mode 100644 ocr/tests/__init__.py create mode 100644 ocr/tests/test_project.py create mode 100644 ocr/tests/test_result.py diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..73f69e0 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..6649a8c --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..8201b1d --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/nocode_backend.iml b/.idea/nocode_backend.iml new file mode 100644 index 0000000..e7a7d50 --- /dev/null +++ b/.idea/nocode_backend.iml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/common/consts.py b/common/consts.py index 07ad591..d44088d 100644 --- a/common/consts.py +++ b/common/consts.py @@ -1,3 +1,4 @@ +from enum import Enum # Permission Levels Everyone = 0 User = 1 diff --git a/common/utils.py b/common/utils.py index 92dfe3c..9ebe7f9 100644 --- a/common/utils.py +++ b/common/utils.py @@ -27,7 +27,7 @@ def inner(request, *args, **kwargs): data: dict = parse_data(request) if data is None or not isinstance(data, dict): return failed_api_response(StatusCode.INVALID_REQUEST_ARGUMENT) - if not data.keys() <= fields: + if not set(data.keys()) <= set(fields): return failed_api_response(StatusCode.INVALID_REQUEST_ARGUMENT) kwargs["data"] = data return func(request, *args, **kwargs) diff --git a/nocode_backend/settings.py b/nocode_backend/settings.py index 6b50961..747a6ce 100644 --- a/nocode_backend/settings.py +++ b/nocode_backend/settings.py @@ -77,8 +77,14 @@ DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + # 'ENGINE': 'django.db.backends.sqlite3', + # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'NAME': 'OCR_DB', #数据库名字 + 'USER': 'postgres', #用户名 + "PASSWORD" : 'my981102', #自己的密码 + "HOST":'', + 'PORT':5432, } } diff --git a/ocr/api/ocr_result.py b/ocr/api/ocr_result.py index 4c08d07..0ed582c 100644 --- a/ocr/api/ocr_result.py +++ b/ocr/api/ocr_result.py @@ -24,7 +24,7 @@ def receieve_ocr_photo(request: HttpRequest, project_id: int): id=project_id).filter(belong_to=user).first() if not project: return failed_api_response(StatusCode.REFUSE_ACCESS) - + # TODO:: fetch something from request and pass them to ocr_handler diff --git a/ocr/api/project.py b/ocr/api/project.py index 78099d6..bd061c6 100644 --- a/ocr/api/project.py +++ b/ocr/api/project.py @@ -20,16 +20,26 @@ def create_project(request: HttpRequest, **kwargs): [method]: POST """ - name = kwargs.get("name") - comment = kwargs.get("comment") + # name = kwargs.get("name") + # comment = kwargs.get("comment") + name = request.POST.get("name") + comment = request.POST.get("comment") + if len(name) == 0: return failed_api_response(StatusCode.INVALID_REQUEST_ARGUMENT, "Project name is required") - project: Project = Project.objects.create({ - "name": name, - "comment": comment, - "belong_to": request.user - }) + # project: Project = Project.objects.create({ + # "name": name, + # "comment": comment, + # "belong_to": request.user + # }) + project: Project = Project( + name = name, + comment = comment, + belong_to = request.user + ) + + project.save() return success_api_response({ "id": project.id, diff --git a/ocr/tests/__init__.py b/ocr/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ocr/tests/test_project.py b/ocr/tests/test_project.py new file mode 100644 index 0000000..869046b --- /dev/null +++ b/ocr/tests/test_project.py @@ -0,0 +1,60 @@ +from django.test import TestCase +from django.contrib.auth import get_user_model +from django.test import Client +import json +from ocr.models.project import Project +from ocr.models.recognition_result import RecognitionResult + +class ProjectTestCase(TestCase): + def setUp(self): + self.c = Client() + self.UserModel = get_user_model() + + def test_create_project(self): + self.c.post('/auth/create', {'username':'testuser', 'password':'password', 'email':'email'}, {'content_type':"application/json"}) + response = self.c.post('/auth/', {'username':'testuser', 'password':'password'}, {'content_type':"application/json"}) + access_token = json.loads(response.content.decode())['access_token'] + self.c.defaults['HTTP_AUTHORIZATION'] = 'Bearer ' + access_token + + self.c.post('/ocr/project', {'name': 'project1', 'comment': 'comment1'}, + {'content_type':"application/json"}) + data = json.loads(response.content.decode()) + project_id = data['id'] + project = Project.objects.filter(id=project_id) + self.assertEqual(project.name, 'project1') + self.assertEqual(project.comment, 'comment1') + + def test_update_project(self): + project_id = Project.objects.first().id + self.c.put('/ocr/project/'+project_id, {'name': 'project2', 'comment': 'comment2'}, + {'content_type': "application/json"}) + project = Project.objects.filter(id=project_id) + self.assertEqual(project.name, 'project2') + self.assertEqual(project.comment, 'comment2') + + def test_list_projects(self): + response = self.c.get('/ocr/project', {}, {'content_type': "application/json"}) + data = json.loads(response.content.decode()) + projects = Project.objects.filter(belong_to=self.c) + self.assertEqual(data['projects'], projects.values("id", "name", "comment", "created_at", "results_num")) + self.assertEqual(data['project_num'], 1) + + def test_retrieve_project_detail(self): + project_id = Project.objects.first().id + response = self.c.get('/ocr/project/'+project_id, {}, {'content_type': "application/json"}) + data = json.loads(response.content.decode()) + project = Project.objects.first() + result = RecognitionResult(name='testresult', comment='resultcomment', belong_to=project) + result.save() + results = result.belong_to.recognitionresult_set.all() + + self.assertEqual(data['name'], project.name) + self.assertEqual(data['comment'], project.comment) + self.assertEqual(data['created_at'], project.created_at) + self.assertEqual(data['result_num'], project.recognitionresult_set.count()) + self.assertEqual(data['results'], results.values("id", "name", "comment", "created_at")) + + def test_remove_project(self): + project_id = Project.objects.first().id + self.c.delete('/ocr/project/' + project_id, {}, {'content_type': "application/json"}) + self.assertEqual(Project.objects.count(), 0) \ No newline at end of file diff --git a/ocr/tests/test_result.py b/ocr/tests/test_result.py new file mode 100644 index 0000000..8079948 --- /dev/null +++ b/ocr/tests/test_result.py @@ -0,0 +1,60 @@ +from django.test import TestCase +from django.contrib.auth import get_user_model +from django.test import Client +import json +import os +from ocr.models.project import Project +from ocr.models.recognition_result import RecognitionResult + +class ProjectTestCase(TestCase): + def setUp(self): + self.c = Client() + self.UserModel = get_user_model() + + def test_receieve_ocr_photo(self): + self.c.post('/auth/create', {'username':'testuser2', 'password':'password', 'email':'email'}, {'content_type':"application/json"}) + response = self.c.post('/auth/', {'username':'testuser2', 'password':'password'}, {'content_type':"application/json"}) + access_token = json.loads(response.content.decode())['access_token'] + self.c.defaults['HTTP_AUTHORIZATION'] = 'Bearer ' + access_token + self.c.post('/ocr/project', {'name': 'project1', 'comment': 'comment1'}, + {'content_type':"application/json"}) + data = json.loads(response.content.decode()) + project_id = data['id'] + project = Project.objects.filter(id=project_id) + + file = 'form.png' + payload = {'name': 'result1', 'comment': 'resultcomment1'} + files = { + "json": (None, json.dumps(payload), "application/json"), + "file": (os.path.basename(file), open(file, "rb"), "image/png") + } + response = self.c.post('/ocr/project/'+project_id, files=files) + data = json.loads(response.content.decode()) + result = project.recognitionresult_set.filter(id=data['id']) + self.assertEqual(result.name, 'result1') + self.assertEqual(result.comment, 'resultcomment1') + + def test_retrieve_ocr_result(self): + project = Project.objects.filter(belong_to=self.c).first() + result = project.recognitionresult_set.all().first() + response = self.c.get('/ocr/project/'+project.id+'/'+result.id, {}, {'content_type': "application/json"}) + data = json.loads(response.content.decode()) + self.assertEqual(data['id'], result.id) + self.assertEqual(data['name'], result.name) + self.assertEqual(data['comment'], result.comment) + self.assertEqual(data['result'], result.result) + + def test_update_ocr_result(self): + project = Project.objects.filter(belong_to=self.c).first() + result = project.recognitionresult_set.all().first() + self.c.put('/ocr/project/'+project.id+'/'+result.id, {'name': 'result2', 'comment': 'resultcomment2'}, + {'content_type': "application/json"}) + result = RecognitionResult.objects.filter(id=result.id) + self.assertEqual(result.name, 'result2') + self.assertEqual(result.comment, 'resultcomment2') + + def test_remove_ocr_result(self): + project = Project.objects.filter(belong_to=self.c).first() + result = project.recognitionresult_set.all().first() + self.c.delete('/ocr/project/'+project.id+'/'+result.id, {}, {'content_type': "application/json"}) + self.assertEqual(RecognitionResult.objects.count(), 0) \ No newline at end of file diff --git a/user_manager/api/auth.py b/user_manager/api/auth.py index 9cb2ab8..1a095c1 100644 --- a/user_manager/api/auth.py +++ b/user_manager/api/auth.py @@ -56,6 +56,7 @@ def verify_jwt_token(request: HttpRequest) -> (bool, StatusCode, str, int): status: StatusCode = StatusCode.SUCCESS header: str = request.META.get("HTTP_AUTHORIZATION") try: + print(header) if header is None: raise jwt.InvalidTokenError diff --git a/user_manager/api/user_management.py b/user_manager/api/user_management.py index ecedb33..2661be4 100644 --- a/user_manager/api/user_management.py +++ b/user_manager/api/user_management.py @@ -19,6 +19,7 @@ def create_user(request: HttpRequest): [method]: POST """ + print(request) user_info: dict = parse_data(request) if not user_info: return failed_api_response(StatusCode.BAD_REQUEST, "Bad request") From 5be5bdc558bb447163f298509e52e6ad973c2ef8 Mon Sep 17 00:00:00 2001 From: yankuai Date: Mon, 27 Apr 2020 19:45:44 +0800 Subject: [PATCH 2/3] add ocr test --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 7e94658..66e5f55 100644 --- a/.gitignore +++ b/.gitignore @@ -125,5 +125,6 @@ dmypy.json # REST Client Test Case *.http +*.idea # End of https://www.gitignore.io/api/django \ No newline at end of file From ab14f4f7feb5493eb8ac4c33c3b64854dce2ed39 Mon Sep 17 00:00:00 2001 From: yankuai Date: Mon, 27 Apr 2020 19:46:55 +0800 Subject: [PATCH 3/3] add ocr test --- .gitignore | 1 - .idea/.gitignore | 8 ------ .../inspectionProfiles/profiles_settings.xml | 6 ----- .idea/misc.xml | 7 ----- .idea/modules.xml | 8 ------ .idea/nocode_backend.iml | 27 ------------------- .idea/vcs.xml | 6 ----- 7 files changed, 63 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/inspectionProfiles/profiles_settings.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/nocode_backend.iml delete mode 100644 .idea/vcs.xml diff --git a/.gitignore b/.gitignore index 66e5f55..7e94658 100644 --- a/.gitignore +++ b/.gitignore @@ -125,6 +125,5 @@ dmypy.json # REST Client Test Case *.http -*.idea # End of https://www.gitignore.io/api/django \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 73f69e0..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml -# Editor-based HTTP Client requests -/httpRequests/ diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 105ce2d..0000000 --- a/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 6649a8c..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 8201b1d..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/nocode_backend.iml b/.idea/nocode_backend.iml deleted file mode 100644 index e7a7d50..0000000 --- a/.idea/nocode_backend.iml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file