Commit 5b3324b2 by Anjali Pal Committed by GitHub

Merge pull request #546 from edx/ajpal/bundle

Bundle the app
parents 0b370722 5d2997ce
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
{% load dashboard_extras %} {% load dashboard_extras %}
{% load i18n %} {% load i18n %}
{% load staticfiles %}
{% load rjs %} {% load rjs %}
{% comment %} {% comment %}
...@@ -16,40 +17,15 @@ View of individual learners within a course. ...@@ -16,40 +17,15 @@ View of individual learners within a course.
<link rel="stylesheet" href="/static/bower_components/nprogress/nprogress.css" type="text/css"> <link rel="stylesheet" href="/static/bower_components/nprogress/nprogress.css" type="text/css">
{% endblock stylesheets %} {% endblock stylesheets %}
{% block uncompressed_javascript %} {% block javascript %}
{{ block.super }} {{ block.super }}
{% if not show_error %} <script src="{% static_rjs 'apps/learners/app/learners-main.js' %}"></script>
<script> {% endblock javascript %}
require(['jquery', 'load/init-page', 'learners/app/app'], function ($, page, LearnersApp) {
var app = new LearnersApp({
courseId: '{{ course_id }}',
containerSelector: '.learners-app-container',
learnerListJson: {{ learner_list_json | escape_json }},
learnerListUrl: '{{ learner_list_url }}',
courseLearnerMetadataJson: {{ course_learner_metadata_json | escape_json }},
courseLearnerMetadataUrl: '{{ course_learner_metadata_url }}',
learnerEngagementTimelineUrl: '{{ learner_engagement_timeline_url }}'
});
$(function () {
app.start();
});
});
</script>
{% endif %}
{% endblock uncompressed_javascript %}
{% block child_content %} {% block child_content %}
<section class="view-section"> <section class="view-section">
{% if show_error %}
<div class="section-heading bordered">
<h4 class="section-title">{% trans "Learners" %}</h4>
</div>
{% show_table_error %}
{% else %}
<div class="learners-app-container container-fluid"> <div class="learners-app-container container-fluid">
{% include "loading.html" %} {% include "loading.html" %}
</div> </div>
{% endif %}
</section> </section>
{% endblock %} {% endblock %}
...@@ -41,7 +41,7 @@ class LearnersViewTests(ViewTestMixin, TestCase): ...@@ -41,7 +41,7 @@ class LearnersViewTests(ViewTestMixin, TestCase):
self.addCleanup(httpretty.reset) self.addCleanup(httpretty.reset)
def _get(self): def _get(self):
return self.client.get(self.path(course_id=DEMO_COURSE_ID), follow=True) return self.client.get(self.path(course_id=DEMO_COURSE_ID))
def _assert_context(self, response, expected_context_subset): def _assert_context(self, response, expected_context_subset):
default_expected_context_subset = { default_expected_context_subset = {
...@@ -50,9 +50,10 @@ class LearnersViewTests(ViewTestMixin, TestCase): ...@@ -50,9 +50,10 @@ class LearnersViewTests(ViewTestMixin, TestCase):
course_id=DEMO_COURSE_ID course_id=DEMO_COURSE_ID
), ),
} }
self.assertDictContainsSubset(dict(expected_context_subset.items()), response.context)
self.assertDictContainsSubset( self.assertDictContainsSubset(
dict(default_expected_context_subset.items() + expected_context_subset.items()), dict(default_expected_context_subset.items()),
response.context response.context['js_data']['course']
) )
def get_mock_data(self, *args, **kwargs): def get_mock_data(self, *args, **kwargs):
...@@ -65,8 +66,7 @@ class LearnersViewTests(ViewTestMixin, TestCase): ...@@ -65,8 +66,7 @@ class LearnersViewTests(ViewTestMixin, TestCase):
response = self._get() response = self._get()
self._assert_context(response, { self._assert_context(response, {
'learner_list_json': learners_payload, 'learner_list_json': learners_payload,
'course_learner_metadata_json': course_metadata_payload, 'course_learner_metadata_json': course_metadata_payload
'show_error': False
}) })
self.assertNotContains(response, self.TABLE_ERROR_TEXT) self.assertNotContains(response, self.TABLE_ERROR_TEXT)
...@@ -86,11 +86,9 @@ class LearnersViewTests(ViewTestMixin, TestCase): ...@@ -86,11 +86,9 @@ class LearnersViewTests(ViewTestMixin, TestCase):
with LogCapture(level=logging.ERROR) as lc: with LogCapture(level=logging.ERROR) as lc:
response = self._get() response = self._get()
self._assert_context(response, { self._assert_context(response, {
'learner_list_json': {}, 'learner_list_json': 'Failed to reach the Learner List endpoint',
'course_learner_metadata_json': {}, 'course_learner_metadata_json': 'Failed to reach the Course Learner Metadata endpoint'
'show_error': True,
}) })
self.assertContains(response, self.TABLE_ERROR_TEXT, 1)
lc.check( lc.check(
('courses.views.learners', 'ERROR', 'Failed to reach the Learner List endpoint'), ('courses.views.learners', 'ERROR', 'Failed to reach the Learner List endpoint'),
('courses.views.learners', 'ERROR', 'Failed to reach the Course Learner Metadata endpoint') ('courses.views.learners', 'ERROR', 'Failed to reach the Course Learner Metadata endpoint')
......
...@@ -19,8 +19,7 @@ class LearnersView(CourseTemplateWithNavView): ...@@ -19,8 +19,7 @@ class LearnersView(CourseTemplateWithNavView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(LearnersView, self).get_context_data(**kwargs) context = super(LearnersView, self).get_context_data(**kwargs)
context.update({ context['js_data']['course'].update({
'page_data': self.get_page_data(context),
'learner_list_url': reverse('learner_analytics_api:v0:LearnerList'), 'learner_list_url': reverse('learner_analytics_api:v0:LearnerList'),
'course_learner_metadata_url': reverse( 'course_learner_metadata_url': reverse(
'learner_analytics_api:v0:CourseMetadata', 'learner_analytics_api:v0:CourseMetadata',
...@@ -54,9 +53,11 @@ class LearnersView(CourseTemplateWithNavView): ...@@ -54,9 +53,11 @@ class LearnersView(CourseTemplateWithNavView):
except (Timeout, ConnectionError, ValueError): except (Timeout, ConnectionError, ValueError):
# ValueError may be thrown by the call to .json() # ValueError may be thrown by the call to .json()
logger.exception(error_message) logger.exception(error_message)
context[data_name] = {} context[data_name] = error_message
context['js_data']['course'].update({
data_name: context[data_name]
})
# Only show roster if data is avilable for it; otherwise, an error will be displayed. context['page_data'] = self.get_page_data(context)
context['show_error'] = False if context['learner_list_json'] else True
return context return context
...@@ -5,6 +5,7 @@ define(function(require) { ...@@ -5,6 +5,7 @@ define(function(require) {
Backbone = require('backbone'), Backbone = require('backbone'),
Marionette = require('marionette'), Marionette = require('marionette'),
NProgress = require('nprogress'), NProgress = require('nprogress'),
_ = require('underscore'),
initModels = require('load/init-page'), initModels = require('load/init-page'),
...@@ -73,6 +74,7 @@ define(function(require) { ...@@ -73,6 +74,7 @@ define(function(require) {
courseId: this.options.courseId, courseId: this.options.courseId,
learnerCollection: learnerCollection, learnerCollection: learnerCollection,
courseMetadata: courseMetadata, courseMetadata: courseMetadata,
hasData: _.isObject(this.options.learnerListJson),
pageModel: pageModel, pageModel: pageModel,
rootView: rootView, rootView: rootView,
learnerEngagementTimelineUrl: this.options.learnerEngagementTimelineUrl, learnerEngagementTimelineUrl: this.options.learnerEngagementTimelineUrl,
......
...@@ -56,6 +56,7 @@ define(function(require) { ...@@ -56,6 +56,7 @@ define(function(require) {
var rosterView = new LearnerRosterView({ var rosterView = new LearnerRosterView({
collection: this.options.learnerCollection, collection: this.options.learnerCollection,
courseMetadata: this.options.courseMetadata, courseMetadata: this.options.courseMetadata,
hasData: this.options.hasData,
trackingModel: this.options.trackingModel trackingModel: this.options.trackingModel
}), }),
loadingView = new LoadingView({ loadingView = new LoadingView({
......
require(['vendor/domReady!', 'jquery', 'load/init-page', 'apps/learners/app/app'], function(doc, $, page, LearnersApp) {
'use strict';
var modelData = page.models.courseModel,
app = new LearnersApp({
courseId: modelData.get('courseId'),
containerSelector: '.learners-app-container',
learnerListJson: modelData.get('learner_list_json'),
learnerListUrl: modelData.get('learner_list_url'),
courseLearnerMetadataJson: modelData.get('course_learner_metadata_json'),
courseLearnerMetadataUrl: modelData.get('course_learner_metadata_url'),
learnerEngagementTimelineUrl: modelData.get('learner_engagement_timeline_url')
});
app.start();
});
...@@ -26,7 +26,7 @@ define(function(require) { ...@@ -26,7 +26,7 @@ define(function(require) {
this.onLearnerCollectionUpdated(this.options.collection); this.onLearnerCollectionUpdated(this.options.collection);
}, },
onLearnerCollectionUpdated: function(collection) { onLearnerCollectionUpdated: function(collection) {
if (collection.length) { if (collection.length && this.options.hasData) {
// Don't re-render the learner table view if one already exists. // Don't re-render the learner table view if one already exists.
if (!(this.getRegion('main').currentView instanceof LearnerTableView)) { if (!(this.getRegion('main').currentView instanceof LearnerTableView)) {
this.showChildView('main', new LearnerTableView({ this.showChildView('main', new LearnerTableView({
......
...@@ -70,6 +70,7 @@ define(function(require) { ...@@ -70,6 +70,7 @@ define(function(require) {
this.showChildView('results', new LearnerResultsView({ this.showChildView('results', new LearnerResultsView({
collection: this.options.collection, collection: this.options.collection,
courseMetadata: this.options.courseMetadata, courseMetadata: this.options.courseMetadata,
hasData: this.options.hasData,
trackingModel: this.options.trackingModel trackingModel: this.options.trackingModel
})); }));
}, },
......
...@@ -63,6 +63,7 @@ define(function(require) { ...@@ -63,6 +63,7 @@ define(function(require) {
courseMetadata: defaultOptions.courseMetadataModel || courseMetadata: defaultOptions.courseMetadataModel ||
new CourseMetadataModel(defaultOptions.courseMetadata, {parse: true}), new CourseMetadataModel(defaultOptions.courseMetadata, {parse: true}),
el: '.' + fixtureClass, el: '.' + fixtureClass,
hasData: true,
trackingModel: new TrackingModel() trackingModel: new TrackingModel()
}).render(); }).render();
rosterView.onBeforeShow(); rosterView.onBeforeShow();
......
...@@ -69,7 +69,7 @@ ...@@ -69,7 +69,7 @@
exclude: ['js/common'] exclude: ['js/common']
}, },
{ {
name: 'apps/learners/app/app', name: 'apps/learners/app/learners-main',
exclude: ['js/common'] exclude: ['js/common']
}, },
{ {
......
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