def signup(request): """ 회원가입 기능 """ try: logger.info("/account/signup") if request.is_ajax() == False: return HttpResponseNotFound('<h1>Page not found</h1>') email = request.POST.get('email') password = request.POST.get('password') user = User.objects.create_user(email, password) if user is not None: #Verify form's content existence if user.is_active: #Verify validity login(request, user) result = ErrClass('NOERROR').toDict() result['user_index'] = user.pk result['email'] = user.email return HttpResponse(json.dumps(result), content_type="application/json") else: return ErrClass("ID_OR_PASSWORD_MISMATCH").response() except IntegrityError as e: logger.error(traceback.format_exc() ) ## 동일 이메일 중복으로 인한 에러 if "1062" in str(e): return ErrClass('DUPLICATED_EMAIL').response() return ErrClass('UNKNWON_ERROR').response() except Exception as e: logger.error(traceback.format_exc() ) return ErrClass('UNKNWON_ERROR').response()
def _login(request): """ User login 기능 """ try: logger.info("/account/login") if request.is_ajax() == False: c = {} c.update(csrf(request)) response = TemplateResponse(request, 'accounts/login.html', c ) response.render() return response email = request.POST.get('email') password = request.POST.get('password') next = request.POST.get('next') user = authenticate(username=email, password=password) if user is not None: ## 로그인 체크 if user.is_active: ## 유저 상태 active 인지 검사(admin 이 false 설정을 해서 로그인을 막아 놓았을 수 있다.) login(request, user) result = ErrClass('NOERROR').toDict() result['user_index'] = user.pk result['email'] = user.email if next: result['redirect_url'] = next else: result['redirect_url'] = "/todo/list" return HttpResponse(json.dumps(result), content_type="application/json") return ErrClass("UNACTIVE_USER").response() else: return ErrClass("ID_OR_PASSWORD_WRONG").response() except Exception as e: logger.error(traceback.format_exc() ) return ErrClass('UNKNWON_ERROR').response()
def importData(request): try: importfile = request.FILES["importfile"] file_mime = mimetypes.guess_type(importfile.name) jsonDataList = [] importfile.seek(0) if file_mime[0] == "text/csv": reader = csv.reader(io.StringIO(importfile.read().decode('utf-8'))) for row in reader: # id, priority, text, create_time, done done = row[4] == "True" item = { "id": row[0], "priority": row[1], "text": row[2], "create_time": int(row[3]), "done": done } jsonDataList.append(item) elif file_mime[0] == "application/vnd.ms-excel": wb = load_workbook(filename=io.BytesIO(importfile.read())) worksheet = wb.active for row in worksheet.rows: # id, priority, text, create_time, done done = row[4].value item = { "id": row[0].value or "", "priority": str(row[1].value), "text": row[2].value, "create_time": int(row[3].value), "done": done } jsonDataList.append(item) elif file_mime[0] == "application/json": jsonDataByte = importfile.read() jsonDataStr = jsonDataByte.decode("utf-8") jsonDataList = json.loads(jsonDataStr) else: return ErrClass('UNKNWON_ERROR').response() result = ErrClass('NOERROR').toDict() result["jsonData"] = jsonDataList return HttpResponse(json.dumps(result), content_type="application/json") except Exception as e: logger.error(traceback.format_exc()) return ErrClass('UNKNWON_ERROR').response()
def exportData(request): try: filetype = request.GET.get("filetype") jsonDataString = request.GET.get("jsonData") jsonDataList = json.loads(jsonDataString) if filetype == "csv": response = HttpResponse(content_type='text/csv') response[ 'Content-Disposition'] = 'attachment; filename="todolist.csv"' # id, priority, text, create_time, done writer = csv.writer(response) for item in jsonDataList: writer.writerow([ item["id"], item["priority"], item["text"], item["create_time"], item["done"] ]) return response elif filetype == "excel": wb = openpyxl.Workbook() worksheet = wb.active for item in jsonDataList: worksheet.append([ item["id"], item["priority"], item["text"], item["create_time"], item["done"] ]) response = HttpResponse(content=save_virtual_workbook(wb), content_type='application/vnd.ms-excel') response[ 'Content-Disposition'] = 'attachment; filename="todolist.xls"' return response elif filetype == "json": response = HttpResponse(content=jsonDataString, content_type='application/json') response[ 'Content-Disposition'] = 'attachment; filename="todolist.json"' return response return ErrClass('UNKNWON_ERROR').response() except Exception as e: logger.error(traceback.format_exc()) return ErrClass('UNKNWON_ERROR').response()
def create(self, request, *args, **kwargs): """ HTTP POST Method 를 사용했을 때 호출되는 부분 email 과 password 를 이용해서 user 를 생성한다. """ param_dict = request.data.copy() serializer = self.get_serializer(data=param_dict) if serializer.is_valid() == False: if 'username' in serializer.errors: return ErrClass("DUPLICATED_EMAIL").response() return ErrClass('UNKNWON_ERROR').response() self.perform_create(serializer) user = serializer.instance user.is_active = True user.set_password(param_dict['password']) ## 패스워드의 경우 Hashmode 을 이용하기 위해 해당 메소드를 이용한다. user.save() result = ErrClass('NOERROR').toDict() return HttpResponse(json.dumps(result), content_type="application/json")
def deletelist(self, request): """ HTTP POST Method 를 사용하고 deletelist 라는 path email 과 password 를 이용해서 user 를 생성한다. ids[] : 삭제하고 싶 """ ids = request.POST.getlist("ids[]") objects = self.get_queryset().filter( id__in = ids ) objects.delete() result = ErrClass('NOERROR').toDict() return HttpResponse(json.dumps(result), content_type="application/json")
def _list(request): try: logger.info("/account/list") c = {} c.update(csrf(request)) response = TemplateResponse(request, 'accounts/list.html', c ) response.render() return response except Exception as e: logger.error(traceback.format_exc() ) return ErrClass('UNKNWON_ERROR').response()
def emailselectlist(self, request): """ 유저 이메일 리스팅 """ objects = self.get_queryset().all( ) objects_list = objects.values( "id", "email") data = [] for item in objects_list: data.append( item ) result = ErrClass('NOERROR').toDict() result["data"] = data return HttpResponse(json.dumps(result), content_type="application/json")
def sample(request): try: logger.info("/sample") if request.path.startswith("/rest") == False: c = {} response = TemplateResponse(request, 'sample.html', c) response.render() return response except Exception as e: logger.error(traceback.format_exc()) return ErrClass('UNKNWON_ERROR').response()
def dayofweeklist(request): try: logger.info("/todos/dayofweeklist") c = {} c.update(csrf(request)) if request.user.is_superuser: response = TemplateResponse(request, 'todos/admin_dayofweeklist.html', c) else: response = TemplateResponse(request, 'todos/dayofweeklist.html', c) response.render() return response except Exception as e: logger.error(traceback.format_exc()) return ErrClass('UNKNWON_ERROR').response()
def save(self, request): """ HTTP POST Method 를 사용하고 save 라는 path 를 사용할 때 데이터를 저장하는 함수 저장하려는 데이터와 실제 DB에 저장된 데이터가 있을 때, 그 차이에 대해서만 저장하고 삭제한다. """ try: jsonDataString = request.POST.get("jsonData") jsonDataList = json.loads(jsonDataString) josnDataDict = {} ## id 를 key 로, 나머지 데이터를 value 로하는 dict index = 2**32 for item in jsonDataList: _id = item["id"] if _id == "": ## 새로 추가 되는 아이템인 경우 id 가 0일 수 있는데, 이 경우 임의의 id를 부여 item["id"] = _id = index index += 1 josnDataDict[_id] = item jsonDataSet = set(josnDataDict.keys()) objects = self.get_queryset().filter(user=request.user) objectsDict = {} ## id 를 key로, 나머지 데이터를 value 로하는 dict for item in objects: _id = item.id objectsDict[_id] = item objectsSet = set(objectsDict.keys()) ## jsonData 와 objects(DB) 를 비교해서 ## jsonData 에만 존재, 데이터 추가 itemToAdd = jsonDataSet - objectsSet for _id in itemToAdd: item = josnDataDict[_id] create_time = datetime.datetime.fromtimestamp( item["create_time"] / 1000) todo = Todo(user=request.user, priority=item["priority"], text=item["text"], done=item["done"], create_time=create_time) todo.save() ## objects에만 존재 데이터 삭제 itemToDelete = objectsSet - jsonDataSet for _id in itemToDelete: item = objectsDict[_id] self.get_queryset().filter(id=_id).delete() ## 양쪽에 다 존재하는 데이터의 done과 priority 상태 확인 itemToUpdateCheck = objectsSet.intersection(jsonDataSet) for _id in itemToUpdateCheck: itemWeb = josnDataDict[_id] itemDB = objectsDict[_id] if itemWeb["done"] != itemDB.done or itemWeb[ "priority"] != itemDB.priority: self.get_queryset().filter(id=_id).update( done=itemWeb["done"], priority=itemWeb["priority"]) result = ErrClass('NOERROR').toDict() return HttpResponse(json.dumps(result), content_type="application/json") except Exception as e: logger.error(traceback.format_exc()) return ErrClass('UNKNWON_ERROR').response()