Commit f9f6ab8a by Clinton Blackburn

Upgraded to Django 1.9.12

ECOM-7096
parent 966cedea
# -*- coding: utf-8 -*-
# Generated by Django 1.9.12 on 2017-02-16 03:34
from __future__ import unicode_literals
import django.core.validators
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('core', '0025_auto_20170214_0003'),
]
operations = [
migrations.AlterField(
model_name='user',
name='username',
field=models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=30, unique=True, validators=[django.core.validators.RegexValidator('^[\\w.@+-]+$', 'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.')], verbose_name='username'),
),
]
......@@ -37,8 +37,8 @@ class SiteConfiguration(models.Model):
The multi-tenant implementation has one site per partner.
"""
site = models.OneToOneField('sites.Site', null=False, blank=False)
partner = models.ForeignKey('partner.Partner', null=False, blank=False)
site = models.OneToOneField('sites.Site', null=False, blank=False, on_delete=models.CASCADE)
partner = models.ForeignKey('partner.Partner', null=False, blank=False, on_delete=models.CASCADE)
lms_url_root = models.URLField(
verbose_name=_('LMS base url for custom site/microsite'),
help_text=_("Root URL of this site's LMS (e.g. https://courses.stage.edx.org)"),
......
......@@ -9,11 +9,11 @@ Product = get_model('catalogue', 'Product')
class ProductFilter(django_filters.FilterSet):
""" Filter products via query string parameters. """
product_class = django_filters.MethodFilter()
structure = django_filters.CharFilter(name='structure', lookup_type='iexact')
title = django_filters.CharFilter(name='title', lookup_type='startswith')
product_class = django_filters.CharFilter(method='filter_product_class')
structure = django_filters.CharFilter(name='structure', lookup_expr='iexact')
title = django_filters.CharFilter(name='title', lookup_expr='startswith')
def filter_product_class(self, queryset, value):
def filter_product_class(self, queryset, name, value): # pylint: disable=unused-argument
return queryset.filter(Q(product_class__name__iexact=value) | Q(parent__product_class__name__iexact=value))
class Meta(object):
......
......@@ -23,5 +23,5 @@ class ProductFilterTests(CourseCatalogTestMixin, TestCase):
product_class_name = self.seat_product_class.name
queryset = Product.objects.all()
actual = list(self.filter.filter_product_class(queryset, product_class_name))
actual = list(self.filter.filter_product_class(queryset, 'product_class', product_class_name))
self.assertListEqual(actual, [seat, parent])
......@@ -82,7 +82,7 @@ ENTERPRISE_URLS = [
urlpatterns = [
url(r'^baskets/', include(BASKET_URLS, namespace='baskets')),
url(r'^checkout/$', include(CHECKOUT_URLS, namespace='checkout')),
url(r'^checkout/', include(CHECKOUT_URLS, namespace='checkout')),
url(r'^coupons/', include(COUPON_URLS, namespace='coupons')),
url(r'^enterprise/', include(ENTERPRISE_URLS, namespace='enterprise')),
url(r'^payment/', include(PAYMENT_URLS, namespace='payment')),
......
......@@ -3,18 +3,17 @@ import logging
from oscar.core.loading import get_model
from requests.exceptions import ConnectionError, Timeout
from rest_framework import status
from rest_framework.decorators import list_route
from rest_framework.permissions import IsAuthenticated, IsAdminUser
from rest_framework.response import Response
from rest_framework.viewsets import ReadOnlyModelViewSet
from rest_framework_extensions.decorators import action
from rest_framework_extensions.mixins import NestedViewSetMixin
from slumber.exceptions import SlumberBaseException
from ecommerce.core.constants import DEFAULT_CATALOG_PAGE_SIZE
from ecommerce.coupons.utils import get_catalog_course_runs
from ecommerce.extensions.api import serializers
from ecommerce.courses.utils import get_course_catalogs
from ecommerce.extensions.api import serializers
Catalog = get_model('catalogue', 'Catalog')
Product = get_model('catalogue', 'Product')
......@@ -26,10 +25,10 @@ class CatalogViewSet(NestedViewSetMixin, ReadOnlyModelViewSet):
serializer_class = serializers.CatalogSerializer
permission_classes = (IsAuthenticated, IsAdminUser,)
@action(is_for_list=True, methods=['get'])
@list_route()
def preview(self, request):
"""
Preview the results of the catalog query.
""" Preview the results of the catalog query.
A list of course runs, indicating a course run presence within the catalog, will be returned.
---
parameters:
......@@ -75,7 +74,7 @@ class CatalogViewSet(NestedViewSetMixin, ReadOnlyModelViewSet):
return Response(status=status.HTTP_400_BAD_REQUEST)
return Response(status=status.HTTP_400_BAD_REQUEST)
@action(is_for_list=True, methods=['get'])
@list_route()
def course_catalogs(self, request):
"""
Returns response with all course catalogs in the format:
......
......@@ -10,19 +10,18 @@ from opaque_keys.edx.keys import CourseKey
from oscar.core.loading import get_model
from requests.exceptions import ConnectionError, Timeout
from rest_framework import filters, status
from rest_framework.decorators import list_route
from rest_framework.response import Response
from rest_framework_extensions.decorators import action
from slumber.exceptions import SlumberBaseException
from ecommerce.core.constants import DEFAULT_CATALOG_PAGE_SIZE
from ecommerce.coupons.utils import get_catalog_course_runs
from ecommerce.courses.models import Course
from ecommerce.courses.utils import get_course_info_from_catalog
from ecommerce.coupons.utils import get_catalog_course_runs
from ecommerce.extensions.api import serializers
from ecommerce.extensions.api.permissions import IsOffersOrIsAuthenticatedAndStaff
from ecommerce.extensions.api.v2.views import NonDestroyableModelViewSet
logger = logging.getLogger(__name__)
Order = get_model('order', 'Order')
Product = get_model('catalogue', 'Product')
......@@ -35,25 +34,25 @@ class VoucherFilter(django_filters.FilterSet):
Filter for vouchers via query string parameters.
Currently supports filtering via the voucher's code.
"""
code = django_filters.CharFilter(name='code', lookup_type='exact')
code = django_filters.CharFilter(name='code')
class Meta(object):
model = Voucher
fields = ('code', )
fields = ('code',)
class VoucherViewSet(NonDestroyableModelViewSet):
""" View set for vouchers. """
queryset = Voucher.objects.all()
serializer_class = serializers.VoucherSerializer
permission_classes = (IsOffersOrIsAuthenticatedAndStaff, )
filter_backends = (filters.DjangoFilterBackend, )
permission_classes = (IsOffersOrIsAuthenticatedAndStaff,)
filter_backends = (filters.DjangoFilterBackend,)
filter_class = VoucherFilter
@action(is_for_list=True, methods=['get'], endpoint='offers')
@list_route()
def offers(self, request):
"""
Preview the courses offered by the voucher.
""" Preview the courses offered by the voucher.
Paginated Response containing the list of course offers will be returned.
---
parameters:
......@@ -107,9 +106,8 @@ class VoucherViewSet(NonDestroyableModelViewSet):
nonexpired_course_ids = []
for result in results:
all_course_ids.append(result['key'])
if not result['enrollment_end'] or (
result['enrollment_end'] and parser.parse(result['enrollment_end']) > now()
):
if not result['enrollment_end'] or \
(result['enrollment_end'] and parser.parse(result['enrollment_end']) > now()):
nonexpired_course_ids.append(result['key'])
products = []
......
......@@ -74,8 +74,10 @@ class BasketAttribute(models.Model):
can be added by defining new types. Currently only supports text fields,
but could be extended
"""
basket = models.ForeignKey('basket.Basket', verbose_name=_("Basket"))
attribute_type = models.ForeignKey('basket.BasketAttributeType', verbose_name=_("Attribute Type"))
basket = models.ForeignKey('basket.Basket', verbose_name=_("Basket"), on_delete=models.CASCADE)
attribute_type = models.ForeignKey(
'basket.BasketAttributeType', verbose_name=_("Attribute Type"), on_delete=models.CASCADE
)
value_text = models.TextField(_("Text Attribute"))
class Meta(object):
......
......@@ -198,7 +198,6 @@ class BasketSingleItemViewTests(CouponMixin, CourseCatalogTestMixin, CourseCatal
url = '{path}?sku={sku}'.format(path=self.path, sku=sku)
response = self.client.get(url)
self.assertEqual(response.status_code, 303)
self.assertEqual(response.reason_phrase, "SEE OTHER")
self.assertEqual(response.wsgi_request.path_info, '/basket/single-item/')
self.assertEqual(response.wsgi_request.GET['sku'], sku)
......@@ -222,7 +221,6 @@ class BasketSingleItemViewTests(CouponMixin, CourseCatalogTestMixin, CourseCatal
url = '{path}?sku={sku}'.format(path=self.path, sku=stock_record.partner_sku)
response = self.client.get(url)
self.assertEqual(response.status_code, 303)
self.assertEqual(response.reason_phrase, "SEE OTHER")
self.assertEqual(response.wsgi_request.path_info, '/basket/single-item/')
self.assertEqual(response.wsgi_request.GET['sku'], stock_record.partner_sku)
......
# -*- coding: utf-8 -*-
# Generated by Django 1.9.12 on 2017-02-16 03:34
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('catalogue', '0022_auto_20170215_2229'),
]
operations = [
migrations.AlterField(
model_name='historicalproduct',
name='parent',
field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='catalogue.HistoricalProduct'),
),
]
......@@ -6,7 +6,9 @@ from simple_history.models import HistoricalRecords
class Product(AbstractProduct):
course = models.ForeignKey('courses.Course', null=True, blank=True, related_name='products')
course = models.ForeignKey(
'courses.Course', null=True, blank=True, related_name='products', on_delete=models.CASCADE
)
expires = models.DateTimeField(null=True, blank=True,
help_text=_('Last date/time on which this product can be purchased.'))
history = HistoricalRecords()
......@@ -18,7 +20,7 @@ class ProductAttributeValue(AbstractProductAttributeValue):
class Catalog(models.Model):
name = models.CharField(max_length=255)
partner = models.ForeignKey('partner.Partner', related_name='catalogs')
partner = models.ForeignKey('partner.Partner', related_name='catalogs', on_delete=models.CASCADE)
stock_records = models.ManyToManyField('partner.StockRecord', blank=True, related_name='catalogs')
def __unicode__(self):
......
......@@ -115,7 +115,7 @@ class OrderViewBrowserTestBase(LiveServerTestCase):
# Ensure an alert is displayed)
self.assertAlertDisplayed('alert-error',
'Failed to fulfill order {}: INTERNAL SERVER ERROR'.format(order_number))
'Failed to fulfill order {}: Internal Server Error'.format(order_number))
class OrderListViewBrowserTests(OrderViewTestsMixin, RefundTestMixin, OrderViewBrowserTestBase):
......
......@@ -6,16 +6,15 @@ can successfully fulfill the product. Success can be reported back based on each
"""
import logging
from importlib import import_module
from django.conf import settings
from django.utils import importlib
from django.utils.timezone import now
from ecommerce.extensions.fulfillment import exceptions
from ecommerce.extensions.fulfillment.status import ORDER, LINE
from ecommerce.extensions.refund.status import REFUND_LINE
logger = logging.getLogger(__name__)
......@@ -65,7 +64,7 @@ def fulfill_order(order, lines):
logger.error("Product Type [%s] does not have an associated Fulfillment Module. It cannot be fulfilled.",
product_type)
line.set_status(LINE.FULFILLMENT_CONFIGURATION_ERROR)
except Exception: # pylint: disable=broad-except
except Exception: # pylint: disable=broad-except
logger.exception('An unexpected error occurred while fulfilling order [%s].', order.number)
finally:
# Check if all lines are successful, or there were errors, and set the status of the Order.
......@@ -97,7 +96,7 @@ def get_fulfillment_modules():
for cls_path in module_paths:
try:
module_path, _, name = cls_path.rpartition('.')
module = getattr(importlib.import_module(module_path), name)
module = getattr(import_module(module_path), name)
modules.append(module)
except (ImportError, ValueError, AttributeError):
logger.exception("Could not load module at [%s]", cls_path)
......
......@@ -183,7 +183,9 @@ class Range(AbstractRange):
'enterprise_customer',
]
ALLOWED_SEAT_TYPES = ['credit', 'professional', 'verified']
catalog = models.ForeignKey('catalogue.Catalog', blank=True, null=True, related_name='ranges')
catalog = models.ForeignKey(
'catalogue.Catalog', blank=True, null=True, related_name='ranges', on_delete=models.CASCADE
)
catalog_query = models.TextField(blank=True, null=True)
course_catalog = models.PositiveIntegerField(
help_text=_('Course catalog id from the Catalog Service.'),
......
"""Helper functions for working with payment processor classes."""
import hmac
import base64
import hashlib
import hmac
from importlib import import_module
from django.conf import settings
from django.utils import importlib
from ecommerce.extensions.payment import exceptions
......@@ -24,7 +24,7 @@ def get_processor_class(path):
does not contain a class with the parsed class name.
"""
module_path, _, class_name = path.rpartition('.')
processor_class = getattr(importlib.import_module(module_path), class_name)
processor_class = getattr(import_module(module_path), class_name)
return processor_class
......
......@@ -12,6 +12,7 @@ import paypalrestsdk
from django.conf import settings
from django.core.urlresolvers import reverse
from django.test import RequestFactory
from factory.fuzzy import FuzzyInteger
from oscar.apps.payment.exceptions import GatewayError
from oscar.core.loading import get_model
from paypalrestsdk.resource import Resource # pylint:disable=ungrouped-imports
......@@ -184,24 +185,26 @@ class PaypalTests(PaypalMixin, PaymentProcessorTestCaseMixin, TestCase):
self.site.siteconfiguration.enable_otto_receipt_page = False
assert self._get_receipt_url() == self.site.siteconfiguration.build_lms_url('/commerce/checkout/receipt/')
@httpretty.activate
@mock.patch('ecommerce.extensions.payment.processors.paypal.paypalrestsdk.Payment')
@ddt.data(None, Paypal.DEFAULT_PROFILE_NAME, "some-other-name")
@ddt.data(None, Paypal.DEFAULT_PROFILE_NAME, 'some-other-name')
def test_web_profiles(self, enabled_profile_name, mock_payment):
"""
Verify that the payment creation payload references a web profile when one is enabled with the expected name.
"""
mock_payment_instance = mock.Mock()
# NOTE: This is necessary to avoid the issue in https://code.djangoproject.com/ticket/25493.
mock_payment_instance.id = FuzzyInteger(low=1).fuzz()
mock_payment_instance.to_dict.return_value = {}
mock_payment_instance.links = [mock.Mock(rel='approval_url', href='dummy')]
mock_payment.return_value = mock_payment_instance
if enabled_profile_name is not None:
PaypalWebProfile.objects.create(name=enabled_profile_name, id="test-profile-id")
PaypalWebProfile.objects.create(name=enabled_profile_name, id='test-profile-id')
self.processor.get_transaction_parameters(self.basket, request=self.request)
payment_creation_payload = mock_payment.call_args[0][0]
if enabled_profile_name == Paypal.DEFAULT_PROFILE_NAME:
self.assertEqual(payment_creation_payload['experience_profile_id'], "test-profile-id")
self.assertEqual(payment_creation_payload['experience_profile_id'], 'test-profile-id')
else:
self.assertNotIn('experience_profile_id', payment_creation_payload)
......
......@@ -65,8 +65,8 @@ class StatusMixin(object):
class Refund(StatusMixin, TimeStampedModel):
"""Main refund model, used to represent the state of a refund."""
order = models.ForeignKey('order.Order', related_name='refunds', verbose_name=_('Order'))
user = models.ForeignKey('core.User', related_name='refunds', verbose_name=_('User'))
order = models.ForeignKey('order.Order', related_name='refunds', verbose_name=_('Order'), on_delete=models.CASCADE)
user = models.ForeignKey('core.User', related_name='refunds', verbose_name=_('User'), on_delete=models.CASCADE)
total_credit_excl_tax = models.DecimalField(_('Total Credit (excl. tax)'), decimal_places=2, max_digits=12)
currency = models.CharField(_("Currency"), max_length=12, default=get_default_currency)
status = models.CharField(
......@@ -290,8 +290,12 @@ class Refund(StatusMixin, TimeStampedModel):
class RefundLine(StatusMixin, TimeStampedModel):
"""A refund line, used to represent the state of a single item as part of a larger Refund."""
refund = models.ForeignKey('refund.Refund', related_name='lines', verbose_name=_('Refund'))
order_line = models.ForeignKey('order.Line', related_name='refund_lines', verbose_name=_('Order Line'))
refund = models.ForeignKey(
'refund.Refund', related_name='lines', verbose_name=_('Refund'), on_delete=models.CASCADE
)
order_line = models.ForeignKey(
'order.Line', related_name='refund_lines', verbose_name=_('Order Line'), on_delete=models.CASCADE
)
line_credit_excl_tax = models.DecimalField(_('Line Credit (excl. tax)'), decimal_places=2, max_digits=12)
quantity = models.PositiveIntegerField(_('Quantity'), default=1)
status = models.CharField(
......
......@@ -15,12 +15,12 @@ class CouponVouchers(models.Model):
'start_datetime',
'name'
]
coupon = models.ForeignKey('catalogue.Product', related_name='coupon_vouchers')
coupon = models.ForeignKey('catalogue.Product', related_name='coupon_vouchers', on_delete=models.CASCADE)
vouchers = models.ManyToManyField('voucher.Voucher', blank=True, related_name='coupon_vouchers')
class OrderLineVouchers(models.Model):
line = models.ForeignKey('order.Line', related_name='order_line_vouchers')
line = models.ForeignKey('order.Line', related_name='order_line_vouchers', on_delete=models.CASCADE)
vouchers = models.ManyToManyField('voucher.Voucher', related_name='order_line_vouchers')
......
# -*- coding: utf-8 -*-
# Generated by Django 1.9.12 on 2017-02-16 03:34
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('invoice', '0003_auto_20160616_0657'),
]
operations = [
migrations.AlterField(
model_name='invoice',
name='basket',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='basket.Basket'),
),
migrations.AlterField(
model_name='invoice',
name='business_client',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='core.BusinessClient'),
),
migrations.AlterField(
model_name='invoice',
name='order',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='order.Order'),
),
]
......@@ -30,9 +30,9 @@ class Invoice(TimeStampedModel):
'invoice_type',
'tax_deducted_source',
]
basket = models.ForeignKey('basket.Basket', null=True, blank=True)
order = models.ForeignKey('order.Order', null=True, blank=False)
business_client = models.ForeignKey('core.BusinessClient', null=True, blank=False)
basket = models.ForeignKey('basket.Basket', null=True, blank=True, on_delete=models.SET_NULL)
order = models.ForeignKey('order.Order', null=True, blank=False, on_delete=models.SET_NULL)
business_client = models.ForeignKey('core.BusinessClient', null=True, blank=False, on_delete=models.SET_NULL)
state = models.CharField(max_length=255, default=NOT_PAID, choices=state_choices)
number = models.CharField(max_length=255, null=True, blank=True)
......
# -*- coding: utf-8 -*-
# Generated by Django 1.9.12 on 2017-02-16 03:34
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('referrals', '0003_auto_20161027_1738'),
]
operations = [
migrations.AlterField(
model_name='referral',
name='basket',
field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='basket.Basket'),
),
migrations.AlterField(
model_name='referral',
name='order',
field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='order.Order'),
),
]
......@@ -19,9 +19,9 @@ class Referral(TimeStampedModel):
'utm_created_at',
)
site = models.ForeignKey('sites.Site', null=True, blank=False)
basket = models.OneToOneField('basket.Basket', null=True, blank=True)
order = models.OneToOneField('order.Order', null=True, blank=True)
site = models.ForeignKey('sites.Site', null=True, blank=False, on_delete=models.CASCADE)
basket = models.OneToOneField('basket.Basket', null=True, blank=True, on_delete=models.SET_NULL)
order = models.OneToOneField('order.Order', null=True, blank=True, on_delete=models.SET_NULL)
affiliate_id = models.CharField(_('Affiliate ID'), blank=True, default="", max_length=255)
utm_source = models.CharField(_('UTM Source'), blank=True, default="", max_length=255)
utm_medium = models.CharField(_('UTM Medium'), blank=True, default="", max_length=255)
......
......@@ -210,6 +210,7 @@ MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django_sites_extensions.middleware.CurrentSiteWithDefaultMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
......
......@@ -50,11 +50,7 @@ if os.environ.get('ENABLE_DJANGO_TOOLBAR', False):
'debug_toolbar',
)
MIDDLEWARE_CLASSES += (
'debug_toolbar.middleware.DebugToolbarMiddleware',
)
DEBUG_TOOLBAR_PATCH_SETTINGS = False
MIDDLEWARE_CLASSES = ('debug_toolbar.middleware.DebugToolbarMiddleware',) + MIDDLEWARE_CLASSES
# http://django-debug-toolbar.readthedocs.org/en/latest/installation.html
INTERNAL_IPS = ('127.0.0.1',)
......
......@@ -11,7 +11,7 @@ class SiteTheme(models.Model):
site (ForeignKey): Foreign Key field pointing to django Site model
theme_dir_name (CharField): Contains directory name for any site's theme (e.g. 'red-theme')
"""
site = models.ForeignKey(Site, related_name='themes')
site = models.ForeignKey(Site, related_name='themes', on_delete=models.CASCADE)
theme_dir_name = models.CharField(max_length=255)
@staticmethod
......
"""
Theming aware template loaders.
"""
from django.utils._os import safe_join
from django.core.exceptions import SuspiciousFileOperation
from django.template.loaders.filesystem import Loader as FilesystemLoader
from django.template.loaders.filesystem import Loader
from threadlocals.threadlocals import get_current_request
from ecommerce.theming.helpers import get_current_theme, get_all_theme_template_dirs
class ThemeTemplateLoader(FilesystemLoader):
class ThemeTemplateLoader(Loader):
"""
Filesystem Template loaders to pickup templates from theme directory based on the current site.
"""
is_usable = True
_accepts_engine_in_init = True
def get_template_sources(self, template_name, template_dirs=None):
"""
Returns the absolute paths to "template_name", when appended to each
directory in "template_dirs". Any paths that don't lie inside one of the
template dirs are excluded from the result set, for security reasons.
"""
if not template_dirs:
template_dirs = self.engine.dirs
theme_dirs = self.get_theme_template_sources()
# append theme dirs to the beginning so templates are looked up inside theme dir first
if isinstance(theme_dirs, list):
template_dirs = theme_dirs + template_dirs
def get_dirs(self):
dirs = super(ThemeTemplateLoader, self).get_dirs()
theme_dirs = []
for template_dir in template_dirs:
try:
yield safe_join(template_dir, template_name)
except SuspiciousFileOperation:
# The joined path was located outside of this template_dir
# (it might be inside another one, so this isn't fatal).
pass
@staticmethod
def get_theme_template_sources():
"""
Return template sources for the given theme and if request object is None (this would be the case for
management commands) return template sources for all themes.
"""
if get_current_request():
# template is being accessed by a view, so return templates sources for current theme
# If the template is being loaded in a request, prepend the current theme's template directories
# so the theme's templates take precedence.
theme = get_current_theme()
return theme and theme.template_dirs
if theme:
theme_dirs = theme.template_dirs
else:
# if request object is not present, then this method is being called inside a management
# command and return all theme template sources for compression
return get_all_theme_template_dirs()
# If we are outside of a request, we are most likely running the compress management command, in which
# case we should load all directories for all themes.
theme_dirs = get_all_theme_template_dirs()
return theme_dirs + dirs
......@@ -6,7 +6,9 @@ from django.conf.urls import url, include
from django.conf.urls.static import static
from django.contrib import admin
from django.shortcuts import redirect
from django.views.defaults import page_not_found, server_error
from django.views.generic import TemplateView
from django.views.i18n import javascript_catalog
from ecommerce.core import views as core_views
from ecommerce.core.url_utils import get_lms_dashboard_url
......@@ -40,9 +42,7 @@ js_info_dict = {
# NOTE 1: Add our logout override first to ensure it is registered by Django as the actual logout view.
# NOTE 2: These same patterns are used for rest_framework's browseable API authentication links.
AUTH_URLS = [
url(r'^logout/$', LogoutView.as_view(), name='logout'),
] + auth_urlpatterns
AUTH_URLS = [url(r'^logout/$', LogoutView.as_view(), name='logout'), ] + auth_urlpatterns
urlpatterns = AUTH_URLS + [
url(r'^admin/', include(admin.site.urls)),
......@@ -54,7 +54,7 @@ urlpatterns = AUTH_URLS + [
url(r'^coupons/', include('ecommerce.coupons.urls', namespace='coupons')),
url(r'^health/$', core_views.health, name='health'),
url(r'^i18n/', include('django.conf.urls.i18n')),
url(r'^jsi18n/$', 'django.views.i18n.javascript_catalog', js_info_dict),
url(r'^jsi18n/$', javascript_catalog, js_info_dict, name='javascript-catalog'),
]
# Install Oscar extension URLs
......@@ -74,8 +74,8 @@ if settings.DEBUG and settings.MEDIA_ROOT: # pragma: no cover
if settings.DEBUG: # pragma: no cover
urlpatterns += [
url(r'^403/$', handler403, name='403'),
url(r'^404/$', 'django.views.defaults.page_not_found', name='404'),
url(r'^500/$', 'django.views.defaults.server_error', name='500'),
url(r'^404/$', page_not_found, name='404'),
url(r'^500/$', server_error, name='500'),
url(r'^bootstrap/$', TemplateView.as_view(template_name='bootstrap-demo.html')),
]
# Allow error pages to be tested
......
analytics-python==1.1.0
Django==1.8.16
django-appconf==0.6
django-compressor==2.0
Django==1.9.12
django-compressor==2.1.1
django-crispy-forms==1.6.1
django_extensions==1.5.5
django-filter==0.11.0
django-filter==1.0.1
django-libsass==0.5
django-oscar==1.3
django-rest-swagger[reST]==0.3.10
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment