コード例 #1
0
ファイル: base.py プロジェクト: hossamelneily/nexchange
    def setUp(self):
        super(WalletBaseTestCase, self).setUp()
        # look at:
        # nexchange/tests/fixtures/transaction_history.xml self.order_data
        # matches first transaction from the XML file
        okpay_pref = PaymentPreference.objects.filter(
            user__is_staff=True,
            payment_method__name__icontains='okpay').first()

        payeer_pref = PaymentPreference.objects.filter(
            user__is_staff=True,
            payment_method__name__icontains='payeer').first()

        mock = get_ok_pay_mock()
        self.okpay_order_data = {
            'amount_quote': Decimal(split_ok_pay_mock(mock, 'Net')),
            'amount_base': Decimal(0.1),
            'pair': self.BTCEUR,
            'user': self.user,
            'admin_comment': 'tests Order',
            'unique_reference': split_ok_pay_mock(mock, 'Comment'),
            'payment_preference': okpay_pref,
        }
        self.payeer_order_data = deepcopy(self.okpay_order_data)
        self.payeer_order_data['payment_preference'] = payeer_pref

        self.okpay_order_data_address = deepcopy(self.okpay_order_data)
        addr = Address(address='A555B', user=self.user)
        addr.save()
        self.okpay_order_data_address['withdraw_address'] = addr

        self.payeer_order_data_address = deepcopy(
            self.okpay_order_data_address)
        self.payeer_order_data_address['payment_preference'] = payeer_pref
コード例 #2
0
 def setUp(self):
     self.professional = Professional.objects.create(
         user=User.objects.create_user(
             email='*****@*****.**',
             password='******',
             is_active=True,
             cpf="396.852.650-38",
         ))
     self.professional.user.save()
     self.professional.save()
     self.user = User.objects.create_user(
         email='*****@*****.**',
         password='******',
         is_active=True,
         born=(now() - timedelta(days=10000)).date(),
         full_name='Nerso da Silva',
         cellphone='988883333',
         cpf="529.982.247-25",
         cellphone_ddd='43',
     )
     address = Address(
         user=self.user,
         street='Rua Tal',
         street_number='45',
         zipcode='45666-333',
         state='MG',
         city='Notredame',
         neighborhood='Gran',
         complementary='Fundos',
     )
     address.save()
     self.user.save()
     self.proposal = Proposal(client=self.user,
                              professional=self.professional,
                              city='Curitiba',
                              state='PR',
                              professional_type='AE',
                              service_type='AC',
                              start_datetime=TODAY + timedelta(days=1),
                              end_datetime=TODAY + timedelta(days=3),
                              value=300.00,
                              description='Lorem Ipsum dolores')
     self.proposal.save()
     self.proposal.accept()
     self.user.create_customer()
     self.user.create_card({
         "card_expiration_date": "1122",
         "card_number": "4018720572598048",
         "card_cvv": "123",
         "card_holder_name": "Cersei Lannister"
     })
     self.professional.create_recipient(
         **{
             'agency': '0932',
             'agency_dv': '5',
             'bank_code': '341',
             'account': '58054',
             'account_dv': '1',
             'legal_name': 'HOUSE TARGARYEN'
         })
コード例 #3
0
def user_btc_adress(request):
    btc_address = request.POST.get('btcAddress')
    user = request.user
    validate_bc(str(btc_address))
    address = Address(address=btc_address, user=user)
    address.save()
    return JsonResponse({'status': 'OK'})
コード例 #4
0
    def test_can_set_as_paid_if_has_withdraw_address_internal(self):
        # Creates an withdraw address fro this user
        address = Address(user=self.user,
                          type='W',
                          address='17NdbrSGoUotzeGCcMMCqnFkEvLymoou9j')
        address.save()

        payment_method = PaymentMethod(name='Internal Test', is_internal=True)
        payment_method.save()

        pref = PaymentPreference(payment_method=payment_method,
                                 user=self.order.user,
                                 identifier='InternalTestIdentifier')
        pref.save()

        payment = Payment(payment_preference=pref,
                          amount_cash=self.order.amount_cash,
                          order=self.order,
                          currency=self.RUB,
                          user=self.order.user)
        payment.save()
        # Creates an Transaction for the Order, using the user Address
        transaction = Transaction(order=self.order,
                                  address_to=address,
                                  address_from=address)
        transaction.save()

        # Set Order as Paid
        response = self.client.post(self.url, {'paid': 'true'})
        expected = {"frozen": True, "paid": True, "status": "OK"}
        self.assertJSONEqual(
            json.dumps(expected),
            str(response.content, encoding='utf8'),
        )
コード例 #5
0
    def setUp(self):
        super(UpdateWithdrawAddressTestCase, self).setUp()

        PaymentMethod.objects.all().delete()

        method_data = {
            'bin': 426101,
            'fee': 0.0,
            'is_slow': 0,
            'name': 'Alpha Bank Visa'
        }
        payment_method = PaymentMethod(**method_data)
        payment_method.save()

        pref_data = {
            'user': self.user,
            'identifier': str(payment_method.bin),
            'comment': 'Just testing'
        }
        pref = PaymentPreference(**pref_data)
        pref.save()
        pref.currency.add(self.USD)
        pref.save()
        """Creates an order"""
        data = {
            'amount_cash': Decimal(30674.85),
            'amount_btc': Decimal(1.00),
            'currency': self.USD,
            'user': self.user,
            'admin_comment': 'test Order',
            'unique_reference': '12345',
            'payment_preference': pref
        }

        order = Order(**data)
        # TODO: patch and uncomment
        # order.full_clean()  # ensure is initially correct
        order.save()
        self.order = order

        pk = self.order.pk
        self.url = reverse('core.update_withdraw_address', kwargs={'pk': pk})

        self.addr_data = {
            'type': 'W',
            'name': '17NdbrSGoUotzeGCcMMCqnFkEvLymoou9j',
            'address': '17NdbrSGoUotzeGCcMMCqnFkEvLymoou9j',
        }
        self.addr = Address(**self.addr_data)
        self.addr.user = self.user
        self.addr.save()

        # The 'other' address for the Transaction
        user = User.objects.create_user(username='******')
        addr2 = Address(**self.addr_data)
        addr2.user = user
        addr2.save()
コード例 #6
0
def process_data(request, data):
    # Process Employer
    try:
        employer = Employer.objects.get(name=data[0]['name'])
    except (Employer.DoesNotExist):
        empl_address = Address(street=data[0]['street'],
                               city=data[0]['city'],
                               state=data[0]['state'],
                               zip_code=data[0]['zip_code'],
                               address_type=data[0]['address_type'])
        empl_address.save()
        employer = Employer(name=data[0]['name'],
                            employer_address=empl_address)
        try:
            employer.full_clean()
            employer.save()
        except ValidationError as e:
            print(e, 'employer error')
    # Process Employee
    try:
        employee = EmployeeModel.objects.get(empl_ssn=data[1]['empl_ssn'])
    except (EmployeeModel.DoesNotExist):
        try:
            empl_address = Address.objects.get(street=data[1]['street'],
                                               zip_code=data[1]['zip_code'])
        except (Address.DoesNotExist):
            empl_address = Address(street=data[1]['street'],
                                   city=data[1]['city'],
                                   state=data[1]['state'],
                                   zip_code=data[1]['zip_code'],
                                   address_type=data[1]['address_type'])
            empl_address.save()
        try:
            employee = EmployeeModel(empl_full_name=data[1]['empl_full_name'],
                                     empl_hire_date=data[1]['empl_hire_date'],
                                     empl_dob=data[1]['empl_dob'],
                                     empl_ssn=data[1]['empl_ssn'],
                                     empl_gender=data[1]['empl_gender'],
                                     empl_address=empl_address,
                                     employer=employer,
                                     form_type=data[1]['form_type'])
            employee.full_clean()
            employee.save()
        except ValidationError as e:
            print(e, 'employee creation error')

    app_model = ApplicationModel(name=employee.form_type,
                                 submit_user=request.user,
                                 employee=employee)
    try:
        app_model.full_clean()
        app_model.save()
    except ValidationError as e:
        print(e, 'app model error')

    return employee
コード例 #7
0
ファイル: base.py プロジェクト: hossamelneily/nexchange
 def _create_withdraw_adress(self, currency, address):
     addr_data = {
         'type': 'W',
         'name': address,
         'address': address,
         'currency': currency
     }
     addr = Address(**addr_data)
     addr.user = self.user
     addr.save()
     return addr
コード例 #8
0
 def update(self, instance, validated_data):
     refund_address = validated_data.pop('refund_address')
     addr_list = Address.objects.filter(address=refund_address['address'])
     if not addr_list:
         address = Address(**refund_address)
         address.type = Address.WITHDRAW
         address.currency = instance.pair.quote
         address.save()
     else:
         address = addr_list[0]
     instance.refund_address = address
     instance.save()
     return instance
コード例 #9
0
def generate_addresses(request, times):
    for i in range(0, times):
        a = Address()
        idx = random.randint(0, 1)
        a.address_type = ['B', 'S'][idx]
        a.first_name = random_text('t', 15)
        a.last_name = random_text('t', 15)
        a.address = random_text('t', 50)
        a.zipcode = random_text('n', 5)
        a.country = random_text('t', 10)
        a.city = random_text('t', 10)
        a.save()
    return HttpResponse(f'{times} Addresses generated !')
コード例 #10
0
ファイル: views.py プロジェクト: hossamelneily/nexchange
def create_withdraw_address(request, order_pk):
    error_message = 'Error creating address: %s'
    order = Order.objects.get(pk=order_pk)
    if not order.user.profile.is_verified and not order.exchange:
        pm = order.payment_preference.payment_method
        if pm.required_verification_buy or order.user.profile.anonymous_login:
            resp = {
                'status':
                'ERR',
                'msg':
                'You need to be a verified user to set withdrawal '
                'address for order with payment method \'{}\''
                ''.format(pm.name)
            }
            return JsonResponse(resp, safe=False)

    address = request.POST.get('value')
    addr = Address()
    addr.type = Address.WITHDRAW
    addr.user = request.user
    addr.address = address
    if order.order_type == Order.BUY:
        currency = order.pair.base
    else:
        currency = order.pair.quote
    addr.currency = currency

    try:
        if currency.code == 'BTC':
            validate_btc(addr.address)
        elif currency.code == 'LTC':
            validate_ltc(addr.address)
        elif currency.code == 'ETH':
            validate_eth(addr.address)
        else:
            validate_address(addr.address)
        addr.save()
        resp = {'status': 'OK', 'pk': addr.pk, 'target': addr.currency.code}

    except ValidationError:
        resp = {'status': 'ERR', 'msg': 'The supplied address is invalid.'}

    except Exception as e:
        msg = error_message % (e)
        resp = {'status': 'ERR', 'msg': msg}

    return JsonResponse(resp, safe=False)
コード例 #11
0
    def create(self, validated_data):
        for field in READABLE_FIELDS:
            validated_data.pop(field, None)
        withdraw_address = validated_data.pop('withdraw_address')
        payment_id = withdraw_address.pop('payment_id', None)
        destination_tag = withdraw_address.pop('destination_tag', None)
        validated_data.pop('pair')
        # Just making sure
        addr_list = Address.objects.filter(address=withdraw_address['address'])
        order = Order(pair=self.pair, **validated_data)
        if payment_id:
            order.payment_id = payment_id
        if destination_tag:
            order.destination_tag = destination_tag
        if not addr_list:
            address = Address(**withdraw_address)
            address.type = Address.WITHDRAW
            address.currency = order.pair.base
            address.save()
        else:
            address = addr_list[0]

        order.withdraw_address = address
        try:
            order.save()
            # get post_save stuff in sync
            order.refresh_from_db()
            self.fields['deposit_address'] = NestedReadOnlyAddressSerializer(
                many=False,
                read_only=True,
                additional_params={
                    'destination_tag': order.quote_destination_tag,
                    'payment_id': order.quote_payment_id
                })
            self.fields['withdraw_address'] = NestedAddressSerializer(
                many=False,
                read_only=False,
                additional_params={
                    'destination_tag': order.base_destination_tag,
                    'payment_id': order.base_payment_id
                })
            return order
        except ValidationError as e:
            raise RestValidationError({'non_field_errors': [e.message]})
コード例 #12
0
    def post(self, *args, **kwargs):
        form = CheckoutForm(self.request.POST)
        if form.is_valid():
            email = form.cleaned_data.get('email')
            name = form.cleaned_data.get('name')
            phone = form.cleaned_data.get('phone')

            if is_valid_form([email, name, phone]):
                shipping_address = Address(
                    email=email,
                    name=name,
                    phone=phone,
                )
                shipping_address.save()
                BasketItem.objects.all()
                return redirect("core:thank-you")
        else:
            messages.info(self.request, "All fields are required.")
        return redirect("core:checkout")
コード例 #13
0
    def test_can_set_as_paid_if_has_withdraw_address(self):
        # Creates an withdraw address fro this user
        address = Address(user=self.user,
                          type='W',
                          address='17NdbrSGoUotzeGCcMMCqnFkEvLymoou9j')
        address.save()

        # Creates an Transaction for the Order, using the user Address
        transaction = Transaction(order=self.order,
                                  address_to=address,
                                  address_from=address)
        transaction.save()

        # Set Order as Paid
        response = self.client.post(self.url, {'paid': 'true'})
        expected = {"frozen": None, "paid": True, "status": "OK"}
        self.assertJSONEqual(
            json.dumps(expected),
            str(response.content, encoding='utf8'),
        )
