Exemple #1
0
 def add(self, request):
     data = Tools.clean_and_upper_key(request.data, 'uid')
     data = Tools.clean_key(request.data, 'purchase_code')
     serializer = BolBaseSr(data=data)
     if serializer.is_valid(raise_exception=True):
         serializer.save()
     return res(serializer.data)
Exemple #2
0
 def change(self, request, pk=None):
     obj = self.get_object(pk)
     data = Tools.clean_and_upper_key(request.data, 'uid')
     data = Tools.clean_key(request.data, 'purchase_code')
     serializer = BolBaseSr(obj, data=data, partial=True)
     if serializer.is_valid(raise_exception=True):
         serializer.save()
     return res(serializer.data)
Exemple #3
0
    def test_date_to_str(self):
        input = timezone.now()
        output = Tools.date_to_str(input).split('/')

        self.assertEqual(Tools.date_to_str(''), '')
        self.assertEqual(Tools.date_to_str(None), '')

        self.assertEqual(len(output[0]), 2)
        self.assertEqual(len(output[1]), 2)
        self.assertEqual(len(output[2]), 4)
Exemple #4
0
    def match_vn(self, request):
        uid = request.data.get('bol_uid', '')
        bag_uid = request.data.get('bag_uid', '')

        uid = Tools.remove_special_chars(uid, True)
        bag_uid = Tools.remove_special_chars(bag_uid, True)

        obj = get_object_or_404(Bol, uid=uid, bag__uid=bag_uid)
        if not obj.vn_date:
            obj.vn_date = timezone.now()
            obj.save()
        return res(BolBaseSr(obj).data)
Exemple #5
0
    def save(self, *args, **kwargs):
        from .utils import CustomerUtils

        if not self._state.adding:
            item = Customer.objects.get(pk=self.pk)
            if item.avatar and item.avatar and hasattr(item.avatar, 'url'):
                if self.avatar and item.avatar != self.avatar:
                    Tools.remove_file(item.avatar.path, True)
        super(Customer, self).save(*args, **kwargs)

        CustomerUtils.ensure_roles(self)

        if self.avatar and hasattr(self.avatar, 'url'):
            Tools.scale_image(1, self.avatar.path)
Exemple #6
0
    def list(self, request):
        from apps.staff.models import Staff
        from apps.staff.serializers import StaffSelectSr
        from apps.customer.models import Customer
        from apps.customer.serializers import CustomerSelectSr

        balance = 0
        queryset = Transaction.objects.all()
        if hasattr(request.user, 'customer'):
            queryset = queryset.filter(customer=request.user.customer)
            balance = TransactionUtils.get_customer_balance(request.user.customer)

        queryset = self.filter_queryset(queryset)
        queryset = self.paginate_queryset(queryset)
        serializer = TransactionBaseSr(queryset, many=True)

        result = {
            'items': serializer.data,
            'extra': {
                'list_bank': BankBaseSr(Bank.objects.all(), many=True).data,
                'list_customer': [],
                'balance': balance,
                'options': {
                    'staff': StaffSelectSr(Staff.objects.all(), many=True).data,
                    'customer': CustomerSelectSr(Customer.objects.all(), many=True).data
                }
            }
        }
        is_fetch_customers = Tools.string_to_bool(request.query_params.get('customers', 'False'))
        if is_fetch_customers:
            result['extra']['list_customer'] = CustomerUtils.get_list_for_select()
        return self.get_paginated_response(result)
Exemple #7
0
 def get_title(self, obj):
     lang = Tools.langFromContext(self.context)
     if lang not in settings.LANGUAGES or lang == settings.LANGUAGES[0]:
         return obj.title
     translation = BannerTranslation.objects.filter(banner=obj.pk,
                                                    lang=lang).first()
     return translation.title if translation.title else obj.title
Exemple #8
0
 def get_description(self, obj):
     lang = Tools.langFromContext(self.context)
     if lang not in settings.LANGUAGES:
         return obj.description
     translation = BannerTranslation.objects.filter(banner=obj.pk,
                                                    lang=lang).first()
     return translation.description
