Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ XModule: Don't delete generated xmodule asset files when compiling (for
instance, when XModule provides a coffeescript file, don't delete
the associated javascript)

Studio: For courses running on edx.org (marketing site), disable fields in
Course Settings that do not apply.

Common: Make asset watchers run as singletons (so they won't start if the
watcher is already running in another shell).

Expand Down
65 changes: 62 additions & 3 deletions cms/djangoapps/contentstore/tests/test_course_settings.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
"""
Tests for Studio Course Settings.
"""
import datetime
import json
import copy
import mock

from django.contrib.auth.models import User
from django.test.client import Client
from django.core.urlresolvers import reverse
from django.utils.timezone import UTC
from django.test.utils import override_settings

from xmodule.modulestore import Location
from models.settings.course_details import (CourseDetails, CourseSettingsEncoder)
Expand All @@ -21,6 +26,9 @@


class CourseTestCase(ModuleStoreTestCase):
"""
Base class for test classes below.
"""
def setUp(self):
"""
These tests need a user in the DB so that the django Test Client
Expand Down Expand Up @@ -51,6 +59,9 @@ def setUp(self):


class CourseDetailsTestCase(CourseTestCase):
"""
Tests the first course settings page (course dates, overview, etc.).
"""
def test_virgin_fetch(self):
details = CourseDetails.fetch(self.course_location)
self.assertEqual(details.course_location, self.course_location, "Location not copied into")
Expand Down Expand Up @@ -81,9 +92,9 @@ def test_ooc_encoder(self):
Test the encoder out of its original constrained purpose to see if it functions for general use
"""
details = {'location': Location(['tag', 'org', 'course', 'category', 'name']),
'number': 1,
'string': 'string',
'datetime': datetime.datetime.now(UTC())}
'number': 1,
'string': 'string',
'datetime': datetime.datetime.now(UTC())}
jsondetails = json.dumps(details, cls=CourseSettingsEncoder)
jsondetails = json.loads(jsondetails)

Expand Down Expand Up @@ -118,8 +129,50 @@ def test_update_and_fetch(self):
jsondetails.effort, "After set effort"
)

@override_settings(MKTG_URLS={'ROOT': 'dummy-root'})
def test_marketing_site_fetch(self):
settings_details_url = reverse('settings_details',
kwargs={'org': self.course_location.org, 'name': self.course_location.name,
'course': self.course_location.course})

with mock.patch.dict('django.conf.settings.MITX_FEATURES', {'ENABLE_MKTG_SITE': True}):
response = self.client.get(settings_details_url)
self.assertContains(response, "Course Summary Page")
self.assertContains(response, "course summary page will not be viewable")

self.assertContains(response, "Course Start Date")
self.assertContains(response, "Course End Date")
self.assertNotContains(response, "Enrollment Start Date")
self.assertNotContains(response, "Enrollment End Date")
self.assertContains(response, "not the dates shown on your course summary page")

self.assertNotContains(response, "Introducing Your Course")
self.assertNotContains(response, "Requirements")

def test_regular_site_fetch(self):
settings_details_url = reverse('settings_details',
kwargs={'org': self.course_location.org, 'name': self.course_location.name,
'course': self.course_location.course})

with mock.patch.dict('django.conf.settings.MITX_FEATURES', {'ENABLE_MKTG_SITE': False}):
response = self.client.get(settings_details_url)
self.assertContains(response, "Course Summary Page")
self.assertNotContains(response, "course summary page will not be viewable")

self.assertContains(response, "Course Start Date")
self.assertContains(response, "Course End Date")
self.assertContains(response, "Enrollment Start Date")
self.assertContains(response, "Enrollment End Date")
self.assertNotContains(response, "not the dates shown on your course summary page")

self.assertContains(response, "Introducing Your Course")
self.assertContains(response, "Requirements")


class CourseDetailsViewTest(CourseTestCase):
"""
Tests for modifying content on the first course settings page (course dates, overview, etc.).
"""
def alter_field(self, url, details, field, val):
setattr(details, field, val)
# Need to partially serialize payload b/c the mock doesn't handle it correctly
Expand Down Expand Up @@ -181,6 +234,9 @@ def compare_date_fields(self, details, encoded, context, field):


class CourseGradingTest(CourseTestCase):
"""
Tests for the course settings grading page.
"""
def test_initial_grader(self):
descriptor = get_modulestore(self.course_location).get_item(self.course_location)
test_grader = CourseGradingModel(descriptor)
Expand Down Expand Up @@ -256,6 +312,9 @@ def test_update_grader_from_json(self):


class CourseMetadataEditingTest(CourseTestCase):
"""
Tests for CourseMetadata.
"""
def setUp(self):
CourseTestCase.setUp(self)
# add in the full class too
Expand Down
3 changes: 2 additions & 1 deletion cms/djangoapps/contentstore/views/course.py
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,8 @@ def get_course_settings(request, org, course, name):
kwargs={"org": org,
"course": course,
"name": name,
"section": "details"})
"section": "details"}),
'about_page_editable': not settings.MITX_FEATURES.get('ENABLE_MKTG_SITE', False)
})


Expand Down
38 changes: 38 additions & 0 deletions cms/static/sass/elements/_system-help.scss
Original file line number Diff line number Diff line change
@@ -1,2 +1,40 @@
// studio - elements - system help
// ====================

// notices - in-context: to be used as notices to users within the context of a form/action
.notice-incontext {
@extend .ui-well;
@include border-radius(($baseline/10));

.title {
@extend .t-title7;
margin-bottom: ($baseline/4);
font-weight: 600;
}

.copy {
@extend .t-copy-sub1;
@include transition(opacity 0.25s ease-in-out 0);
opacity: 0.75;
}

strong {
font-weight: 600;
}

&:hover {

.copy {
opacity: 1.0;
}
}
}

// particular warnings around a workflow for something
.notice-workflow {
background: $yellow-l5;

.copy {
color: $gray-d1;
}
}
8 changes: 7 additions & 1 deletion cms/static/sass/views/_settings.scss
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ body.course.settings {
font-size: 14px;
}

.message-status {
.message-status {
display: none;
@include border-top-radius(2px);
@include box-sizing(border-box);
Expand Down Expand Up @@ -52,6 +52,12 @@ body.course.settings {
}
}

// notices - used currently for edx mktg
.notice-workflow {
margin-top: ($baseline);
}


// in form - elements
.group-settings {
margin: 0 0 ($baseline*2) 0;
Expand Down
Loading