コード例 #14
0
    def create_user_wallet(self, user, currency):
        one_card_currencies = ['XMR', 'XRP']
        unassigned_cards = AddressReserve.objects.filter(currency=currency,
                                                         user=None,
                                                         disabled=False)
        if currency.code in one_card_currencies:
            unassigned_cards = AddressReserve.objects.filter(currency=currency,
                                                             disabled=False)

        if len(unassigned_cards) == 0 \
                and currency.code not in one_card_currencies:
            self.logger.warning('instance {} has no reserve cards available'
                                ' for {} calling renew_cards_reserve()'.format(
                                    user, currency))

            self.renew_cards_reserve(
                expected_reserve=settings.EMERGENCY_CARDS_RESERVE_COUNT)
            unassigned_cards = AddressReserve.objects.filter(currency=currency,
                                                             user=None,
                                                             disabled=False)

        if unassigned_cards:
            # FIFO
            card = unassigned_cards.earliest('id')
            card.user = user
            try:
                address = Address.objects.get(address=card.address)
            except Address.DoesNotExist:
                address = Address(address=card.address,
                                  user=card.user,
                                  currency=currency,
                                  type=Address.DEPOSIT,
                                  reserve=card)
            address.save()
            card.save()
            return card, address
        else:
            self.logger.error(
                'instance {} has no cards available'.format(currency))
        return None, None
コード例 #15
0
def signupLevel1(request):
    activationKey = request.data.get('activationKey')
    verifyMobileNumber = request.data.get('verifyMobileNumber')
    profile = get_object_or_404(Profile, activationKey=activationKey)
    profile.user.set_password(request.data.get('password'))
    profile.user.is_active = True
    profile.user.save()
    profile.dob = request.data.get('dob')
    address = Address()
    address.country = request.data.get('country')
    address.region = request.data.get('region')
    address.city = request.data.get('city')
    address.street = request.data.get('address')
    address.zipCode = request.data.get('zipcode')
    address.save()
    profile.defaultAddress = address
    profile.mobile = request.data.get('mobile')
    if request.data.get('ssn') and len(request.data.get('ssn')) > 0:
        profile.ssn = request.data.get('ssn')
    profile.termsAgreement = request.data.get('agreement')
    profile.setVerificationCode()
    profile.save()
    try:
        if verifyMobileNumber:
            messageSend = sendVerificationCodeSMS(request,
                                                  profile.verificationCode,
                                                  profile.mobile)
        else:
            profile.setActivationKey()
            profile.mobileVerified = True
            profile.save()
        return Response({'success': True})
    except Exception as e:
        return Response({
            'success': False,
            'error': {
                'code': 'no.sms.sent',
                'msg': e.message
            }
        })
コード例 #16
0
def create_withdraw_address(request):
    error_message = 'Error creating address: %s'

    address = request.POST.get('value')

    addr = Address()
    addr.type = Address.WITHDRAW
    addr.user = request.user
    addr.address = address

    try:
        validate_bc(addr.address)
        addr.save()
        resp = {'status': 'OK', 'pk': addr.pk}

    except ValidationError:
        resp = {'status': 'ERR', 'msg': 'The supplied address is invalid.'}

    except Exception as e:
        msg = error_message % (e)
        resp = {'status': 'ERR', 'msg': msg}

    return JsonResponse(resp, safe=False)
コード例 #17
0
    def create(self, validated_data):
        for field in READABLE_FIELDS:
            validated_data.pop(field, None)
        withdraw_address = validated_data.pop('withdraw_address')
        refund_address = validated_data.pop('refund_address')
        validated_data.pop('pair')
        withdraw_addr_list = Address.objects.filter(
            address=withdraw_address['address'])
        order = LimitOrder(pair=self.pair,
                           order_book=self.order_book,
                           **validated_data)
        if not withdraw_addr_list:
            w_address = Address(**withdraw_address)
            w_address.type = Address.WITHDRAW
            w_address.currency = order.withdraw_currency
            w_address.save()
        else:
            w_address = withdraw_addr_list[0]

        order.withdraw_address = w_address
        refund_addr_list = Address.objects.filter(
            address=refund_address['address'])
        if not refund_addr_list:
            r_address = Address(**refund_address)
            r_address.type = Address.REFUND
            r_address.currency = order.refund_currency
            r_address.save()
        else:
            r_address = refund_addr_list[0]
        order.refund_address = r_address
        try:
            order.save()
            # get post_save stuff in sync
            order.refresh_from_db()
            return order
        except ValidationError as e:
            raise RestValidationError({'non_field_errors': [e.message]})
コード例 #18
0
def basket_create(request):
    if request.POST.get("address"):
        address = Address.objects.get(id=request.POST.get("address"))
    else:
        address = Address(user=request.user,
                          name=request.POST.get("name"),
                          city=request.POST.get("city"),
                          street=request.POST.get("street"),
                          home=request.POST.get("home"),
                          flat=request.POST.get("flat"))
        address.save()

    order_ = Order.objects.get(user=request.user, status__base_status__id=1)
    order_.address = address
    order_.payment_method = PaymentMethod.objects.get(
        id=request.POST.get("payment_method"))
    status = Status(base_status=BaseStatus.objects.get(id=2),
                    datetime=datetime.now())
    status.save()
    order_.status.add(status)
    order_.status.remove(order_.status.all()[0])
    order_.save()

    return HttpResponseRedirect("/profile/")
