From 7390015799831d4b3d7d7b074993a91f3cd02848 Mon Sep 17 00:00:00 2001 From: Alexander Kryklia Date: Wed, 5 Dec 2012 14:43:35 +0200 Subject: [PATCH 001/437] parameters in display video --- .../xmodule/xmodule/js/src/video/display/video_player.coffee | 3 +++ 1 file changed, 3 insertions(+) diff --git a/common/lib/xmodule/xmodule/js/src/video/display/video_player.coffee b/common/lib/xmodule/xmodule/js/src/video/display/video_player.coffee index 8829e25dac..9e5288b8a2 100644 --- a/common/lib/xmodule/xmodule/js/src/video/display/video_player.coffee +++ b/common/lib/xmodule/xmodule/js/src/video/display/video_player.coffee @@ -36,6 +36,7 @@ class @VideoPlayer extends Subview @volumeControl = new VideoVolumeControl el: @$('.secondary-controls') @speedControl = new VideoSpeedControl el: @$('.secondary-controls'), speeds: @video.speeds, currentSpeed: @currentSpeed() @progressSlider = new VideoProgressSlider el: @$('.slider') + @debugger_1 @player = new YT.Player @video.id, playerVars: controls: 0 @@ -44,6 +45,8 @@ class @VideoPlayer extends Subview showinfo: 0 enablejsapi: 1 modestbranding: 1 + start: 10 + end: 20 videoId: @video.youtubeId() events: onReady: @onReady From 97016d6168ae16ea1632febe41d43f86b31fa32e Mon Sep 17 00:00:00 2001 From: Alexander Kryklia Date: Wed, 5 Dec 2012 17:18:35 +0200 Subject: [PATCH 002/437] video time frame support for xmodule --- .../xmodule/js/src/video/display.coffee | 2 ++ .../js/src/video/display/video_player.coffee | 24 ++++++++------ common/lib/xmodule/xmodule/video_module.py | 31 ++++++++++++++++--- lms/templates/video.html | 4 ++- 4 files changed, 46 insertions(+), 15 deletions(-) diff --git a/common/lib/xmodule/xmodule/js/src/video/display.coffee b/common/lib/xmodule/xmodule/js/src/video/display.coffee index 6587f05899..a170075b68 100644 --- a/common/lib/xmodule/xmodule/js/src/video/display.coffee +++ b/common/lib/xmodule/xmodule/js/src/video/display.coffee @@ -2,6 +2,8 @@ class @Video constructor: (element) -> @el = $(element).find('.video') @id = @el.attr('id').replace(/video_/, '') + @start = @el.data('start') + @end = @el.data('end') @caption_data_dir = @el.data('caption-data-dir') @show_captions = @el.data('show-captions') == "true" window.player = null diff --git a/common/lib/xmodule/xmodule/js/src/video/display/video_player.coffee b/common/lib/xmodule/xmodule/js/src/video/display/video_player.coffee index 9e5288b8a2..ec52d15874 100644 --- a/common/lib/xmodule/xmodule/js/src/video/display/video_player.coffee +++ b/common/lib/xmodule/xmodule/js/src/video/display/video_player.coffee @@ -36,17 +36,21 @@ class @VideoPlayer extends Subview @volumeControl = new VideoVolumeControl el: @$('.secondary-controls') @speedControl = new VideoSpeedControl el: @$('.secondary-controls'), speeds: @video.speeds, currentSpeed: @currentSpeed() @progressSlider = new VideoProgressSlider el: @$('.slider') - @debugger_1 + @playerVars = + controls: 0 + wmode: 'transparent' + rel: 0 + showinfo: 0 + enablejsapi: 1 + modestbranding: 1 + if @video.start + @playerVars.start = @video.start + if @video.end + # work in AS3, not HMLT5. but iframe use AS3 + @playerVars.end = @video.end + @player = new YT.Player @video.id, - playerVars: - controls: 0 - wmode: 'transparent' - rel: 0 - showinfo: 0 - enablejsapi: 1 - modestbranding: 1 - start: 10 - end: 20 + playerVars: @playerVars videoId: @video.youtubeId() events: onReady: @onReady diff --git a/common/lib/xmodule/xmodule/video_module.py b/common/lib/xmodule/xmodule/video_module.py index 9a22950ca8..801e70fd06 100644 --- a/common/lib/xmodule/xmodule/video_module.py +++ b/common/lib/xmodule/xmodule/video_module.py @@ -7,6 +7,9 @@ from pkg_resources import resource_string, resource_listdir from xmodule.x_module import XModule from xmodule.raw_module import RawDescriptor +import datetime +import time + log = logging.getLogger(__name__) @@ -33,6 +36,7 @@ class VideoModule(XModule): self.show_captions = xmltree.get('show_captions', 'true') self.source = self._get_source(xmltree) self.track = self._get_track(xmltree) + self.start_time, self.end_time = self._get_timeframe(xmltree) if instance_state is not None: state = json.loads(instance_state) @@ -42,11 +46,11 @@ class VideoModule(XModule): def _get_source(self, xmltree): # find the first valid source return self._get_first_external(xmltree, 'source') - + def _get_track(self, xmltree): # find the first valid track return self._get_first_external(xmltree, 'track') - + def _get_first_external(self, xmltree, tag): """ Will return the first valid element @@ -61,6 +65,23 @@ class VideoModule(XModule): break return result + def _get_timeframe(self, xmltree): + """ Converts 'from' and 'to' parameters in video tag to seconds. + If there are no parameters, returns empty string. """ + + def parse_time(s): + """Converts s in '12:34:45' format to seconds. If s is + None, returns empty string""" + if s is None: + return '' + else: + x = time.strptime(s, '%H:%M:%S') + return datetime.timedelta(hours=x.tm_hour, + minutes=x.tm_min, + seconds=x.tm_sec).total_seconds() + + return parse_time(xmltree.get('from')), parse_time(xmltree.get('to')) + def handle_ajax(self, dispatch, get): ''' Handle ajax calls to this video. @@ -98,11 +119,13 @@ class VideoModule(XModule): 'id': self.location.html_id(), 'position': self.position, 'source': self.source, - 'track' : self.track, + 'track': self.track, 'display_name': self.display_name, # TODO (cpennington): This won't work when we move to data that isn't on the filesystem 'data_dir': self.metadata['data_dir'], - 'show_captions': self.show_captions + 'show_captions': self.show_captions, + 'start': self.start_time, + 'end': self.end_time }) diff --git a/lms/templates/video.html b/lms/templates/video.html index 5c041d5c70..6e45a91c31 100644 --- a/lms/templates/video.html +++ b/lms/templates/video.html @@ -2,7 +2,9 @@

