Merge pull request #4720 from edx/split/add-and-fixes
Split/add and fixes
This commit is contained in:
@@ -10,6 +10,7 @@ Core methods
|
||||
|
||||
from django.core.cache import cache
|
||||
from django.db import DEFAULT_DB_ALIAS
|
||||
from opaque_keys import InvalidKeyError
|
||||
|
||||
from . import app_settings
|
||||
|
||||
@@ -118,9 +119,19 @@ def get_cached_content(location):
|
||||
|
||||
|
||||
def del_cached_content(location):
|
||||
# delete content for the given location, as well as for content with run=None.
|
||||
# it's possible that the content could have been cached without knowing the
|
||||
# course_key - and so without having the run.
|
||||
cache.delete_many(
|
||||
[unicode(loc).encode("utf-8") for loc in [location, location.replace(run=None)]]
|
||||
)
|
||||
"""
|
||||
delete content for the given location, as well as for content with run=None.
|
||||
it's possible that the content could have been cached without knowing the
|
||||
course_key - and so without having the run.
|
||||
"""
|
||||
def location_str(loc):
|
||||
return unicode(loc).encode("utf-8")
|
||||
|
||||
locations = [location_str(location)]
|
||||
try:
|
||||
locations.append(location_str(location.replace(run=None)))
|
||||
except InvalidKeyError:
|
||||
# although deprecated keys allowed run=None, new keys don't if there is no version.
|
||||
pass
|
||||
|
||||
cache.delete_many(locations)
|
||||
|
||||
@@ -6,6 +6,7 @@ from xmodule.contentstore.django import contentstore
|
||||
from xmodule.contentstore.content import StaticContent, XASSET_LOCATION_TAG
|
||||
from xmodule.modulestore import InvalidLocationError
|
||||
from opaque_keys import InvalidKeyError
|
||||
from opaque_keys.edx.locator import AssetLocator
|
||||
from cache_toolbox.core import get_cached_content, set_cached_content
|
||||
from xmodule.exceptions import NotFoundError
|
||||
|
||||
@@ -14,8 +15,11 @@ from xmodule.exceptions import NotFoundError
|
||||
|
||||
class StaticContentServer(object):
|
||||
def process_request(self, request):
|
||||
# look to see if the request is prefixed with 'c4x' tag
|
||||
if request.path.startswith('/' + XASSET_LOCATION_TAG + '/'):
|
||||
# look to see if the request is prefixed with an asset prefix tag
|
||||
if (
|
||||
request.path.startswith('/' + XASSET_LOCATION_TAG + '/') or
|
||||
request.path.startswith('/' + AssetLocator.CANONICAL_NAMESPACE)
|
||||
):
|
||||
try:
|
||||
loc = StaticContent.get_location_from_path(request.path)
|
||||
except (InvalidLocationError, InvalidKeyError):
|
||||
|
||||
@@ -5,7 +5,7 @@ Adds user's tags to tracking event context.
|
||||
|
||||
from eventtracking import tracker
|
||||
from opaque_keys import InvalidKeyError
|
||||
from opaque_keys.edx.locations import SlashSeparatedCourseKey
|
||||
from opaque_keys.edx.keys import CourseKey
|
||||
|
||||
from track.contexts import COURSE_REGEX
|
||||
from user_api.models import UserCourseTag
|
||||
@@ -24,7 +24,7 @@ class UserTagsEventContextMiddleware(object):
|
||||
if match:
|
||||
course_id = match.group('course_id')
|
||||
try:
|
||||
course_key = SlashSeparatedCourseKey.from_deprecated_string(course_id)
|
||||
course_key = CourseKey.from_string(course_id)
|
||||
except InvalidKeyError:
|
||||
course_id = None
|
||||
course_key = None
|
||||
|
||||
@@ -2,6 +2,7 @@ from django.db import models
|
||||
from django.core.exceptions import ValidationError
|
||||
from opaque_keys.edx.locations import SlashSeparatedCourseKey, Location
|
||||
from opaque_keys.edx.keys import CourseKey, UsageKey
|
||||
from opaque_keys.edx.locator import Locator
|
||||
|
||||
from south.modelsinspector import add_introspection_rules
|
||||
add_introspection_rules([], ["^xmodule_django\.models\.CourseKeyField"])
|
||||
@@ -44,6 +45,28 @@ class NoneToEmptyQuerySet(models.query.QuerySet):
|
||||
return super(NoneToEmptyQuerySet, self)._filter_or_exclude(*args, **kwargs)
|
||||
|
||||
|
||||
def _strip_object(key):
|
||||
"""
|
||||
Strips branch and version info if the given key supports those attributes.
|
||||
"""
|
||||
if hasattr(key, 'version_agnostic') and hasattr(key, 'for_branch'):
|
||||
return key.for_branch(None).version_agnostic()
|
||||
else:
|
||||
return key
|
||||
|
||||
|
||||
def _strip_value(value, lookup='exact'):
|
||||
"""
|
||||
Helper function to remove the branch and version information from the given value,
|
||||
which could be a single object or a list.
|
||||
"""
|
||||
if lookup == 'in':
|
||||
stripped_value = [_strip_object(el) for el in value]
|
||||
else:
|
||||
stripped_value = _strip_object(value)
|
||||
return stripped_value
|
||||
|
||||
|
||||
class CourseKeyField(models.CharField):
|
||||
description = "A SlashSeparatedCourseKey object, saved to the DB in the form of a string"
|
||||
|
||||
@@ -69,14 +92,18 @@ class CourseKeyField(models.CharField):
|
||||
if lookup == 'isnull':
|
||||
raise TypeError('Use CourseKeyField.Empty rather than None to query for a missing CourseKeyField')
|
||||
|
||||
return super(CourseKeyField, self).get_prep_lookup(lookup, value)
|
||||
return super(CourseKeyField, self).get_prep_lookup(
|
||||
lookup,
|
||||
# strip key before comparing
|
||||
_strip_value(value, lookup)
|
||||
)
|
||||
|
||||
def get_prep_value(self, value):
|
||||
if value is self.Empty or value is None:
|
||||
return '' # CharFields should use '' as their empty value, rather than None
|
||||
|
||||
assert isinstance(value, CourseKey)
|
||||
return value.to_deprecated_string()
|
||||
return unicode(_strip_value(value))
|
||||
|
||||
def validate(self, value, model_instance):
|
||||
"""Validate Empty values, otherwise defer to the parent"""
|
||||
@@ -119,14 +146,19 @@ class LocationKeyField(models.CharField):
|
||||
if lookup == 'isnull':
|
||||
raise TypeError('Use LocationKeyField.Empty rather than None to query for a missing LocationKeyField')
|
||||
|
||||
return super(LocationKeyField, self).get_prep_lookup(lookup, value)
|
||||
# remove version and branch info before comparing keys
|
||||
return super(LocationKeyField, self).get_prep_lookup(
|
||||
lookup,
|
||||
# strip key before comparing
|
||||
_strip_value(value, lookup)
|
||||
)
|
||||
|
||||
def get_prep_value(self, value):
|
||||
if value is self.Empty:
|
||||
return ''
|
||||
|
||||
assert isinstance(value, UsageKey)
|
||||
return value.to_deprecated_string()
|
||||
return unicode(_strip_value(value))
|
||||
|
||||
def validate(self, value, model_instance):
|
||||
"""Validate Empty values, otherwise defer to the parent"""
|
||||
|
||||
Reference in New Issue
Block a user