Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
da5ab6d
Add SHOW_PROGRESS_SUCCESS_BUTTON feature
FiloSottile Mar 3, 2014
1ce7a24
Make the SHOW_PROGRESS_SUCCESS_BUTTON feature more flexible
FiloSottile Mar 28, 2014
4844a50
Add test in import code to make sure two overlapping courses aren't i…
carsongee Mar 31, 2014
13af6fc
Refactored terminology and added loop break for optimization
carsongee Apr 9, 2014
6136ed2
Switch PDF Textbooks to use portable URLs
carsongee Apr 16, 2014
2231d6c
install and set up paver before using it
fmyzjs Apr 17, 2014
fca915c
install and set up paver before using it
fmyzjs Apr 19, 2014
4db7f33
Added process documentation
singingwolfboy Apr 22, 2014
ac1e566
Refer to process docs in CONTRIBUTING.rst
singingwolfboy Apr 22, 2014
09f8923
Include analytics team in dev process
singingwolfboy Apr 23, 2014
44e4f96
link to docs to rebase a pull request
singingwolfboy Apr 23, 2014
4bc3ec2
Added a visualization of the PR process
singingwolfboy Apr 23, 2014
ab5a2a4
core committers, not contributors
singingwolfboy Apr 24, 2014
99897c4
Add example for how scrum teams spend time reviewing contributor pull…
singingwolfboy Apr 24, 2014
05e5564
remove duplicate "should"
singingwolfboy Apr 24, 2014
f71e78b
add acceptance tests for user profile pagination.
Apr 22, 2014
3c9b79d
Experiment with cell widths to see if images will appear
srpearce Apr 24, 2014
e629e88
Merge pull request #3461 from edx/sylvia/docs/table_images
srpearce Apr 24, 2014
b7c7575
DOC-275, location & Language columns
Apr 23, 2014
6686eb5
Merge pull request #3448 from edx/ahodges/documentation/DOC275
mhoeber Apr 24, 2014
d1d3e6b
Merge pull request #3460 from edx/release
singingwolfboy Apr 24, 2014
4d1d1a7
Wait that all resources are loaded and fragments rendered before init…
Apr 24, 2014
bf56d30
Merge pull request #3458 from edx/jsa/user-profile-pagination-acceptance
Apr 24, 2014
bb4b547
Changes for batch add beta testers feature
Apr 17, 2014
e714409
Add information about per-criterion feedback
srpearce Apr 24, 2014
1e2adc6
Merge pull request #3390 from edx/ahodges/documentation/LMS2476
Apr 24, 2014
015b1c3
Removed evil HEAD line
Apr 24, 2014
6994f25
Merge pull request #3468 from edx/ahodges/documentation/chglogchgs
Apr 24, 2014
a75b6ea
HTML Editor Changes - Raw Editor
mhoeber Apr 24, 2014
dead780
Merge pull request #3454 from edx/markhoeber/documentation/stud-1566
mhoeber Apr 24, 2014
83defda
visual styling adjustments to discussion listing metadata, simplifyin…
marcotuts Mar 4, 2014
49ef8c5
Added code to remove css on closing cheatsheet.
waheedahmed Apr 23, 2014
0f70a99
Add timestamp and wait for 35 sec.
olmar Apr 17, 2014
9fc190d
Merge pull request #3445 from edx/waheed/stud1514-toggle-cheatsheet-n…
waheedahmed Apr 25, 2014
7966ca4
Merge pull request #3384 from edx/oleg/fix-matlab-timeout
olmar Apr 25, 2014
490d2fe
Disable flaky video test
Apr 25, 2014
8fd14bf
Wraps long lines in bulk email messages.
symbolist Apr 24, 2014
7411bc6
Minor change
srpearce Apr 25, 2014
1499f0b
Merge pull request #3465 from edx/sylvia/docs/TIM-463
srpearce Apr 25, 2014
1203001
AN-900: new event types for PDFs
Apr 16, 2014
dfa83a8
Merge pull request #3379 from edx/ahodges/documentation/AN870
mhoeber Apr 25, 2014
76b9ecf
Merge pull request #3472 from edx/zoldak/disable-video-test
Apr 25, 2014
7975693
index org changes
mhoeber Apr 25, 2014
9d3ea69
Merge pull request #3455 from edx/usman/lms1466-email-formatting
symbolist Apr 25, 2014
e3d8510
add index file
mhoeber Apr 25, 2014
901920b
no need for $.when() here..
Apr 25, 2014
faf35d4
Update label information; correct typo; add XML to PWAH
srpearce Apr 25, 2014
f6fc10f
Merge pull request #3463 from aboudreault/xblock-initialization-issue
andy-armstrong Apr 25, 2014
5ef9618
Update change log
srpearce Apr 25, 2014
34b17d4
Merge pull request #3473 from edx/sylvia/docs/DOC-237
srpearce Apr 25, 2014
4f3efa6
Fix note formatting problem in JSInput doc
srpearce Apr 25, 2014
fad631b
Merge pull request #3474 from edx/sylvia/docs/typo_in_jsinput
srpearce Apr 25, 2014
95e4728
bug fix - wrong problem name
mhoeber Apr 25, 2014
a4f4d7b
Merge pull request #3475 from edx/markhoeber/documentation/doc-107
mhoeber Apr 25, 2014
0a022e1
Merge pull request #3371 from carsongee/cg/pdf_textbook_urls
singingwolfboy Apr 25, 2014
dac6270
Fix i18n of video player string
sarina Apr 23, 2014
8385309
Merge pull request #3380 from fmyzjs/patch-4
singingwolfboy Apr 25, 2014
ce0b640
Add third-party auth implementation and tests
johncox-google Apr 24, 2014
c80b596
Fix two error message corner cases
johncox-google Apr 24, 2014
1192b5f
Make dispatch logic clearer
johncox-google Apr 25, 2014
6f064e2
Configure youtube stub for bok-choy
muhammad-ammar Apr 23, 2014
7aa627b
Merge pull request #3145 from carsongee/cg/course_import_validation
singingwolfboy Apr 25, 2014
a15e43f
Merge pull request #2810 from edx/marco/discussions/styling-cleanup
marcotuts Apr 25, 2014
3671b91
Add info about removing prompt
srpearce Apr 25, 2014
cc892d6
Correct copy/paste error in Adaptive Hint section
srpearce Apr 25, 2014
b38a923
Merge pull request #3479 from edx/sylvia/docs/DOC-345
srpearce Apr 25, 2014
0379bd3
Fix acceptance tests
johncox-google Apr 25, 2014
5edae3e
Merge pull request #2780 from FiloSottile/progress_success_button
singingwolfboy Apr 25, 2014
441055d
Update changelog
johncox-google Apr 25, 2014
82bd46d
Merge pull request #3450 from johncox-google/johncox/feature/buttons
nedbat Apr 25, 2014
cb59040
Correct native spelling of Armenian language
sarina Apr 22, 2014
c9f707f
Release for Apr 27, 2014
Apr 27, 2014
3422fcf
Update how translations are pulled
sarina Apr 27, 2014
5118809
Update translations (autogenerated message)
sarina Apr 27, 2014
4800811
Merge pull request #3484 from edx/sarina/042914-language-update
sarina Apr 27, 2014
37cb005
Merge pull request #3483 from edx/ora2/release-2014-04-27T20.17
Apr 28, 2014
dfa45ea
Merge pull request #3440 from edx/ammar/config-youtube-stub-for-bok-choy
muhammad-ammar Apr 28, 2014
73c30e9
Merge pull request #3434 from edx/db/dev-process
singingwolfboy Apr 28, 2014
e4c5eb4
Merge pull request #3478 from edx/sylvia/docs/TIM-476
srpearce Apr 28, 2014
7a51382
Merge pull request #3438 from edx/sarina/fix-video-i18n
sarina Apr 28, 2014
49a5d56
Add a feature be able to do mass password resets.
feanil Apr 10, 2014
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
1 change: 1 addition & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -141,3 +141,4 @@ William Desloge <william.desloge@ionis-group.com>
Marco Re <mrc.re@tiscali.it>
Jonas Jelten <jelten@in.tum.de>
Christine Lytwynec <clytwynec@edx.org>
John Cox <johncox@google.com>
5 changes: 5 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ These are notable changes in edx-platform. This is a rolling list of changes,
in roughly chronological order, most recent first. Add your entries at or near
the top. Include a label indicating the component affected.

Common: Add extensible third-party auth module.

Blades: Handle situation if no response were sent from XQueue to LMS in Matlab
problem after Run Code button press. BLD-994.

Blades: Set initial video quality to large instead of default to avoid automatic switch to HD when iframe resizes. BLD-981.

Blades: Add an upload button for authors to provide students with an option to
Expand Down
6 changes: 4 additions & 2 deletions CONTRIBUTING.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@ Contributing to edx-platform

Contributions to edx-platform are very welcome, and strongly encouraged! The
easiest way is to fork the repo and then make a pull request from your fork.
Read on for details on how to become a contributor, edx-platform code quality,
testing, making a pull request, and more.
Check out our `process documentation`_, or read on for details on how to
become a contributor, edx-platform code quality, testing, making a pull
request, and more.

.. _process documentation: https://github.com/edx/edx-platform/blob/master/docs/en_us/developers/source/process/index.rst

Becoming a Contributor
======================
Expand Down
4 changes: 2 additions & 2 deletions cms/djangoapps/contentstore/features/textbooks.feature
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ Feature: CMS.Textbooks
And I upload the textbook "textbook.pdf"
And I wait for "2" seconds
And I save the textbook
Then I should see a textbook named "Economics" with a chapter path containing "/c4x/MITx/999/asset/textbook.pdf"
Then I should see a textbook named "Economics" with a chapter path containing "/static/textbook.pdf"
And I reload the page
Then I should see a textbook named "Economics" with a chapter path containing "/c4x/MITx/999/asset/textbook.pdf"
Then I should see a textbook named "Economics" with a chapter path containing "/static/textbook.pdf"

