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")