Exemple #9
0
    def save(self, *args, **kwargs):
        from .utils import OrderUtils
        from apps.bol.utils import BolUtils

        if not self._state.adding:
            self = OrderUtils.check_order_for_frozen(self)

            BolUtils.update_order_service(self)

        if self._state.adding and self.address and not self.uid:
            self.uid = OrderUtils.get_next_uid(self.address)

            self.customer = self.address.customer
            deposit_factor = self.customer.deposit_factor
            if not deposit_factor or deposit_factor < 0 or deposit_factor > 90:
                self.deposit_factor = settings.DEPOSIT_FACTOR
            else:
                self.deposit_factor = self.customer.deposit_factor

        if self._state.adding and self.address:
            customer = self.address.customer
            if not self.sale:
                self.sale = customer.sale
            if not self.cust_care:
                self.cust_care = customer.cust_care

        if self.purchase_code:
            self.purchase_code = self.purchase_code.strip()

        self.customer = self.address.customer

        if not Tools.is_testing():
            self.__dict__.update(OrderUtils.cal_all(self))
        super(Order, self).save(*args, **kwargs)
Exemple #10
0
 def create(self, validated_data):
     validated_data['filetype'] = Tools.checkMime(validated_data['attachment'])
     if validated_data['filetype'] == '':
         raise ValidationError({'detail': 'File type not supported'})
     attach = Attach(**validated_data)
     attach.save()
     return attach
Exemple #11
0
 def get_content(self, obj):
     lang = Tools.langFromContext(self.context)
     if lang not in settings.LANGUAGES:
         return obj.content
     translation = ArticleTranslation.objects.filter(article=obj.pk,
                                                     lang=lang).first()
     return translation.content if translation.content else obj.content
Exemple #12
0
 def get_title(self, obj):
     lang = self.context.get('lang', None)
     if lang is None:
         lang = Tools.langFromContext(self.context)
     if lang not in settings.LANGUAGES or lang == settings.LANGUAGES[0]:
         return obj.title
     translation = CategoryTranslation.objects.filter(category=obj.pk, lang=lang).first()
     return translation.title if translation.title else obj.title
Exemple #13
0
 def update(self, instance, validated_data):
     if 'attachment' in validated_data:
         validated_data['filetype'] = Tools.checkMime(validated_data['attachment'])
         if validated_data['filetype'] == '':
             raise ValidationError({'detail': 'File type not supported'})
     instance.__dict__.update(validated_data)
     instance.save()
     return instance
Exemple #14
0
 def list(self, request):
     query = self.request.GET.dict()
     if 'richtext_image' in query:
         query['richtext_image'] = Tools.stringToBool(
             query['richtext_image'])
     queryset = Attach.objects.filter(**query)
     queryset = self.filter_queryset(queryset)
     serializer = AttachBaseSerializer(queryset, many=True)
     return Response(serializer.data)
Exemple #15
0
    def post(self, request, format=None):
        params = self.request.data
        item = self.get_object(params["username"])
        user = item.user

        token = Tools.getUuid()

        item.reset_password_token = token
        item.reset_password_tmp = make_password(params["password"])
        item.reset_password_created = timezone.now()
        item.save()
        url = settings.BASE_URL + "admin/reset-password/" + str(token)
        subject = "Rest set password for %s %s" % (user.first_name, user.last_name)
        body = "Reset password confirm link: %s" % (url)
        to = user.email

        Tools.sendEmailAsync(subject, body, to)
        return Response({})
Exemple #16
0
 def change_address(self, request, pk=None):
     obj = get_object_or_404(Order, pk=pk)
     blank, address = Tools.obj_from_pk(Address,
                                        request.data.get('value', None))
     if not blank and not address:
         # Address not exist -> do nothing
         serializer = OrderBaseSr(obj)
     else:
         serializer = OrderUtils.partial_update(obj, 'address', address.pk)
     return res(serializer.data)
Exemple #17
0
 def change_cust_care(self, request, pk=None):
     obj = get_object_or_404(Order, pk=pk)
     blank, staff = Tools.obj_from_pk(Staff,
                                      request.data.get('value', None))
     if not blank and not staff:
         # Staff not exist -> do nothing
         serializer = OrderBaseSr(obj)
     else:
         serializer = OrderUtils.partial_update(obj, 'cust_care', staff.pk)
     return res(serializer.data)