${display_name}

% endif -
+
From cc54c37359acec8c4ecdc1d478c87e7ca93b1d12 Mon Sep 17 00:00:00 2001 From: Jay Zoldak Date: Mon, 17 Dec 2012 15:00:11 -0500 Subject: [PATCH 003/437] Exclude settings.py files from coverage reports and configure titles for the reports. --- cms/.coveragerc | 2 ++ common/lib/capa/.coveragerc | 1 + common/lib/xmodule/.coveragerc | 1 + lms/.coveragerc | 2 ++ 4 files changed, 6 insertions(+) diff --git a/cms/.coveragerc b/cms/.coveragerc index 42638feb8f..9b1e59d670 100644 --- a/cms/.coveragerc +++ b/cms/.coveragerc @@ -2,11 +2,13 @@ [run] data_file = reports/cms/.coverage source = cms +omit = cms/envs/*, cms/manage.py [report] ignore_errors = True [html] +title = CMS Python Test Coverage Report directory = reports/cms/cover [xml] diff --git a/common/lib/capa/.coveragerc b/common/lib/capa/.coveragerc index 6af3218f75..149a4c860a 100644 --- a/common/lib/capa/.coveragerc +++ b/common/lib/capa/.coveragerc @@ -7,6 +7,7 @@ source = common/lib/capa ignore_errors = True [html] +title = Capa Python Test Coverage Report directory = reports/common/lib/capa/cover [xml] diff --git a/common/lib/xmodule/.coveragerc b/common/lib/xmodule/.coveragerc index 310c8e778b..baadd30829 100644 --- a/common/lib/xmodule/.coveragerc +++ b/common/lib/xmodule/.coveragerc @@ -7,6 +7,7 @@ source = common/lib/xmodule ignore_errors = True [html] +title = XModule Python Test Coverage Report directory = reports/common/lib/xmodule/cover [xml] diff --git a/lms/.coveragerc b/lms/.coveragerc index acac3ed4f2..7e18a37492 100644 --- a/lms/.coveragerc +++ b/lms/.coveragerc @@ -2,11 +2,13 @@ [run] data_file = reports/lms/.coverage source = lms +omit = lms/envs/* [report] ignore_errors = True [html] +title = LMS Python Test Coverage Report directory = reports/lms/cover [xml] From c7a00cd2ba368eb5f9e025e2f39eb8924daf640f Mon Sep 17 00:00:00 2001 From: John Jarvis Date: Mon, 17 Dec 2012 19:07:23 -0500 Subject: [PATCH 004/437] pinning versions to what is currently on stage --- requirements.txt | 100 +++++++++++++++++++++++------------------------ 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/requirements.txt b/requirements.txt index a1983fd095..a3e1e3e6e5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,58 +1,58 @@ -django>=1.4,<1.5 +django==1.4.3 pip -numpy -scipy -Markdown<2.3.0 -pygments -lxml -boto -mako -python-memcached -python-openid +numpy==1.6.2 +scipy==0.11.0 +Markdown==2.2.1 +pygments==1.5 +lxml==3.0.1 +boto==2.6.0 +mako==0.7.3 +python-memcached==1.48 +python-openid==2.2.5 path.py django_debug_toolbar -fs -beautifulsoup -beautifulsoup4 -feedparser -requests==0.12.1 +fs==0.4.0 +beautifulsoup==3.2.1 +beautifulsoup4==4.1.3 +feedparser==5.1.3 +requests==0.14.2 http://sympy.googlecode.com/files/sympy-0.7.1.tar.gz -newrelic -glob2 -pymongo +newrelic==1.8.0.13 +glob2==0.3 +pymongo==2.4.1 django_nose -nosexcover -rednose -GitPython >= 0.3 -django-override-settings -mock>=0.8, <0.9 -PyYAML -South -pytz -django-celery -django-countries -django-kombu -django-followit -django-jasmine -django-keyedcache -django-mako -django-masquerade -django-openid-auth -django-robots -django-ses -django-storages -django-threaded-multihost -django-sekizai<0.7 -django-mptt>=0.5.3 -sorl-thumbnail -networkx -pygraphviz +nosexcover==1.0.7 +rednose==0.3.3 +GitPython==0.3.2.RC1 +django-override-settings==1.2 +mock==0.8.0 +PyYAML==3.10 +South==0.7.6 +pytz==2012h +django-celery==3.0.11 +django-countries==1.5 +django-kombu==0.9.4 +django-followit==0.0.3 +django-jasmine==0.3.2 +django-keyedcache==1.4-6 +django-mako==0.1.5pre +django-masquerade==0.1.6 +django-openid-auth==0.4 +django-robots==0.9.1 +django-ses==0.4.1 +django-storages==1.1.5 +django-threaded-multihost==1.4-1 +django-sekizai==0.6.1 +django-mptt==0.5.5 +sorl-thumbnail==11.12 +networkx==1.7 +pygraphviz==1.1 -r repo-requirements.txt -pil -nltk -dogstatsd-python +pil==1.1.7 +nltk==2.0.4 +dogstatsd-python==0.2.1 # Taking out MySQL-python for now because it requires mysql to be installed, so breaks updates on content folks' envs. # MySQL-python -sphinx -Shapely -ipython +sphinx==1.1.3 +Shapely==1.2.16 +ipython==0.13.1 From 8373ee4bf6e380cd3eb0c98fa686efc3abba357e Mon Sep 17 00:00:00 2001 From: David Ormsbee Date: Wed, 19 Dec 2012 04:01:37 -0500 Subject: [PATCH 005/437] Basic support for freeform advertised_start dates like 'Spring' --- common/lib/xmodule/xmodule/course_module.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/common/lib/xmodule/xmodule/course_module.py b/common/lib/xmodule/xmodule/course_module.py index 3506c72bd7..03512b6f8f 100644 --- a/common/lib/xmodule/xmodule/course_module.py +++ b/common/lib/xmodule/xmodule/course_module.py @@ -251,7 +251,20 @@ class CourseDescriptor(SequenceDescriptor): @property def start_date_text(self): - displayed_start = self._try_parse_time('advertised_start') or self.start + parsed_advertised_start = self._try_parse_time('advertised_start') + + # If the advertised start isn't a real date string, we assume it's free + # form text... + if parsed_advertised_start is None and \ + ('advertised_start' in self.metadata): + return self.metadata['advertised_start'] + + displayed_start = parsed_advertised_start or self.start + + # If we have neither an advertised start or a real start, just return TBD + if not displayed_start: + return "TBD" + return time.strftime("%b %d, %Y", displayed_start) @property From 326d21d1430778f29df36e692d804d140711f47d Mon Sep 17 00:00:00 2001 From: Don Mitchell Date: Wed, 19 Dec 2012 10:48:03 -0500 Subject: [PATCH 006/437] ie7 fixes: define indexOf, use charAt rather than [] to access string, put try/catch around fn that was throwing errors. --- lms/static/coffee/src/main.coffee | 8 ++++++++ lms/static/sass/bourbon/css3/_box-sizing.scss | 1 - lms/static/scripts/boxsizing.htc | 5 ++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lms/static/coffee/src/main.coffee b/lms/static/coffee/src/main.coffee index ec5cbdec5b..3b000ba4f3 100644 --- a/lms/static/coffee/src/main.coffee +++ b/lms/static/coffee/src/main.coffee @@ -37,3 +37,11 @@ $ -> $('#signup').click -> $('#signup-modal input[name="email"]').focus() false + + # fix for ie + if !Array::indexOf + Array::indexOf = (obj, start = 0) -> + for ele, i in this[start..] + if ele is obj + return i + start + return -1 diff --git a/lms/static/sass/bourbon/css3/_box-sizing.scss b/lms/static/sass/bourbon/css3/_box-sizing.scss index 42aaaf6fc7..d61523b5f1 100644 --- a/lms/static/sass/bourbon/css3/_box-sizing.scss +++ b/lms/static/sass/bourbon/css3/_box-sizing.scss @@ -2,6 +2,5 @@ // content-box | border-box | inherit -webkit-box-sizing: $box; -moz-box-sizing: $box; - box-sizing: $box; box-sizing: $box; *behavior: url(/static/scripts/boxsizing.htc); } diff --git a/lms/static/scripts/boxsizing.htc b/lms/static/scripts/boxsizing.htc index 43bd86fae1..40f5ab4e12 100644 --- a/lms/static/scripts/boxsizing.htc +++ b/lms/static/scripts/boxsizing.htc @@ -85,7 +85,10 @@ function update(){ } resizetimeout = window.setTimeout(function(){ restore(); - init(); + try { + init(); + } + catch (err) {} resizetimeout = null; },100); } From 42857796c0161daadffc477b8faec565b95a0f37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s=20Rocha?= Date: Wed, 19 Dec 2012 11:39:44 -0500 Subject: [PATCH 007/437] Update jobs and faq page [#41258701 #41258685] --- lms/templates/static_templates/faq.html | 10 ----- lms/templates/static_templates/jobs.html | 49 ++++++++++++------------ 2 files changed, 25 insertions(+), 34 deletions(-) diff --git a/lms/templates/static_templates/faq.html b/lms/templates/static_templates/faq.html index 96e781e817..030eaa5013 100644 --- a/lms/templates/static_templates/faq.html +++ b/lms/templates/static_templates/faq.html @@ -24,16 +24,6 @@

EdX currently offers HarvardX, MITx and BerkeleyX classes online for free. Beginning in fall 2013, edX will offer WellesleyX and GeorgetownX classes online for free. The University of Texas System includes nine universities and six health institutions. The edX institutions aim to extend their collective reach to build a global community of online students. Along with offering online courses, the three universities undertake research on how students learn and how technology can transform learning – both on-campus and online throughout the world.

-
-

Why is Georgetown University joining edX?

-

Georgetown University, the oldest Catholic and Jesuit university in America, has a long history of providing courses of the highest quality through its schools of foreign service, law, medicine, nursing, business, as well as the arts and sciences. GeorgetownX courses, and the mission-driven Georgetown faculty, will provide a new perspective from which the hundreds of thousands of edX learners can benefit.

-

Georgetown offers a world-class learning experience focused on educating the whole person through exposure to different faiths, cultures and beliefs. Georgetown's global perspective with presences in Qatar, Shanghai, Santiago, Buenos Aires and London aligns with edX's mission to extend access to education around the world and to perform research into how students learn and how technology can transform learning both on-campus and online.

-

As with all consortium members, the values of Georgetown are aligned with those of edX. Georgetown and edX are both committed to expanding access to education to learners of all ages, means, and backgrounds. Both institutions are also committed to the non-profit model. We value principle not profit.

-
-
-

How many GeorgetownX courses will be offered initially? When?

-

Initially, GeorgetownX will begin offering edX courses in the fall of 2013. The courses, which will offer students the opportunity to explore a variety of subjects, will be of the same high quality and rigor as those offered on the Georgetown University campus.

-

Will edX be adding additional X Universities?

More than 200 institutions from around the world have expressed interest in collaborating with edX since Harvard and MIT announced its creation in May. EdX is focused above all on quality and developing the best not-for-profit model for online education. In addition to providing online courses on the edX platform, the "X University" Consortium will be a forum in which members can share experiences around online learning. Harvard, MIT, UC Berkeley, the University of Texas system and the other consortium members will work collaboratively to establish the "X University" Consortium, whose membership will expand to include additional "X Universities". Each member of the consortium will offer courses on the edX platform as an "X University." The gathering of many universities' educational content together on one site will enable learners worldwide to access the offered course content of any participating university from a single website, and to use a set of online educational tools shared by all participating universities.

diff --git a/lms/templates/static_templates/jobs.html b/lms/templates/static_templates/jobs.html index 2d921eb76f..50f47ed715 100644 --- a/lms/templates/static_templates/jobs.html +++ b/lms/templates/static_templates/jobs.html @@ -52,7 +52,8 @@
-

MEMBER SERVICES MANAGER

+
+

MEMBER SERVICES MANAGER

The edX Member Services Manager is responsible for both defining support best practices and directly supporting edX members by handling or routing issues that come in from our websites, email and social media tools.  We are looking for a passionate person to help us define and own this experience. While this is a Manager level position, we see this candidate quickly moving through the ranks, leading a larger team of employees over time. This staff member will be running our fast growth support organization.

Responsibilities:

    @@ -69,7 +70,7 @@

Qualifications:

    -
  • 5-8 years in a call center or support team management
  • +
  • 5-8 years in a call center or support team management
  • Exemplary customer service skills
  • Experience in creating and rolling out support/service best practices
  • Solid computer skills – must be fluent with desktop applications and have a basic understanding of web technologies (i.e. basic HTML)
  • @@ -85,43 +86,43 @@
-
+ +
-

MEMBER SERVICES ASSOCIATE

-

The edX Member Services Associate is responsible for providing customer service and support to edX customers by handling or routing issues that come in from our websites, email and social media tools.

-

Responsibilities:

+

DIRECTOR OF PR AND COMMUNICATIONS

+

The edX Director of PR & Communications is responsible for creating and executing all PR strategy and providing company-wide leadership to help create and refine the edX core messages and identity as the revolutionary global leader in both on-campus and worldwide education. The Director will design and direct a communications program that conveys cohesive and compelling information about edX's mission, activities, personnel and products while establishing a distinct identity for edX as the leader in online education for both students and learning institutions.

+

Responsibilities:

    -
  • Resolves issues according to edX policies; escalates non-routine issues.
  • -
  • Educates members on edX policies and getting started
  • -
  • May assist new members with edX procedures and processing registration issues.
  • -
  • Provides timely follow-up and resolution to issues.
  • -
  • May specialize in specific area of operation or handle more complex issues.
  • -
  • A passion for doing the right thing - at edX the member is always our top priority.
    -
  • +
  • Develop and execute goals and strategy for a comprehensive external and internal communications program focused on driving student engagement around courses and institutional adoption of the edX learning platform.
  • +
  • Work with media, either directly or through our agency of record, to establish edX as the industry leader in global learning.
  • +
  • Work with key influencers including government officials on a global scale to ensure the edX mission, content and tools are embraced and supported worldwide.
  • +
  • Work with marketing colleagues to co-develop and/or monitor and evaluate the content and delivery of all communications messages and collateral.
  • +
  • Initiate and/or plan thought leadership events developed to heighten target-audience awareness; participate in meetings and trade shows
  • +
  • Conduct periodic research to determine communications benchmarks
  • +
  • Inform employees about edX's vision, values, policies, and strategies to enable them to perform their jobs efficiently and drive morale.
  • +
  • Work with and manage existing communications team to effectively meet strategic goals.

Qualifications:

    -
  • 1-3 years prior experience in customer service role.
  • -
  • Excellent customer service skills.
  • -
  • Problem solving-the individual identifies and resolves problems in a timely manner, gathers and analyzes information skillfully and maintains confidentiality.
  • -
  • Interpersonal skills-the individual maintains confidentiality, remains open to others' ideas and exhibits willingness to try new things.
  • -
  • Oral communication-the individual speaks clearly and persuasively in positive or negative situations and demonstrates group presentation skills.
  • -
  • Written communication-the individual edits work for spelling and grammar, presents numerical data effectively and is able to read and interpret written information.
  • -
  • Adaptability-the individual adapts to changes in the work environment, manages competing demands and is able to deal with frequent change, delays or unexpected events.
  • -
  • Dependability-the individual is consistently at work and on time, follows instructions, responds to management direction and solicits feedback to improve performance.
  • -
  • College degree preferred.
  • -
  • Basic computer skills.
  • +
  • Ten years of experience in PR and communications
  • +
  • Ability to work creatively and provide company-wide leadership in a fast-paced, dynamic start-up environment required
  • +
  • Adaptability - the individual adapts to changes in the work environment, manages competing demands and is able to deal with frequent change, delays or unexpected events.
  • +
  • Experience in working in successful consumer-focused startups preferred
  • +
  • PR agency experience in setting strategy for complex multichannel, multinational organizations a plus.
  • +
  • Extensive writing experience and simply amazing oral, written, and interpersonal communications skills
  • +
  • B.A./B.S. in communications or related field

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

+

Positions

How to Apply

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

From f23bf85199f217bbf03899d8f05779f571ca7e7d Mon Sep 17 00:00:00 2001 From: Bridger Maxwell Date: Wed, 19 Dec 2012 11:44:32 -0500 Subject: [PATCH 008/437] Added config to grader to hide averages of pset scores. --- common/lib/xmodule/xmodule/course_module.py | 3 ++- common/lib/xmodule/xmodule/graders.py | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/common/lib/xmodule/xmodule/course_module.py b/common/lib/xmodule/xmodule/course_module.py index 3506c72bd7..5384bfa90a 100644 --- a/common/lib/xmodule/xmodule/course_module.py +++ b/common/lib/xmodule/xmodule/course_module.py @@ -100,7 +100,8 @@ class CourseDescriptor(SequenceDescriptor): """Parse the policy specified in policy_str, and save it""" try: self._grading_policy = load_grading_policy(policy_str) - except: + except Exception, err: + log.exception('Failed to load grading policy:') self.system.error_tracker("Failed to load grading policy") # Setting this to an empty dictionary will lead to errors when # grading needs to happen, but should allow course staff to see diff --git a/common/lib/xmodule/xmodule/graders.py b/common/lib/xmodule/xmodule/graders.py index 8f885dc9d2..a183cec98b 100644 --- a/common/lib/xmodule/xmodule/graders.py +++ b/common/lib/xmodule/xmodule/graders.py @@ -316,7 +316,7 @@ class AssignmentFormatGrader(CourseGrader): min_count = 2 would produce the labels "Assignment 3", "Assignment 4" """ - def __init__(self, type, min_count, drop_count, category=None, section_type=None, short_label=None, show_only_average=False, starting_index=1): + def __init__(self, type, min_count, drop_count, category=None, section_type=None, short_label=None, show_only_average=False, hide_average=False, starting_index=1): self.type = type self.min_count = min_count self.drop_count = drop_count @@ -325,6 +325,7 @@ class AssignmentFormatGrader(CourseGrader): self.short_label = short_label or self.type self.show_only_average = show_only_average self.starting_index = starting_index + self.hide_average = hide_average def grade(self, grade_sheet, generate_random_scores=False): def totalWithDrops(breakdown, drop_count): @@ -385,7 +386,8 @@ class AssignmentFormatGrader(CourseGrader): if self.show_only_average: breakdown = [] - breakdown.append({'percent': total_percent, 'label': total_label, 'detail': total_detail, 'category': self.category, 'prominent': True}) + if not self.hide_average: + breakdown.append({'percent': total_percent, 'label': total_label, 'detail': total_detail, 'category': self.category, 'prominent': True}) return {'percent': total_percent, 'section_breakdown': breakdown, From 6d85accad8cd54060bd0829644e511f6a5c3e455 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s=20Rocha?= Date: Tue, 18 Dec 2012 18:03:34 -0500 Subject: [PATCH 009/437] Add news announcement for spring 2013 courses [# 41258693] --- .../sass/multicourse/_press_release.scss | 4 + lms/templates/feed.rss | 11 ++- .../Spring_2013_course_announcements.html | 77 +++++++++++++++++++ lms/urls.py | 5 +- 4 files changed, 94 insertions(+), 3 deletions(-) create mode 100644 lms/templates/static_templates/press_releases/Spring_2013_course_announcements.html diff --git a/lms/static/sass/multicourse/_press_release.scss b/lms/static/sass/multicourse/_press_release.scss index f0a2302f4e..7ee362617d 100644 --- a/lms/static/sass/multicourse/_press_release.scss +++ b/lms/static/sass/multicourse/_press_release.scss @@ -23,6 +23,10 @@ color: $base-font-color; font: normal 1em/1.6em $serif; margin: 0px; + + a { + font: 1em $serif; + } } li + li { diff --git a/lms/templates/feed.rss b/lms/templates/feed.rss index 872ed46ff1..415199141d 100644 --- a/lms/templates/feed.rss +++ b/lms/templates/feed.rss @@ -6,7 +6,16 @@ ## EdX Blog - 2012-12-10T14:00:12-07:00 + 2012-12-19T14:00:12-07:00 + + tag:www.edx.org,2012:Post/10 + 2012-12-19T14:00:00-07:00 + 2012-12-19T14:00:00-07:00 + + edX announces first wave of new courses for Spring 2013 + <img src="${static.url('images/press/releases/edx-logo_240x180.png')}" /> + <p></p> + tag:www.edx.org,2012:Post/9 2012-12-10T14:00:00-07:00 diff --git a/lms/templates/static_templates/press_releases/Spring_2013_course_announcements.html b/lms/templates/static_templates/press_releases/Spring_2013_course_announcements.html new file mode 100644 index 0000000000..7c1b82727b --- /dev/null +++ b/lms/templates/static_templates/press_releases/Spring_2013_course_announcements.html @@ -0,0 +1,77 @@ +<%! from django.core.urlresolvers import reverse %> +<%inherit file="../../main.html" /> + +<%namespace name='static' file='../../static_content.html'/> + +<%block name="title">EdX expands platform, announces first wave of courses for spring 2013 +
+ + +
+
+

EdX expands platform, announces first wave of courses for spring 2013

+
+ +
+

Leading minds from top universities to offer world-wide MOOC courses on statistics, history, justice, and poverty

+ +

CAMBRIDGE, MA – December 19, 2012 —EdX, the not-for-profit online learning initiative founded by Harvard University and the Massachusetts Institute of Technology (MIT), announced today its initial spring 2013 schedule including its first set of courses in the humanities and social sciences – introductory courses with wide, global appeal. In its second semester, edX expands its online courses to a variety of subjects ranging from the ancient Greek hero to the riddle of world poverty, all taught by experts at some of the world’s leading universities. EdX is also bringing back several courses from its popular offerings in the fall semester.

+ +

“EdX is both revolutionizing and democratizing education,” said Anant Agarwal, President of edX. “In just eight months we’ve attracted more than half a million unique users from around the world to our learning portal. Now, with these spring courses we are entering a new era – and are poised to touch millions of lives with the best courses from the best faculty at the best institutions in the world.”

+ +

Building on the success of its initial offerings, edX is broadening the courses on its innovative educational platform. In its second semester – now open for registration – edX continues with courses from some of the world’s most esteemed faculty from UC Berkeley, Harvard and MIT. Spring 2013 courses include:

+ + + +

“I'm delighted to have my Justice course on edX,” said Michael Sandel, Ann T. and Robert M. Bass Professor of Government at Harvard University, “where students everywhere will be able to engage in a global dialogue about the big moral and civic questions of our time.”

+ +

In addition to these new courses, edX is bringing back several courses from the popular fall 2012 semester: Introduction to Computer Science and Programming; Introduction to Solid State Chemistry; Introduction to Artificial Intelligence; Software as a Service I; Software as a Service II; Foundations of Computer Graphics.

+ +

This spring also features Harvard's Copyright, taught by Harvard Law School professor William Fisher III, former law clerk to Justice Thurgood Marshall and expert on the hotly debated U.S. copyright system, which will explore the current law of copyright and the ongoing debates concerning how that law should be reformed. Copyright will be offered as an experimental course, taking advantage of different combinations and uses of teaching materials, educational technologies, and the edX platform. 500 learners will be selected through an open application process that begins in late January 2013.

+ +

Copyright from William Fisher III, WilmerHale Professor of Intellectual Property Law, Harvard Law School, and Director, Berkman Center for Internet & Society, will explore the current law of copyright and the ongoing debates concerning how that law should be reformed.

+ +

These new courses would not be possible without the contributions of key edX institutions, including UC Berkeley, which is the inaugural chair of the “X University” consortium and major contributor to the platform. All of the courses will be hosted on edX’s innovative platform at www.edx.org and are open for registration as of today. EdX expects to announce a second set of spring 2013 courses in the future.

+ +

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.

+ +
+

Contact: Brad Baker

+

BBaker@webershandwick.com

+

617-520-7260

+
+ + +
+
+
diff --git a/lms/urls.py b/lms/urls.py index 0a76907380..92abdf794b 100644 --- a/lms/urls.py +++ b/lms/urls.py @@ -109,10 +109,11 @@ urlpatterns = ('', {'template': 'press_releases/Wellesley_College_joins_edX.html'}, name="press/wellesley-college-joins-edx"), url(r'^press/georgetown-joins-edx$', 'static_template_view.views.render', {'template': 'press_releases/Georgetown_joins_edX.html'}, name="press/georgetown-joins-edx"), - + url(r'^press/spring-courses$', 'static_template_view.views.render', + {'template': 'press_releases/Spring_2013_course_announcements.html'}, name="press/spring-courses"), # Should this always update to point to the latest press release? - (r'^pressrelease$', 'django.views.generic.simple.redirect_to', {'url': '/press/georgetown-joins-edx'}), + (r'^pressrelease$', 'django.views.generic.simple.redirect_to', {'url': '/press/spring-courses'}), (r'^favicon\.ico$', 'django.views.generic.simple.redirect_to', {'url': '/static/images/favicon.ico'}), From a239fe2ee74e1db0f2aea62458d57a25265a9130 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s=20Rocha?= Date: Wed, 19 Dec 2012 12:07:34 -0500 Subject: [PATCH 010/437] Add google analytics to model signup and login panels [# 40805407] --- lms/static/coffee/src/main.coffee | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lms/static/coffee/src/main.coffee b/lms/static/coffee/src/main.coffee index ec5cbdec5b..034b914201 100644 --- a/lms/static/coffee/src/main.coffee +++ b/lms/static/coffee/src/main.coffee @@ -32,8 +32,10 @@ $ -> $('#login').click -> $('#login_form input[name="email"]').focus() + _gaq.push(['_trackPageview', '/login']) false $('#signup').click -> $('#signup-modal input[name="email"]').focus() + _gaq.push(['_trackPageview', '/signup']) false From 5a65c245071d49edc39faf4b95c441ae38463669 Mon Sep 17 00:00:00 2001 From: Bridger Maxwell Date: Wed, 19 Dec 2012 12:37:02 -0500 Subject: [PATCH 011/437] Added parameters to hide grade totals and grade cutoffs in progress graph. --- lms/templates/courseware/progress_graph.js | 59 ++++++++++++---------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/lms/templates/courseware/progress_graph.js b/lms/templates/courseware/progress_graph.js index 189137ada3..449cad766f 100644 --- a/lms/templates/courseware/progress_graph.js +++ b/lms/templates/courseware/progress_graph.js @@ -1,4 +1,4 @@ -<%page args="grade_summary, grade_cutoffs, graph_div_id, **kwargs"/> +<%page args="grade_summary, grade_cutoffs, graph_div_id, show_grade_breakdown = True, show_grade_cutoffs = True, **kwargs"/> <%! import json import math @@ -70,25 +70,26 @@ $(function () { series = categories.values() overviewBarX = tickIndex extraColorIndex = len(categories) #Keeping track of the next color to use for categories not in categories[] - - for section in grade_summary['grade_breakdown']: - if section['percent'] > 0: - if section['category'] in categories: - color = categories[ section['category'] ]['color'] - else: - color = colors[ extraColorIndex % len(colors) ] - extraColorIndex += 1 - - series.append({ - 'label' : section['category'] + "-grade_breakdown", - 'data' : [ [overviewBarX, section['percent']] ], - 'color' : color - }) - - detail_tooltips[section['category'] + "-grade_breakdown"] = [ section['detail'] ] - ticks += [ [overviewBarX, "Total"] ] - tickIndex += 1 + sectionSpacer + if show_grade_breakdown: + for section in grade_summary['grade_breakdown']: + if section['percent'] > 0: + if section['category'] in categories: + color = categories[ section['category'] ]['color'] + else: + color = colors[ extraColorIndex % len(colors) ] + extraColorIndex += 1 + + series.append({ + 'label' : section['category'] + "-grade_breakdown", + 'data' : [ [overviewBarX, section['percent']] ], + 'color' : color + }) + + detail_tooltips[section['category'] + "-grade_breakdown"] = [ section['detail'] ] + + ticks += [ [overviewBarX, "Total"] ] + tickIndex += 1 + sectionSpacer totalScore = grade_summary['percent'] detail_tooltips['Dropped Scores'] = dropped_score_tooltips @@ -97,10 +98,14 @@ $(function () { ## ----------------------------- Grade cutoffs ------------------------- ## grade_cutoff_ticks = [ [1, "100%"], [0, "0%"] ] - descending_grades = sorted(grade_cutoffs, key=lambda x: grade_cutoffs[x], reverse=True) - for grade in descending_grades: - percent = grade_cutoffs[grade] - grade_cutoff_ticks.append( [ percent, "{0} {1:.0%}".format(grade, percent) ] ) + if show_grade_cutoffs: + grade_cutoff_ticks = [ [1, "100%"], [0, "0%"] ] + descending_grades = sorted(grade_cutoffs, key=lambda x: grade_cutoffs[x], reverse=True) + for grade in descending_grades: + percent = grade_cutoffs[grade] + grade_cutoff_ticks.append( [ percent, "{0} {1:.0%}".format(grade, percent) ] ) + else: + grade_cutoff_ticks = [ ] %> var series = ${ json.dumps( series ) }; @@ -135,9 +140,11 @@ $(function () { var $grade_detail_graph = $("#${graph_div_id}"); if ($grade_detail_graph.length > 0) { var plot = $.plot($grade_detail_graph, series, options); - //We need to put back the plotting of the percent here - var o = plot.pointOffset({x: ${overviewBarX} , y: ${totalScore}}); - $grade_detail_graph.append('
${"{totalscore:.0%}".format(totalscore=totalScore)}
'); + + %if show_grade_breakdown: + var o = plot.pointOffset({x: ${overviewBarX} , y: ${totalScore}}); + $grade_detail_graph.append('
${"{totalscore:.0%}".format(totalscore=totalScore)}
'); + %endif } var previousPoint = null; From d911297670d39d74bcb409fbee1fecdd94d5bbf2 Mon Sep 17 00:00:00 2001 From: Bridger Maxwell Date: Wed, 19 Dec 2012 12:47:43 -0500 Subject: [PATCH 012/437] The progress page now checks course.metadata.get(no_grade, False) to see if the course has a grade. --- lms/templates/courseware/progress.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lms/templates/courseware/progress.html b/lms/templates/courseware/progress.html index 81268ff081..fb163d112d 100644 --- a/lms/templates/courseware/progress.html +++ b/lms/templates/courseware/progress.html @@ -18,7 +18,7 @@ From 4bcfa84519cc7d61034f8cd6ae88fd82259a1e1c Mon Sep 17 00:00:00 2001 From: Brian Talbot Date: Wed, 19 Dec 2012 14:25:59 -0500 Subject: [PATCH 013/437] adding zendesk logo for styling purposes --- lms/static/images/logo-edx-support.png | Bin 0 -> 3288 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 lms/static/images/logo-edx-support.png diff --git a/lms/static/images/logo-edx-support.png b/lms/static/images/logo-edx-support.png new file mode 100644 index 0000000000000000000000000000000000000000..054647c99f1273f485e5e30031f954735c889753 GIT binary patch literal 3288 zcmXX|c|2787rqrjsmPm}EHR9|>_sKn_ccppN%ox(vSphw!w_S#&e(@3`T9qtLzn>oVA0Z4H3pv};4RL03XG@j zmqmgRFw}jZhKP*=yxv^$%#O;$hL++IeIgRIY|*|i6F3#?Va{+~g>a*XG0%fPUUW!O zwsuCQH$q(yK`+_y|Oa63Ho{Vh^w-cKOt`+71 z&rFN=46NgKsN;96fjR&VIkBnOBs3aG@5@F-(m>8y5(-(%=kSi#9?LlT4#2j1!$eaPPWK_j}Hg-%nF8w8dF&Y*3*E5hhPD^G^0~r(=I9>$wMw3mSKF)ygSR5>6 z&C&?R99rq`%CyX}jr3!aSu~wWs6BvR02@!DhFMH;Y~bg|&jQ(?Pq1tLuRU59XghqA zCPiBioB}#Iwt=6gEl3+NPvd|9OFEu=jMM+Wb!2!LCBjEKm03w8pe-)pZ<$I3P=L%n9LPDE> zryq|nV2_JKCjw4|0O31_XSUZhf#ie)@XrDAm*Z2@19-#$*L-jhRD5DR%n8U@5U2a2 z1bXf9GuAgbTwEM6N|~ylZc(Y!Wb#JASS6X-M5P{52cFt)h!B1{-pf^3{I<;8zD1ps zo)$6jx}`ZLPyJI|{b-Vee#V#3Sba~=yMBS4)%mHAtN;1Sou{Za==Llw1SC}~7%yVj zeL74+bLz}L^n#npy#MAeX@^G+t}Hw(rcRn!HxB3UId`!oal_F1al;3YEdG84JDCuF z>}dL->b(+Vd_13i9a)21e)nwI;J-^JNF}8hO^;cKIYBV5zU1&TS$xPq z!tOufwy2!Dg`}5N%admf6sn}FfHF&`%y<6Yi>l^jXGue5-b*x6C!mgJsbPwk9$cMiSogR)JNBB69 z=YP9j-&CrOE6r1u${i3S-W3mszDis zawYwdK7(B1ke-^rdLeSloeLqE9RGRSwCv}%OP5;)_n20Ou|{)m{*t&NE@G^s*meIP zu?`6fS}e`Vw=8~c6XN0R{BK_`M?!hjRNj>mrYm|-eiO+qm2G;~JeP#Pw5nyL6-xFY z_U7H4-fKc!aZmMx>U0Vw7B**PSgfq#z@f zvJZZUj}P(wC*Pdxle`qCB3scLB5Y=gg&;*XDDR9dNmV+Q4zQ}#!MhSd9gO*1czU5 zX=K%vwlG<&$m$pDQ5HC8uQxSNYt;))ImxmjO0R{&&bK=)>N-|+kDm!%H(-6moS$)F z(_y`UVbVUAZqs!8pPSzt+@~K|%GzSyd0T9kyzvS<99Txc8Eg)s5Gj%ZXGKdR0)n;V zdr88+?3jjF$AtI>h>wAR-|{~u@{4>#J*u#yP_xG@GvVE9UCk>PzK_3F6zk2+Z?sO_ z>rAKY(x;6P^w1UZc5l?wVAEDtK7I#+63!2>z!5KS`)`jayF5mEVbG9tWXIB?-Xra&V;%az zcMTmx?c{2^8DU&q&MzvD{_IhyMtY=gT3>bX`=^04ae zaH^a_#v9I|RyaKztU1Czc~&P8yDV?M>G`E%Tl%LtfYH71_wV=#z6yEcpbE@Nf9>sGbUuW)PpY3#R_XHTaobL0`vX@Q#l9IL9D>Gu4YJev^+#k}N;LqcR z4^P!*-}7G`^}S*9_lQTlag_wp15= zNost^n=IZQ1BVvGH20gjG(tA0%RjfNWs+Z4 zUnX}Lo=(Hg)JRr7mM}_Em+dDES-Y^f5$L{bbnxNbUIZ&H8W*!z6O>V$lD1Us^TS&o z-&eAf6wmKkRjo{I>k09P2YDTcjb2Nrzw<-r(m_Cm%iAZBcvpYZvqU97DE3Cw(@@1aiNuM0tGr*Mf+(_c4Adj9!LolDJhdATi^2LoNnK;hQ~=yr4lWqESe%dLc5NTL~;@FZqX7< lE~Zm Date: Wed, 19 Dec 2012 16:13:17 -0500 Subject: [PATCH 014/437] Fix links for Software as a Service courses --- .../press_releases/Spring_2013_course_announcements.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lms/templates/static_templates/press_releases/Spring_2013_course_announcements.html b/lms/templates/static_templates/press_releases/Spring_2013_course_announcements.html index 7c1b82727b..19efa21dba 100644 --- a/lms/templates/static_templates/press_releases/Spring_2013_course_announcements.html +++ b/lms/templates/static_templates/press_releases/Spring_2013_course_announcements.html @@ -38,7 +38,7 @@

“I'm delighted to have my Justice course on edX,” said Michael Sandel, Ann T. and Robert M. Bass Professor of Government at Harvard University, “where students everywhere will be able to engage in a global dialogue about the big moral and civic questions of our time.”

-

In addition to these new courses, edX is bringing back several courses from the popular fall 2012 semester: Introduction to Computer Science and Programming; Introduction to Solid State Chemistry; Introduction to Artificial Intelligence; Software as a Service I; Software as a Service II; Foundations of Computer Graphics.

+

In addition to these new courses, edX is bringing back several courses from the popular fall 2012 semester: Introduction to Computer Science and Programming; Introduction to Solid State Chemistry; Introduction to Artificial Intelligence; Software as a Service I; Software as a Service II; Foundations of Computer Graphics.

This spring also features Harvard's Copyright, taught by Harvard Law School professor William Fisher III, former law clerk to Justice Thurgood Marshall and expert on the hotly debated U.S. copyright system, which will explore the current law of copyright and the ongoing debates concerning how that law should be reformed. Copyright will be offered as an experimental course, taking advantage of different combinations and uses of teaching materials, educational technologies, and the edX platform. 500 learners will be selected through an open application process that begins in late January 2013.

From 4d137446227b0b8f68592c65d1a4b4568f479795 Mon Sep 17 00:00:00 2001 From: Brian Talbot Date: Wed, 19 Dec 2012 16:21:37 -0500 Subject: [PATCH 015/437] added new visual status to course listings on edx.org --- lms/static/sass/shared/_course_object.scss | 25 ++++++++++++++++++++++ lms/templates/course.html | 1 + 2 files changed, 26 insertions(+) diff --git a/lms/static/sass/shared/_course_object.scss b/lms/static/sass/shared/_course_object.scss index 374caf4898..2f6ca88a63 100644 --- a/lms/static/sass/shared/_course_object.scss +++ b/lms/static/sass/shared/_course_object.scss @@ -24,6 +24,31 @@ width: 100%; @include transition(all, 0.15s, linear); + .status { + background: $blue; + color: white; + font-size: 10px; + left: 10px; + padding: 2px 10px; + @include border-radius(2px); + position: absolute; + text-transform: uppercase; + top: -6px; + z-index: 100; + } + + .status:after { + border-bottom: 6px solid shade($blue, 50%); + border-right: 6px solid transparent; + content: ""; + display: block; + height: 0; + position: absolute; + right: -6px; + top: 0; + width: 0; + } + a:hover { text-decoration: none; } diff --git a/lms/templates/course.html b/lms/templates/course.html index 50a00f9d31..7392dfcefa 100644 --- a/lms/templates/course.html +++ b/lms/templates/course.html @@ -5,6 +5,7 @@ %> <%page args="course" />
+ New
From 5d85fab28348319efaef122599ec135ff91cf878 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s=20Rocha?= Date: Wed, 19 Dec 2012 18:48:30 -0500 Subject: [PATCH 016/437] Fix django auth login redirection The django authentication decorator login_required, redirects to settings.LOGIN_URL. If it is missing, it redirects to /accounts/login. We did not have the setting enable, not a proper page where to redirect. This cause users not logged in to see a 404 error when accessing courseware directly, by using a link or a bookmark. [#41499213] --- common/djangoapps/student/views.py | 12 ++++ lms/envs/common.py | 3 + lms/templates/accounts_login.html | 92 ++++++++++++++++++++++++++++++ lms/urls.py | 2 + 4 files changed, 109 insertions(+) create mode 100644 lms/templates/accounts_login.html diff --git a/common/djangoapps/student/views.py b/common/djangoapps/student/views.py index 44877ef597..bcb3b664e7 100644 --- a/common/djangoapps/student/views.py +++ b/common/djangoapps/student/views.py @@ -333,6 +333,18 @@ def change_enrollment(request): return {'success': False, 'error': 'We weren\'t able to unenroll you. Please try again.'} +@ensure_csrf_cookie +def accounts_login(request, error=""): + + return_to = '' + + return render_to_response('accounts_login.html', { + 'error': error, + 'return_to': return_to + }) + + + # Need different levels of logging @ensure_csrf_cookie def login_user(request, error=""): diff --git a/lms/envs/common.py b/lms/envs/common.py index 1b1be28ead..26941f7e01 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -187,6 +187,9 @@ DEBUG_TRACK_LOG = False MITX_ROOT_URL = '' +LOGIN_REDIRECT_URL = MITX_ROOT_URL + '/accounts/login' +LOGIN_URL = MITX_ROOT_URL + '/accounts/login' + COURSE_NAME = "6.002_Spring_2012" COURSE_NUMBER = "6.002x" COURSE_TITLE = "Circuits and Electronics" diff --git a/lms/templates/accounts_login.html b/lms/templates/accounts_login.html new file mode 100644 index 0000000000..011ca643c6 --- /dev/null +++ b/lms/templates/accounts_login.html @@ -0,0 +1,92 @@ +<%! from django.core.urlresolvers import reverse %> +<%inherit file="main.html" /> +<%namespace name='static' file='static_content.html'/> + +<%block name="headextra"> + + + + + + diff --git a/lms/urls.py b/lms/urls.py index 92abdf794b..baa720028b 100644 --- a/lms/urls.py +++ b/lms/urls.py @@ -37,6 +37,8 @@ urlpatterns = ('', url(r'^event$', 'track.views.user_track'), url(r'^t/(?P