diff --git a/cms/djangoapps/contentstore/management/commands/check_course.py b/cms/djangoapps/contentstore/management/commands/check_course.py new file mode 100644 index 0000000000..57965fe793 --- /dev/null +++ b/cms/djangoapps/contentstore/management/commands/check_course.py @@ -0,0 +1,68 @@ +from django.core.management.base import BaseCommand, CommandError +from xmodule.modulestore.django import modulestore +from xmodule.modulestore.xml_importer import check_module_metadata_editability +from xmodule.course_module import CourseDescriptor + +from request_cache.middleware import RequestCache + + +class Command(BaseCommand): + help = '''Enumerates through the course and find common errors''' + + def handle(self, *args, **options): + if len(args) != 1: + raise CommandError("check_course requires one argument: ") + + loc_str = args[0] + + loc = CourseDescriptor.id_to_location(loc_str) + store = modulestore() + + # setup a request cache so we don't throttle the DB with all the metadata inheritance requests + store.request_cache = RequestCache.get_request_cache() + + course = store.get_item(loc, depth=3) + + err_cnt = 0 + + def _xlint_metadata(module): + err_cnt = check_module_metadata_editability(module) + for child in module.get_children(): + err_cnt = err_cnt + _xlint_metadata(child) + return err_cnt + + err_cnt = err_cnt + _xlint_metadata(course) + + # we've had a bug where the xml_attributes field can we rewritten as a string rather than a dict + def _check_xml_attributes_field(module): + err_cnt = 0 + if hasattr(module, 'xml_attributes') and isinstance(module.xml_attributes, basestring): + print 'module = {0} has xml_attributes as a string. It should be a dict'.format(module.location.url()) + err_cnt = err_cnt + 1 + for child in module.get_children(): + err_cnt = err_cnt + _check_xml_attributes_field(child) + return err_cnt + + err_cnt = err_cnt + _check_xml_attributes_field(course) + + # check for dangling discussion items, this can cause errors in the forums + def _get_discussion_items(module): + discussion_items = [] + if module.location.category == 'discussion': + discussion_items = discussion_items + [module.location.url()] + + for child in module.get_children(): + discussion_items = discussion_items + _get_discussion_items(child) + + return discussion_items + + discussion_items = _get_discussion_items(course) + + # now query all discussion items via get_items() and compare with the tree-traversal + queried_discussion_items = store.get_items(['i4x', course.location.org, course.location.course, + 'discussion', None, None]) + + for item in queried_discussion_items: + if item.location.url() not in discussion_items: + print 'Found dangling discussion module = {0}'.format(item.location.url()) + diff --git a/cms/envs/aws.py b/cms/envs/aws.py index be7816d21f..edf67badfe 100644 --- a/cms/envs/aws.py +++ b/cms/envs/aws.py @@ -46,6 +46,9 @@ SESSION_COOKIE_DOMAIN = ENV_TOKENS.get('SESSION_COOKIE_DOMAIN') for feature, value in ENV_TOKENS.get('MITX_FEATURES', {}).items(): MITX_FEATURES[feature] = value +# load segment.io key, provide a dummy if it does not exist +SEGMENT_IO_KEY = ENV_TOKENS.get('SEGMENT_IO_KEY', '***REMOVED***') + LOGGING = get_logger_config(LOG_DIR, logging_env=ENV_TOKENS['LOGGING_ENV'], syslog_addr=(ENV_TOKENS['SYSLOG_SERVER'], 514), diff --git a/cms/envs/common.py b/cms/envs/common.py index 5ad9068636..37cfeea7a1 100644 --- a/cms/envs/common.py +++ b/cms/envs/common.py @@ -34,7 +34,9 @@ MITX_FEATURES = { 'ENABLE_DISCUSSION_SERVICE': False, 'AUTH_USE_MIT_CERTIFICATES': False, 'STUB_VIDEO_FOR_TESTING': False, # do not display video when running automated acceptance tests + 'STAFF_EMAIL': '', # email address for staff (eg to request course creation) 'STUDIO_NPS_SURVEY': True, + 'SEGMENT_IO': True, } ENABLE_JASMINE = False diff --git a/cms/envs/dev.py b/cms/envs/dev.py index ae78b93f06..dbf9c5574c 100644 --- a/cms/envs/dev.py +++ b/cms/envs/dev.py @@ -150,3 +150,6 @@ DEBUG_TOOLBAR_MONGO_STACKTRACES = True # disable NPS survey in dev mode MITX_FEATURES['STUDIO_NPS_SURVEY'] = False + +# segment-io key for dev +SEGMENT_IO_KEY = 'mty8edrrsg' diff --git a/cms/envs/test.py b/cms/envs/test.py index 59664bfd40..820b2cbe23 100644 --- a/cms/envs/test.py +++ b/cms/envs/test.py @@ -118,3 +118,6 @@ PASSWORD_HASHERS = ( 'django.contrib.auth.hashers.SHA1PasswordHasher', 'django.contrib.auth.hashers.MD5PasswordHasher', ) + +# dummy segment-io key +SEGMENT_IO_KEY = '***REMOVED***' diff --git a/cms/static/coffee/src/views/module_edit.coffee b/cms/static/coffee/src/views/module_edit.coffee index 9f7e3a5e60..3cb3b1703f 100644 --- a/cms/static/coffee/src/views/module_edit.coffee +++ b/cms/static/coffee/src/views/module_edit.coffee @@ -15,7 +15,7 @@ class CMS.Views.ModuleEdit extends Backbone.View $component_editor: => @$el.find('.component-editor') loadDisplay: -> - XModule.loadModule(@$el.find('.xmodule_display')) + XModule.loadModule(@$el.find('.xmodule_display')) loadEdit: -> if not @module @@ -55,6 +55,11 @@ class CMS.Views.ModuleEdit extends Backbone.View clickSaveButton: (event) => event.preventDefault() data = @module.save() + + analytics.track "Saved Module", + course: course_location_analytics + id: _this.model.id + data.metadata = _.extend(data.metadata || {}, @metadata()) @hideModal() @model.save(data).done( => diff --git a/cms/static/coffee/src/views/tabs.coffee b/cms/static/coffee/src/views/tabs.coffee index 9fbe4e5789..1034fc988e 100644 --- a/cms/static/coffee/src/views/tabs.coffee +++ b/cms/static/coffee/src/views/tabs.coffee @@ -28,6 +28,10 @@ class CMS.Views.TabsEdit extends Backbone.View @$('.component').each((idx, element) => tabs.push($(element).data('id')) ) + + analytics.track "Reordered Static Pages", + course: course_location_analytics + $.ajax({ type:'POST', url: '/reorder_static_tabs', @@ -56,10 +60,18 @@ class CMS.Views.TabsEdit extends Backbone.View 'i4x://edx/templates/static_tab/Empty' ) + analytics.track "Added Static Page", + course: course_location_analytics + deleteTab: (event) => if not confirm 'Are you sure you want to delete this component? This action cannot be undone.' return $component = $(event.currentTarget).parents('.component') + + analytics.track "Deleted Static Page", + course: course_location_analytics + id: $component.data('id') + $.post('/delete_item', { id: $component.data('id') }, => diff --git a/cms/static/coffee/src/views/unit.coffee b/cms/static/coffee/src/views/unit.coffee index 42127b2800..e23477ccfa 100644 --- a/cms/static/coffee/src/views/unit.coffee +++ b/cms/static/coffee/src/views/unit.coffee @@ -35,6 +35,10 @@ class CMS.Views.UnitEdit extends Backbone.View @$('.components').sortable( handle: '.drag-handle' update: (event, ui) => + analytics.track "Reordered Components", + course: course_location_analytics + id: unit_location_analytics + payload = children : @components() options = success : => @model.unset('children') @model.save(payload, options) @@ -89,6 +93,11 @@ class CMS.Views.UnitEdit extends Backbone.View $(event.currentTarget).data('location') ) + analytics.track "Added a Component", + course: course_location_analytics + unit_id: unit_location_analytics + type: $(event.currentTarget).data('location') + @closeNewComponent(event) components: => @$('.component').map((idx, el) -> $(el).data('id')).get() @@ -111,6 +120,11 @@ class CMS.Views.UnitEdit extends Backbone.View $.post('/delete_item', { id: $component.data('id') }, => + analytics.track "Deleted a Component", + course: course_location_analytics + unit_id: unit_location_analytics + id: $component.data('id') + $component.remove() # b/c we don't vigilantly keep children up to date # get rid of it before it hurts someone @@ -129,6 +143,10 @@ class CMS.Views.UnitEdit extends Backbone.View id: @$el.data('id') delete_children: true }, => + analytics.track "Deleted Draft", + course: course_location_analytics + unit_id: unit_location_analytics + window.location.reload() ) @@ -138,6 +156,10 @@ class CMS.Views.UnitEdit extends Backbone.View $.post('/create_draft', { id: @$el.data('id') }, => + analytics.track "Created Draft", + course: course_location_analytics + unit_id: unit_location_analytics + @model.set('state', 'draft') ) @@ -148,20 +170,31 @@ class CMS.Views.UnitEdit extends Backbone.View $.post('/publish_draft', { id: @$el.data('id') }, => + analytics.track "Published Draft", + course: course_location_analytics + unit_id: unit_location_analytics + @model.set('state', 'public') ) setVisibility: (event) -> if @$('.visibility-select').val() == 'private' target_url = '/unpublish_unit' + visibility = "private" else target_url = '/publish_draft' + visibility = "public" @wait(true) $.post(target_url, { id: @$el.data('id') }, => + analytics.track "Set Unit Visibility", + course: course_location_analytics + unit_id: unit_location_analytics + visibility: visibility + @model.set('state', @$('.visibility-select').val()) ) @@ -193,6 +226,11 @@ class CMS.Views.UnitEdit.NameEdit extends Backbone.View @model.save(metadata: metadata) # Update name shown in the right-hand side location summary. $('.unit-location .editing .unit-name').html(metadata.display_name) + analytics.track "Edited Unit Name", + course: course_location_analytics + unit_id: unit_location_analytics + display_name: metadata.display_name + class CMS.Views.UnitEdit.LocationState extends Backbone.View initialize: => diff --git a/cms/static/js/base.js b/cms/static/js/base.js index 6ea918cc36..7b930a176b 100644 --- a/cms/static/js/base.js +++ b/cms/static/js/base.js @@ -331,6 +331,12 @@ function createNewUnit(e) { var parent = $(this).data('parent'); var template = $(this).data('template'); + analytics.track('Created a Unit', { + 'course': course_location_analytics, + 'parent_location': parent + }); + + $.post('/clone_item', {'parent_location': parent, 'template': template, @@ -363,6 +369,12 @@ function _deleteItem($el) { var id = $el.data('id'); + analytics.track('Deleted an Item', { + 'course': course_location_analytics, + 'id': id + }); + + $.post('/delete_item', {'id': id, 'delete_children': true, 'delete_all_versions': true}, function (data) { @@ -426,6 +438,11 @@ function displayFinishedUpload(xhr) { var html = Mustache.to_html(template, resp); $('table > tbody').prepend(html); + analytics.track('Uploaded a File', { + 'course': course_location_analytics, + 'asset_url': resp.url + }); + } function markAsLoaded() { @@ -555,6 +572,11 @@ function saveNewSection(e) { var template = $saveButton.data('template'); var display_name = $(this).find('.new-section-name').val(); + analytics.track('Created a Section', { + 'course': course_location_analytics, + 'display_name': display_name + }); + $.post('/clone_item', { 'parent_location': parent, 'template': template, @@ -600,6 +622,12 @@ function saveNewCourse(e) { return; } + analytics.track('Created a Course', { + 'org': org, + 'number': number, + 'display_name': display_name + }); + $.post('/create_new_course', { 'template': template, 'org': org, @@ -646,9 +674,14 @@ function saveNewSubsection(e) { var parent = $(this).find('.new-subsection-name-save').data('parent'); var template = $(this).find('.new-subsection-name-save').data('template'); - var display_name = $(this).find('.new-subsection-name-input').val(); + analytics.track('Created a Subsection', { + 'course': course_location_analytics, + 'display_name': display_name + }); + + $.post('/clone_item', { 'parent_location': parent, 'template': template, @@ -702,6 +735,13 @@ function saveEditSectionName(e) { return; } + analytics.track('Edited Section Name', { + 'course': course_location_analytics, + 'display_name': display_name, + 'id': id + }); + + var $_this = $(this); // call into server to commit the new order $.ajax({ @@ -741,6 +781,12 @@ function saveSetSectionScheduleDate(e) { var id = $modal.attr('data-id'); + analytics.track('Edited Section Release Date', { + 'course': course_location_analytics, + 'id': id, + 'start': start + }); + // call into server to commit the new order $.ajax({ url: "/save_item", diff --git a/cms/static/js/views/checklists_view.js b/cms/static/js/views/checklists_view.js index e553c7a2ca..85c0f5242b 100644 --- a/cms/static/js/views/checklists_view.js +++ b/cms/static/js/views/checklists_view.js @@ -77,11 +77,18 @@ CMS.Views.Checklists = Backbone.View.extend({ var task_index = $checkbox.data('task'); var model = this.collection.at(checklist_index); model.attributes.items[task_index].is_checked = $task.hasClass(completed); + model.save({}, { success : function() { var updatedTemplate = self.renderTemplate(model, checklist_index); self.$el.find('#course-checklist'+checklist_index).first().replaceWith(updatedTemplate); + + analytics.track('Toggled a Checklist Task', { + 'course': course_location_analytics, + 'task': model.attributes.items[task_index].short_description, + 'state': model.attributes.items[task_index].is_checked + }); }, error : CMS.ServerError }); diff --git a/cms/static/js/views/course_info_edit.js b/cms/static/js/views/course_info_edit.js index ce959fd443..a6d42e1927 100644 --- a/cms/static/js/views/course_info_edit.js +++ b/cms/static/js/views/course_info_edit.js @@ -107,6 +107,11 @@ CMS.Views.ClassInfoUpdateView = Backbone.View.extend({ // push change to display, hide the editor, submit the change targetModel.save({}, {error : CMS.ServerError}); this.closeEditor(this); + + analytics.track('Saved Course Update', { + 'course': course_location_analytics, + 'date': this.dateEntry(event).val() + }); }, onCancel: function(event) { @@ -147,6 +152,11 @@ CMS.Views.ClassInfoUpdateView = Backbone.View.extend({ return; } + analytics.track('Deleted Course Update', { + 'course': course_location_analytics, + 'date': this.dateEntry(event).val() + }); + var targetModel = this.eventModel(event); this.modelDom(event).remove(); var cacheThis = this; @@ -284,6 +294,11 @@ CMS.Views.ClassInfoHandoutsView = Backbone.View.extend({ this.model.save({}, {error: CMS.ServerError}); this.$form.hide(); this.closeEditor(this); + + analytics.track('Saved Course Handouts', { + 'course': course_location_analytics + }); + }, onCancel: function(event) { diff --git a/cms/static/js/views/settings/advanced_view.js b/cms/static/js/views/settings/advanced_view.js index e3ff098efb..52c5ed78d0 100644 --- a/cms/static/js/views/settings/advanced_view.js +++ b/cms/static/js/views/settings/advanced_view.js @@ -137,6 +137,10 @@ CMS.Views.Settings.Advanced = CMS.Views.ValidatingView.extend({ success : function() { self.render(); self.showMessage(self.successful_changes); + analytics.track('Saved Advanced Settings', { + 'course': course_location_analytics + }); + }, error : CMS.ServerError }); diff --git a/cms/static/sass/base-style.scss b/cms/static/sass/base-style.scss index 5c67789f72..b9becc4829 100644 --- a/cms/static/sass/base-style.scss +++ b/cms/static/sass/base-style.scss @@ -27,7 +27,7 @@ @import 'elements/forms'; @import 'elements/modal'; @import 'elements/alerts'; -@import 'elements/jquery-ui-calendar'; +@import 'elements/vendor'; @import 'elements/tender-widget'; // specific views diff --git a/cms/static/sass/elements/_jquery-ui-calendar.scss b/cms/static/sass/elements/_vendor.scss similarity index 87% rename from cms/static/sass/elements/_jquery-ui-calendar.scss rename to cms/static/sass/elements/_vendor.scss index d7d7f093e5..b106f322ab 100644 --- a/cms/static/sass/elements/_jquery-ui-calendar.scss +++ b/cms/static/sass/elements/_vendor.scss @@ -1,6 +1,7 @@ -// studio - elements - JQUI calendar +// studio - elements - vendor overrides // ==================== +// JQUI calendar .ui-datepicker { border-color: $darkGrey; border-radius: 2px; @@ -54,4 +55,11 @@ border-color: $orange; color: #fff; } +} + +// ==================== + +// JQUI timepicker +.ui-timepicker-list { + z-index: 100000 !important; } \ No newline at end of file diff --git a/cms/static/sass/views/_outline.scss b/cms/static/sass/views/_outline.scss index e5a294467e..6a141fa789 100644 --- a/cms/static/sass/views/_outline.scss +++ b/cms/static/sass/views/_outline.scss @@ -26,7 +26,7 @@ body.course.outline { position: relative; top: -4px; right: 50px; - width: 145px; + width: 100px; .status-label { position: absolute; @@ -62,7 +62,7 @@ body.course.outline { opacity: 0.0; position: absolute; top: -1px; - left: 5px; + right: 0; margin: 0; padding: 8px 12px; background: $white; @@ -160,7 +160,7 @@ body.course.outline { .section-published-date { position: absolute; top: 19px; - right: 90px; + right: 80px; padding: 4px 10px; border-radius: 3px; background: $lightGrey; @@ -271,8 +271,6 @@ body.course.outline { .section-published-date { float: right; - width: 278px; - margin-right: 220px; @include border-radius(3px); background: $lightGrey; diff --git a/cms/templates/base.html b/cms/templates/base.html index 15f4c556bb..e4f5befd63 100644 --- a/cms/templates/base.html +++ b/cms/templates/base.html @@ -23,6 +23,8 @@ + <%include file="widgets/segment-io.html" /> + <%block name="header_extras"> diff --git a/cms/templates/index.html b/cms/templates/index.html index 9482b9d9af..8b14ea179a 100644 --- a/cms/templates/index.html +++ b/cms/templates/index.html @@ -46,6 +46,8 @@ @@ -67,7 +69,7 @@
% if user.is_active:
+ +
+
+

TRAINER

+

All those Universities on the edX homepage are full of incredible professors and teaching teams, designing on-line courses that will change the face of education. The edX team is constantly training whole new university teams on how to make their visions shine using edX software. We’re looking for some truly talented people to help train people on the tools that are enabling the future of education.

+

Responsibilities:

+
    +
  • Facilitate training programs as required ensuring that best practices are incorporated in all learning environments.
  • +
  • Create and design learning materials for training curriculums, incorporate edX best practices into training curriculum.
  • +
  • Incorporate key performance metrics into training modules; participate in strategic initiatives
  • +
  • Measure, monitor and share training results with business units to identify future training opportunities.
  • +
  • Identify and leverage existing resources to maximize partner efficiency and productivity.
  • +
  • Work with both Universities and edX to provide strategic input based on future training needs.
  • +
  • Communicate effectively in oral and written presentations.
  • +
  • Analyze learners training needs and identify cross training opportunities.
  • +
  • Mentor and train others on training tools to expand training efficiency and uniformity.
  • +
  • Build relationships with universities to be viewed as a trusted training partner.
  • +
+

Requirements:

+
    +
  • Minimum of 1-3 years experience developing and delivering educational training, preferably in an educational technology organization.
  • +
  • Lean and Agile thinking and training. Experienced in Scrum or kanban preferred.
  • +
  • Excellent interpersonal skills including proven presentation and facilitation skills.
  • +
  • Strong oral and written communication skills.
  • +
  • Flexibility to work on a variety of initiatives; prior startup experience preferred.
  • +
  • Outstanding work ethic, results-oriented, and creative/innovative style.
  • +
  • Proactive, optimistic approach to problem solving.
  • +
  • Commitment to constant personal and organizational improvement.
  • +
  • Willingness to travel to partner sites as needed.
  • +
  • Bachelors or Master’s in Education, organizational learning, instructional design or other related field preferred. But we're all about education, so let us know how you gained what you need to succeed in this role: projects after completing 6.00x or CS50x, Xbox cheevos, on-line guilds led, large scale innovations championed.
  • +
+ +

If you are interested in this position, please send an email to jobs@edx.org.

+
+
+ +

INSTRUCTIONAL DESIGNER

@@ -187,8 +224,10 @@

Qualifications:

    -
  • Master's Degree in Educational Technology, Instructional Design or related field. Experience in higher education with additional experience in a start-up or research environment preferable.
  • -
  • Excellent interpersonal and communication (written and verbal), project management, problem-solving and time management skills. The ability to be flexible with projects and to work on multiple courses essential.
  • Ability to meet deadlines and manage expectations of constituents. +
  • Master's Degree in Educational Technology, Instructional Design or related field. Experience in higher education with additional experience in a start-up or research environment preferable. But we're all about education, so let us know how you gained what you need to succeed in this role: projects after completing 6.00x or CS50x, Xbox cheevos, on-line guilds led, large scale innovations championed.
  • +
  • Experience in higher education with additional experience in a start-up or research environment preferable.
  • +
  • Excellent interpersonal and communication (written and verbal), project management, problem-solving and time management skills. The ability to be flexible with projects and to work on multiple courses essential.
  • +
  • Ability to meet deadlines and manage expectations of constituents.
  • Capacity to develop new and relevant technology skills. Experience using game theory design and learning analytics to inform instructional design decisions and strategy.
  • Technical Skills: Video and screencasting experience. LMS Platform experience, xml, HTML, CSS, Adobe Design Suite, Camtasia or Captivate experience. Experience with web 2.0 collaboration tools.
