Fix Range.all_products() inconsistency with contains_product()
This change fixes the inconsistency with range.all_products() which
didn't check for exclusions when includes_all_products is set
Every other bit of oscar expected range.includes_all_products means
that all products are included, no questions asked. The dashboard
interface even hides the option to edit/remove individual products.
The short circuiting in ConditionalOffer.products() is removed so
the range.all_products() logic is applied consistently.
Fix validation of required phone_number field in PhoneNumberMixin.
If a phone_number field is required, and empty, then PhoneNumberMixin.clean() fails with a key error because the field does not exist in cleaned_data.
This patch fixes the clean() method to only attempt to clean a field if it exists in cleaned_data. If it doesn't then allow Django to raise a validation error for a missing required field.
Also added more comprehensive tests for the validation logic in the mixin.
Decouple price and availability in base strategies.
Revert changes in #1913 and #2294 that required a stock record to have price_excl_tax set in order to report the product as available.
Add separate checks to the basket form/add logic that checks at the time of
adding a product to the basket whether a price exists, and report an error if it doesn't.
Fixes #2664.
Add backward compatible order verification hash checking.
This can be enabled by specifying a `OSCAR_DEPRECATED_ORDER_VERIFY_KEY` setting, which is not set by default.
This allows projects to continue validating old order verification hashes while still changing the `SECRET_KEY`.
during development of large ecommerce site we ran into an exception
when accessing the list of offers and ranges:
AttributeError 'NoneType' object has no attribute 'paginator'
django_rangepaginator/templatetags/rangepaginator.py in paginate at line 12
This PR fixes all cases I could find where this happens, but chances are
some views need the same fix.
- split out the queryset filters into separate methods for easy overloading
in subclasses, i.e. have the keyword search in product titles as well.
- cleanup the get_date_from_to_queryset method a little to make it more dry.
- expand test-coverage for the affected code.
There is a subtle change in behaviour here. Null is converted to ''
only when reading the field value from the database. Previously
this was done in the to_python method, but this causes problems
with uniqueness validation.