Scenario: Create a textbook with multiple chapters
Given I have opened a new course in Studio
Expand Down
2 changes: 0 additions & 2 deletions cms/djangoapps/contentstore/features/video.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,6 @@ def configure_youtube_api(_step, action):
@step('I have created a Video component$')
def i_created_a_video_component(_step):

assert_less(world.youtube.config['youtube_api_response'].status_code, 400, "Real Youtube server is unavailable")

world.create_course_with_unit()
world.create_component_instance(
step=_step,
Expand Down
2 changes: 1 addition & 1 deletion cms/djangoapps/contentstore/management/commands/import.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,5 +53,5 @@ def handle(self, *args, **options):
for module in course_items:
course_id = module.location.course_id
if not are_permissions_roles_seeded(course_id):
self.stdout.write('Seeding forum roles for course {0}'.format(course_id))
self.stdout.write('Seeding forum roles for course {0}\n'.format(course_id))
seed_permissions_roles(course_id)
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

from contentstore.tests.modulestore_config import TEST_MODULESTORE
from django_comment_common.utils import are_permissions_roles_seeded
from xmodule.modulestore.django import modulestore
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase


Expand All @@ -22,6 +23,7 @@ class TestImport(ModuleStoreTestCase):
"""

COURSE_ID = ['EDx', '0.00x', '2013_Spring', ]
DIFF_RUN = ['EDx', '0.00x', '2014_Spring', ]

def setUp(self):
"""
Expand All @@ -41,10 +43,35 @@ def setUp(self):
with open(os.path.join(self.good_dir, "course", "{0[2]}.xml".format(self.COURSE_ID)), "w+") as f:
f.write('<course></course>')

# Create run changed course xml
self.dupe_dir = tempfile.mkdtemp(dir=self.content_dir)
os.makedirs(os.path.join(self.dupe_dir, "course"))
with open(os.path.join(self.dupe_dir, "course.xml"), "w+") as f:
f.write('<course url_name="{0[2]}" org="{0[0]}" '
'course="{0[1]}"/>'.format(self.DIFF_RUN))

with open(os.path.join(self.dupe_dir, "course", "{0[2]}.xml".format(self.DIFF_RUN)), "w+") as f:
f.write('<course></course>')

def test_forum_seed(self):
"""
Tests that forum roles were created with import.
"""
self.assertFalse(are_permissions_roles_seeded('/'.join(self.COURSE_ID)))
call_command('import', self.content_dir, self.good_dir)
self.assertTrue(are_permissions_roles_seeded('/'.join(self.COURSE_ID)))

def test_duplicate_with_url(self):
"""
Check to make sure an import doesn't import courses that have the
same org and course, but they have different runs in order to
prevent modulestore "findone" exceptions on deletion
"""
# Load up base course and verify it is available
call_command('import', self.content_dir, self.good_dir)
store = modulestore()
self.assertIsNotNone(store.get_course('/'.join(self.COURSE_ID)))

# Now load up duped course and verify it doesn't load
call_command('import', self.content_dir, self.dupe_dir)
self.assertIsNone(store.get_course('/'.join(self.DIFF_RUN)))
8 changes: 4 additions & 4 deletions cms/djangoapps/contentstore/tests/test_contentstore.py
Original file line number Diff line number Diff line change
Expand Up @@ -1809,10 +1809,10 @@ def test_import_into_new_course_id(self):
# first check PDF textbooks, to make sure the url paths got updated
course_module = module_store.get_instance(target_course_id, target_location)

self.assertEquals(len(course_module.pdf_textbooks), 1)
self.assertEquals(len(course_module.pdf_textbooks[0]["chapters"]), 2)
self.assertEquals(course_module.pdf_textbooks[0]["chapters"][0]["url"], '/c4x/MITx/999/asset/Chapter1.pdf')
self.assertEquals(course_module.pdf_textbooks[0]["chapters"][1]["url"], '/c4x/MITx/999/asset/Chapter2.pdf')
self.assertEqual(len(course_module.pdf_textbooks), 1)
self.assertEqual(len(course_module.pdf_textbooks[0]["chapters"]), 2)
self.assertEqual(course_module.pdf_textbooks[0]["chapters"][0]["url"], '/static/Chapter1.pdf')
self.assertEqual(course_module.pdf_textbooks[0]["chapters"][1]["url"], '/static/Chapter2.pdf')

def test_import_into_new_course_id_wiki_slug_renamespacing(self):
module_store = modulestore('direct')
Expand Down
6 changes: 6 additions & 0 deletions cms/envs/bok_choy.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,9 @@

# Unfortunately, we need to use debug mode to serve staticfiles
DEBUG = True

# Point the URL used to test YouTube availability to our stub YouTube server
YOUTUBE_PORT = 9080
YOUTUBE['API'] = "127.0.0.1:{0}/get_youtube_api/".format(YOUTUBE_PORT)
YOUTUBE['TEST_URL'] = "127.0.0.1:{0}/test_youtube/".format(YOUTUBE_PORT)
YOUTUBE['TEXT_API']['url'] = "127.0.0.1:{0}/test_transcripts_youtube/".format(YOUTUBE_PORT)
2 changes: 1 addition & 1 deletion cms/static/js/views/edit_chapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ define(["js/views/baseview", "underscore", "underscore.string", "jquery", "gette
if(!that.model.get('name')) {
options.name = response.asset.displayname;
}
options.asset_path = response.asset.url;
options.asset_path = response.asset.portable_url;
that.model.set(options);
}
});
Expand Down
6 changes: 6 additions & 0 deletions cms/static/js/views/modals/edit_xblock.js
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,12 @@ define(["jquery", "underscore", "gettext", "js/views/modals/base_modal",
var parent = $(event.target.parentElement),
mode = parent.data('mode');
event.preventDefault();
var $cheatsheet = $('.simple-editor-cheatsheet');
if ($cheatsheet.hasClass("shown")) {
$(".CodeMirror").removeAttr("style");
$(".modal-content").removeAttr("style");
$cheatsheet.removeClass('shown');
}
this.selectMode(mode);
},

Expand Down
25 changes: 15 additions & 10 deletions cms/static/js/views/xblock.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,18 +25,23 @@ define(["jquery", "underscore", "js/views/baseview", "xblock/runtime.v1"],
},

handleXBlockFragment: function(fragment, options) {
var wrapper = this.$el,
var self = this,
wrapper = this.$el,
xblockElement,
success = options ? options.success : null,
xblock;
this.renderXBlockFragment(fragment, wrapper);
xblockElement = this.$('.xblock').first();
xblock = XBlock.initializeBlock(xblockElement);
this.xblock = xblock;
this.xblockReady(xblock);
if (success) {
success(xblock);
}
xblock,
fragmentsRendered;

fragmentsRendered = this.renderXBlockFragment(fragment, wrapper);
fragmentsRendered.done(function() {
xblockElement = self.$('.xblock').first();
xblock = XBlock.initializeBlock(xblockElement);
self.xblock = xblock;
self.xblockReady(xblock);
if (success) {
success(xblock);
}
});
},

/**
Expand Down
19 changes: 18 additions & 1 deletion common/djangoapps/student/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

from django.conf import settings
from django.utils import timezone
from django.utils.dateparse import parse_datetime
from django.contrib.auth.models import User
from django.contrib.auth.hashers import make_password
from django.contrib.auth.signals import user_logged_in, user_logged_out
Expand Down Expand Up @@ -392,6 +393,16 @@ def is_student_forced_password_reset_enabled(cls):
'MIN_DAYS_FOR_STUDENT_ACCOUNTS_PASSWORD_RESETS', None
)

@classmethod
def is_password_reset_time_defined(cls):
"""
Returns whether on not a time is defined for how old a password can be.
"""
return settings.FEATURES['ADVANCED_SECURITY'] and \
settings.ADVANCED_SECURITY_CONFIG.get(
'OLDEST_VALID_PASSWORD_TIME', None
)

@classmethod
def should_user_reset_password_now(cls, user):
"""
Expand All @@ -410,7 +421,7 @@ def should_user_reset_password_now(cls, user):
days_before_password_reset = \
settings.ADVANCED_SECURITY_CONFIG['MIN_DAYS_FOR_STUDENT_ACCOUNTS_PASSWORD_RESETS']

if days_before_password_reset:
if days_before_password_reset or cls.is_password_reset_time_defined():
history = PasswordHistory.objects.filter(user=user).order_by('-time_set')
time_last_reset = None

Expand All @@ -423,6 +434,12 @@ def should_user_reset_password_now(cls, user):

now = timezone.now()

if cls.is_password_reset_time_defined():
naive_time = parse_datetime(settings.ADVANCED_SECURITY_CONFIG['OLDEST_VALID_PASSWORD_TIME'])
oldest_valid = timezone.get_current_timezone().localize(naive_time)
delta = time_last_reset - oldest_valid
return delta.days < 0

delta = now - time_last_reset

return delta.days >= days_before_password_reset
Expand Down
Loading