@@ -205,16 +244,16 @@

edX Program Managers (PM) lead the edX's course production process. They are systems thinkers who manage the creation of a course from start to finish. PMs work with University Professors and course staff to help them take advantage of edX services to create world class online learning offerings and encourage the exploration of an emerging form of higher education.

Responsibilities:

    -
  • Create and execute the course production cycle. PMs are able to examine and explain what they do in great detail and able to think abstractly about people, time, and processes. They coordinate the efforts of multiple
  • teams engaged in the production of the courses assigned to them. +
  • Create and execute the course production cycle. PMs are able to examine and explain what they do in great detail and able to think abstractly about people, time, and processes. They coordinate the efforts of multiple teams engaged in the production of the courses assigned to them.
  • Train partners and drive best practices adoption. PMs train course staff from partner institutions and help them adopt best practices for workflow and tools.
  • Build capacity. Mentor staff at partner institutions, train the trainers that help them scale their course production ability.
  • -
  • Create visibility. PMs are responsible for making the state of the course production system accessible and comprehensible to all stakeholders. They are capable of training Course development teams in Scrum and
  • Kanban, and are Lean thinkers and educators. +
  • Create visibility. PMs are responsible for making the state of the course production system accessible and comprehensible to all stakeholders. They are capable of training Course development teams in Scrum and Kanban, and are Lean thinkers and educators.
  • Improve workflows. PMs are responsible for carefully assessing the methods and outputs of each course and adjusting them to take best advantage of available resources.
  • Encourage innovation. Spark creativity in course teams to build new courses that could never be produced in brick and mortar settings.

Qualifications:

    -
  • Bachelor's Degree. Master's Degree preferred.
  • +
  • Bachelor's Degree. Master's Degree preferred. But we're all about education, so let us know how you gained what you need to succeed in this role: projects after completing 6.00x or CS50x, Xbox cheevos, on-line guilds led, large scale innovations championed.
  • At least 2 years of experience working with University faculty and administrators.
  • Proven record of successful Scrum or Kanban project management, including use of project management tools.
  • Ability to create processes that systematically provide solutions to open ended challenges.
  • @@ -237,36 +276,6 @@
-
-
-

PROJECT MANAGER (PMO)

-

As a fast paced, rapidly growing organization serving the evolving online higher education market, edX maximizes its talents and resources. To help make the most of this unapologetically intelligent and dedicated team, we seek a project manager to increase the accuracy of our resource and schedule estimates and our stakeholder satisfaction.

-

Responsibilities:

-
    -
  • Coordinate multiple projects to bring Courses, Software Product and Marketing initiatives to market, all of which are related, which have both dedicated and shared resources.
  • -
  • Provide, at a moment’s notice, the state of development, so that priorities can be enforced or reset, so that future expectations can be set accurately.
  • -
  • Develop lean processes that supports a wide variety of efforts which draw on a shared resource pool.
  • -
  • Develop metrics on resource use that support the leadership team in optimizing how they respond to unexpected challenges and new opportunities.
  • -
  • Accurately and clearly escalate only those issues which need escalation for productive resolution. Assist in establishing consensus for all other issues.
  • -
  • Advise the team on best practices, whether developed internally or as industry standards.
  • -
  • Recommend to the leadership team how to re-deploy key resources to better match stated priorities.
  • -
  • Help the organization deliver on its commitments with more consistency and efficiency. Allow the organization to respond to new opportunities with more certainty in its ability to forecast resource needs.
  • -
  • Select and maintain project management tools for Scrum and Kanban that can serve as the standard for those we use with our partners.
  • -
  • Forecast future resource needs given the strategic direction of the organization.
  • -
-

Skills:

-
    -
  • Bachelor’s degree or higher
  • -
  • Exquisite communication skills, especially listening
  • -
  • Inexhaustible attention to detail with the ability to let go of perfection
  • -
  • Deep commitment to Lean project management, including a dedication to its best intentions not just its rituals
  • -
  • Sense of humor and humility
  • -
  • Ability to hold on to the important in the face of the urgent
  • -
-

If you are interested in this position, please send an email to jobs@edx.org.

-
-
-
@@ -286,8 +295,7 @@

Qualifications:

    -
  • Bachelor’s degree or higher in a Technical Area
  • -
  • MBA or Masters in Design preferred
  • +
  • Bachelor’s degree or higher in a Technical Area, MBA or Masters in Design preferred. But we're all about education, so let us know how you gained what you need to succeed in this role: projects after completing 6.00x or CS50x, Xbox cheevos, on-line guilds led, large scale innovations championed.
  • Proven ability to develop and implement strategy
  • Exquisite organizational skills
  • Deep analytical skills
  • @@ -319,7 +327,7 @@

Qualifications:

    -
  • Bachelor’s degree or higher
  • +
  • Bachelor’s degree or higher. But we're all about education, so let us know how you gained what you need to succeed in this role: projects after completing 6.00x or CS50x, Xbox cheevos, on-line guilds led, large scale innovations championed.
  • Thorough knowledge of Python, DJango, XML,HTML, CSS , Javascript and backbone.js
  • Ability to work on multiple projects simultaneously without splintering
  • Tactfully escalate conflicting deadlines or priorities only when needed. Otherwise help the team members negotiate a solution.
  • @@ -358,7 +366,7 @@
  • Test Driven Development
  • Committed to Documentation best practices so your code can be consumed in an open source environment
  • Contributor to or consumer of Open Source Frameworks
  • -
  • BS in Computer Science from top-tier institution
  • +
  • BS in Computer Science from top-tier institution. But we're all about education, so let us know how you gained what you need to succeed in this role: projects after completing 6.00x or CS50x, Xbox cheevos, on-line guilds led, large scale innovations championed.
  • Acknowledged by peers as a technology leader
@@ -367,6 +375,51 @@
+
+
+

DEVOPS ENGINEER – SYESTEMS ADMINISTRATOR

+

The Devop Engineers at edX help develop and maintain the infrastructure in AWS for all services and systems required to run edX. We're seeking a capable systems administrator who is unafraid of scripting languages and development to build out tools in order to improve the functionality of edX. The devops team primarily focuses on the provisioning, configuration, and deployment of services at edX. If you have a passion for automation and constant improvement then we want to hear from you. Our production environment is primarily built on Ubuntu (in AWS) and we use Puppet and Fabric to manage most of the environment.

+

In addition to the primary task of building infrastructure the Devops team supports the developers in a variety of other contexts, including helping with desktop development environments if required. We participate in on-call and emergency support and there will be occasional out of normal hours work required.

+

Responsibilities:

+
    +
  • Work with developers and staff to maintain and improve the infrastructure of edX.
  • +
  • Assist where needed with other technical support tasks to support the fast moving pace of edX.
  • +
  • Rapidly diagnose and resolve faults with organization-wide servers and services, and communicate to users as appropriate.
  • +
+

Requirements:

+
    +
  • Bachelor's degree in engineering or computer science. But we're all about education, so let us know how you gained what you need to succeed in this role: projects after completing 6.00x or CS50x, Xbox cheevos, on-line guilds led, large scale innovations championed.3 or more years of systems administration.
  • +
  • Must have an excellent working knowledge of Linux both as an end-user and as an administrator.
  • +
  • Must be adept in programming/scripting languages such as Python, Ruby, Bash.
  • +
  • Must be familiar with a configuration management system such as Puppet, Chef, Ansible.
  • +
  • Must have experience running web applications in a production environment.
  • +
  • Must have excellent personal interaction skills as the position requires interfacing with a wide range of people up to board level.
  • +
  • Ideally possesses experience with some of the following technologies: nginx, mysql, mongodb, django environments, splunk, git.
  • +
+ +

If you are interested in this position, please send an email to jobs@edx.org.

+
+
+ + +
+
+

LEARNING SCIENCES ENGINEER

+

