Ejemplo n.º 1
0
    def _initialize_source_from_state(self, state, creator, ip_address, save, order_to_update=None):
        shop_data = state.pop("shop", None).get("selected", {})
        shop = self.safe_get_first(Shop, pk=shop_data.pop("id", None))
        if not shop:
            self.add_error(ValidationError(_("Please choose a valid shop."), code="no_shop"))
            return None

        source = OrderSource(shop=shop)
        if order_to_update:
            source.update_from_order(order_to_update)

        customer_data = state.pop("customer", None)
        billing_address_data = customer_data.pop("billingAddress", {})
        shipping_address_data = (
            billing_address_data
            if customer_data.pop("shipToBillingAddress", False)
            else customer_data.pop("shippingAddress", {}))
        is_company = customer_data.pop("isCompany", False)
        save_address = customer_data.pop("saveAddress", False)
        customer = self._get_customer(customer_data, billing_address_data, is_company, save)
        if not customer:
            return

        billing_address = MutableAddress.from_data(billing_address_data)
        shipping_address = MutableAddress.from_data(shipping_address_data)
        if save:
            billing_address.save()
            shipping_address.save()

        if save and save_address:
            customer.default_billing_address = billing_address
            customer.default_shipping_address = shipping_address
            customer.save()

        methods_data = state.pop("methods", None) or {}
        shipping_method = methods_data.pop("shippingMethod")
        if not shipping_method:
            self.add_error(ValidationError(_("Please select shipping method."), code="no_shipping_method"))

        payment_method = methods_data.pop("paymentMethod")
        if not payment_method:
            self.add_error(ValidationError(_("Please select payment method."), code="no_payment_method"))

        if self.errors:
            return

        source.update(
            creator=creator,
            ip_address=ip_address,
            customer=customer,
            billing_address=billing_address,
            shipping_address=shipping_address,
            status=OrderStatus.objects.get_default_initial(),
            shipping_method=self.safe_get_first(ShippingMethod, pk=shipping_method.get("id")),
            payment_method=self.safe_get_first(PaymentMethod, pk=payment_method.get("id")),
        )
        return source
Ejemplo n.º 2
0
 def update_address(self, instance, field_name, validated_address_data):
     if not validated_address_data:
         return None
     contact_address = getattr(instance, field_name)
     if contact_address:
         MutableAddress.objects.filter(pk=contact_address.pk).update(**validated_address_data)
         contact_address.refresh_from_db()
     else:
         address = MutableAddress(**validated_address_data)
         address.save()
         setattr(instance, field_name, address)
         instance.save()
Ejemplo n.º 3
0
 def update_address(self, instance, field_name, validated_address_data):
     if not validated_address_data:
         return None
     contact_address = getattr(instance, field_name)
     if contact_address:
         MutableAddress.objects.filter(pk=contact_address.pk).update(
             **validated_address_data)
         contact_address.refresh_from_db()
     else:
         address = MutableAddress(**validated_address_data)
         address.save()
         setattr(instance, field_name, address)
         instance.save()
Ejemplo n.º 4
0
    def save(self, commit=True):
        def populate_address(needle):
            data = {}
            delete = []
            for k, value in six.iteritems(self.cleaned_data):
                if k.startswith(needle):
                    key = k.replace(needle, "")
                    data[key] = value
                    delete.append(k)

            # sweep unneeded keys
            for k in delete:
                del self.cleaned_data[k]

            return data

        contact_address_data = populate_address("contact_")
        company_address_data = populate_address("company_")
        user = super(CompanyRegistrationForm, self).save(commit)

        website = company_address_data.pop("www")

        contact_address = MutableAddress.from_data(contact_address_data)
        contact_address.save()
        company_address = MutableAddress.from_data(company_address_data)
        company_address.save()

        contact = PersonContact()
        contact.is_active = False
        contact.user = user
        contact.email = user.email
        contact.default_shipping_address = contact_address
        contact.default_billing_address = contact_address
        contact.first_name = contact_address_data["first_name"]
        contact.last_name = contact_address_data["last_name"]
        contact.phone = contact_address.phone
        contact.save()

        company = CompanyContact()
        company.default_shipping_address = company_address
        company.default_billing_address = company_address
        company.is_active = False
        company.phone = company_address.phone
        company.www = website
        company.name = company_address_data["name"]
        company.name_ext = company_address_data["name_ext"]
        company.tax_number = company_address_data["tax_number"]
        company.email = company_address_data["email"]
        company.save()
        company.members.add(contact)
        return user
