def validate(self, attrs): # email comes as the code username = attrs.get('email') password = attrs.get('password') # check the working period first time_now = datetime.now().time() if username and password: username = username.lower() if '@' in username: kwargs = {'email': username} else: kwargs = {'code': username} try: us = get_user_model().objects.get(**kwargs) except ObjectDoesNotExist as ex: logger.error("could not get user details", exception=ex) msg = _('Invalid User Credentials.') raise serializers.ValidationError(msg) user = authenticate(username=us.email, password=us.rest_code) if user: logger.info('successful authentication', user=user) if not user.is_active: logger.info('unauthorized user login, user not active', user=user) msg = _('Unauthorized User Login.') raise serializers.ValidationError(msg) if not user.has_perm('sales.code_login'): logger.info('unauthorized user login, user has no permissions', user=user) msg = _('Unauthorized User Login.') raise serializers.ValidationError(msg) if not is_shift_started(): """ check permission for changing main shift """ if not user.has_perm('sales.change_shift'): logger.info('close main shift, user has no permissions to start shift', user=user) msg = _('MAIN SHIFT IS CLOSED.') raise serializers.ValidationError(msg) payload = jwt_payload_handler(user) return { 'token': jwt_encode_handler(payload), 'user': user, 'permissions': user.get_all_permissions(), 'main_shift_status': is_shift_started() } else: logger.info('invalid user credentials, user not authenticated') msg = _('Invalid User Credentials.') raise serializers.ValidationError(msg) else: logger.info('error authorizing empty code') msg = _('Must include "{username_field}" and "password".') msg = msg.format(username_field=self.username_field) raise serializers.ValidationError(msg)
def end_shift(request): cash_drawer_amount = "0.0" qs = Terminal.objects.all() if qs.last(): cash_drawer_amount = str(qs.last().amount) if request.method == 'POST': code = request.data.get('code') email = request.data.get('email') note = request.data.get('note') balance = request.data.get('balance') main_shift_status = request.data.get('main_shift_status') """ if the main status is True then check if shift already exists and close it """ if bool(main_shift_status): if is_shift_started(): close_time_from_now = timezone.localtime(timezone.now()) main_shift = MainShift.objects.all().last() main_shift.closing_time = close_time_from_now main_shift.save() if code and email: is_started_shift = False try: user = User.objects.get(code=code, email=email) now = datetime.now() time_now = now.strftime("%Y-%m-%d %H:%M: %p") query = Shift.objects.filter(user=user) if query.exists(): shift = query.last() shift.end_time = time_now shift.end_counter_balance = cash_drawer_amount shift.cashier_end_balance = balance shift.end_note = note shift.save() except Exception as e: logger.error("check_shift_started", message=e.message) raise serializers.ValidationError(_('No such user exists.')) is_started_shift = {"is_started_shift": is_started_shift} serializer = ShiftSerializer(is_started_shift) return Response(serializer.data) raise serializers.ValidationError(_('Method not allowed'))
def jwt_response_payload_handler(token, user=None, request=None): if not check_work_period(): return {'error': "working period closed"} # Override to return a custom response such as including # the serialized representation of the User. return { 'token': token, 'user': UserSerializer(user, context={ 'request': request }).data, 'main_shift_status': is_shift_started() }
def get_queryset(self, *args, **kwargs): if is_shift_started(): shift = MainShift.objects.all().last() open_date = shift.opening_time.replace(tzinfo=None) close_date = shift.closing_time.replace(tzinfo=None) queryset_list = Item.objects.filter(qty__gte=1) try: if self.kwargs['pk']: queryset_list = queryset_list.filter( transfer__date__range=[open_date, close_date] ).filter(stock__variant__product__categories__pk=self.kwargs['pk']) else: queryset_list = Item.objects.filter( transfer__date__range=[open_date, close_date] ) except Exception as e: queryset_list = Item.objects.all().filter( transfer__date__range=[open_date, close_date] ) page_size = 'page_size' if self.request.GET.get(page_size): pagination.PageNumberPagination.page_size = self.request.GET.get(page_size) else: pagination.PageNumberPagination.page_size = 8 if self.request.GET.get('date'): queryset_list = queryset_list.filter(date__icontains=self.request.GET.get('date')) if self.request.GET.get('counter'): queryset_list = queryset_list.filter(counter__pk=self.request.GET.get('counter')) query = self.request.GET.get('q') if query: queryset_list = queryset_list.filter( Q(stock__variant__sku__icontains=query) | Q(stock__variant__product__name__icontains=query)) return queryset_list.distinct('stock').select_related().order_by('stock') else: return Item.objects.none() # to return empty queryset
def get(self, request): query = self.request.GET.get('q', '') all_counter_menu_stock = [] if is_shift_started(): shift = MainShift.objects.all().last() open_date = shift.opening_time.replace(tzinfo=None) close_date = shift.closing_time.replace(tzinfo=None) """ get the counter stocks """ try: counter_stock = CounterItems.objects.filter( transfer__date__range=[open_date, close_date]).filter( qty__gte=1).distinct('stock').select_related() if query: counter_stock = counter_stock.filter( Q(stock__variant__sku__icontains=query) | Q(stock__variant__product__name__icontains=query) | Q(counter__name__icontains=query)).order_by('stock') if counter_stock.exists(): for i in counter_stock: """ set the json data fields using getCounterItemsJsonData(obj) """ all_counter_menu_stock.append( getCounterItemsJsonData(i)) except Exception as e: """ log error """ logger.info('Error in getting counter stock: ' + str(e)) pass """ get the menu stocks """ try: menu_stock = MenuItem.objects.filter( transfer__date__range=[open_date, close_date]).filter( qty__gte=1).distinct('menu').select_related() if query: menu_stock = menu_stock.filter( Q(menu__category__name__icontains=query) | Q(name__icontains=query) | Q(counter__name__icontains=query) | Q(menu__name__icontains=query) | Q(menu__id__icontains=query)).order_by('menu') if menu_stock.exists(): for i in menu_stock: """ set the json data fields using getMenuItemsJsonData(obj) """ all_counter_menu_stock.append(getMenuItemsJsonData(i)) except Exception as e: """ log error """ logger.info('Error in getting menu stock: ' + str(e)) pass serializer = SearchTransferredStockListSerializer( all_counter_menu_stock, many=True) return Response(serializer.data)
def start_shift(request): cash_drawer_amount = "0.0" qs = Terminal.objects.all() if qs.last(): cash_drawer_amount = str(qs.last().amount) if request.method == 'POST': code = request.data.get('code') email = request.data.get('email') note = request.data.get('note') balance = request.data.get('balance') main_shift_status = request.data.get('main_shift_status') """ if the main status is True then check if shift already exists, else create one if not """ if bool(main_shift_status): if not is_shift_started(): date_now = timezone.localtime(timezone.now()) open_time_from_now = date_now close_date = date_now + timedelta(days=1) close_time = close_date.replace(hour=6, minute=0, second=0) close_time_from_now = close_time main_shift = MainShift() main_shift.opening_time = open_time_from_now main_shift.closing_time = close_time_from_now main_shift.start_note = note main_shift.start_balance = balance main_shift.save() if code and email: is_started_shift = True try: user = User.objects.get(code=code, email=email) now = datetime.now() time_now = now.strftime("%Y-%m-%d %H:%M: %p") date_today = now.strftime("%Y-%m-%d") query = Shift.objects.filter(created_at__icontains=date_today, user=user) if query.exists(): last = query.last() if last.end_time: shift = Shift.objects.create( start_time=time_now, user=user, start_counter_balance=cash_drawer_amount, cashier_start_balance=balance, start_note=note) else: Shift.objects.create( start_time=time_now, user=user, start_counter_balance=cash_drawer_amount, cashier_start_balance=balance, start_note=note) except Exception as e: logger.error("check_shift_started", message=e.message) raise serializers.ValidationError(_('No such user exists.')) is_started_shift = {"is_started_shift": is_started_shift} serializer = ShiftSerializer(is_started_shift) return Response(serializer.data) raise serializers.ValidationError(_('Method not allowed'))