In 2012, edX reinvented education. In 2013, the edX learning sciences team is charged with reinventing education, again. The goal of the team is to prototype and develop technologies which will radically change the way students learn and instructors teach. We will engage in projects in learning analytics, crowdsourced content development, intelligent tutoring, as well as radical changes to the ways course content is structured. We are looking to opportunistically build a small (3 person), fast-moving team capable of rapidly bringing advanced development projects to prototype and to market. All members of the team must be spectacular software engineers capable of working in or adapting to dynamic, duck typed, functional languages (Python and JavaScript). In addition, we are looking for some combination of:

+
    +
  • Deep expertise in mathematics, and in particular, advanced linear algebra, machine learning, big data, psychometrics, and probability.
  • +
  • UX design. Capable of envisioning user interface for software that does things that have never been done before, and bringing them through to market. Skills should be broad and range the full gamut: graphic design, UX, HTML5, basic JavaScript, and CSS.
  • +
  • Interest and experience in both research and practice of education, cognitive science, and related fields.
  • +
  • Core backend experience (Python, Django, MongoDB, SQL)
  • +
  • Background in social networks and social network analysis (both social science and mathematics) is desirable as well.
  • +
+

More than anything, we’re looking for spectacular people capable of very rapidly building things which have never been built before. We’re capable of providing both traditional employment, and potentially, in partnership with MIT, more academic opportunities.

+ +

If you are interested in this position, please send an email to jobs@edx.org.

+
+
+ +
@@ -374,12 +427,14 @@

How to Apply

E-mail your resume, cover letter and any other materials to jobs@edx.org

diff --git a/lms/templates/static_templates/press_releases/stanford_announcement.html b/lms/templates/static_templates/press_releases/stanford_announcement.html new file mode 100644 index 0000000000..2b19b62de3 --- /dev/null +++ b/lms/templates/static_templates/press_releases/stanford_announcement.html @@ -0,0 +1,92 @@ +<%! from django.core.urlresolvers import reverse %> +<%inherit file="../../main.html" /> + +<%namespace name='static' file='../../static_content.html'/> + +<%block name="title">Stanford University to Collaborate with edX on Development of Non-Profit Open Source edX Platform +
+ + +
+
+

Stanford University to Collaborate with edX on Development of Non-Profit Open Source edX Platform

+
+
+

edX Learning Platform to be open source and available on June 1

+ +

CAMBRIDGE, MA and STANFORD, CA – April 3, 2013 – + +Stanford University and edX, the not-for-profit online learning enterprise founded by Harvard University and the Massachusetts Institute of Technology (MIT), today announced their collaboration to advance the development of edX’s open source learning platform and provide free and open online learning tools for institutions around the world.

+ +

As part of this announcement, edX will release the source code for its entire online learning platform on June 1, 2013. In support of that move, Stanford will integrate features of its existing Class2Go platform into the edX platform, use the integration as an internal platform for online coursework for on-campus and distance learners, and work collaboratively with edX and other institutions to further develop the edX platform.

+ +

“This collaboration brings together two leaders in online education in a common effort to ensure that the world’s universities have the strongest possible not-for-profit, open source platform available to them,” said John Mitchell, vice provost for online learning at Stanford University. “A not-for-profit, open source platform will help universities experiment with different ways to produce and share content, fostering continued innovation through a vibrant community of contributors.”

+ +

EdX and Stanford will collaborate along with others around the globe on the ongoing development and refinement of the edX online learning platform. As of June 1, developers everywhere will be able to freely access the source code of the edX learning platform, including code for its Learning Management System (LMS); Studio, a course authoring tool; xBlock, an application programming interface (API) for integrating third-party learning objects; and machine grading API’s. EdX will support and nurture the community of developers contributing to the enhancement of the edX platform by providing a rich environment for developer collaboration as well as technical and process guidelines to facilitate developer contributions.

+ +

“It has been our vision to offer our platform as open source since edX’s founding by Harvard and MIT,” stated Anant Agarwal, president of edX. “We are now realizing that vision, and I am pleased to welcome Stanford University, one of the world’s leading institutions of higher education, to further this global open source solution. I want to acknowledge the key role played by our X Consortium member UC Berkeley, which was instrumental in fostering this collaboration. We believe the edX platform—the Linux of learning—will benefit from all the world’s institutions and communities.”

+ +

EdX is pursuing an open source vision to enhance access to higher education for the entire world. One of the chief benefits of massive open online courses (MOOCs) is that they bring together a tremendously diverse student body to learn with and from each other. EdX has chosen to extend that perspective to its learning platform as well, knowing that drawing upon the global community of developers is an effective route to both transform and deliver the world’s best and most accessible online and blended learning experience.

+ +

MOOCs and innovative online teaching approaches on college campuses, such as the “flipped classroom,” use web environments that support interactive video, online discussion, social/cohort interaction, assessment and other functions. Open source online learning platforms will allow universities to develop their own delivery methods, partner with other universities and institutions as they choose, collect data, and control branding of their educational material. Further developing online opportunities through open source technology is a key objective of the partnership between edX and Stanford.

+ +

Stanford will continue to provide a range of platforms for its instructors to choose from in hosting their online coursework, including continued partnerships with Coursera and other providers. The university will focus its ongoing platform development efforts on the new platform, combining key features from the Class2Go open source platform with the open source edX code base.