Ejemplo n.º 5
0
def test_stacked_tax_taxful_price():
    shop = get_shop(prices_include_tax=True, currency='EUR')
    source = OrderSource(shop)
    assert source.prices_include_tax
    source.add_line(type=OrderLineType.OTHER,
                    quantity=1,
                    base_unit_price=source.create_price(20))
    with override_provides("tax_module", TAX_MODULE_SPEC):
        with override_settings(SHUUP_TAX_MODULE="irvine"):
            source.shipping_address = MutableAddress(
                street="16215 Alton Pkwy",
                postal_code="92602",
            )
            line = source.get_final_lines(with_taxes=True)[0]
            assert isinstance(line, SourceLine)
            assert line.taxes
            assert line.taxful_price == TaxfulPrice(20, 'EUR')
            assert_almost_equal(line.taxless_price,
                                TaxlessPrice("18.52", 'EUR'))
            source.uncache()

            # Let's move out to a taxless location.
            source.shipping_address.postal_code = "11111"
            line = source.get_final_lines(with_taxes=True)[0]
            assert isinstance(line, SourceLine)
            assert not line.taxes
            assert line.taxful_price == TaxfulPrice(20, source.currency)
            assert line.taxless_price.value == Decimal("20")
Ejemplo n.º 6
0
 def _get_address(self, address, is_company, save):
     if self.is_empty_address(address):
         return None
     address_form = forms.modelform_factory(MutableAddress, exclude=[])
     address_form_instance = address_form(data=address)
     address_form_instance.full_clean()
     if not address_form_instance.is_valid():
         for field_name, errors in address_form_instance.errors.items():
             field_label = address_form_instance.fields[field_name].label
             for error_msg in errors:
                 self.add_error(
                     ValidationError(
                         "Error! %(field_label)s: %(error_msg)s" % {
                             "field_label": field_label,
                             "error_msg": error_msg
                         },
                         code="invalid_address",
                     ))
         return None
     if is_company and not address_form_instance.cleaned_data["tax_number"]:
         self.add_error(
             ValidationError(_("Tax number is not set for company."),
                             code="no_tax_number"))
         return None
     if save:
         return address_form_instance.save()
     return MutableAddress.from_data(address_form_instance.cleaned_data)
Ejemplo n.º 7
0
def test_home_country_in_address():
    with override("fi"):
        finnish_address = MutableAddress(country="FI")
        with override_settings(SHUUP_ADDRESS_HOME_COUNTRY="US"):
            assert "Suomi" in str(finnish_address), "When home is not Finland, Finland appears in address string"
        with override_settings(SHUUP_ADDRESS_HOME_COUNTRY="FI"):
            assert "Suomi" not in str(finnish_address), "When home is Finland, Finland does not appear in address string"
Ejemplo n.º 8
0
 def get_shipping_address(self, form):
     """
     Just return a MutableAddress with city, region and country set
     """
     return MutableAddress(city=form.cleaned_data['city'],
                           region=form.cleaned_data['region'],
                           country=form.cleaned_data['country'])
Ejemplo n.º 9
0
def test_stacked_tax_taxless_price():
    source = OrderSource(get_shop(prices_include_tax=False))
    assert source.prices_include_tax is False
    source.add_line(
        product=get_default_product(),
        supplier=get_default_supplier(),
        type=OrderLineType.PRODUCT,
        quantity=1,
        base_unit_price=source.create_price(10),
    )
    with override_provides("tax_module", TAX_MODULE_SPEC):
        with override_settings(SHUUP_TAX_MODULE="irvine"):
            source.shipping_address = MutableAddress(
                street="16215 Alton Pkwy",
                postal_code="92602",
            )
            line = source.get_final_lines(with_taxes=True)[0]
            assert isinstance(line, SourceLine)
            assert line.taxes
            assert line.taxful_price.value == Decimal("10.800")
            source.uncache()

            # Let's move out to a taxless location.
            source.shipping_address.postal_code = "11111"
            line = source.get_final_lines(with_taxes=True)[0]
            assert isinstance(line, SourceLine)
            assert not line.taxes
            assert line.taxful_price.value == Decimal("10")