コード例 #19
0
ファイル: test_tasks.py プロジェクト: hossamelneily/nexchange
class RetryReleaseTestCase(TickerBaseTestCase):
    def setUp(self):
        super(RetryReleaseTestCase, self).setUp()
        self.address = Address(
            type=Address.WITHDRAW,
            address='0x993cE7372Ed0621ddD4593ac3433E678236A496D')
        self.address.save()
        self.ETH = Currency.objects.get(code='ETH')
        self.client = UpholdApiClient()
        self._create_order()
        self.order.status = Order.PRE_RELEASE
        self.order.withdraw_address = self.address
        self.order.save()
        self.tx_data = {
            'currency': self.order.pair.base,
            'amount': self.order.amount_base,
            'order': self.order,
            'address_to': self.order.withdraw_address,
            'type': Transaction.WITHDRAW
        }
        self.retry_release = RetryOrderRelease(api=self.client)

    @patch('orders.models.app.send_task')
    @patch(UPHOLD_ROOT + 'execute_txn')
    @patch(UPHOLD_ROOT + 'prepare_txn')
    def test_retry_release_true(self, prepare_txn, execute_txn, send_task):
        prepare_txn.return_value = self.generate_txn_id()
        execute_txn.return_value = {'code': 'validation_failed'}
        self.order.release(self.tx_data, api=self.client)
        self.assertEqual(send_task.call_count, 1)

    @patch('orders.models.app.send_task')
    @patch(UPHOLD_ROOT + 'execute_txn')
    @patch(UPHOLD_ROOT + 'prepare_txn')
    def test_retry_release_false(self, prepare_txn, execute_txn, send_task):
        prepare_txn.return_value = self.generate_txn_id()
        execute_txn.return_value = {'code': 'OK'}
        self.order.release(self.tx_data, api=self.client)
        self.assertEqual(send_task.call_count, 0)

    @patch('orders.models.app.send_task')
    @patch(UPHOLD_ROOT + 'execute_txn')
    @patch(UPHOLD_ROOT + 'prepare_txn')
    def test_retry_release_false_no_tx_id(self, prepare_txn, execute_txn,
                                          send_task):
        prepare_txn.return_value = ''
        execute_txn.return_value = {'code': 'validation_failed'}
        self.order.release(self.tx_data, api=self.client)
        self.assertEqual(send_task.call_count, 0)

    @patch(UPHOLD_ROOT + 'execute_txn')
    @patch(UPHOLD_ROOT + 'prepare_txn')
    def test_retry_x_times(self, prepare_txn, execute_txn):
        prepare_txn.return_value = self.generate_txn_id()
        execute_txn.return_value = {'code': 'validation_failed'}
        self.order.release(self.tx_data, api=self.client)
        txn = self.order.transactions.last()
        release_retry_invoke.apply([txn.pk])
        self.assertEqual(execute_txn.call_count,
                         settings.RETRY_RELEASE_MAX_RETRIES + 2)

    @data_provider(lambda: (
        ('Bad type', {
            'type': Transaction.DEPOSIT
        }, {
            'success': False,
            'retry': False
        }),
        ('tx_id exists', {
            'tx_id': '123sdf'
        }, {
            'success': False,
            'retry': False
        }),
        ('txn flagged', {
            'flagged': True
        }, {
            'success': False,
            'retry': False
        }),
        ('txn is_verified', {
            'is_verified': True
        }, {
            'success': False,
            'retry': False
        }),
        ('ok', {}, {
            'success': True,
            'retry': False
        }),
    ))
    @patch(UPHOLD_ROOT + 'execute_txn')
    @patch(UPHOLD_ROOT + 'prepare_txn')
    def test_retry_release_class_errors_tx_data(self, name, tx_data_update,
                                                result, prepare_txn,
                                                execute_txn):
        tx_data = {
            'type': Transaction.WITHDRAW,
            'tx_id': '',
            'flagged': False,
            'is_verified': False
        }
        tx_data.update(tx_data_update)
        prepare_txn.return_value = self.generate_txn_id()
        execute_txn.return_value = {'code': 'validation_failed'}
        self.order.release(self.tx_data, api=self.client)
        execute_txn.return_value = {'code': 'ok'}
        txn = self.order.transactions.last()
        for attr, value in tx_data.items():
            setattr(txn, attr, value)
        txn.save()
        res = self.retry_release.run(txn.pk)
        self.assertEqual(res, result, name)

    @data_provider(lambda: (
        ('ok', {}, {
            'success': True,
            'retry': False
        }),
        ('Bad amount', {
            'amount_base': 11.111
        }, {
            'success': False,
            'retry': False
        }),
        ('Bad currency', {
            'pair_id': 1
        }, {
            'success': False,
            'retry': False
        }),
        ('Bad status', {
            'status': Order.COMPLETED
        }, {
            'success': False,
            'retry': False
        }),
        ('Bad address', {
            'withdraw_address_id': 1
        }, {
            'success': False,
            'retry': False
        }),
    ))
    @patch(UPHOLD_ROOT + 'execute_txn')
    @patch(UPHOLD_ROOT + 'prepare_txn')
    def test_retry_release_class_errors_order_data(self, name,
                                                   order_data_update, result,
                                                   prepare_txn, execute_txn):
        self._create_order()
        self.order.status = Order.PRE_RELEASE
        self.order.withdraw_address = self.address
        self.order.save()
        self.tx_data.update({'order': self.order})
        prepare_txn.return_value = self.generate_txn_id()
        execute_txn.return_value = {'code': 'validation_failed'}
        self.order.release(self.tx_data, api=self.client)
        execute_txn.return_value = {'code': 'ok'}
        txn = self.order.transactions.last()
        for attr, value in order_data_update.items():
            setattr(self.order, attr, value)
        self.order.save()
        res = self.retry_release.run(txn.pk)
        self.assertEqual(res, result, name)

    @patch(UPHOLD_ROOT + 'execute_txn')
    @patch(UPHOLD_ROOT + 'prepare_txn')
    def test_retry_release_success(self, prepare_txn, execute_txn):
        prepare_txn.return_value = self.generate_txn_id()
        execute_txn.return_value = {'code': 'validation_failed'}
        self.order.release(self.tx_data, api=self.client)
        txn = self.order.transactions.last()
        self.assertFalse(txn.is_verified)
        self.assertEqual(execute_txn.call_count, 1)
        # First retry (success=False)
        res = self.retry_release.run(txn.pk)
        txn.refresh_from_db()
        self.assertEqual(res, {'success': False, 'retry': True})
        self.assertFalse(txn.is_verified)
        self.assertEqual(execute_txn.call_count, 2)
        execute_txn.return_value = {'code': 'ok'}
        # Second retry (success=True)
        res = self.retry_release.run(txn.pk)
        txn.refresh_from_db()
        self.assertEqual(res, {'success': True, 'retry': False})
        self.assertTrue(txn.is_verified)
        self.assertEqual(execute_txn.call_count, 3)
        # Third retry (stop because already released)
        res = self.retry_release.run(txn.pk)
        txn.refresh_from_db()
        self.assertEqual(res, {'success': False, 'retry': False})
        self.assertTrue(txn.is_verified)
        self.assertEqual(execute_txn.call_count, 3)
