Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
E
edx-platform
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
edx-platform
Commits
36e31e10
Commit
36e31e10
authored
Jul 01, 2015
by
Ahsan Ulhaq
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #8687 from edx/ahsan/ECOM-1782-Order-Credit-Eligibility-line-items-progress-page
Order of Credit Eligibility line items
parents
1ee3094d
7787974d
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
194 additions
and
38 deletions
+194
-38
lms/djangoapps/courseware/tests/test_submitting_problems.py
+1
-1
lms/djangoapps/courseware/views.py
+1
-6
lms/templates/courseware/progress.html
+1
-3
openedx/core/djangoapps/credit/api.py
+6
-2
openedx/core/djangoapps/credit/migrations/0011_auto__add_field_creditrequirement_order.py
+154
-0
openedx/core/djangoapps/credit/models.py
+7
-2
openedx/core/djangoapps/credit/tasks.py
+3
-3
openedx/core/djangoapps/credit/tests/test_api.py
+14
-14
openedx/core/djangoapps/credit/tests/test_models.py
+6
-6
openedx/core/djangoapps/credit/tests/test_signals.py
+1
-1
No files found.
lms/djangoapps/courseware/tests/test_submitting_problems.py
View file @
36e31e10
...
@@ -627,7 +627,7 @@ class TestCourseGrader(TestSubmittingProblems):
...
@@ -627,7 +627,7 @@ class TestCourseGrader(TestSubmittingProblems):
"namespace"
:
"grade"
,
"namespace"
:
"grade"
,
"name"
:
"grade"
,
"name"
:
"grade"
,
"display_name"
:
"Grade"
,
"display_name"
:
"Grade"
,
"criteria"
:
{
"min_grade"
:
0.52
}
"criteria"
:
{
"min_grade"
:
0.52
}
,
}]
}]
# Add a single credit requirement (final grade)
# Add a single credit requirement (final grade)
set_credit_requirements
(
self
.
course
.
id
,
requirements
)
set_credit_requirements
(
self
.
course
.
id
,
requirements
)
...
...
lms/djangoapps/courseware/views.py
View file @
36e31e10
...
@@ -1153,14 +1153,9 @@ def _credit_course_requirements(course_key, student):
...
@@ -1153,14 +1153,9 @@ def _credit_course_requirements(course_key, student):
else
:
else
:
eligibility_status
=
"partial_eligible"
eligibility_status
=
"partial_eligible"
paired_requirements
=
{}
for
requirement
in
requirement_statuses
:
namespace
=
requirement
.
pop
(
"namespace"
)
paired_requirements
.
setdefault
(
namespace
,
[])
.
append
(
requirement
)
return
{
return
{
'eligibility_status'
:
eligibility_status
,
'eligibility_status'
:
eligibility_status
,
'requirements'
:
OrderedDict
(
sorted
(
paired_requirements
.
items
(),
reverse
=
True
))
'requirements'
:
requirement_statuses
,
}
}
...
...
lms/templates/courseware/progress.html
View file @
36e31e10
...
@@ -120,8 +120,7 @@ from django.utils.http import urlquote_plus
...
@@ -120,8 +120,7 @@ from django.utils.http import urlquote_plus
%endif
%endif
<button
class=
"credit-help"
><i
class=
"fa fa-question"
></i><span
class=
"sr"
>
Help regarding credit requirement
</span></button><br>
<button
class=
"credit-help"
><i
class=
"fa fa-question"
></i><span
class=
"sr"
>
Help regarding credit requirement
</span></button><br>
<div
class=
"requirement-container"
data-eligible=
"${credit_course_requirements['eligibility_status']}"
>
<div
class=
"requirement-container"
data-eligible=
"${credit_course_requirements['eligibility_status']}"
>
%for namespace in credit_course_requirements['requirements']:
%for requirement in credit_course_requirements['requirements']:
%for requirement in credit_course_requirements['requirements'][namespace]:
<div
class=
"requirement"
>
<div
class=
"requirement"
>
<div
class=
"requirement-name"
>
${_(requirement['display_name'])}
</div>
<div
class=
"requirement-name"
>
${_(requirement['display_name'])}
</div>
<div
class=
"requirement-status"
>
<div
class=
"requirement-status"
>
...
@@ -141,7 +140,6 @@ from django.utils.http import urlquote_plus
...
@@ -141,7 +140,6 @@ from django.utils.http import urlquote_plus
</div>
</div>
</div>
</div>
%endfor
%endfor
%endfor
</div>
</div>
<button
class=
"detail-collapse"
aria-live=
"polite"
><i
class=
"fa fa-caret-up"
></i>
<button
class=
"detail-collapse"
aria-live=
"polite"
><i
class=
"fa fa-caret-up"
></i>
<span
class=
"requirement-detail"
>
${_("Less")}
</span>
<span
class=
"requirement-detail"
>
${_("Less")}
</span>
...
...
openedx/core/djangoapps/credit/api.py
View file @
36e31e10
...
@@ -92,8 +92,9 @@ def set_credit_requirements(course_key, requirements):
...
@@ -92,8 +92,9 @@ def set_credit_requirements(course_key, requirements):
if
requirements_to_disable
:
if
requirements_to_disable
:
CreditRequirement
.
disable_credit_requirements
(
requirements_to_disable
)
CreditRequirement
.
disable_credit_requirements
(
requirements_to_disable
)
for
requirement
in
requirements
:
# update requirement with new order
CreditRequirement
.
add_or_update_course_requirement
(
credit_course
,
requirement
)
for
order
,
requirement
in
enumerate
(
requirements
):
CreditRequirement
.
add_or_update_course_requirement
(
credit_course
,
requirement
,
order
)
def
get_credit_requirements
(
course_key
,
namespace
=
None
):
def
get_credit_requirements
(
course_key
,
namespace
=
None
):
...
@@ -427,6 +428,7 @@ def get_credit_requirement_status(course_key, username, namespace=None, name=Non
...
@@ -427,6 +428,7 @@ def get_credit_requirement_status(course_key, username, namespace=None, name=Non
"display_name": "In Course Reverification",
"display_name": "In Course Reverification",
"criteria": {},
"criteria": {},
"status": "failed",
"status": "failed",
"status_date": "2015-06-26 07:49:13",
},
},
{
{
"namespace": "proctored_exam",
"namespace": "proctored_exam",
...
@@ -434,6 +436,7 @@ def get_credit_requirement_status(course_key, username, namespace=None, name=Non
...
@@ -434,6 +436,7 @@ def get_credit_requirement_status(course_key, username, namespace=None, name=Non
"display_name": "Proctored Mid Term Exam",
"display_name": "Proctored Mid Term Exam",
"criteria": {},
"criteria": {},
"status": "satisfied",
"status": "satisfied",
"status_date": "2015-06-26 11:07:42",
},
},
{
{
"namespace": "grade",
"namespace": "grade",
...
@@ -441,6 +444,7 @@ def get_credit_requirement_status(course_key, username, namespace=None, name=Non
...
@@ -441,6 +444,7 @@ def get_credit_requirement_status(course_key, username, namespace=None, name=Non
"display_name": "Minimum Passing Grade",
"display_name": "Minimum Passing Grade",
"criteria": {"min_grade": 0.8},
"criteria": {"min_grade": 0.8},
"status": "failed",
"status": "failed",
"status_date": "2015-06-26 11:07:44",
},
},
]
]
...
...
openedx/core/djangoapps/credit/migrations/0011_auto__add_field_creditrequirement_order.py
0 → 100644
View file @
36e31e10
# -*- coding: utf-8 -*-
from
south.utils
import
datetime_utils
as
datetime
from
south.db
import
db
from
south.v2
import
SchemaMigration
from
django.db
import
models
class
Migration
(
SchemaMigration
):
def
forwards
(
self
,
orm
):
# Adding field 'CreditRequirement.order'
db
.
add_column
(
'credit_creditrequirement'
,
'order'
,
self
.
gf
(
'django.db.models.fields.PositiveIntegerField'
)(
default
=
0
),
keep_default
=
False
)
def
backwards
(
self
,
orm
):
# Deleting field 'CreditRequirement.order'
db
.
delete_column
(
'credit_creditrequirement'
,
'order'
)
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'
})
},
'credit.creditcourse'
:
{
'Meta'
:
{
'object_name'
:
'CreditCourse'
},
'course_key'
:
(
'xmodule_django.models.CourseKeyField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'255'
,
'db_index'
:
'True'
}),
'enabled'
:
(
'django.db.models.fields.BooleanField'
,
[],
{
'default'
:
'False'
}),
'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'providers'
:
(
'django.db.models.fields.related.ManyToManyField'
,
[],
{
'to'
:
"orm['credit.CreditProvider']"
,
'symmetrical'
:
'False'
})
},
'credit.crediteligibility'
:
{
'Meta'
:
{
'unique_together'
:
"(('username', 'course'),)"
,
'object_name'
:
'CreditEligibility'
},
'course'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'related_name'
:
"'eligibilities'"
,
'to'
:
"orm['credit.CreditCourse']"
}),
'created'
:
(
'model_utils.fields.AutoCreatedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'modified'
:
(
'model_utils.fields.AutoLastModifiedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'username'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'255'
,
'db_index'
:
'True'
})
},
'credit.creditprovider'
:
{
'Meta'
:
{
'object_name'
:
'CreditProvider'
},
'active'
:
(
'django.db.models.fields.BooleanField'
,
[],
{
'default'
:
'True'
}),
'created'
:
(
'model_utils.fields.AutoCreatedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'display_name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'255'
}),
'eligibility_duration'
:
(
'django.db.models.fields.PositiveIntegerField'
,
[],
{
'default'
:
'31556970'
}),
'enable_integration'
:
(
'django.db.models.fields.BooleanField'
,
[],
{
'default'
:
'False'
}),
'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'modified'
:
(
'model_utils.fields.AutoLastModifiedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'provider_id'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'255'
}),
'provider_url'
:
(
'django.db.models.fields.URLField'
,
[],
{
'default'
:
"''"
,
'max_length'
:
'200'
})
},
'credit.creditrequest'
:
{
'Meta'
:
{
'unique_together'
:
"(('username', 'course', 'provider'),)"
,
'object_name'
:
'CreditRequest'
},
'course'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'related_name'
:
"'credit_requests'"
,
'to'
:
"orm['credit.CreditCourse']"
}),
'created'
:
(
'model_utils.fields.AutoCreatedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'modified'
:
(
'model_utils.fields.AutoLastModifiedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'parameters'
:
(
'jsonfield.fields.JSONField'
,
[],
{}),
'provider'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'related_name'
:
"'credit_requests'"
,
'to'
:
"orm['credit.CreditProvider']"
}),
'status'
:
(
'django.db.models.fields.CharField'
,
[],
{
'default'
:
"'pending'"
,
'max_length'
:
'255'
}),
'username'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'255'
,
'db_index'
:
'True'
}),
'uuid'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'32'
,
'db_index'
:
'True'
})
},
'credit.creditrequirement'
:
{
'Meta'
:
{
'unique_together'
:
"(('namespace', 'name', 'course'),)"
,
'object_name'
:
'CreditRequirement'
},
'active'
:
(
'django.db.models.fields.BooleanField'
,
[],
{
'default'
:
'True'
}),
'course'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'related_name'
:
"'credit_requirements'"
,
'to'
:
"orm['credit.CreditCourse']"
}),
'created'
:
(
'model_utils.fields.AutoCreatedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'criteria'
:
(
'jsonfield.fields.JSONField'
,
[],
{}),
'display_name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'default'
:
"''"
,
'max_length'
:
'255'
}),
'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'modified'
:
(
'model_utils.fields.AutoLastModifiedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'255'
}),
'namespace'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'255'
}),
'order'
:
(
'django.db.models.fields.PositiveIntegerField'
,
[],
{
'default'
:
'0'
})
},
'credit.creditrequirementstatus'
:
{
'Meta'
:
{
'unique_together'
:
"(('username', 'requirement'),)"
,
'object_name'
:
'CreditRequirementStatus'
},
'created'
:
(
'model_utils.fields.AutoCreatedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'modified'
:
(
'model_utils.fields.AutoLastModifiedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'reason'
:
(
'jsonfield.fields.JSONField'
,
[],
{
'default'
:
'{}'
}),
'requirement'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'related_name'
:
"'statuses'"
,
'to'
:
"orm['credit.CreditRequirement']"
}),
'status'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'32'
}),
'username'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'255'
,
'db_index'
:
'True'
})
},
'credit.historicalcreditrequest'
:
{
'Meta'
:
{
'ordering'
:
"(u'-history_date', u'-history_id')"
,
'object_name'
:
'HistoricalCreditRequest'
},
'course'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'blank'
:
'True'
,
'related_name'
:
"u'+'"
,
'null'
:
'True'
,
'on_delete'
:
'models.DO_NOTHING'
,
'to'
:
"orm['credit.CreditCourse']"
}),
'created'
:
(
'model_utils.fields.AutoCreatedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
u'history_date'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{}),
u'history_id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
u'history_type'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'1'
}),
u'history_user'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'related_name'
:
"u'+'"
,
'null'
:
'True'
,
'on_delete'
:
'models.SET_NULL'
,
'to'
:
"orm['auth.User']"
}),
'id'
:
(
'django.db.models.fields.IntegerField'
,
[],
{
'db_index'
:
'True'
,
'blank'
:
'True'
}),
'modified'
:
(
'model_utils.fields.AutoLastModifiedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'parameters'
:
(
'jsonfield.fields.JSONField'
,
[],
{}),
'provider'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'blank'
:
'True'
,
'related_name'
:
"u'+'"
,
'null'
:
'True'
,
'on_delete'
:
'models.DO_NOTHING'
,
'to'
:
"orm['credit.CreditProvider']"
}),
'status'
:
(
'django.db.models.fields.CharField'
,
[],
{
'default'
:
"'pending'"
,
'max_length'
:
'255'
}),
'username'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'255'
,
'db_index'
:
'True'
}),
'uuid'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'32'
,
'db_index'
:
'True'
})
},
'credit.historicalcreditrequirementstatus'
:
{
'Meta'
:
{
'ordering'
:
"(u'-history_date', u'-history_id')"
,
'object_name'
:
'HistoricalCreditRequirementStatus'
},
'created'
:
(
'model_utils.fields.AutoCreatedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
u'history_date'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{}),
u'history_id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
u'history_type'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'1'
}),
u'history_user'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'related_name'
:
"u'+'"
,
'null'
:
'True'
,
'on_delete'
:
'models.SET_NULL'
,
'to'
:
"orm['auth.User']"
}),
'id'
:
(
'django.db.models.fields.IntegerField'
,
[],
{
'db_index'
:
'True'
,
'blank'
:
'True'
}),
'modified'
:
(
'model_utils.fields.AutoLastModifiedField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'reason'
:
(
'jsonfield.fields.JSONField'
,
[],
{
'default'
:
'{}'
}),
'requirement'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'blank'
:
'True'
,
'related_name'
:
"u'+'"
,
'null'
:
'True'
,
'on_delete'
:
'models.DO_NOTHING'
,
'to'
:
"orm['credit.CreditRequirement']"
}),
'status'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'32'
}),
'username'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'255'
,
'db_index'
:
'True'
})
}
}
complete_apps
=
[
'credit'
]
\ No newline at end of file
openedx/core/djangoapps/credit/models.py
View file @
36e31e10
...
@@ -142,6 +142,7 @@ class CreditRequirement(TimeStampedModel):
...
@@ -142,6 +142,7 @@ class CreditRequirement(TimeStampedModel):
namespace
=
models
.
CharField
(
max_length
=
255
)
namespace
=
models
.
CharField
(
max_length
=
255
)
name
=
models
.
CharField
(
max_length
=
255
)
name
=
models
.
CharField
(
max_length
=
255
)
display_name
=
models
.
CharField
(
max_length
=
255
,
default
=
""
)
display_name
=
models
.
CharField
(
max_length
=
255
,
default
=
""
)
order
=
models
.
PositiveIntegerField
(
default
=
0
)
criteria
=
JSONField
()
criteria
=
JSONField
()
active
=
models
.
BooleanField
(
default
=
True
)
active
=
models
.
BooleanField
(
default
=
True
)
...
@@ -152,7 +153,7 @@ class CreditRequirement(TimeStampedModel):
...
@@ -152,7 +153,7 @@ class CreditRequirement(TimeStampedModel):
unique_together
=
(
'namespace'
,
'name'
,
'course'
)
unique_together
=
(
'namespace'
,
'name'
,
'course'
)
@classmethod
@classmethod
def
add_or_update_course_requirement
(
cls
,
credit_course
,
requirement
):
def
add_or_update_course_requirement
(
cls
,
credit_course
,
requirement
,
order
):
"""
"""
Add requirement to a given course.
Add requirement to a given course.
...
@@ -171,12 +172,15 @@ class CreditRequirement(TimeStampedModel):
...
@@ -171,12 +172,15 @@ class CreditRequirement(TimeStampedModel):
defaults
=
{
defaults
=
{
"display_name"
:
requirement
[
"display_name"
],
"display_name"
:
requirement
[
"display_name"
],
"criteria"
:
requirement
[
"criteria"
],
"criteria"
:
requirement
[
"criteria"
],
"order"
:
order
,
"active"
:
True
"active"
:
True
}
}
)
)
if
not
created
:
if
not
created
:
credit_requirement
.
criteria
=
requirement
[
"criteria"
]
credit_requirement
.
criteria
=
requirement
[
"criteria"
]
credit_requirement
.
active
=
True
credit_requirement
.
active
=
True
credit_requirement
.
order
=
order
credit_requirement
.
display_name
=
requirement
[
"display_name"
]
credit_requirement
.
save
()
credit_requirement
.
save
()
return
credit_requirement
,
created
return
credit_requirement
,
created
...
@@ -197,7 +201,8 @@ class CreditRequirement(TimeStampedModel):
...
@@ -197,7 +201,8 @@ class CreditRequirement(TimeStampedModel):
QuerySet of CreditRequirement model
QuerySet of CreditRequirement model
"""
"""
requirements
=
CreditRequirement
.
objects
.
filter
(
course__course_key
=
course_key
,
active
=
True
)
# order credit requirements according to their appearance in courseware
requirements
=
CreditRequirement
.
objects
.
filter
(
course__course_key
=
course_key
,
active
=
True
)
.
order_by
(
"-order"
)
if
namespace
is
not
None
:
if
namespace
is
not
None
:
requirements
=
requirements
.
filter
(
namespace
=
namespace
)
requirements
=
requirements
.
filter
(
namespace
=
namespace
)
...
...
openedx/core/djangoapps/credit/tasks.py
View file @
36e31e10
...
@@ -59,7 +59,7 @@ def _get_course_credit_requirements(course):
...
@@ -59,7 +59,7 @@ def _get_course_credit_requirements(course):
"""
"""
credit_xblock_requirements
=
_get_credit_course_requirement_xblocks
(
course
)
credit_xblock_requirements
=
_get_credit_course_requirement_xblocks
(
course
)
min_grade_requirement
=
_get_min_grade_requirement
(
course
)
min_grade_requirement
=
_get_min_grade_requirement
(
course
)
credit_requirements
=
credit_xblock_requirements
+
min_grade_requirement
credit_requirements
=
min_grade_requirement
+
credit_xblock_requirements
return
credit_requirements
return
credit_requirements
...
@@ -85,7 +85,7 @@ def _get_min_grade_requirement(course):
...
@@ -85,7 +85,7 @@ def _get_min_grade_requirement(course):
"display_name"
:
"Grade"
,
"display_name"
:
"Grade"
,
"criteria"
:
{
"criteria"
:
{
"min_grade"
:
getattr
(
course
,
"minimum_grade_credit"
)
"min_grade"
:
getattr
(
course
,
"minimum_grade_credit"
)
}
}
,
}
}
]
]
except
AttributeError
:
except
AttributeError
:
...
@@ -113,7 +113,7 @@ def _get_credit_course_requirement_xblocks(course): # pylint: disable=invalid-n
...
@@ -113,7 +113,7 @@ def _get_credit_course_requirement_xblocks(course): # pylint: disable=invalid-n
"namespace"
:
curr_block
.
get_credit_requirement_namespace
(),
"namespace"
:
curr_block
.
get_credit_requirement_namespace
(),
"name"
:
curr_block
.
get_credit_requirement_name
(),
"name"
:
curr_block
.
get_credit_requirement_name
(),
"display_name"
:
curr_block
.
get_credit_requirement_display_name
(),
"display_name"
:
curr_block
.
get_credit_requirement_display_name
(),
"criteria"
:
""
"criteria"
:
""
,
}
}
requirements_blocks
.
append
(
block
)
requirements_blocks
.
append
(
block
)
...
...
openedx/core/djangoapps/credit/tests/test_api.py
View file @
36e31e10
...
@@ -118,7 +118,7 @@ class CreditRequirementApiTests(CreditApiTestBase):
...
@@ -118,7 +118,7 @@ class CreditRequirementApiTests(CreditApiTestBase):
"namespace"
:
"grade"
,
"namespace"
:
"grade"
,
"name"
:
"grade"
,
"name"
:
"grade"
,
"display_name"
:
"Grade"
,
"display_name"
:
"Grade"
,
"criteria"
:
{}
"criteria"
:
{}
,
}
}
]
]
with
self
.
assertRaises
(
InvalidCreditCourse
):
with
self
.
assertRaises
(
InvalidCreditCourse
):
...
@@ -138,7 +138,7 @@ class CreditRequirementApiTests(CreditApiTestBase):
...
@@ -138,7 +138,7 @@ class CreditRequirementApiTests(CreditApiTestBase):
"display_name"
:
"Grade"
,
"display_name"
:
"Grade"
,
"criteria"
:
{
"criteria"
:
{
"min_grade"
:
0.8
"min_grade"
:
0.8
}
}
,
},
},
{
{
"namespace"
:
"grade"
,
"namespace"
:
"grade"
,
...
@@ -146,7 +146,7 @@ class CreditRequirementApiTests(CreditApiTestBase):
...
@@ -146,7 +146,7 @@ class CreditRequirementApiTests(CreditApiTestBase):
"display_name"
:
"Grade"
,
"display_name"
:
"Grade"
,
"criteria"
:
{
"criteria"
:
{
"min_grade"
:
0.9
"min_grade"
:
0.9
}
}
,
}
}
]
]
api
.
set_credit_requirements
(
self
.
course_key
,
requirements
)
api
.
set_credit_requirements
(
self
.
course_key
,
requirements
)
...
@@ -161,7 +161,7 @@ class CreditRequirementApiTests(CreditApiTestBase):
...
@@ -161,7 +161,7 @@ class CreditRequirementApiTests(CreditApiTestBase):
"namespace"
:
"reverification"
,
"namespace"
:
"reverification"
,
"name"
:
"midterm"
,
"name"
:
"midterm"
,
"display_name"
:
"Midterm"
,
"display_name"
:
"Midterm"
,
"criteria"
:
{}
"criteria"
:
{}
,
},
},
{
{
"namespace"
:
"grade"
,
"namespace"
:
"grade"
,
...
@@ -169,7 +169,7 @@ class CreditRequirementApiTests(CreditApiTestBase):
...
@@ -169,7 +169,7 @@ class CreditRequirementApiTests(CreditApiTestBase):
"display_name"
:
"Grade"
,
"display_name"
:
"Grade"
,
"criteria"
:
{
"criteria"
:
{
"min_grade"
:
0.8
"min_grade"
:
0.8
}
}
,
}
}
]
]
api
.
set_credit_requirements
(
self
.
course_key
,
requirements
)
api
.
set_credit_requirements
(
self
.
course_key
,
requirements
)
...
@@ -191,7 +191,7 @@ class CreditRequirementApiTests(CreditApiTestBase):
...
@@ -191,7 +191,7 @@ class CreditRequirementApiTests(CreditApiTestBase):
"display_name"
:
"Grade"
,
"display_name"
:
"Grade"
,
"criteria"
:
{
"criteria"
:
{
"min_grade"
:
0.8
"min_grade"
:
0.8
}
}
,
}
}
]
]
api
.
set_credit_requirements
(
self
.
course_key
,
requirements
)
api
.
set_credit_requirements
(
self
.
course_key
,
requirements
)
...
@@ -202,7 +202,7 @@ class CreditRequirementApiTests(CreditApiTestBase):
...
@@ -202,7 +202,7 @@ class CreditRequirementApiTests(CreditApiTestBase):
"namespace"
:
"reverification"
,
"namespace"
:
"reverification"
,
"name"
:
"i4x://edX/DemoX/edx-reverification-block/assessment_uuid"
,
"name"
:
"i4x://edX/DemoX/edx-reverification-block/assessment_uuid"
,
"display_name"
:
"Assessment 1"
,
"display_name"
:
"Assessment 1"
,
"criteria"
:
{}
"criteria"
:
{}
,
}
}
]
]
api
.
set_credit_requirements
(
self
.
course_key
,
requirements
)
api
.
set_credit_requirements
(
self
.
course_key
,
requirements
)
...
@@ -232,7 +232,7 @@ class CreditRequirementApiTests(CreditApiTestBase):
...
@@ -232,7 +232,7 @@ class CreditRequirementApiTests(CreditApiTestBase):
"display_name"
:
"Grade"
,
"display_name"
:
"Grade"
,
"criteria"
:
{
"criteria"
:
{
"min_grade"
:
0.8
"min_grade"
:
0.8
}
}
,
}
}
]
]
requirement
=
api
.
get_credit_requirement
(
self
.
course_key
,
"grade"
,
"grade"
)
requirement
=
api
.
get_credit_requirement
(
self
.
course_key
,
"grade"
,
"grade"
)
...
@@ -261,13 +261,13 @@ class CreditRequirementApiTests(CreditApiTestBase):
...
@@ -261,13 +261,13 @@ class CreditRequirementApiTests(CreditApiTestBase):
"display_name"
:
"Grade"
,
"display_name"
:
"Grade"
,
"criteria"
:
{
"criteria"
:
{
"min_grade"
:
0.8
"min_grade"
:
0.8
}
}
,
},
},
{
{
"namespace"
:
"reverification"
,
"namespace"
:
"reverification"
,
"name"
:
"i4x://edX/DemoX/edx-reverification-block/assessment_uuid"
,
"name"
:
"i4x://edX/DemoX/edx-reverification-block/assessment_uuid"
,
"display_name"
:
"Assessment 1"
,
"display_name"
:
"Assessment 1"
,
"criteria"
:
{}
"criteria"
:
{}
,
}
}
]
]
...
@@ -299,13 +299,13 @@ class CreditRequirementApiTests(CreditApiTestBase):
...
@@ -299,13 +299,13 @@ class CreditRequirementApiTests(CreditApiTestBase):
"display_name"
:
"Grade"
,
"display_name"
:
"Grade"
,
"criteria"
:
{
"criteria"
:
{
"min_grade"
:
0.8
"min_grade"
:
0.8
}
}
,
},
},
{
{
"namespace"
:
"reverification"
,
"namespace"
:
"reverification"
,
"name"
:
"i4x://edX/DemoX/edx-reverification-block/assessment_uuid"
,
"name"
:
"i4x://edX/DemoX/edx-reverification-block/assessment_uuid"
,
"display_name"
:
"Assessment 1"
,
"display_name"
:
"Assessment 1"
,
"criteria"
:
{}
"criteria"
:
{}
,
}
}
]
]
api
.
set_credit_requirements
(
self
.
course_key
,
requirements
)
api
.
set_credit_requirements
(
self
.
course_key
,
requirements
)
...
@@ -366,13 +366,13 @@ class CreditRequirementApiTests(CreditApiTestBase):
...
@@ -366,13 +366,13 @@ class CreditRequirementApiTests(CreditApiTestBase):
"display_name"
:
"Grade"
,
"display_name"
:
"Grade"
,
"criteria"
:
{
"criteria"
:
{
"min_grade"
:
0.8
"min_grade"
:
0.8
}
}
,
},
},
{
{
"namespace"
:
"reverification"
,
"namespace"
:
"reverification"
,
"name"
:
"i4x://edX/DemoX/edx-reverification-block/assessment_uuid"
,
"name"
:
"i4x://edX/DemoX/edx-reverification-block/assessment_uuid"
,
"display_name"
:
"Assessment 1"
,
"display_name"
:
"Assessment 1"
,
"criteria"
:
{}
"criteria"
:
{}
,
}
}
]
]
api
.
set_credit_requirements
(
self
.
course_key
,
requirements
)
api
.
set_credit_requirements
(
self
.
course_key
,
requirements
)
...
...
openedx/core/djangoapps/credit/tests/test_models.py
View file @
36e31e10
...
@@ -37,9 +37,9 @@ class CreditEligibilityModelTests(TestCase):
...
@@ -37,9 +37,9 @@ class CreditEligibilityModelTests(TestCase):
"display_name"
:
"Grade"
,
"display_name"
:
"Grade"
,
"criteria"
:
{
"criteria"
:
{
"min_grade"
:
0.8
"min_grade"
:
0.8
},
}
}
}
credit_req
,
created
=
CreditRequirement
.
add_or_update_course_requirement
(
credit_course
,
requirement
,
0
)
credit_req
,
created
=
CreditRequirement
.
add_or_update_course_requirement
(
credit_course
,
requirement
)
self
.
assertEqual
(
credit_course
,
credit_req
.
course
)
self
.
assertEqual
(
credit_course
,
credit_req
.
course
)
self
.
assertEqual
(
created
,
True
)
self
.
assertEqual
(
created
,
True
)
requirements
=
CreditRequirement
.
get_course_requirements
(
self
.
course_key
)
requirements
=
CreditRequirement
.
get_course_requirements
(
self
.
course_key
)
...
@@ -53,9 +53,9 @@ class CreditEligibilityModelTests(TestCase):
...
@@ -53,9 +53,9 @@ class CreditEligibilityModelTests(TestCase):
"display_name"
:
"Grade"
,
"display_name"
:
"Grade"
,
"criteria"
:
{
"criteria"
:
{
"min_grade"
:
0.8
"min_grade"
:
0.8
},
}
}
}
credit_req
,
created
=
CreditRequirement
.
add_or_update_course_requirement
(
credit_course
,
requirement
,
0
)
credit_req
,
created
=
CreditRequirement
.
add_or_update_course_requirement
(
credit_course
,
requirement
)
self
.
assertEqual
(
credit_course
,
credit_req
.
course
)
self
.
assertEqual
(
credit_course
,
credit_req
.
course
)
self
.
assertEqual
(
created
,
True
)
self
.
assertEqual
(
created
,
True
)
...
@@ -63,9 +63,9 @@ class CreditEligibilityModelTests(TestCase):
...
@@ -63,9 +63,9 @@ class CreditEligibilityModelTests(TestCase):
"namespace"
:
"reverification"
,
"namespace"
:
"reverification"
,
"name"
:
"i4x://edX/DemoX/edx-reverification-block/assessment_uuid"
,
"name"
:
"i4x://edX/DemoX/edx-reverification-block/assessment_uuid"
,
"display_name"
:
"Assessment 1"
,
"display_name"
:
"Assessment 1"
,
"criteria"
:
{}
"criteria"
:
{}
,
}
}
credit_req
,
created
=
CreditRequirement
.
add_or_update_course_requirement
(
credit_course
,
requirement
)
credit_req
,
created
=
CreditRequirement
.
add_or_update_course_requirement
(
credit_course
,
requirement
,
1
)
self
.
assertEqual
(
credit_course
,
credit_req
.
course
)
self
.
assertEqual
(
credit_course
,
credit_req
.
course
)
self
.
assertEqual
(
created
,
True
)
self
.
assertEqual
(
created
,
True
)
...
...
openedx/core/djangoapps/credit/tests/test_signals.py
View file @
36e31e10
...
@@ -59,7 +59,7 @@ class TestMinGradedRequirementStatus(ModuleStoreTestCase):
...
@@ -59,7 +59,7 @@ class TestMinGradedRequirementStatus(ModuleStoreTestCase):
"namespace"
:
"grade"
,
"namespace"
:
"grade"
,
"name"
:
"grade"
,
"name"
:
"grade"
,
"display_name"
:
"Grade"
,
"display_name"
:
"Grade"
,
"criteria"
:
{
"min_grade"
:
0.52
}
"criteria"
:
{
"min_grade"
:
0.52
}
,
}]
}]
# Add a single credit requirement (final grade)
# Add a single credit requirement (final grade)
set_credit_requirements
(
self
.
course
.
id
,
requirements
)
set_credit_requirements
(
self
.
course
.
id
,
requirements
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment