Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
e21d750
ImageExplorer MVP implementation & fix under https
Feb 7, 2014
2532d0d
capa-mrq: Added hinting/feedback mechanism for multiple choice proble…
Feb 25, 2014
6f38bcc
Add some optional policies around password resets, such as password r…
Mar 3, 2014
e6f78e0
make GA account code configurable as well as allow GA to appear on co…
Mar 12, 2014
e3ededc
freetext-mrq: Add fork of the mentoring XBlock repository
antoviaque Mar 7, 2014
fd8ff3b
image-explorer: add reference to image-explorer
Mar 12, 2014
bbac54a
drag-drop: add MVP implementation of drag-and-drop xBlock
Mar 24, 2014
5608dd5
Enforce type of the XBlocks Fields when set
FiloSottile Apr 4, 2014
84e96d0
mentoring: Update commit hash (MCQ, MRQ & Free Text Answer changes)
antoviaque Apr 7, 2014
9ee4961
mentoring: Update hash
antoviaque Apr 10, 2014
b12583a
xblock-external-ui: Add XBlock API call to render XBlock views
antoviaque Mar 18, 2014
d80ce3c
Merge pull request #6 from edx-solutions/xblock-external-ui-solutions
antoviaque Apr 11, 2014
a0c036d
mentoring: Update commit hash
antoviaque Apr 11, 2014
fff9d6a
Initial API implementation
Mar 10, 2014
1ddea5d
API_KEY header fix
Apr 15, 2014
834c619
Fixed indentation error
Apr 15, 2014
9f161dd
move api from common to lms
Apr 17, 2014
64a6147
Merge pull request #8 from edx-solutions/cdodge/move-api-home
Apr 17, 2014
92f9023
update hash
Apr 17, 2014
3d1ab71
Merge pull request #9 from edx-solutions/cdodge/update-drag-and-drop-…
antoviaque Apr 17, 2014
21a77a5
mentoring: Update hash
antoviaque Apr 18, 2014
073a08e
image-explorer: Update hash
antoviaque Apr 18, 2014
e2a7b2c
ooyala: Add ooyala XBlock
antoviaque Apr 18, 2014
bcddcd3
Course-Group Relationships
Apr 20, 2014
7c581d0
Merge pull request #10 from edx-solutions/mattdrayer/CLIENT-480
Apr 20, 2014
759898b
wip
Apr 17, 2014
eda70ad
add parsing of overview content blob
Apr 17, 2014
cd121cf
initial implementation
Apr 19, 2014
812b0be
get course updates API method
Apr 20, 2014
e3c38e5
get course static tabs API methods
Apr 20, 2014
f191692
add unit tests
Apr 20, 2014
b8f70ff
fix some merge conflicts and remove some extra print statements picke…
Apr 20, 2014
49d491d
better constrain some of the course url regexs to expect a triple for…
Apr 20, 2014
f59612c
Merge pull request #11 from edx-solutions/cdodge/sprint-H-api-work
Apr 20, 2014
4527a67
add ability to enroll users into courses
Apr 21, 2014
7594277
Merge pull request #12 from edx-solutions/cdodge/course_users_list
Apr 21, 2014
3de3238
wip
Apr 21, 2014
c8e1dbb
add queryable group lists
Apr 22, 2014
e1e473b
Merge pull request #13 from edx-solutions/cdodge/add-group-profile
Apr 22, 2014
07d7754
Merge pull request #14 from edx-solutions/api
Apr 22, 2014
489a3ee
add a GET endpoint to /api/groups/{groupid}/courses to get the list o…
Apr 22, 2014
8fdcce0
Merge pull request #15 from edx-solutions/api
Apr 22, 2014
b87f54a
return the display names when listing all courses in a group (program)
Apr 22, 2014
2366b18
Merge pull request #16 from edx-solutions/api
Apr 22, 2014
a2c044b
create optimized course tree query API endpoint
Apr 22, 2014
1122582
Merge pull request #17 from edx-solutions/api
Apr 22, 2014
16e7ea4
Added Security to session api as requested in #785
ziafazal Apr 21, 2014
5ccd5cb
Storing passoword history of user and validation for user's email and…
ziafazal Apr 23, 2014
460b31a
Moved security tests to lms also
ziafazal Apr 23, 2014
e353f18
add two FEATURE flag overrides to enable the security features
Apr 23, 2014
9292e94
remove unnecessary settings overrides (because they are 'feature flags')
Apr 23, 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 cms/djangoapps/contentstore/views/component.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@
'lti',
'concept',
'openassessment', # edx-ora2
'image_explorer',
] + OPEN_ENDED_COMPONENT_TYPES + NOTE_COMPONENT_TYPES

ADVANCED_COMPONENT_CATEGORY = 'advanced'
Expand Down
3 changes: 3 additions & 0 deletions cms/envs/aws.py
Original file line number Diff line number Diff line change
Expand Up @@ -274,3 +274,6 @@

##### X-Frame-Options response header settings #####
X_FRAME_OPTIONS = ENV_TOKENS.get('X_FRAME_OPTIONS', X_FRAME_OPTIONS)

##### ADVANCED_SECURITY_CONFIG #####
ADVANCED_SECURITY_CONFIG = ENV_TOKENS.get('ADVANCED_SECURITY_CONFIG', {})
8 changes: 8 additions & 0 deletions cms/envs/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,9 @@

# Prevent concurrent logins per user
'PREVENT_CONCURRENT_LOGINS': False,

# Turn off Advanced Security by default
'ADVANCED_SECURITY': False,
}
ENABLE_JASMINE = False

Expand Down Expand Up @@ -566,6 +569,7 @@
'openassessment.xblock'
)


for app_name in OPTIONAL_APPS:
# First attempt to only find the module rather than actually importing it,
# to avoid circular references - only try to import if it can't be found
Expand All @@ -578,3 +582,7 @@
except ImportError:
continue
INSTALLED_APPS += (app_name,)

### ADVANCED_SECURITY_CONFIG
# Empty by default
ADVANCED_SECURITY_CONFIG = {}
10 changes: 10 additions & 0 deletions cms/lib/xblock/mixin.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
"""

import datetime
import time

from xblock.fields import Scope, Field, Integer, XBlockMixin

Expand All @@ -20,6 +21,15 @@ def to_json(self, value):

return list(value.timetuple())

def enforce_type(self, value):
if isinstance(value, datetime.datetime) or value is None:
return value

if isinstance(value, tuple, time.struct_time):
return self.from_json(DateTuple)

raise TypeError("Value should be datetime, a timetuple or None, not {}".format(type(value)))


class CmsBlockMixin(XBlockMixin):
"""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,8 @@ def backwards(self, orm):
},
'student.userprofile': {
'Meta': {'object_name': 'UserProfile', 'db_table': "'auth_userprofile'"},
'city': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'country': ('django_countries.fields.CountryField', [], {'max_length': '2', 'null': 'True', 'blank': 'True'}),
'allow_certificate': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'courseware': ('django.db.models.fields.CharField', [], {'default': "'course.xml'", 'max_length': '255', 'blank': 'True'}),
'gender': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '6', 'null': 'True', 'blank': 'True'}),
Expand Down Expand Up @@ -144,4 +146,4 @@ def backwards(self, orm):
}
}

complete_apps = ['student']
complete_apps = ['student']
156 changes: 156 additions & 0 deletions common/djangoapps/student/migrations/0033_auto__add_passwordhistory.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
# -*- coding: utf-8 -*-
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models


class Migration(SchemaMigration):

def forwards(self, orm):
# Adding model 'PasswordHistory'
db.create_table('student_passwordhistory', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])),
('password', self.gf('django.db.models.fields.CharField')(max_length=128)),
('time_set', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)),
))
db.send_create_signal('student', ['PasswordHistory'])


def backwards(self, orm):
# Deleting model 'PasswordHistory'
db.delete_table('student_passwordhistory')


models = {
'auth.group': {
'Meta': {'object_name': 'Group'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
'auth.permission': {
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'student.anonymoususerid': {
'Meta': {'object_name': 'AnonymousUserId'},
'anonymous_user_id': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '32'}),
'course_id': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
},
'student.courseenrollment': {
'Meta': {'ordering': "('user', 'course_id')", 'unique_together': "(('user', 'course_id'),)", 'object_name': 'CourseEnrollment'},
'course_id': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'db_index': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'mode': ('django.db.models.fields.CharField', [], {'default': "'honor'", 'max_length': '100'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
},
'student.courseenrollmentallowed': {
'Meta': {'unique_together': "(('email', 'course_id'),)", 'object_name': 'CourseEnrollmentAllowed'},
'auto_enroll': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'course_id': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'db_index': 'True', 'blank': 'True'}),
'email': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
},
'student.loginfailures': {
'Meta': {'object_name': 'LoginFailures'},
'failure_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'lockout_until': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
},
'student.passwordhistory': {
'Meta': {'object_name': 'PasswordHistory'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'time_set': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
},
'student.pendingemailchange': {
'Meta': {'object_name': 'PendingEmailChange'},
'activation_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '32', 'db_index': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'new_email': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '255', 'blank': 'True'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'})
},
'student.pendingnamechange': {
'Meta': {'object_name': 'PendingNameChange'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'new_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'rationale': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'})
},
'student.registration': {
'Meta': {'object_name': 'Registration', 'db_table': "'auth_registration'"},
'activation_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '32', 'db_index': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'unique': 'True'})
},
'student.userprofile': {
'Meta': {'object_name': 'UserProfile', 'db_table': "'auth_userprofile'"},
'allow_certificate': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'city': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'country': ('django_countries.fields.CountryField', [], {'max_length': '2', 'null': 'True', 'blank': 'True'}),
'courseware': ('django.db.models.fields.CharField', [], {'default': "'course.xml'", 'max_length': '255', 'blank': 'True'}),
'gender': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '6', 'null': 'True', 'blank': 'True'}),
'goals': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'language': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '255', 'blank': 'True'}),
'level_of_education': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '6', 'null': 'True', 'blank': 'True'}),
'location': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '255', 'blank': 'True'}),
'mailing_address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'meta': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '255', 'blank': 'True'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'profile'", 'unique': 'True', 'to': "orm['auth.User']"}),
'year_of_birth': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'})
},
'student.userstanding': {
'Meta': {'object_name': 'UserStanding'},
'account_status': ('django.db.models.fields.CharField', [], {'max_length': '31', 'blank': 'True'}),
'changed_by': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'standing_last_changed_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'standing'", 'unique': 'True', 'to': "orm['auth.User']"})
},
'student.usertestgroup': {
'Meta': {'object_name': 'UserTestGroup'},
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '32', 'db_index': 'True'}),
'users': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.User']", 'db_index': 'True', 'symmetrical': 'False'})
}
}

complete_apps = ['student']
Loading