コード例 #20
0
class UpdateWithdrawAddressTestCase(UserBaseTestCase, OrderBaseTestCase):
    def setUp(self):
        super(UpdateWithdrawAddressTestCase, self).setUp()

        PaymentMethod.objects.all().delete()

        method_data = {
            'bin': 426101,
            'fee': 0.0,
            'is_slow': 0,
            'name': 'Alpha Bank Visa'
        }
        payment_method = PaymentMethod(**method_data)
        payment_method.save()

        pref_data = {
            'user': self.user,
            'identifier': str(payment_method.bin),
            'comment': 'Just testing'
        }
        pref = PaymentPreference(**pref_data)
        pref.save()
        pref.currency.add(self.USD)
        pref.save()
        """Creates an order"""
        data = {
            'amount_cash': Decimal(30674.85),
            'amount_btc': Decimal(1.00),
            'currency': self.USD,
            'user': self.user,
            'admin_comment': 'test Order',
            'unique_reference': '12345',
            'payment_preference': pref
        }

        order = Order(**data)
        # TODO: patch and uncomment
        # order.full_clean()  # ensure is initially correct
        order.save()
        self.order = order

        pk = self.order.pk
        self.url = reverse('core.update_withdraw_address', kwargs={'pk': pk})

        self.addr_data = {
            'type': 'W',
            'name': '17NdbrSGoUotzeGCcMMCqnFkEvLymoou9j',
            'address': '17NdbrSGoUotzeGCcMMCqnFkEvLymoou9j',
        }
        self.addr = Address(**self.addr_data)
        self.addr.user = self.user
        self.addr.save()

        # The 'other' address for the Transaction
        user = User.objects.create_user(username='******')
        addr2 = Address(**self.addr_data)
        addr2.user = user
        addr2.save()

    def test_forbiden_to_update_other_users_orders(self):
        username = '******'
        password = '******'
        User.objects.create_user(username=username, password=password)

        client = self.client
        client.login(username=username, password=password)

        response = client.post(self.url, {
            'pk': self.order.pk,
            'value': self.addr.pk
        })

        self.assertEqual(403, response.status_code)

        self.client.login(username=self.user.username, password='******')

    def test_sucess_to_update_withdraw_adrress(self):

        response = self.client.post(self.url, {
            'pk': self.order.pk,
            'value': self.addr.pk,
        })

        self.assertJSONEqual(
            '{"status": "OK"}',
            str(response.content, encoding='utf8'),
        )

        self.assertEqual(self.order.withdraw_address, self.addr.address)

    def test_throw_error_for_invalid_withdraw_adrress(self):
        response = self.client.post(self.url, {
            'pk': self.order.pk,
            'value': 50
        })

        self.assertEqual(b'Invalid addresses informed.', response.content)
コード例 #21
0
class PaymentReleaseTestCase(UserBaseTestCase, OrderBaseTestCase):
    def setUp(self):
        super(PaymentReleaseTestCase, self).setUp()
        self.method_data = {"is_internal": 1, 'name': 'Robokassa'}

        amount_cash = Decimal(30000.00)

        self.payment_method = PaymentMethod(name='ROBO')
        self.payment_method.save()

        self.addr_data = {
            'type': 'W',
            'name': '17NdbrSGoUotzeGCcMMCqnFkEvLymoou9j',
            'address': '17NdbrSGoUotzeGCcMMCqnFkEvLymoou9j',
        }

        self.addr = Address(**self.addr_data)
        self.addr.user = self.user
        self.addr.save()

        pref_data = {
            'user': self.user,
            'comment': 'Just testing',
            'payment_method': self.payment_method
        }

        pref = PaymentPreference(**pref_data)
        pref.save('internal')

        self.data = {
            'amount_cash': amount_cash,
            'amount_btc': Decimal(1.00),
            'currency': self.RUB,
            'user': self.user,
            'admin_comment': 'test Order',
            'unique_reference': '12345',
            'payment_preference': pref,
            'is_paid': True
        }

        self.order = Order(**self.data)
        self.order.save()

        self.pay_data = {
            'amount_cash': self.order.amount_cash,
            'currency': self.RUB,
            'user': self.user,
            'payment_preference': pref,
        }

        self.payment = Payment(**self.pay_data)
        self.payment.save()

        tx_id_ = '76aa6bdc27e0bb718806c93db66525436' \
                 'fa621766b52bad831942dee8b618678'

        self.transaction = Transaction(tx_id=tx_id_,
                                       order=self.order,
                                       address_to=self.addr)
        self.transaction.save()

    def test_bad_release_payment(self):
        for o in Order.objects.filter(is_paid=True, is_released=False):
            p = Payment.objects.filter(user=o.user,
                                       amount_cash=o.amount_cash,
                                       payment_preference=o.payment_preference,
                                       is_complete=False,
                                       currency=o.currency).first()
            if p is not None:
                tx_id_ = release_payment(o.withdraw_address, o.amount_btc)
                self.assertEqual(tx_id_, None)

    def test_orders_with_approved_payments(self):

        for o in Order.objects.filter(is_paid=True, is_released=False):

            p = Payment.objects.filter(user=o.user,
                                       amount_cash=o.amount_cash,
                                       payment_preference=o.payment_preference,
                                       is_complete=False,
                                       currency=o.currency).first()

            if p is not None:

                o.is_released = True
                o.save()

                p.is_complete = True
                p.save()

            self.assertTrue(o.is_released)
            self.assertTrue(p.is_complete)

    def checker_transactions(self):
        if check_transaction(self.transaction.tx_id):
            self.transaction.is_completed = True
            self.transaction.save()
        self.assertTrue(self.transaction.is_completed)
コード例 #22
0
ファイル: views.py プロジェクト: izielin/bookshop
    def post(self, request, *args, **kwargs):
        if not request.user.id == self.kwargs.get('pk'):
            raise Http404

        if 'profile_edit' in request.POST and request.method == 'POST':
            instance = get_object_or_404(Profile, user=request.user)
            form = ProfileForm(self.request.POST or None, instance=instance)
            if form.is_valid():
                print("sanity check")
                form.save(commit=False)
                form.email = request.user.email
                form.save()

        elif 'address_edit' in request.POST and request.method == 'POST':

            form = AddressForm(self.request.POST or None)
            if form.is_valid():
                address_form_form = form.cleaned_data.get('street_address')
                apartment_address = form.cleaned_data.get('apartment_address')
                country = form.cleaned_data.get('country')
                city = form.cleaned_data.get('city')
                zip = form.cleaned_data.get('zip')
                try:
                    address = Address.objects.get(user=request.user,
                                                  default=True)
                    address.user = self.request.user
                    address.street_address = address_form_form
                    address.apartment_address = apartment_address
                    address.country = country
                    address.city = city
                    address.zip = zip
                    address.save()

                except ObjectDoesNotExist:
                    address = Address(user=self.request.user,
                                      street_address=address_form_form,
                                      apartment_address=apartment_address,
                                      country=country,
                                      city=city,
                                      zip=zip,
                                      default=True)
                    address.save()
            else:
                messages.warning(self.request,
                                 "Please fill in the required fields")

        elif 'socialMedia_edit' in request.POST and request.method == 'POST':
            instance, created = SocialMedia.objects.get_or_create(
                user=request.user)
            if created:
                form = SocialMediaForm(self.request.POST, instance=created)
                if form.is_valid():
                    form.save()
            else:
                form = SocialMediaForm(self.request.POST, instance=instance)
                if form.is_valid():
                    form.save()
        else:
            form = ProfileImageForm(request.POST, request.FILES)
            if form.is_valid():
                try:
                    picture = ProfileImage.objects.get(user=request.user)
                    picture.file.delete()
                    picture.delete()
                    form.instance.user = request.user
                    form.save()
                    messages.info(
                        request,
                        "If photo doesnt change, please reload the page")
                except ObjectDoesNotExist:
                    form.instance.user = request.user
                    form.save()
                    messages.info(
                        request,
                        "If photo doesnt change, please reload the page")
        return redirect('profile', kwargs['pk'])
