def validate_sign_up_sign_in_fields(request): email = request.data.get('email') if email is None or len(email) == 0: raise HttpException(errors.EMAIL_IS_REQUIRED) password = request.data.get('password') if email is None or len(email) == 0: raise HttpException(errors.PASSWORD_IS_REQUIRED) return (email, password)
def post(self, request): try: validator.validate_admin(request) name = validator.validate_menu_name_field(request) if Menu.objects.filter(name=name).count() > 0: raise HttpException(errors.MENU_IS_DUPLICATED) Menu.objects.create(name=name) response = Response({'data': 'OK'}, status=status.HTTP_201_CREATED) response['Cache-Control'] = 'max-age=0, must-revalidate' return response except HttpException as e: return e.get_response() except Exception as e: Logger.log_exception(e) return HttpException(errors.INTERNAL_SERVER_ERROR).get_response()
def sigin(request): try: email, password = validator.validate_sign_up_sign_in_fields(request) user = authenticate(username=email, password=password) if user is None: raise HttpException(errors.AUTHENTICATION_FAILURE) user_logged_in.send(sender=user.__class__, request=request, user=user) response = Response({'data': auth.create_jwt(user)}) response['Cache-Control'] = 'max-age=0, must-revalidate' return response except HttpException as e: return e.get_response() except Exception as e: Logger.log_exception(e) return HttpException(errors.INTERNAL_SERVER_ERROR).get_response()
def validate_order_date(request): timestamp = request.data.get('orderDate') order_date = get_date_from_timestamp(timestamp) start_date = timezone.make_aware(datetime.now()).date() end_date = start_date + timedelta(days=ORDER_DATE_DELTA) if order_date < start_date or order_date > end_date: raise HttpException(errors.INVALID_ORDER_DATE) return order_date
def put(self, request, id): try: validator.validate_admin(request) name = validator.validate_menu_name_field(request) if Menu.objects.filter(~Q(id=id), name=name).count() > 0: raise HttpException(errors.MENU_IS_DUPLICATED) menu = self.get_object(id) menu.name = name menu.save() response = Response({'data': view_models.get_menu(menu)}) response['Cache-Control'] = 'max-age=0, must-revalidate' return response except HttpException as e: return e.get_response() except Exception as e: Logger.log_exception(e) return HttpException(errors.INTERNAL_SERVER_ERROR).get_response()
def get_order(request, timestamp): try: order_date = validator.get_date_from_timestamp(timestamp) user_id = request.user.id orders = Order.objects.select_related('menu').filter( order_date=order_date, user_id=user_id) if len(orders) > 1: raise HttpException(errors.INVALID_ORDER) data = None if len(orders) == 0 else view_models.get_order(orders[0]) response = Response({'data': data}) response['Cache-Control'] = 'max-age=8' return response except HttpException as e: return e.get_response() except Exception as e: Logger.log_exception(e) return HttpException(errors.INTERNAL_SERVER_ERROR).get_response()
def sigup(request): try: email, password = validator.validate_sign_up_sign_in_fields(request) if User.objects.filter(username=email).count() > 0: raise HttpException(errors.USER_IS_DUPLICATED) user = User.objects.create_user( username=email, email=email, password=password) user_logged_in.send(sender=user.__class__, request=request, user=user) data = {'data': auth.create_jwt(user)} response = Response(data, status=status.HTTP_201_CREATED) response['Cache-Control'] = 'max-age=0, must-revalidate' return response except HttpException as e: return e.get_response() except Exception as e: Logger.log_exception(e) return HttpException(errors.INTERNAL_SERVER_ERROR).get_response()
def get(self, request): try: menu_list = Menu.objects.all() response = Response({'data': view_models.get_menu_list(menu_list)}) response['Cache-Control'] = 'max-age=8' return response except Exception as e: Logger.log_exception(e) return HttpException(errors.INTERNAL_SERVER_ERROR).get_response()
def make_order(request): try: order_date = validator.validate_order_date(request) menu_id = validator.validate_menu_id(request) user_id = request.user.id if Menu.objects.filter(id=menu_id).count() == 0: raise HttpException(errors.INVALID_MENU_ID) with transaction.atomic(): Order.objects.filter(order_date=order_date, user_id=user_id, menu_id=menu_id).delete() order = Order.objects.create( order_date=order_date, user_id=user_id, menu_id=menu_id) response = Response({'data': view_models.get_order(order)}) response['Cache-Control'] = 'max-age=0, must-revalidate' return response except HttpException as e: return e.get_response() except Exception as e: Logger.log_exception(e) return HttpException(errors.INTERNAL_SERVER_ERROR).get_response()
def get(self, request, id): try: menu = self.get_object(id) response = Response({'data': view_models.get_menu(menu)}) response['Cache-Control'] = 'max-age=8' return response except HttpException as e: return e.get_response() except Exception as e: Logger.log_exception(e) return HttpException(errors.INTERNAL_SERVER_ERROR).get_response()
def delete(self, request, id): try: validator.validate_admin(request) menu = self.get_object(id) menu.delete() response = Response({'data': 'OK'}) response['Cache-Control'] = 'max-age=0, must-revalidate' return response except HttpException as e: return e.get_response() except Exception as e: Logger.log_exception(e) return HttpException(errors.INTERNAL_SERVER_ERROR).get_response()
def get_order_summary(request, timestamp): try: order_date = validator.get_date_from_timestamp(timestamp) orders = Order.objects.filter(order_date=order_date).values( 'menu__id', 'menu__name').annotate( total=Count('menu__id')).order_by('total') response = Response({'data': view_models.get_order_summary(orders)}) response['Cache-Control'] = 'max-age=8' return response except HttpException as e: return e.get_response() except Exception as e: Logger.log_exception(e) return HttpException(errors.INTERNAL_SERVER_ERROR).get_response()
def validate_admin(request): if not request.user.is_staff: raise HttpException(errors.INVALID_ADMIN)
def validate_menu_id(request): try: menu_id = request.data.get('menuId') return int(menu_id) except Exception: raise HttpException(errors.INVALID_MENU_ID)
def get_date_from_timestamp(timestamp): try: date = datetime.fromtimestamp(int(timestamp)) return timezone.make_aware(date).date() except Exception: raise HttpException(errors.INVALID_DATE)
def validate_menu_name_field(request): name = request.data.get('name') if name is None or len(name) == 0: raise HttpException(errors.NAME_IS_REQUIRED) return name
def catch_all(request, path): response = HttpException(errors.RESOURCE_NOT_FOUND).get_response() response['Cache-Control'] = 'max-age=600' return response
def get_object(self, id): try: menu = Menu.objects.get(id=id) return menu except Exception: raise HttpException(errors.INVALID_MENU_ID)