Enable model-caching of discussions ID mapping.
Doing modulestore lookups is expensive, so commit 695b036 created a
course_publish listener that would materialize the discussion ID to
XBlock usage key mapping into the CourseDiscussionSettings model.
However, the signal wasn't hooked up to the Studio process, so that
async task was never called. When hooking it up, I also discovered that
bok choy tests related to partitioning were failing because of a race
condition where multiple processes are overwriting the discussion
settings. To make sure this wasn't an issue, I moved the mapping to
its own table.
This is part of ARCH-111, and the overall Course Structures API
deprecation.
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11.13 on 2018-06-13 12:10
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations
|
||||
import jsonfield.fields
|
||||
import opaque_keys.edx.django.models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('django_comment_common', '0006_coursediscussionsettings_discussions_id_map'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='DiscussionsIdMapping',
|
||||
fields=[
|
||||
('course_id', opaque_keys.edx.django.models.CourseKeyField(db_index=True, max_length=255, primary_key=True, serialize=False)),
|
||||
('mapping', jsonfield.fields.JSONField(help_text=b'Key/value store mapping discussion IDs to discussion XBlock usage keys.')),
|
||||
],
|
||||
),
|
||||
]
|
||||
@@ -204,3 +204,24 @@ class CourseDiscussionSettings(models.Model):
|
||||
def divided_discussions(self, value):
|
||||
"""Un-Jsonify the divided_discussions"""
|
||||
self._divided_discussions = json.dumps(value)
|
||||
|
||||
|
||||
class DiscussionsIdMapping(models.Model):
|
||||
"""This model is a performance optimization, updated on course publish."""
|
||||
course_id = CourseKeyField(db_index=True, primary_key=True, max_length=255)
|
||||
mapping = JSONField(
|
||||
help_text="Key/value store mapping discussion IDs to discussion XBlock usage keys.",
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def update_mapping(cls, course_key, discussions_id_map):
|
||||
"""Update the mapping of discussions IDs to XBlock usage key strings."""
|
||||
mapping_entry, created = cls.objects.get_or_create(
|
||||
course_id=course_key,
|
||||
defaults={
|
||||
'mapping': discussions_id_map,
|
||||
},
|
||||
)
|
||||
if not created:
|
||||
mapping_entry.mapping = discussions_id_map
|
||||
mapping_entry.save()
|
||||
|
||||
@@ -139,8 +139,6 @@ def set_course_discussion_settings(course_key, **kwargs):
|
||||
divided_discussions (list): List of discussion ids.
|
||||
division_scheme (str): `CourseDiscussionSettings.NONE`, `CourseDiscussionSettings.COHORT`,
|
||||
or `CourseDiscussionSettings.ENROLLMENT_TRACK`
|
||||
discussions_id_map (dict): Dict containing discussion IDs as keys and the associated discussion
|
||||
XBlock usage keys as values.
|
||||
|
||||
Returns:
|
||||
A CourseDiscussionSettings object.
|
||||
@@ -149,7 +147,6 @@ def set_course_discussion_settings(course_key, **kwargs):
|
||||
'division_scheme': basestring,
|
||||
'always_divide_inline_discussions': bool,
|
||||
'divided_discussions': list,
|
||||
'discussions_id_map': dict,
|
||||
}
|
||||
course_discussion_settings = get_course_discussion_settings(course_key)
|
||||
for field, field_type in fields.items():
|
||||
|
||||
Reference in New Issue
Block a user