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
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()
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()
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
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")
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)
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"
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'])
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")
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)
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)
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)
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
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
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
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
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()
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()
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)
def get_address(**overrides): data = dict(DEFAULT_ADDRESS_DATA, **overrides) return MutableAddress.from_data(data)
def test_partial_address_fails(): address = MutableAddress(name=u"Dog Hello") with pytest.raises(ValidationError): address.full_clean()
def get_address(**overrides): data = dict(DEFAULT_ADDRESS_DATA, **overrides) return MutableAddress.from_data(data)
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
def test_partial_address_fails(): address = MutableAddress( name=u"Dog Hello" ) with pytest.raises(ValidationError): address.full_clean()