Exemple #18
0
 def save(self, *args, **kwargs):
     if not self.uid:
         self.uid = Tools.get_uuid()
     if self.customer:
         self.customer_username = self.customer.user.username
     if self.staff:
         self.staff_username = self.staff.user.username
     if self.address:
         self.address_code = self.address.uid
     super(Receipt, self).save(*args, **kwargs)
Exemple #19
0
    def retrieve_to_print_common(receipt: models.QuerySet) -> dict:
        from apps.variable.utils import VariableUtils
        from apps.address.serializers import AddressBaseSr

        return {
            'company_info': VariableUtils.get_company_info(),
            'customer': {
                'fullname': Tools.get_fullname(receipt.customer),
            },
            'staff': {
                'fullname': Tools.get_fullname(receipt.staff),
            },
            'address': AddressBaseSr(receipt.address).data,
            'uid': receipt.uid,
            'created_at': receipt.created_at,
            'vnd_delivery_fee': receipt.vnd_delivery_fee,
            'vnd_total': receipt.vnd_total,
            'note': receipt.note
        }
Exemple #20
0
 def mark_cn(self, request, pk=None):
     obj = self.get_object(pk)
     if obj.cn_date is not None:
         raise ValidationError(
             {"uid": "Vận đơn này đã ghi nhận về kho TQ."})
     data = Tools.clean_and_upper_key(request.data, 'uid')
     serializer = BolBaseSr(obj, data=data, partial=True)
     if serializer.is_valid(raise_exception=True):
         serializer.save()
     return res(serializer.data)
Exemple #21
0
    def save(self, *args, **kwargs):
        from .utils import TransactionUtils

        self.is_assets = TransactionUtils.is_assets(self.type)

        if not self.uid:
            self.uid = Tools.get_uuid()

        if self.customer:
            self.customer_username = Tools.get_fullname(self.customer.user, True)
        if self.staff:
            self.staff_username = Tools.get_fullname(self.staff.user, True)

        if self.order:
            self.order_uid = self.order.uid
        if self.bol:
            self.bol_uid = self.bol.uid
        self.balance = TransactionUtils.get_transaction_balance(self)

        super(Transaction, self).save(*args, **kwargs)
Exemple #22
0
    def export_no_incomplete_order_bols(bols: models.QuerySet, ids: list) -> str:
        orders_have_multiple_bols = {}
        for bol in bols:
            if bol.order and bol.order.order_bols.count() > 1:
                orders_have_multiple_bols[str(bol.order.pk)] = bol.order
        orders = orders_have_multiple_bols.values()

        for order in orders:
            sub_bols = [bol.pk for bol in order.order_bols.all()]
            if Tools.is_semi_contain(ids, sub_bols):
                return error_messages['EXPORT_INCOMPLETE_ORDER_BOLS']
        return ""
Exemple #23
0
    def save(self, *args, **kwargs):

        if not self.title:
            self.title = self.attachment.path.split("/")[-1]

        if not self._state.adding and self.attachment:
            item = Attach.objects.get(pk=self.pk)
            if not self.richtext_image:
                self.richtext_image = item.richtext_image
            if item.attachment != self.attachment:
                # Update: remove exist attachment
                removeThumbnail = False
                if item.filetype == 'image':
                    removeThumbnail = True
                Tools.removeFile(item.attachment.path, removeThumbnail)
        if self.order == 0:
            if Attach.objects.count() > 0:
                self.order = Attach.objects.order_by(
                    '-order').first().order + 1
            else:
                self.order = 1
        super(Attach, self).save(*args, **kwargs)
        if self.filetype == 'image':
            imageRatio = settings.IMAGE_RATIO
            if self.richtext_image:
                imageRatio = 0
            Tools.scaleImage(settings.IMAGE_RATIO, self.attachment.path)
            Tools.createThumbnail(settings.IMAGE_THUMBNAIL_WIDTH,
                                  self.attachment.path)