+ +

The edX learning platform source code, as well as platform developments from Stanford, edX and other contributors, will be available on June 1, 2013 and can be accessed from the edX Platform Repository located at https://github.com/edX.

+ + +

About edX

+ +

EdX is a not-for-profit enterprise of its founding partners Harvard University and the Massachusetts Institute of Technology focused on transforming online and on-campus learning through groundbreaking methodologies, game-like experiences and cutting-edge research. EdX provides inspirational and transformative knowledge to students of all ages, social status, and income who form worldwide communities of learners. EdX uses its open source technology to transcend physical and social borders. We’re focused on people, not profit. EdX is based in Cambridge, Massachusetts in the USA.

+ +

About Stanford University

+ +

+Stanford University is engaged in a variety of efforts to develop online learning – experimenting with coursework for both on-campus and off-campus students, researching key questions around what a digital environment means for teaching and learning, and pursuing platform development. More information on Stanford’s online learning activities is available at http://online.stanford.edu + + +

+

Media Contact:

+

Dan O'Connell

+

oconnell@edx.org

+

(617) 480-6585

+
+ +
+

Brad Hayward

+

bhayward@stanford.edu

+

650-724-0199

+
+ +
+

Lisa Lapin

+

lapin@stanford.edu

+

650-725-8396

+
+ + + +
+
+
diff --git a/lms/templates/university_profile/utaustinx.html b/lms/templates/university_profile/utaustinx.html index b4f6b4446e..048587b334 100644 --- a/lms/templates/university_profile/utaustinx.html +++ b/lms/templates/university_profile/utaustinx.html @@ -17,7 +17,7 @@ <%block name="university_description"> -

The University of Texas at Austin is the top-ranked public university in a nearly 1,000-mile radius, and is ranked in the top 25 universities in the world. Students have been finding their passion in life at UT Austin for more than 130 years, and it has been a member of the prestigious AAU since 1929. UT Austin combines the academic depth and breadth of a world research institute (regularly ranking within the top three producers of doctoral degrees in the country) with the fun and excitement of a big-time collegiate experience. It is currently the fifth-largest university in America, with more than 50,000 students and 3,000 professors across 17 colleges and schools, and is the first major American university to build a medical school in the past 50 years.

+

The University of Texas at Austin is the top-ranked public university in a nearly 1,000-mile radius, and is ranked in the top 25 universities in the world. Students have been finding their passion in life at UT Austin for more than 130 years, and it has been a member of the prestigious AAU since 1929. UT Austin combines the academic depth and breadth of a world research institute (regularly ranking within the top three producers of doctoral degrees in the country) with the fun and excitement of a big-time collegiate experience. It is currently the fifth-largest university in America, with more than 50,000 students and 3,000 professors across 17 colleges and schools. UT Austin will be opening the Dell Medical School in 2016.

${parent.body()} diff --git a/lms/templates/university_profile/utx.html b/lms/templates/university_profile/utx.html index ea34ddb85b..d25d8f09b8 100644 --- a/lms/templates/university_profile/utx.html +++ b/lms/templates/university_profile/utx.html @@ -22,7 +22,7 @@ <%block name="university_description">

Educating students, providing care for patients, conducting groundbreaking research and serving the needs of Texans and the nation for more than 130 years, The University of Texas System is one of the largest public university systems in the United States, with nine academic universities and six health science centers. Student enrollment exceeded 215,000 in the 2011 academic year. The UT System confers more than one-third of the state’s undergraduate degrees and educates nearly three-fourths of the state’s health care professionals annually. The UT System has an annual operating budget of $13.1 billion (FY 2012) including $2.3 billion in sponsored programs funded by federal, state, local and private sources. With roughly 87,000 employees, the UT System is one of the largest employers in the state.

-

Find out about the University of Texas Austin.

+

Find out about The University of Texas at Austin.

${parent.body()} diff --git a/lms/urls.py b/lms/urls.py index de5c8184fa..4a0608720a 100644 --- a/lms/urls.py +++ b/lms/urls.py @@ -153,6 +153,9 @@ urlpatterns = ('', url(r'^press/xblock_announcement$', 'static_template_view.views.render', {'template': 'press_releases/xblock_announcement.html'}, name="press/xblock-announcement"), + url(r'^press/stanford-to-work-with-edx$', 'static_template_view.views.render', + {'template': 'press_releases/stanford_announcement.html'}, + name="press/stanford-to-work-with-edx"), # Should this always update to point to the latest press release? (r'^pressrelease$', 'django.views.generic.simple.redirect_to', diff --git a/local-requirements.txt b/local-requirements.txt index de2d274719..177897f53d 100644 --- a/local-requirements.txt +++ b/local-requirements.txt @@ -6,4 +6,4 @@ # XBlock: # Might change frequently, so put it in local-requirements.txt, # but conceptually is an external package, so it is in a separate repo. --e git+ssh://git@github.com/MITx/xmodule-debugger@9a4f883a#egg=XBlock +-e git+https://github.com/edx/XBlock.git@96d8f5f4#egg=XBlock