コード例 #1
0
    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)
コード例 #2
0
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'))
コード例 #3
0
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()
    }
コード例 #4
0
    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
コード例 #5
0
    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)
コード例 #6
0
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'))