コード例 #23
0
 def test_has_a_withdraw_address(self):
     address = Address(user=self.user, type=Address.WITHDRAW)
     address.save()
     self.user.refresh_from_db()
     self.assertTrue(self.user.profile.has_withdraw_address)
コード例 #24
0
ファイル: views.py プロジェクト: juliocarrera/test_csv_repo
 def _create_address(self, address_data):
     address = Address(**address_data)
     address.full_clean()
     address.save()
     return address
コード例 #25
0
ファイル: test_tasks.py プロジェクト: hossamelneily/nexchange
class BaseOrderReleaseTestCase(OrderBaseTestCase):
    def generate_orm_obj(self, _constructor, base_data, modifiers=None):
        objs = []
        for modifier in modifiers:
            actual_data = deepcopy(base_data)
            actual_data.update(modifier)
            _obj = _constructor(**actual_data)
            _obj.save()
            _obj.refresh_from_db()
            objs.append(_obj)
        return objs

    def purge_orm_objects(self, *args):
        for objs in args:
            while len(objs):
                obj = objs.pop()
                obj.delete()

    def edit_orm_obj(self, object, modifiers):
        for modifier, value in modifiers.items():
            setattr(object, modifier, value)
            object.save()
            object.refresh_from_db()
        return object

    def setUp(self):
        super(BaseOrderReleaseTestCase, self).setUp()
        enable_all_pairs()
        currencies = Currency.objects.filter(is_crypto=False)
        for curr in currencies:
            curr.maximal_amount = 50000000
            curr.minimal_amount = 0.1
            curr.save()
        self.payments = []
        self.orders = []
        self.addr = Address(address='12345', user=self.user)
        self.addr.save()
        self.our_pref = PaymentPreference.objects.first()
        self.order_data = {
            'amount_quote': Decimal(30674.85),
            'amount_base': Decimal(1.00),
            'user': self.user,
            'admin_comment': 'tests Order',
            'unique_reference': '123456',
            'payment_preference': self.our_pref,
            'withdraw_address': self.addr,
            'pair': self.BTCRUB,
        }

        self.pref, created = PaymentPreference.objects.get_or_create(
            payment_method=self.our_pref.payment_method,
            user=self.user,
            identifier='1234567',
        )

        self.pref.currency.add(self.BTCRUB.quote)
        self.pref.save()

        self.base_payment_data = {
            'user': self.user,
            'currency': self.BTCRUB.quote,
            'payment_preference': self.pref,
            'amount_cash': self.order_data['amount_quote'],
            'is_success': True
        }

    def tearDown(self):
        with transaction.atomic(using='default'):
            self.purge_orm_objects(self.orders, self.payments)