Exemple #24
0
    def save(self, *args, **kwargs):

        if not self._state.adding:
            item = Article.objects.get(pk=self.pk)
            if self.content == "":
                self.content = item.content
            if self.description == "":
                self.description = item.description
            if self.image and item.image and hasattr(item.image, 'url'):
                print(self.image)
                if item.image != self.image:
                    # Update: remove exist image
                    Tools.removeFile(item.image.path, True)
        if self.order == 0:
            if Article.objects.count() > 0:
                self.order = Article.objects.order_by(
                    '-order').first().order + 1
            else:
                self.order = 1
        super(Article, self).save(*args, **kwargs)
        if self.category:
            image_ratio = self.category.image_ratio
        else:
            image_ratio = self.article.category.image_ratio
        if self.image and hasattr(self.image, 'url'):
            Tools.scaleImage(image_ratio, self.image.path)
            Tools.createThumbnail(settings.IMAGE_THUMBNAIL_WIDTH,
                                  self.image.path)
Exemple #25
0
    def change(self, request, pk=None):
        obj = get_object_or_404(Staff, pk=pk)

        data = Tools.parse_user_related_data(request.data)
        userSr = UserSr(obj.user, data=data['user'])
        if userSr.is_valid(raise_exception=True):
            userSr.save()

        remain = data['remain']
        remain.update({'user': obj.user_id})
        serializer = StaffBaseSr(obj, data=remain)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
        return res(serializer.data)
Exemple #26
0
    def add(self, request):
        data = Tools.parse_user_related_data(request.data)
        userSr = UserSr(data=data['user'])
        if userSr.is_valid(raise_exception=True):
            userSr.save()

        remain = data['remain']
        remain.update({'user': userSr.data['id']})
        serializer = StaffBaseSr(data=remain)
        if serializer.is_valid(raise_exception=True):
            serializer.save()

        serializer.data.update({'user': userSr.data})
        return res(serializer.data)
Exemple #27
0
    def post(self, request, format=None):
        params = self.request.data
        try:
            item = self.get_object(params["username"])
        except Staff.DoesNotExist:
            return res({"url": ""})

        user = item.user

        token = Tools.get_uuid()

        item.reset_password_token = token
        item.reset_password_tmp = make_password(params["password"])
        item.reset_password_created = timezone.now()
        item.save()
        url = settings.BASE_URL + "admin/reset-password/" + str(token)
        subject = "Rest set password for %s %s" % (user.first_name,
                                                   user.last_name)
        body = "Reset password confirm link: %s" % (url)
        to = user.email

        Tools.send_email_async(subject, body, to)
        return res({"url": url})
Exemple #28
0
    def retrieve_to_print(self, request, pk=None):
        transaction = get_object_or_404(Transaction, pk=pk)

        return res({
            'company_info': VariableUtils.get_company_info(),
            'customer': {
                'fullname': Tools.get_fullname(transaction.customer),
                'address': transaction.customer.address,
            },
            'uid': transaction.uid,
            'created_at': transaction.created_at,
            'amount': transaction.amount,
            'note': transaction.note
        })
Exemple #29
0
    def test_normal_case(self):
        # Recharge
        recharge_amount = 500000
        money_type = MoneyType.CASH
        TransactionUtils.recharge(recharge_amount, money_type, self.customer, self.staff)

        # Approve
        OrderUtils.approve(self.order, self.staff, self.staff)

        # Set status
        self.order.status = Status.VN_STORE
        self.order.cn_date = Tools.now()
        self.order.vn_date = Tools.now()
        self.order.save()

        # Export
        receipt = ReceiptUtils.seeding(1, True)
        BolUtils.export_order_bols(self.order.order_bols.all(), receipt, self.customer, self.staff)

        deposit = Transaction.objects.get(order=self.order, type=Type.DEPOSIT)
        pay = Transaction.objects.get(order=self.order, type=Type.PAY)
        vnd_total = OrderUtils.get_vnd_total_obj(self.order)

        self.assertEqual(deposit.amount + pay.amount, vnd_total)
Exemple #30
0
 def change_purchase_code(self, request, pk=None):
     from apps.bol.models import Bol
     from apps.order.models import Status
     obj = get_object_or_404(Order, pk=pk)
     value = request.data.get('value', obj.purchase_code)
     if value and obj.status == Status.DEBT:
         obj = MoveStatusUtils.move(obj, Status.PAID)
     if not value and obj.status == Status.PAID:
         obj = MoveStatusUtils.move(obj, Status.DEBT)
     value = Tools.remove_special_chars(value)
     serializer = OrderUtils.partial_update(obj, 'purchase_code', value)
     data = serializer.data
     Bol.objects.filter(purchase_code=data.get('purchase_code')).update(
         order=obj)
     return res(data)