Ejemplo n.º 10
0
    def get_shipping_address(self, form):
        """
        Just return a MutableAddress with a postal code set
        """

        country = form.cleaned_data.get('country', settings.SHUUP_ADDRESS_HOME_COUNTRY)
        return MutableAddress(postal_code=form.cleaned_data['postal_code'],
                              country=country)
Ejemplo n.º 11
0
    def shipping_address(self):
        if self._shipping_address:
            return self._shipping_address

        shipping_address_id = self._get_value_from_data("shipping_address_id")
        if shipping_address_id:
            return MutableAddress.objects.get(pk=shipping_address_id)

        shipping_address_data = self._get_value_from_data("shipping_address_data")
        if shipping_address_data:
            return MutableAddress.from_data(shipping_address_data)
Ejemplo n.º 12
0
    def billing_address(self):
        if self._billing_address:
            return self._billing_address

        billing_address_id = self._get_value_from_data("billing_address_id")
        if billing_address_id:
            return MutableAddress.objects.get(pk=billing_address_id)

        billing_address_data = self._get_value_from_data("billing_address_data")
        if billing_address_data:
            return MutableAddress.from_data(billing_address_data)
Ejemplo n.º 13
0
def create_random_address(fake=None, **values):
    if not fake:
        fake = get_faker(["person", "address"])
    empty = str  # i.e. constructor for empty string
    values.setdefault("name", fake.name())
    values.setdefault("street", fake.address().replace('\n', ' '))
    values.setdefault("city", fake.city())
    values.setdefault("region", getattr(fake, "state", empty)())
    values.setdefault("country", random.choice(COUNTRY_CODES))
    values.setdefault("postal_code", getattr(fake, "postalcode", empty)())
    address = MutableAddress.from_data(values)
    address.save()
    return address
Ejemplo n.º 14
0
def create_random_address(fake=None, **values):
    if not fake:
        fake = get_faker(["person", "address"])
    empty = str  # i.e. constructor for empty string
    values.setdefault("name", fake.name())
    values.setdefault("street", fake.address().replace('\n', ' '))
    values.setdefault("city", fake.city())
    values.setdefault("region", getattr(fake, "state", empty)())
    values.setdefault("country", random.choice(COUNTRY_CODES))
    values.setdefault("postal_code", getattr(fake, "postalcode", empty)())
    address = MutableAddress.from_data(values)
    address.save()
    return address
Ejemplo n.º 15
0
    def shipping_address(self):
        if self._shipping_address:
            return self._shipping_address

        shipping_address = None
        shipping_address_id = self._get_value_from_data("shipping_address_id")
        if shipping_address_id:
            shipping_address = MutableAddress.objects.get(pk=shipping_address_id)

        if not shipping_address:
            shipping_address_data = self._get_value_from_data("shipping_address_data")
            if shipping_address_data:
                shipping_address = MutableAddress.from_data(shipping_address_data)

        self._shipping_address = shipping_address
        return shipping_address
Ejemplo n.º 16
0
    def billing_address(self):
        if self._billing_address:
            return self._billing_address

        billing_address = None
        billing_address_id = self._get_value_from_data("billing_address_id")
        if billing_address_id:
            billing_address = MutableAddress.objects.get(pk=billing_address_id)

        if not billing_address:
            billing_address_data = self._get_value_from_data("billing_address_data")
            if billing_address_data:
                billing_address = MutableAddress.from_data(billing_address_data)

        self._billing_address = billing_address
        return self._billing_address
Ejemplo n.º 17
0
    def handle_row_address(self, fields, row_session):
        row = row_session.row
        contact = row_session.instance
        data = {}
        for field in fields:
            data[field.replace(" ", "_")] = row.get(field, "")
        data["name"] = contact.name
        data["email"] = contact.email
        data["phone"] = contact.phone
        data["name_ext"] = contact.name_ext

        if hasattr(contact, "tax_number"):
            data["tax_number"] = contact.tax_number

        address = MutableAddress.from_data(data)
        address.save()
        contact.default_shipping_address = address
        contact.default_billing_address = address
        contact.save()