コード例 #26
0
ファイル: base.py プロジェクト: hossamelneily/nexchange
class TransactionImportBaseTestCase(OrderBaseTestCase):
    fixtures = [
        'market.json',
        'currency_algorithm.json',
        'transaction_price.json',
        'currency_crypto.json',
        'currency_fiat.json',
        'currency_tokens.json',
        'pairs_cross.json',
        'pairs_btc.json',
        'pairs_ltc.json',
        'pairs_rns.json',
        'pairs_eth.json',
        'pairs_doge.json',
        'pairs_bch.json',
        'pairs_xvg.json',
        'pairs_nano.json',
        'pairs_omg.json',
        'pairs_bdg.json',
        'pairs_eos.json',
        'pairs_zec.json',
        'pairs_usdt.json',
        'pairs_xmr.json',
        'pairs_kcs.json',
        'pairs_bnb.json',
        'pairs_knc.json',
        'pairs_bix.json',
        'pairs_ht.json',
        'pairs_bnt.json',
        'pairs_coss.json',
        'pairs_cob.json',
        'pairs_dash.json',
        'pairs_bmh.json',
        'pairs_xrp.json',
        'payment_method.json',
        'payment_preference.json',
        'reserve.json',
        'account.json',
    ]

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.uphold_import_transactions_empty = None

    def setUp(self):
        super(TransactionImportBaseTestCase, self).setUp()

        self.main_pref = self.okpay_pref = PaymentPreference.objects.get(
            user__is_staff=True, payment_method__name__icontains='okpay')

        self.payeer_pref = PaymentPreference.objects.filter(
            user__is_staff=True,
            payment_method__name__icontains='payeer').first()

        self.order = Order(order_type=Order.SELL,
                           amount_base=0.2,
                           pair=self.BTCEUR,
                           user=self.user,
                           status=Order.INITIAL,
                           payment_preference=self.main_pref)
        with requests_mock.mock() as mock:
            self._mock_cards_reserve(mock)
            self.order.save()

        self.order_modifiers = [{
            'confirmations':
            self.order.pair.base.min_confirmations
        }, {
            'confirmations':
            self.order.pair.base.min_confirmations - 1
        }]

        self._read_fixture()

        self.order.amount_base = \
            Decimal(str(self.amounts[self.status_ok_list_index]))
        self.order.save()

        self.address = Address(
            name='test address',
            address=self.wallet_address,
            currency=self.BTC,
            user=self.user,
            type=Address.DEPOSIT,
        )
        self.address.save()
        xmr_card = AddressReserve(
            currency=Currency.objects.get(code='XMR'),
            address='41pLNkSGSJK8pWAG9dd57YcWB82gH5ucHNEPnGt1FBN59P'
            'rdYqKUGB1SfZxGQPcYcDEbctmpN2kpVbtuie6yCRf16oXkjuY',
        )
        xmr_card.save()
        xrp_card = AddressReserve(currency=Currency.objects.get(code='XRP'),
                                  address='rnErCcvuHdxfUEcU81NtujYv36mQ4BaSP2')
        xrp_card.save()

        self.url_addr = 'http://btc.blockr.io/api/v1/address/txs/{}'.format(
            self.wallet_address)
        self.url_tx_1 = 'http://btc.blockr.io/api/v1/tx/info/{}'.format(
            self.tx_ids[0])

        self.url_tx_2 = 'http://btc.blockr.io/api/v1/tx/info/{}'.format(
            self.tx_ids[1])
        self.LTC = Currency.objects.get(code='LTC')
        self.ETH = Currency.objects.get(code='ETH')
        self.RNS = Currency.objects.get(code='RNS')
        self.DOGE = Currency.objects.get(code='DOGE')
        self.BCH = Currency.objects.get(code='BCH')
        self.ZEC = Currency.objects.get(code='ZEC')
        self.USDT = Currency.objects.get(code='USDT')
        self.XMR = Currency.objects.get(code='XMR')
        self.DASH = Currency.objects.get(code='DASH')
        self.XRP = Currency.objects.get(code='XRP')
        self.XVG = Currency.objects.get(code='XVG')
        self.BTC_address = self._create_withdraw_adress(
            self.BTC, '1GR9k1GCxJnL3B5yryW8Kvz7JGf31n8AGi')
        self.LTC_address = self._create_withdraw_adress(
            self.LTC, 'LYUoUn9ATCxvkbtHseBJyVZMkLonx7agXA')
        self.ETH_address = self._create_withdraw_adress(
            self.ETH, '0x8116546AaC209EB58c5B531011ec42DD28EdFb71')
        self.RNS_address = self._create_withdraw_adress(
            self.RNS, 'RJrEPzpgwfhsyz2tKYxVYSAEfBNWXh8W2v')
        self.DOGE_address = self._create_withdraw_adress(
            self.DOGE, 'DPjMRpkNKEfnYVHqmAan4FbriqP4DyUt2u')
        self.BCH_address = self._create_withdraw_adress(
            self.BCH, '142banESr9veN2RkFg6k67AjDdCepdmVLm')
        self.ZEC_address = self._create_withdraw_adress(
            self.ZEC, 't1a7HFeidzBswwdXaFV1gKtSphn41rLcEmK')
        self.USDT_address = self._create_withdraw_adress(
            self.USDT, '1AzrxFRwxGmXPeSum9Bsisv7XxhSAeANwH')
        self.XMR_address = self._create_withdraw_adress(
            self.XMR, '41pLNkSGSJK8pWAG9dd57YcWB82gH5ucHNEPnGt1FBN59P'
            'rdYqKUGB1SfZxGQPcYcDEbctmpN2kpVbtupm6yCRf16oXkjuY')
        self.DASH_address = self._create_withdraw_adress(
            self.DASH, 'XgJdGA5NWn71TmFYxVPvpZxUKAe8x7YWrP')
        self.XRP_address = self._create_withdraw_adress(
            self.XRP, 'r9y61YwVUQtTWHtwcmYc1Epa5KvstfUzSm')
        self.XVG_address = self._create_withdraw_adress(
            self.XVG, 'DQkwDpRYUyNNnoEZDf5Cb3QVazh4FuPRs9')

    def _read_fixture(self):
        path_addr_fixture = os.path.join(
            settings.BASE_DIR, 'nexchange/tests/fixtures/'
            'blockr/address_transactions.json')

        path_tx1_fixture = os.path.join(
            settings.BASE_DIR, 'nexchange/tests/fixtures/'
            'blockr/address_tx_1.json')

        path_tx2_fixture = os.path.join(
            settings.BASE_DIR, 'nexchange/tests/fixtures/'
            'blockr/address_tx_2.json')

        uphold_get_details_fixture = os.path.join(
            settings.BASE_DIR,
            'nexchange/tests/fixtures/uphold/get_card_details.json')
        uphold_commit_tx_fixture = os.path.join(
            settings.BASE_DIR,
            'nexchange/tests/fixtures/uphold/commit_transaction.json')
        uphold_reverse_completed_fixture = os.path.join(
            settings.BASE_DIR,
            'nexchange/tests/fixtures/uphold/transaction_completed.json')
        uphold_reverse_pending_fixture = os.path.join(
            settings.BASE_DIR,
            'nexchange/tests/fixtures/uphold/transaction_pending.json')
        uphold_import_transactions_empty = os.path.join(
            settings.BASE_DIR,
            'nexchange/tests/fixtures/uphold/import_transactions_empty.json')

        with open(path_addr_fixture) as f:
            self.blockr_response_addr =\
                f.read().replace('\n', '').replace(' ', '')
            self.wallet_address = json.loads(
                self.blockr_response_addr)['data']['address']

            txs = json.loads(self.blockr_response_addr)['data']['txs']
            self.amounts = [tx['amount'] for tx in txs]

            self.tx_ids = [tx['tx'] for tx in txs]
        with open(path_tx1_fixture) as f:
            self.blockr_response_tx1 =\
                f.read().replace('\n', '').replace(' ', '')
            self.blockr_response_tx1_parsed = json.loads(
                self.blockr_response_tx1)

        with open(path_tx2_fixture) as f:
            self.blockr_response_tx2 =\
                f.read().replace('\n', '').replace(' ', '')
            self.blockr_response_tx2_parsed = json.loads(
                self.blockr_response_tx2)

        with open(uphold_get_details_fixture) as f:
            self.uphold_get_card = \
                f.read().replace('\n', '').replace(' ', '')
            self.uphold_tx_id = json.loads(self.uphold_get_card)['id']

        with open(uphold_commit_tx_fixture) as f:
            self.uphold_commit_tx = \
                f.read().replace('\n', '').replace(' ', '')

        with open(uphold_reverse_completed_fixture) as f:
            self.uphold_tx_completed = \
                f.read().replace('\n', '').replace(' ', '')

        with open(uphold_reverse_pending_fixture) as f:
            self.uphold_tx_pending = \
                f.read().replace('\n', '').replace(' ', '')

        with open(uphold_import_transactions_empty) as f:
            self.uphold_import_transactions_empty = \
                f.read().replace('\n', '').replace(' ', '')

        self.txs = [
            self.blockr_response_tx1_parsed, self.blockr_response_tx2_parsed
        ]

        self.tx_texts = [self.blockr_response_tx1, self.blockr_response_tx2]
        self.status_ok_list_index = 0
        self.status_bad_list_index = 1

    def _create_price_for_pair(self, pair):
        ticker = Ticker(pair=pair,
                        ask=OrderBaseTestCase.PRICE_BUY_EUR,
                        bid=OrderBaseTestCase.PRICE_SELL_EUR)
        ticker.save()
        price = Price(pair=pair, ticker=ticker)
        price.save()
        return price

    @patch(UPHOLD_ROOT + 'get_transactions')
    @patch(UPHOLD_ROOT + 'get_reserve_transaction')
    def base_test_create_transactions_with_task(self, run_method, reserve_txs,
                                                import_txs):

        pair_name = 'BTCLTC'
        pair = Pair.objects.get(name=pair_name)
        self._create_price_for_pair(pair)
        order = Order.objects.filter(pair__name=pair_name).first()
        self._create_mocks_uphold(amount2=order.amount_quote, order=order)
        reserve_txs.return_value = json.loads(self.completed)
        import_txs.return_value = json.loads(self.import_txs)
        run_method()
        tx_ok = Transaction.objects.filter(
            tx_id_api=json.loads(self.import_txs)[1]['id'])
        self.assertEqual(len(tx_ok), 1,
                         'Transaction must be created if order is found!')
        order.refresh_from_db()
        self.assertEquals(order.status, Order.PAID_UNCONFIRMED,
                          'Order should be marked as paid after pipeline')
        tx_bad = Transaction.objects.filter(
            tx_id_api=json.loads(self.import_txs)[0]['id'])
        self.assertEqual(
            len(tx_bad), 0,
            'Transaction must not be created if order is not found!')
        run_method()
        tx_ok = Transaction.objects.filter(
            tx_id_api=json.loads(self.import_txs)[1]['id'])
        self.assertEqual(len(tx_ok), 1,
                         'Transaction must be created only one time!')

    def _update_withdraw_address(self, order, address):
        order.refresh_from_db()
        order.withdraw_address = address
        order.save()

    def _create_withdraw_adress(self, currency, address):
        addr_data = {
            'type': 'W',
            'name': address,
            'address': address,
            'currency': currency
        }
        addr = Address(**addr_data)
        addr.user = self.user
        addr.save()
        return addr

    def _create_mocks_uphold(self,
                             amount2=Decimal('0.0'),
                             currency1=None,
                             currency2=None,
                             card_id=None,
                             order=None):
        order = self.order if not order else order
        if len(self.order.user.addressreserve_set.all()) == 0:
            with requests_mock.mock() as mock:
                self._mock_cards_reserve(mock)
                self._create_an_order_for_every_crypto_currency_card(self.user)
        if order is not None:
            self.order = order
        self.tx_ids_api = ['12345', '54321']
        if not currency1:
            currency1 = self.order.pair.base.code
        if not currency2:
            currency2 = self.order.pair.quote.code
        if card_id is None and self.order.pair.quote.is_crypto:
            card_id = self.order.deposit_address.reserve.card_id
        else:
            card_id = time()
        self.import_txs = self.uphold_import_transactions_empty.format(
            tx_id_api1=self.tx_ids_api[0],
            tx_id_api2=self.tx_ids_api[1],
            amount1=self.order.amount_base,
            amount2=amount2,
            currency1=currency1,
            currency2=currency2,
            card_id=card_id,
        )
        reserve_url = 'https://api.uphold.com/v0/reserve/transactions/{}'
        self.reverse_url1 = reserve_url.format(self.tx_ids_api[0])
        self.reverse_url2 = reserve_url.format(self.tx_ids_api[1])
        self.completed = '{"status": "completed", "type": "deposit",' \
                         '"params": {"progress": 999}}'
        self.pending = '{"status": "pending", "type": "deposit"}'
