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
4bd15cf2
Commit
4bd15cf2
authored
May 05, 2015
by
Clinton Blackburn
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #7911 from edx/clintonb/deprecate-verify-later
Deprecated Verify Later Page
parents
f7e8b2e4
5e687531
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
42 additions
and
69 deletions
+42
-69
lms/djangoapps/shoppingcart/models.py
+1
-1
lms/djangoapps/verify_student/tests/test_views.py
+15
-47
lms/djangoapps/verify_student/urls.py
+11
-14
lms/djangoapps/verify_student/views.py
+13
-6
lms/templates/dashboard/_dashboard_course_listing.html
+1
-1
lms/urls.py
+1
-0
No files found.
lms/djangoapps/shoppingcart/models.py
View file @
4bd15cf2
...
@@ -1751,7 +1751,7 @@ class CertificateItem(OrderItem):
...
@@ -1751,7 +1751,7 @@ class CertificateItem(OrderItem):
if
is_enrollment_mode_verified
:
if
is_enrollment_mode_verified
:
domain
=
microsite
.
get_value
(
'SITE_NAME'
,
settings
.
SITE_NAME
)
domain
=
microsite
.
get_value
(
'SITE_NAME'
,
settings
.
SITE_NAME
)
path
=
reverse
(
'verify_student_verify_
later
'
,
kwargs
=
{
'course_id'
:
unicode
(
self
.
course_id
)})
path
=
reverse
(
'verify_student_verify_
now
'
,
kwargs
=
{
'course_id'
:
unicode
(
self
.
course_id
)})
verification_url
=
"http://{domain}{path}"
.
format
(
domain
=
domain
,
path
=
path
)
verification_url
=
"http://{domain}{path}"
.
format
(
domain
=
domain
,
path
=
path
)
verification_reminder
=
_
(
verification_reminder
=
_
(
...
...
lms/djangoapps/verify_student/tests/test_views.py
View file @
4bd15cf2
...
@@ -275,20 +275,18 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase):
...
@@ -275,20 +275,18 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase):
@ddt.data
(
@ddt.data
(
"verify_student_verify_now"
,
"verify_student_verify_now"
,
"verify_student_verify_later"
,
"verify_student_payment_confirmation"
"verify_student_payment_confirmation"
)
)
def
test_verify_now_
or_later_
not_enrolled
(
self
,
page_name
):
def
test_verify_now_not_enrolled
(
self
,
page_name
):
course
=
self
.
_create_course
(
"verified"
)
course
=
self
.
_create_course
(
"verified"
)
response
=
self
.
_get_page
(
page_name
,
course
.
id
,
expected_status_code
=
302
)
response
=
self
.
_get_page
(
page_name
,
course
.
id
,
expected_status_code
=
302
)
self
.
_assert_redirects_to_start_flow
(
response
,
course
.
id
)
self
.
_assert_redirects_to_start_flow
(
response
,
course
.
id
)
@ddt.data
(
@ddt.data
(
"verify_student_verify_now"
,
"verify_student_verify_now"
,
"verify_student_verify_later"
,
"verify_student_payment_confirmation"
"verify_student_payment_confirmation"
)
)
def
test_verify_now_
or_later_
unenrolled
(
self
,
page_name
):
def
test_verify_now_unenrolled
(
self
,
page_name
):
course
=
self
.
_create_course
(
"verified"
)
course
=
self
.
_create_course
(
"verified"
)
self
.
_enroll
(
course
.
id
,
"verified"
)
self
.
_enroll
(
course
.
id
,
"verified"
)
self
.
_unenroll
(
course
.
id
)
self
.
_unenroll
(
course
.
id
)
...
@@ -297,46 +295,21 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase):
...
@@ -297,46 +295,21 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase):
@ddt.data
(
@ddt.data
(
"verify_student_verify_now"
,
"verify_student_verify_now"
,
"verify_student_verify_later"
,
"verify_student_payment_confirmation"
"verify_student_payment_confirmation"
)
)
def
test_verify_now_
or_later_
not_paid
(
self
,
page_name
):
def
test_verify_now_not_paid
(
self
,
page_name
):
course
=
self
.
_create_course
(
"verified"
)
course
=
self
.
_create_course
(
"verified"
)
self
.
_enroll
(
course
.
id
,
"honor"
)
self
.
_enroll
(
course
.
id
,
"honor"
)
response
=
self
.
_get_page
(
page_name
,
course
.
id
,
expected_status_code
=
302
)
response
=
self
.
_get_page
(
page_name
,
course
.
id
,
expected_status_code
=
302
)
self
.
_assert_redirects_to_upgrade
(
response
,
course
.
id
)
self
.
_assert_redirects_to_upgrade
(
response
,
course
.
id
)
def
test_verify_later
(
self
):
def
test_verify_later
(
self
):
""" The deprecated verify-later page should redirect to the verification start page. """
course
=
self
.
_create_course
(
"verified"
)
course
=
self
.
_create_course
(
"verified"
)
self
.
_enroll
(
course
.
id
,
"verified"
)
course_key
=
course
.
id
response
=
self
.
_get_page
(
"verify_student_verify_later"
,
course
.
id
)
self
.
_enroll
(
course_key
,
"verified"
)
response
=
self
.
_get_page
(
"verify_student_verify_later"
,
course_key
,
expected_status_code
=
301
)
self
.
_assert_messaging
(
response
,
PayAndVerifyView
.
VERIFY_LATER_MSG
)
self
.
_assert_redirects_to_verify_start
(
response
,
course_key
,
301
)
# Expect that the payment steps are NOT displayed
self
.
_assert_steps_displayed
(
response
,
[
PayAndVerifyView
.
INTRO_STEP
]
+
PayAndVerifyView
.
VERIFICATION_STEPS
,
PayAndVerifyView
.
INTRO_STEP
)
self
.
_assert_requirements_displayed
(
response
,
[
PayAndVerifyView
.
PHOTO_ID_REQ
,
PayAndVerifyView
.
WEBCAM_REQ
,
])
def
test_verify_later_already_verified
(
self
):
course
=
self
.
_create_course
(
"verified"
)
self
.
_enroll
(
course
.
id
,
"verified"
)
self
.
_set_verification_status
(
"submitted"
)
# Already verified, so if we somehow end up here,
# redirect immediately to the dashboard
response
=
self
.
_get_page
(
'verify_student_verify_later'
,
course
.
id
,
expected_status_code
=
302
)
self
.
_assert_redirects_to_dashboard
(
response
)
def
test_payment_confirmation
(
self
):
def
test_payment_confirmation
(
self
):
course
=
self
.
_create_course
(
"verified"
)
course
=
self
.
_create_course
(
"verified"
)
...
@@ -489,7 +462,7 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase):
...
@@ -489,7 +462,7 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase):
course
.
id
,
course
.
id
,
expected_status_code
=
302
expected_status_code
=
302
)
)
self
.
_assert_redirects_to_verify_
later
(
response
,
course
.
id
)
self
.
_assert_redirects_to_verify_
start
(
response
,
course
.
id
)
def
test_upgrade_already_verified_and_paid
(
self
):
def
test_upgrade_already_verified_and_paid
(
self
):
course
=
self
.
_create_course
(
"verified"
)
course
=
self
.
_create_course
(
"verified"
)
...
@@ -531,7 +504,6 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase):
...
@@ -531,7 +504,6 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase):
pages
=
[
pages
=
[
'verify_student_start_flow'
,
'verify_student_start_flow'
,
'verify_student_verify_now'
,
'verify_student_verify_now'
,
'verify_student_verify_later'
,
'verify_student_upgrade_and_verify'
,
'verify_student_upgrade_and_verify'
,
]
]
...
@@ -553,7 +525,6 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase):
...
@@ -553,7 +525,6 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase):
@ddt.data
(
@ddt.data
(
"verify_student_start_flow"
,
"verify_student_start_flow"
,
"verify_student_verify_now"
,
"verify_student_verify_now"
,
"verify_student_verify_later"
,
"verify_student_upgrade_and_verify"
,
"verify_student_upgrade_and_verify"
,
)
)
def
test_require_login
(
self
,
url_name
):
def
test_require_login
(
self
,
url_name
):
...
@@ -571,7 +542,6 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase):
...
@@ -571,7 +542,6 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase):
@ddt.data
(
@ddt.data
(
"verify_student_start_flow"
,
"verify_student_start_flow"
,
"verify_student_verify_now"
,
"verify_student_verify_now"
,
"verify_student_verify_later"
,
"verify_student_upgrade_and_verify"
,
"verify_student_upgrade_and_verify"
,
)
)
def
test_no_such_course
(
self
,
url_name
):
def
test_no_such_course
(
self
,
url_name
):
...
@@ -654,7 +624,7 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase):
...
@@ -654,7 +624,7 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase):
# The course mode has expired, so expect an explanation
# The course mode has expired, so expect an explanation
# to the student that the deadline has passed
# to the student that the deadline has passed
response
=
self
.
_get_page
(
"verify_student_verify_
later
"
,
course
.
id
)
response
=
self
.
_get_page
(
"verify_student_verify_
now
"
,
course
.
id
)
self
.
assertContains
(
response
,
"verification deadline"
)
self
.
assertContains
(
response
,
"verification deadline"
)
self
.
assertContains
(
response
,
"Jan 02, 1999 at 00:00 UTC"
)
self
.
assertContains
(
response
,
"Jan 02, 1999 at 00:00 UTC"
)
...
@@ -821,10 +791,10 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase):
...
@@ -821,10 +791,10 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase):
url
=
reverse
(
'verify_student_start_flow'
,
kwargs
=
{
'course_id'
:
unicode
(
course_id
)})
url
=
reverse
(
'verify_student_start_flow'
,
kwargs
=
{
'course_id'
:
unicode
(
course_id
)})
self
.
assertRedirects
(
response
,
url
)
self
.
assertRedirects
(
response
,
url
)
def
_assert_redirects_to_verify_
later
(
self
,
response
,
course_id
):
def
_assert_redirects_to_verify_
start
(
self
,
response
,
course_id
,
status_code
=
302
):
"""Check that the page redirects to the "verify later" part of the flow. """
"""Check that the page redirects to the "verify later" part of the flow. """
url
=
reverse
(
'verify_student_verify_
later
'
,
kwargs
=
{
'course_id'
:
unicode
(
course_id
)})
url
=
reverse
(
'verify_student_verify_
now
'
,
kwargs
=
{
'course_id'
:
unicode
(
course_id
)})
self
.
assertRedirects
(
response
,
url
)
self
.
assertRedirects
(
response
,
url
,
status_code
)
def
_assert_redirects_to_upgrade
(
self
,
response
,
course_id
):
def
_assert_redirects_to_upgrade
(
self
,
response
,
course_id
):
"""Check that the page redirects to the "upgrade" part of the flow. """
"""Check that the page redirects to the "upgrade" part of the flow. """
...
@@ -1765,8 +1735,7 @@ class TestInCourseReverifyView(ModuleStoreTestCase):
...
@@ -1765,8 +1735,7 @@ class TestInCourseReverifyView(ModuleStoreTestCase):
self
.
_create_checkpoint
()
self
.
_create_checkpoint
()
response
=
self
.
client
.
get
(
self
.
_get_url
(
self
.
course_key
,
self
.
MIDTERM
))
response
=
self
.
client
.
get
(
self
.
_get_url
(
self
.
course_key
,
self
.
MIDTERM
))
url
=
reverse
(
'verify_student_verify_later'
,
url
=
reverse
(
'verify_student_verify_now'
,
kwargs
=
{
"course_id"
:
unicode
(
self
.
course_key
)})
kwargs
=
{
"course_id"
:
unicode
(
self
.
course_key
)})
self
.
assertRedirects
(
response
,
url
)
self
.
assertRedirects
(
response
,
url
)
@override_settings
(
SEGMENT_IO_LMS_KEY
=
"foobar"
)
@override_settings
(
SEGMENT_IO_LMS_KEY
=
"foobar"
)
...
@@ -1810,8 +1779,7 @@ class TestInCourseReverifyView(ModuleStoreTestCase):
...
@@ -1810,8 +1779,7 @@ class TestInCourseReverifyView(ModuleStoreTestCase):
self
.
_create_checkpoint
()
self
.
_create_checkpoint
()
response
=
self
.
client
.
post
(
self
.
_get_url
(
self
.
course_key
,
self
.
MIDTERM
))
response
=
self
.
client
.
post
(
self
.
_get_url
(
self
.
course_key
,
self
.
MIDTERM
))
url
=
reverse
(
'verify_student_verify_later'
,
url
=
reverse
(
'verify_student_verify_now'
,
kwargs
=
{
"course_id"
:
unicode
(
self
.
course_key
)})
kwargs
=
{
"course_id"
:
unicode
(
self
.
course_key
)})
self
.
assertRedirects
(
response
,
url
)
self
.
assertRedirects
(
response
,
url
)
...
...
lms/djangoapps/verify_student/urls.py
View file @
4bd15cf2
""" URL definitions for the verify_student app. """
from
django.conf
import
settings
from
django.conf.urls
import
patterns
,
url
from
django.conf.urls
import
patterns
,
url
from
verify_student
import
views
from
verify_student
import
views
from
verify_student.views
import
PayAndVerifyView
from
django.conf
import
settings
urlpatterns
=
patterns
(
urlpatterns
=
patterns
(
...
@@ -19,7 +19,7 @@ urlpatterns = patterns(
...
@@ -19,7 +19,7 @@ urlpatterns = patterns(
views
.
PayAndVerifyView
.
as_view
(),
# pylint: disable=no-value-for-parameter
views
.
PayAndVerifyView
.
as_view
(),
# pylint: disable=no-value-for-parameter
name
=
"verify_student_start_flow"
,
name
=
"verify_student_start_flow"
,
kwargs
=
{
kwargs
=
{
'message'
:
PayAndVerifyView
.
FIRST_TIME_VERIFY_MSG
'message'
:
views
.
PayAndVerifyView
.
FIRST_TIME_VERIFY_MSG
}
}
),
),
...
@@ -31,7 +31,7 @@ urlpatterns = patterns(
...
@@ -31,7 +31,7 @@ urlpatterns = patterns(
views
.
PayAndVerifyView
.
as_view
(),
# pylint: disable=no-value-for-parameter
views
.
PayAndVerifyView
.
as_view
(),
# pylint: disable=no-value-for-parameter
name
=
"verify_student_upgrade_and_verify"
,
name
=
"verify_student_upgrade_and_verify"
,
kwargs
=
{
kwargs
=
{
'message'
:
PayAndVerifyView
.
UPGRADE_MSG
'message'
:
views
.
PayAndVerifyView
.
UPGRADE_MSG
}
}
),
),
...
@@ -47,8 +47,8 @@ urlpatterns = patterns(
...
@@ -47,8 +47,8 @@ urlpatterns = patterns(
name
=
"verify_student_verify_now"
,
name
=
"verify_student_verify_now"
,
kwargs
=
{
kwargs
=
{
'always_show_payment'
:
True
,
'always_show_payment'
:
True
,
'current_step'
:
PayAndVerifyView
.
FACE_PHOTO_STEP
,
'current_step'
:
views
.
PayAndVerifyView
.
FACE_PHOTO_STEP
,
'message'
:
PayAndVerifyView
.
VERIFY_NOW_MSG
'message'
:
views
.
PayAndVerifyView
.
VERIFY_NOW_MSG
}
}
),
),
...
@@ -59,11 +59,8 @@ urlpatterns = patterns(
...
@@ -59,11 +59,8 @@ urlpatterns = patterns(
# (since the user already paid).
# (since the user already paid).
url
(
url
(
r'^verify-later/{course}/$'
.
format
(
course
=
settings
.
COURSE_ID_PATTERN
),
r'^verify-later/{course}/$'
.
format
(
course
=
settings
.
COURSE_ID_PATTERN
),
views
.
PayAndVerifyView
.
as_view
(),
# pylint: disable=no-value-for-parameter
views
.
VerifyLaterView
.
as_view
(),
# pylint: disable=no-value-for-parameter
name
=
"verify_student_verify_later"
,
name
=
"verify_student_verify_later"
kwargs
=
{
'message'
:
PayAndVerifyView
.
VERIFY_LATER_MSG
}
),
),
# The user is returning to the flow after paying.
# The user is returning to the flow after paying.
...
@@ -75,8 +72,8 @@ urlpatterns = patterns(
...
@@ -75,8 +72,8 @@ urlpatterns = patterns(
name
=
"verify_student_payment_confirmation"
,
name
=
"verify_student_payment_confirmation"
,
kwargs
=
{
kwargs
=
{
'always_show_payment'
:
True
,
'always_show_payment'
:
True
,
'current_step'
:
PayAndVerifyView
.
PAYMENT_CONFIRMATION_STEP
,
'current_step'
:
views
.
PayAndVerifyView
.
PAYMENT_CONFIRMATION_STEP
,
'message'
:
PayAndVerifyView
.
PAYMENT_CONFIRMATION_MSG
'message'
:
views
.
PayAndVerifyView
.
PAYMENT_CONFIRMATION_MSG
}
}
),
),
...
...
lms/djangoapps/verify_student/views.py
View file @
4bd15cf2
...
@@ -20,7 +20,7 @@ from django.http import (
...
@@ -20,7 +20,7 @@ from django.http import (
from
django.shortcuts
import
redirect
from
django.shortcuts
import
redirect
from
django.views.decorators.csrf
import
csrf_exempt
from
django.views.decorators.csrf
import
csrf_exempt
from
django.views.decorators.http
import
require_POST
from
django.views.decorators.http
import
require_POST
from
django.views.generic.base
import
View
from
django.views.generic.base
import
View
,
RedirectView
from
django.utils.decorators
import
method_decorator
from
django.utils.decorators
import
method_decorator
from
django.utils.translation
import
ugettext
as
_
,
ugettext_lazy
from
django.utils.translation
import
ugettext
as
_
,
ugettext_lazy
from
django.contrib.auth.decorators
import
login_required
from
django.contrib.auth.decorators
import
login_required
...
@@ -473,10 +473,9 @@ class PayAndVerifyView(View):
...
@@ -473,10 +473,9 @@ class PayAndVerifyView(View):
url
=
reverse
(
'verify_student_start_flow'
,
kwargs
=
course_kwargs
)
url
=
reverse
(
'verify_student_start_flow'
,
kwargs
=
course_kwargs
)
elif
message
==
self
.
UPGRADE_MSG
:
elif
message
==
self
.
UPGRADE_MSG
:
if
is_enrolled
:
if
is_enrolled
:
# If upgrading and we've paid but haven't verified,
# then the "verify later" messaging makes more sense.
if
already_paid
:
if
already_paid
:
url
=
reverse
(
'verify_student_verify_later'
,
kwargs
=
course_kwargs
)
# If the student has paid, but not verified, redirect to the verification flow.
url
=
reverse
(
'verify_student_verify_now'
,
kwargs
=
course_kwargs
)
else
:
else
:
url
=
reverse
(
'verify_student_start_flow'
,
kwargs
=
course_kwargs
)
url
=
reverse
(
'verify_student_start_flow'
,
kwargs
=
course_kwargs
)
...
@@ -1205,7 +1204,7 @@ class InCourseReverifyView(View):
...
@@ -1205,7 +1204,7 @@ class InCourseReverifyView(View):
Returns:
Returns:
HttpResponse with status_code 400 if photo is missing or any error
HttpResponse with status_code 400 if photo is missing or any error
or redirect to
verify_student_verify_later url
if initial verification doesn't exist otherwise
or redirect to
the verification flow
if initial verification doesn't exist otherwise
HttpsResponse with status code 200
HttpsResponse with status code 200
"""
"""
# Check the in-course re-verification is enabled or not
# Check the in-course re-verification is enabled or not
...
@@ -1330,4 +1329,12 @@ class InCourseReverifyView(View):
...
@@ -1330,4 +1329,12 @@ class InCourseReverifyView(View):
u"for the course
%
s."
,
u"for the course
%
s."
,
user
.
id
,
course_key
user
.
id
,
course_key
)
)
return
redirect
(
reverse
(
'verify_student_verify_later'
,
kwargs
=
{
'course_id'
:
unicode
(
course_key
)}))
return
redirect
(
reverse
(
'verify_student_verify_now'
,
kwargs
=
{
'course_id'
:
unicode
(
course_key
)}))
class
VerifyLaterView
(
RedirectView
):
""" This view has been deprecated and should redirect to the unified verification flow. """
permanent
=
True
def
get_redirect_url
(
self
,
course_id
,
**
kwargs
):
# pylint: disable=unused-argument
return
reverse
(
'verify_student_verify_now'
,
kwargs
=
{
'course_id'
:
unicode
(
course_id
)})
lms/templates/dashboard/_dashboard_course_listing.html
View file @
4bd15cf2
...
@@ -292,7 +292,7 @@ from student.helpers import (
...
@@ -292,7 +292,7 @@ from student.helpers import (
% endif
% endif
</div>
</div>
<div
class=
"verification-cta"
>
<div
class=
"verification-cta"
>
<a
href=
"${reverse('verify_student_verify_
later
', kwargs={'course_id': unicode(course.id)})}"
class=
"cta"
data-course-id=
"${course.id | h}"
>
${_('Verify Now')}
</a>
<a
href=
"${reverse('verify_student_verify_
now
', kwargs={'course_id': unicode(course.id)})}"
class=
"cta"
data-course-id=
"${course.id | h}"
>
${_('Verify Now')}
</a>
</div>
</div>
% elif verification_status['status'] == VERIFY_STATUS_SUBMITTED:
% elif verification_status['status'] == VERIFY_STATUS_SUBMITTED:
<h4
class=
"message-title"
>
${_('You have already verified your ID!')}
</h4>
<h4
class=
"message-title"
>
${_('You have already verified your ID!')}
</h4>
...
...
lms/urls.py
View file @
4bd15cf2
...
@@ -122,6 +122,7 @@ if settings.FEATURES["ENABLE_MOBILE_REST_API"]:
...
@@ -122,6 +122,7 @@ if settings.FEATURES["ENABLE_MOBILE_REST_API"]:
# if settings.FEATURES.get("MULTIPLE_ENROLLMENT_ROLES"):
# if settings.FEATURES.get("MULTIPLE_ENROLLMENT_ROLES"):
urlpatterns
+=
(
urlpatterns
+=
(
# TODO Namespace these!
url
(
r'^verify_student/'
,
include
(
'verify_student.urls'
)),
url
(
r'^verify_student/'
,
include
(
'verify_student.urls'
)),
url
(
r'^course_modes/'
,
include
(
'course_modes.urls'
)),
url
(
r'^course_modes/'
,
include
(
'course_modes.urls'
)),
)
)
...
...
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