Ejemplo n.º 18
0
    def handle_row_address(self, fields, row_session):
        row = row_session.row
        contact = row_session.instance
        data = {}
        for field in fields:
            data[field.replace(" ", "_")] = row.get(field, "")
        data["name"] = contact.name
        data["email"] = contact.email
        data["phone"] = contact.phone
        data["name_ext"] = contact.name_ext

        if hasattr(contact, "tax_number"):
            data["tax_number"] = contact.tax_number

        address = MutableAddress.from_data(data)
        address.save()
        contact.default_shipping_address = address
        contact.default_billing_address = address
        contact.save()
Ejemplo n.º 19
0
 def _get_address(self, address, is_company, save):
     address_form = forms.modelform_factory(MutableAddress, exclude=[])
     address_form_instance = address_form(data=address)
     address_form_instance.full_clean()
     if not address_form_instance.is_valid():
         for field_name, errors in address_form_instance.errors.items():
             field_label = address_form_instance.fields[field_name].label
             for error_msg in errors:
                 self.add_error(
                     ValidationError(
                         "%(field_label)s: %(error_msg)s",
                         params={"field_label": field_label, "error_msg": error_msg},
                         code="invalid_address"
                     )
                 )
         return None
     if is_company and not address_form_instance.cleaned_data["tax_number"]:
         self.add_error(ValidationError(_("Tax number is not set for company."), code="no_tax_number"))
         return None
     if save:
         return address_form_instance.save()
     return MutableAddress.from_data(address_form_instance.cleaned_data)
Ejemplo n.º 20
0
def get_address(**overrides):
    data = dict(DEFAULT_ADDRESS_DATA, **overrides)
    return MutableAddress.from_data(data)
Ejemplo n.º 21
0
def test_partial_address_fails():
    address = MutableAddress(name=u"Dog Hello")
    with pytest.raises(ValidationError):
        address.full_clean()
Ejemplo n.º 22
0
def get_address(**overrides):
    data = dict(DEFAULT_ADDRESS_DATA, **overrides)
    return MutableAddress.from_data(data)
Ejemplo n.º 23
0
    def _initialize_source_from_state(self,
                                      state,
                                      creator,
                                      ip_address,
                                      save,
                                      order_to_update=None):
        shop_data = state.pop("shop", None).get("selected", {})
        shop = self.safe_get_first(Shop, pk=shop_data.pop("id", None))
        if not shop:
            self.add_error(
                ValidationError(_("Please choose a valid shop."),
                                code="no_shop"))
            return None

        source = OrderSource(shop=shop)
        if order_to_update:
            source.update_from_order(order_to_update)

        customer_data = state.pop("customer", None)
        billing_address_data = customer_data.pop("billingAddress", {})
        shipping_address_data = (billing_address_data if customer_data.pop(
            "shipToBillingAddress", False) else customer_data.pop(
                "shippingAddress", {}))
        is_company = customer_data.pop("isCompany", False)
        save_address = customer_data.pop("saveAddress", False)
        customer = self._get_customer(customer_data, billing_address_data,
                                      is_company, save)
        if not customer:
            return

        billing_address = MutableAddress.from_data(billing_address_data)
        shipping_address = MutableAddress.from_data(shipping_address_data)
        if save:
            billing_address.save()
            shipping_address.save()

        if save and save_address:
            customer.default_billing_address = billing_address
            customer.default_shipping_address = shipping_address
            customer.save()

        methods_data = state.pop("methods", None) or {}
        shipping_method = methods_data.pop("shippingMethod")
        if not shipping_method:
            self.add_error(
                ValidationError(_("Please select shipping method."),
                                code="no_shipping_method"))

        payment_method = methods_data.pop("paymentMethod")
        if not payment_method:
            self.add_error(
                ValidationError(_("Please select payment method."),
                                code="no_payment_method"))

        if self.errors:
            return

        source.update(
            creator=creator,
            ip_address=ip_address,
            customer=customer,
            billing_address=billing_address,
            shipping_address=shipping_address,
            status=OrderStatus.objects.get_default_initial(),
            shipping_method=self.safe_get_first(ShippingMethod,
                                                pk=shipping_method.get("id")),
            payment_method=self.safe_get_first(PaymentMethod,
                                               pk=payment_method.get("id")),
        )
        return source
Ejemplo n.º 24
0
def test_partial_address_fails():
    address = MutableAddress(
        name=u"Dog Hello"
    )
    with pytest.raises(ValidationError):
        address.full_clean()