Commit 73e2a23c by Waheed Ahmed

Added error message on saving course-key.

ECOM-6748
parent db25b93b
"""Publisher API Serializers""" """Publisher API Serializers"""
import waffle import waffle
from django.utils.translation import ugettext_lazy as _
from opaque_keys import InvalidKeyError from opaque_keys import InvalidKeyError
from opaque_keys.edx.keys import CourseKey from opaque_keys.edx.keys import CourseKey
from rest_framework import serializers from rest_framework import serializers
...@@ -51,7 +53,10 @@ class UpdateCourseKeySerializer(serializers.ModelSerializer): ...@@ -51,7 +53,10 @@ class UpdateCourseKeySerializer(serializers.ModelSerializer):
try: try:
CourseKey.from_string(lms_course_id) CourseKey.from_string(lms_course_id)
except InvalidKeyError: except InvalidKeyError:
raise serializers.ValidationError('Invalid course key [{}]'.format(lms_course_id)) # pylint: disable=no-member
raise serializers.ValidationError(
{'lms_course_id': _('Invalid course key "{lms_course_id}"').format(lms_course_id=lms_course_id)}
)
request = self.context.get('request') request = self.context.get('request')
if request: if request:
......
...@@ -243,7 +243,42 @@ class UpdateCourseKeyViewTests(TestCase): ...@@ -243,7 +243,42 @@ class UpdateCourseKeyViewTests(TestCase):
self.assertEqual(response.status_code, 400) self.assertEqual(response.status_code, 400)
self.assertEqual( self.assertEqual(
response.data.get('non_field_errors'), ['Invalid course key [{}]'.format(invalid_course_id)] response.data.get('lms_course_id'),
['Invalid course key "{lms_course_id}"'.format(lms_course_id=invalid_course_id)]
)
def test_update_course_key_without_permission(self):
"""
Test that api returns error without permission.
"""
self.user.groups.remove(Group.objects.get(name=INTERNAL_USER_GROUP_NAME))
response = self.client.patch(
self.update_course_key_url,
data=json.dumps({'lms_course_id': 'course-v1:edxTest+TC12+2050Q1'}),
content_type=JSON_CONTENT_TYPE
)
self.assertEqual(response.status_code, 403)
self.assertEqual(
response.data.get('detail'), 'You do not have permission to perform this action.'
)
def test_update_course_key_with_duplicate(self):
"""
Test that api returns error if course key already exist.
"""
lms_course_id = 'course-v1:edxTest+TC12+2050Q1'
factories.CourseRunFactory(lms_course_id=lms_course_id)
response = self.client.patch(
self.update_course_key_url,
data=json.dumps({'lms_course_id': lms_course_id}),
content_type=JSON_CONTENT_TYPE
)
self.assertEqual(response.status_code, 400)
self.assertEqual(
response.data.get('lms_course_id'), ['CourseRun with this lms course id already exists.']
) )
def test_update_course_key(self): def test_update_course_key(self):
......
...@@ -7,14 +7,14 @@ msgid "" ...@@ -7,14 +7,14 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-01-16 14:06+0500\n" "POT-Creation-Date: 2017-01-18 12:59+0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: \n"
#: apps/api/filters.py #: apps/api/filters.py
#, python-brace-format #, python-brace-format
...@@ -411,6 +411,11 @@ msgstr "" ...@@ -411,6 +411,11 @@ msgstr ""
msgid "JSON string containing an elasticsearch function score config." msgid "JSON string containing an elasticsearch function score config."
msgstr "" msgstr ""
#: apps/publisher/api/serializers.py
#, python-brace-format
msgid "Invalid course key \"{lms_course_id}\""
msgstr ""
#: apps/publisher/choices.py templates/publisher/courses.html #: apps/publisher/choices.py templates/publisher/courses.html
msgid "Partner Coordinator" msgid "Partner Coordinator"
msgstr "" msgstr ""
......
...@@ -7,14 +7,14 @@ msgid "" ...@@ -7,14 +7,14 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-01-16 14:06+0500\n" "POT-Creation-Date: 2017-01-18 12:59+0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: \n"
#: static/js/catalogs-change-form.js #: static/js/catalogs-change-form.js
msgid "Preview" msgid "Preview"
...@@ -26,6 +26,10 @@ msgid "" ...@@ -26,6 +26,10 @@ msgid ""
"{courseRunDetail} with a start date of {startDate}" "{courseRunDetail} with a start date of {startDate}"
msgstr "" msgstr ""
#: static/js/publisher/views/dashboard.js
msgid "There was an error in saving your data."
msgstr ""
#: static/js/publisher/views/navbar.js #: static/js/publisher/views/navbar.js
msgid "OFF" msgid "OFF"
msgstr "" msgstr ""
......
...@@ -7,14 +7,14 @@ msgid "" ...@@ -7,14 +7,14 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-01-16 14:06+0500\n" "POT-Creation-Date: 2017-01-18 12:59+0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps/api/filters.py #: apps/api/filters.py
...@@ -517,6 +517,11 @@ msgstr "" ...@@ -517,6 +517,11 @@ msgstr ""
"JSÖN strïng çöntäïnïng än élästïçséärçh fünçtïön sçöré çönfïg. Ⱡ'σяєм ιρѕυм " "JSÖN strïng çöntäïnïng än élästïçséärçh fünçtïön sçöré çönfïg. Ⱡ'σяєм ιρѕυм "
"∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α#" "∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α#"
#: apps/publisher/api/serializers.py
#, python-brace-format
msgid "Invalid course key \"{lms_course_id}\""
msgstr "Ìnvälïd çöürsé kéý \"{lms_course_id}\" Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢ση#"
#: apps/publisher/choices.py templates/publisher/courses.html #: apps/publisher/choices.py templates/publisher/courses.html
msgid "Partner Coordinator" msgid "Partner Coordinator"
msgstr "Pärtnér Çöördïnätör Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт,#" msgstr "Pärtnér Çöördïnätör Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт,#"
......
...@@ -7,14 +7,14 @@ msgid "" ...@@ -7,14 +7,14 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-01-16 14:06+0500\n" "POT-Creation-Date: 2017-01-18 12:59+0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: static/js/catalogs-change-form.js #: static/js/catalogs-change-form.js
...@@ -30,6 +30,12 @@ msgstr "" ...@@ -30,6 +30,12 @@ msgstr ""
"{courseRunDetail} wïth ä stärt däté öf {startDate} Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт " "{courseRunDetail} wïth ä stärt däté öf {startDate} Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт "
"αмєт, ¢σηѕє¢#" "αмєт, ¢σηѕє¢#"
#: static/js/publisher/views/dashboard.js
msgid "There was an error in saving your data."
msgstr ""
"Théré wäs än érrör ïn sävïng ýöür dätä. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, "
"¢σηѕє¢тєтυя#"
#: static/js/publisher/views/navbar.js #: static/js/publisher/views/navbar.js
msgid "OFF" msgid "OFF"
msgstr "ÖFF Ⱡ'σяєм#" msgstr "ÖFF Ⱡ'σяєм#"
......
...@@ -18,6 +18,7 @@ $(document).ready(function() { ...@@ -18,6 +18,7 @@ $(document).ready(function() {
courseTitleTag = $courseRunParentTag.find("#course-title").html().trim(), courseTitleTag = $courseRunParentTag.find("#course-title").html().trim(),
startDateTag = $courseRunParentTag.find("#course-start").html().trim(), startDateTag = $courseRunParentTag.find("#course-start").html().trim(),
$studioInstanceSuccess = $(".studio-instance-success"), $studioInstanceSuccess = $(".studio-instance-success"),
$studioInstanceError = $(".studio-instance-error"),
successMessage = interpolateString( successMessage = interpolateString(
gettext("You have successfully created a studio instance ({studioLinkTag}) for {courseRunDetail} with a start date of {startDate}"), gettext("You have successfully created a studio instance ({studioLinkTag}) for {courseRunDetail} with a start date of {startDate}"),
{ {
...@@ -38,6 +39,16 @@ $(document).ready(function() { ...@@ -38,6 +39,16 @@ $(document).ready(function() {
$("#studio-count").html(data_table_studio.rows().count()); $("#studio-count").html(data_table_studio.rows().count());
$studioInstanceSuccess.find(".copy-meta").html(successMessage); $studioInstanceSuccess.find(".copy-meta").html(successMessage);
$studioInstanceSuccess.css("display", "block"); $studioInstanceSuccess.css("display", "block");
},
error: function (response) {
if(response.responseJSON.lms_course_id) {
$studioInstanceError.find(".copy").html(response.responseJSON.lms_course_id[0]);
} else if(response.responseJSON.detail) {
$studioInstanceError.find(".copy").html(response.responseJSON.detail);
} else {
$studioInstanceError.find(".copy").html(gettext("There was an error in saving your data."));
}
$studioInstanceError.removeClass("hidden");
} }
}); });
}); });
......
...@@ -10,6 +10,10 @@ ...@@ -10,6 +10,10 @@
} }
} }
.studio-instance-error {
margin-bottom: 20px;
}
.tabs { .tabs {
@include padding(0, 0, 0, 0); @include padding(0, 0, 0, 0);
@include margin(0, 0, 0, 0); @include margin(0, 0, 0, 0);
......
...@@ -5,6 +5,11 @@ ...@@ -5,6 +5,11 @@
<div class="studio-instance-success depth depth-0"> <div class="studio-instance-success depth depth-0">
<p class="copy-meta"></p> <p class="copy-meta"></p>
</div> </div>
<div class="alert alert-error alert-slim studio-instance-error hidden">
<div class="alert-message">
<p class="copy"></p>
</div>
</div>
<div class="table-view"> <div class="table-view">
<table class="data-table-studio display" cellspacing="0" width="100%"> <table class="data-table-studio display" cellspacing="0" width="100%">
<thead> <thead>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment