toothie
toothie

Reputation: 1029

Django oscar add a standard shipping method

Can anyone please explain how to a standard shipping charge by overriding the django oscar's shipping app? I have tried doing it using the recipe given in docs but it doesn't show any shipping methods available. This is what I have done:

apps/shipping/admin.py:

from oscar.apps.shipping.admin import *

apps/shipping/config.py:

from django.apps import AppConfig


class ShippingConfig(AppConfig):
    name = 'apps.shipping'

apps/shipping/methods.py:

from decimal import Decimal as D
from django.template.loader import render_to_string

from oscar.apps.shipping import methods
from oscar.core import prices


class Standard(methods.Base):
    code = 'standard'
    name = 'Standard shipping'

    charge_per_item = D('0.99')
    threshold = D('12.00')

    description = render_to_string(
        'shipping/standard.html', {
            'charge_per_item': charge_per_item,
            'threshold': threshold})

    def calculate(self, basket):
        # Free for orders over some threshold
        if basket.total_incl_tax > self.threshold:
            return prices.Price(
                currency=basket.currency,
                excl_tax=D('0.00'),
                incl_tax=D('0.00'))

        # Simple method - charge 0.99 per item
        total = basket.num_items * self.charge_per_item
        return prices.Price(
            currency=basket.currency,
            excl_tax=total,
            incl_tax=total)


class Express(methods.Base):
    code = 'express'
    name = 'Express shipping'

    charge_per_item = D('1.50')
    description = render_to_string(
        'shipping/express.html', {'charge_per_item': charge_per_item})

    def calculate(self, basket):
        total = basket.num_items * self.charge_per_item
        return prices.Price(
            currency=basket.currency,
            excl_tax=total,
            incl_tax=total)

apps/shipping/models.py:

from oscar.apps.shipping.models import *

apps/shipping/repository.py:

from oscar.apps.shipping import repository

from . import methods


# Override shipping repository in order to provide our own two
# custom methods
class Repository(repository.Repository):
    methods = (methods.Standard(), methods.Express())

Upvotes: 1

Views: 1643

Answers (1)

The Pied Pipes
The Pied Pipes

Reputation: 1435

Have you added your shipping app to your settings.py?

Should look a bit like this:

# settings.py

from oscar import get_core_apps
# ...
INSTALLED_APPS = [
    # all your non-Oscar apps
] + get_core_apps(['yourproject.shipping'])

Hope that's the tick :)

Upvotes: 2

Related Questions