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
09405a75
Commit
09405a75
authored
Aug 05, 2015
by
Clinton Blackburn
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #9193 from edx/patch/2015-08-04
ECOM Patch
parents
69be9000
69e9ac1a
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
60 additions
and
5 deletions
+60
-5
lms/djangoapps/commerce/api/v1/models.py
+26
-4
lms/djangoapps/commerce/api/v1/serializers.py
+29
-1
lms/djangoapps/commerce/api/v1/tests/test_views.py
+0
-0
lms/djangoapps/commerce/api/v1/views.py
+5
-0
No files found.
lms/djangoapps/commerce/api/v1/models.py
View file @
09405a75
""" API v1 models. """
from
itertools
import
groupby
import
logging
import
logging
from
django.db
import
transaction
from
opaque_keys
import
InvalidKeyError
from
opaque_keys.edx.keys
import
CourseKey
from
openedx.core.djangoapps.content.course_overviews.models
import
CourseOverview
from
course_modes.models
import
CourseMode
from
verify_student.models
import
VerificationDeadline
log
=
logging
.
getLogger
(
__name__
)
...
...
@@ -17,11 +18,25 @@ class Course(object):
modes
=
None
_deleted_modes
=
None
def
__init__
(
self
,
id
,
modes
):
# pylint: disable=invalid-name,redefined-builtin
def
__init__
(
self
,
id
,
modes
,
verification_deadline
=
None
):
# pylint: disable=invalid-name,redefined-builtin
self
.
id
=
CourseKey
.
from_string
(
unicode
(
id
))
# pylint: disable=invalid-name
self
.
modes
=
list
(
modes
)
self
.
verification_deadline
=
verification_deadline
self
.
_deleted_modes
=
[]
@property
def
name
(
self
):
""" Return course name. """
course_id
=
CourseKey
.
from_string
(
unicode
(
self
.
id
))
# pylint: disable=invalid-name
try
:
return
CourseOverview
.
get_from_id
(
course_id
)
.
display_name
except
CourseOverview
.
DoesNotExist
:
# NOTE (CCB): Ideally, the course modes table should only contain data for courses that exist in
# modulestore. If that is not the case, say for local development/testing, carry on without failure.
log
.
warning
(
'Failed to retrieve CourseOverview for [
%
s]. Using empty course name.'
,
course_id
)
return
None
def
get_mode_display_name
(
self
,
mode
):
""" Returns display name for the given mode. """
slug
=
mode
.
mode_slug
.
strip
()
.
lower
()
...
...
@@ -42,6 +57,10 @@ class Course(object):
@transaction.commit_on_success
def
save
(
self
,
*
args
,
**
kwargs
):
# pylint: disable=unused-argument
""" Save the CourseMode objects to the database. """
# Update the verification deadline for the course (not the individual modes)
VerificationDeadline
.
set_deadline
(
self
.
id
,
self
.
verification_deadline
)
for
mode
in
self
.
modes
:
mode
.
course_id
=
self
.
id
mode
.
mode_display_name
=
self
.
get_mode_display_name
(
mode
)
...
...
@@ -53,6 +72,8 @@ class Course(object):
def
update
(
self
,
attrs
):
""" Update the model with external data (usually passed via API call). """
self
.
verification_deadline
=
attrs
.
get
(
'verification_deadline'
)
existing_modes
=
{
mode
.
mode_slug
:
mode
for
mode
in
self
.
modes
}
merged_modes
=
set
()
merged_mode_keys
=
set
()
...
...
@@ -87,7 +108,8 @@ class Course(object):
course_modes
=
CourseMode
.
objects
.
filter
(
course_id
=
course_id
)
if
course_modes
:
return
cls
(
unicode
(
course_id
),
list
(
course_modes
))
verification_deadline
=
VerificationDeadline
.
deadline_for_course
(
course_id
)
return
cls
(
course_id
,
list
(
course_modes
),
verification_deadline
=
verification_deadline
)
return
None
...
...
lms/djangoapps/commerce/api/v1/serializers.py
View file @
09405a75
""" API v1 serializers. """
from
datetime
import
datetime
import
pytz
from
rest_framework
import
serializers
from
commerce.api.v1.models
import
Course
...
...
@@ -25,11 +28,36 @@ class CourseModeSerializer(serializers.ModelSerializer):
class
CourseSerializer
(
serializers
.
Serializer
):
""" Course serializer. """
id
=
serializers
.
CharField
()
# pylint: disable=invalid-name
name
=
serializers
.
CharField
(
read_only
=
True
)
verification_deadline
=
serializers
.
DateTimeField
(
blank
=
True
)
modes
=
CourseModeSerializer
(
many
=
True
,
allow_add_remove
=
True
)
def
validate
(
self
,
attrs
):
""" Ensure the verification deadline occurs AFTER the course mode enrollment deadlines. """
verification_deadline
=
attrs
.
get
(
'verification_deadline'
,
None
)
if
verification_deadline
:
upgrade_deadline
=
None
# Find the earliest upgrade deadline
for
mode
in
attrs
[
'modes'
]:
expires
=
mode
.
expiration_datetime
if
expires
:
# If we don't already have an upgrade_deadline value, use datetime.max so that we can actually
# complete the comparison.
upgrade_deadline
=
min
(
expires
,
upgrade_deadline
or
datetime
.
max
.
replace
(
tzinfo
=
pytz
.
utc
))
# In cases where upgrade_deadline is None (e.g. the verified professional mode), allow a verification
# deadline to be set anyway.
if
upgrade_deadline
is
not
None
and
verification_deadline
<
upgrade_deadline
:
raise
serializers
.
ValidationError
(
'Verification deadline must be after the course mode upgrade deadlines.'
)
return
attrs
def
restore_object
(
self
,
attrs
,
instance
=
None
):
if
instance
is
None
:
return
Course
(
attrs
[
'id'
],
attrs
[
'modes'
])
return
Course
(
attrs
[
'id'
],
attrs
[
'modes'
]
,
attrs
[
'verification_deadline'
]
)
instance
.
update
(
attrs
)
return
instance
lms/djangoapps/commerce/api/v1/tests/test_views.py
View file @
09405a75
This diff is collapsed.
Click to expand it.
lms/djangoapps/commerce/api/v1/views.py
View file @
09405a75
...
...
@@ -41,3 +41,8 @@ class CourseRetrieveUpdateView(RetrieveUpdateAPIView):
return
course
raise
Http404
def
pre_save
(
self
,
obj
):
# There is nothing to pre-save. The default behavior changes the Course.id attribute from
# a CourseKey to a string, which is not desired.
pass
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