コード例 #27
0
    def post(self, *args, **kwargs):
        form = CheckoutForm(self.request.POST or None)
        try:
            order = Order.objects.get(user=self.request.user, ordered=False)
            if form.is_valid():

                use_default_shipping = form.cleaned_data.get(
                    'use_default_shipping')
                if use_default_shipping:
                    print("Using the defualt shipping address")
                    address_qs = Address.objects.filter(user=self.request.user,
                                                        address_type='S',
                                                        default=True)
                    if address_qs.exists():
                        shipping_address = address_qs[0]
                        order.shipping_address = shipping_address
                        order.save()
                    else:
                        messages.info(self.request,
                                      "No default shipping address available")
                        return redirect('core:checkout')
                else:
                    print("User is entering a new shipping address")
                    shipping_address1 = form.cleaned_data.get(
                        'shipping_address')
                    shipping_address2 = form.cleaned_data.get(
                        'shipping_address2')
                    shipping_country = form.cleaned_data.get(
                        'shipping_country')
                    shipping_zip = form.cleaned_data.get('shipping_zip')

                    if is_valid_form(
                        [shipping_address1, shipping_country, shipping_zip]):
                        shipping_address = Address(
                            user=self.request.user,
                            street_address=shipping_address1,
                            apartment_address=shipping_address2,
                            country=shipping_country,
                            zip=shipping_zip,
                            address_type='S')
                        shipping_address.save()

                        order.shipping_address = shipping_address
                        order.save()

                        set_default_shipping = form.cleaned_data.get(
                            'set_default_shipping')
                        if set_default_shipping:
                            shipping_address.default = True
                            shipping_address.save()

                    else:
                        messages.info(
                            self.request,
                            "Please fill in the required shipping address fields"
                        )

                use_default_billing = form.cleaned_data.get(
                    'use_default_billing')
                same_billing_address = form.cleaned_data.get(
                    'same_billing_address')

                if same_billing_address:
                    billing_address = shipping_address
                    billing_address.pk = None
                    billing_address.save()
                    billing_address.address_type = 'B'
                    billing_address.save()
                    order.billing_address = billing_address
                    order.save()

                elif use_default_billing:
                    print("Using the defualt billing address")
                    address_qs = Address.objects.filter(user=self.request.user,
                                                        address_type='B',
                                                        default=True)
                    if address_qs.exists():
                        billing_address = address_qs[0]
                        order.billing_address = billing_address
                        order.save()
                    else:
                        messages.info(self.request,
                                      "No default billing address available")
                        return redirect('core:checkout')
                else:
                    print("User is entering a new billing address")
                    billing_address1 = form.cleaned_data.get('billing_address')
                    billing_address2 = form.cleaned_data.get(
                        'billing_address2')
                    billing_country = form.cleaned_data.get('billing_country')
                    billing_zip = form.cleaned_data.get('billing_zip')

                    if is_valid_form(
                        [billing_address1, billing_country, billing_zip]):
                        billing_address = Address(
                            user=self.request.user,
                            street_address=billing_address1,
                            apartment_address=billing_address2,
                            country=billing_country,
                            zip=billing_zip,
                            address_type='B')
                        billing_address.save()

                        order.billing_address = billing_address
                        order.save()

                        set_default_billing = form.cleaned_data.get(
                            'set_default_billing')
                        if set_default_billing:
                            billing_address.default = True
                            billing_address.save()

                    else:
                        messages.info(
                            self.request,
                            "Please fill in the required billing address fields"
                        )

                payment_option = form.cleaned_data.get('payment_option')

                if payment_option == 'S':
                    return redirect('core:payment', payment_option='stripe')
                elif payment_option == 'P':
                    return redirect('core:payment', payment_option='paypal')
                else:
                    messages.warning(self.request,
                                     "Invalid payment option selected")
                    return redirect('core:checkout')
        except ObjectDoesNotExist:
            messages.warning(self.request, "You do not have an active order")
            return redirect("core:order-summary")
コード例 #28
0
 def create_addresss(self, address, currency=None):
     address = Address(address=address, currency=currency)
     address.save()
     return address