Commit 62460267 by Clinton Blackburn

Merge pull request #135 from edx/course-migration-view

Added view to run migrate_course management command
parents 7cf6791e 0e2212b1
from django.core.urlresolvers import reverse
from django.test import TestCase
from ecommerce.tests.mixins import UserMixin
class CourseMigrationViewTests(UserMixin, TestCase):
path = reverse('migrate_course')
def test_superuser_required(self):
""" Verify the view is only accessible to superusers. """
response = self.client.get(self.path)
self.assertEqual(response.status_code, 404)
user = self.create_user(is_superuser=False)
self.client.login(username=user.username, password=self.password)
response = self.client.get(self.path)
self.assertEqual(response.status_code, 404)
user = self.create_user(is_superuser=True)
self.client.login(username=user.username, password=self.password)
response = self.client.get(self.path + '?course_ids=foo')
self.assertEqual(response.status_code, 200)
def test_course_ids_required(self):
""" The view should return HTTP status 400 if no course IDs are provided. """
user = self.create_user(is_superuser=True)
self.client.login(username=user.username, password=self.password)
response = self.client.get(self.path)
self.assertEqual(response.status_code, 400)
response = self.client.get(self.path + '?course_ids=')
self.assertEqual(response.status_code, 400)
response = self.client.get(self.path + '?course_ids=foo')
self.assertEqual(response.status_code, 200)
from StringIO import StringIO
import logging
from django.core.management import call_command
from django.http import Http404, HttpResponse
from django.views.generic import View
logger = logging.getLogger(__name__)
class CourseMigrationView(View):
def dispatch(self, request, *args, **kwargs):
if not request.user.is_superuser:
raise Http404
return super(CourseMigrationView, self).dispatch(request, *args, **kwargs)
def get(self, request, *_args, **_kwargs):
course_ids = request.GET.get('course_ids')
commit = request.GET.get('commit', False)
commit = commit in ('1', 'true')
# Capture all output and logging
out = StringIO()
err = StringIO()
log = StringIO()
root_logger = logging.getLogger()
log_handler = logging.StreamHandler(log)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
log_handler.setFormatter(formatter)
root_logger.addHandler(log_handler)
# Log who ran this request
msg = 'User [%s] requested course migration for [%s]. '
if commit:
msg += 'The changes will be committed to the database.'
else:
msg += 'The changes will NOT be committed to the database.'
logger.info(msg, request.user.username, course_ids)
if not course_ids:
return HttpResponse('No course_ids specified.', status=400)
course_ids = course_ids.split(',')
call_command('migrate_course', *course_ids, commit=commit, stdout=out, stderr=err)
# Format the output for display
output = 'STDOUT\n{out}\n\nSTDERR\n{err}\n\nLOG\n{log}'.format(out=out.getvalue(), err=err.getvalue(),
log=log.getvalue())
# Remove the log capture handler
root_logger.removeHandler(log_handler)
return HttpResponse(output, content_type='text/plain')
...@@ -210,5 +210,8 @@ class Command(BaseCommand): ...@@ -210,5 +210,8 @@ class Command(BaseCommand):
if options.get('commit', False): if options.get('commit', False):
migrated_course.save() migrated_course.save()
logger.info('Course [%s] was saved to the database.', migrated_course.course.id)
else:
logger.info('Course [%s] was NOT saved to the database.', migrated_course.course.id)
except Exception: # pylint: disable=broad-except except Exception: # pylint: disable=broad-except
logger.exception('Failed to migrate [%s]!', course_id) logger.exception('Failed to migrate [%s]!', course_id)
...@@ -7,6 +7,7 @@ from django.contrib import admin ...@@ -7,6 +7,7 @@ from django.contrib import admin
from django.core.urlresolvers import reverse_lazy from django.core.urlresolvers import reverse_lazy
from django.shortcuts import redirect from django.shortcuts import redirect
from django.views.generic import RedirectView from django.views.generic import RedirectView
from ecommerce.courses.views import CourseMigrationView
from ecommerce.extensions.urls import urlpatterns as extensions_patterns from ecommerce.extensions.urls import urlpatterns as extensions_patterns
from ecommerce.user import views as user_views from ecommerce.user import views as user_views
...@@ -34,6 +35,7 @@ admin.autodiscover() ...@@ -34,6 +35,7 @@ admin.autodiscover()
urlpatterns = patterns( urlpatterns = patterns(
'', '',
url(r'^i18n/', include('django.conf.urls.i18n')), url(r'^i18n/', include('django.conf.urls.i18n')),
url(r'^admin/courses/migrate/$', CourseMigrationView.as_view(), name='migrate_course'),
url(r'^admin/', include(admin.site.urls)), url(r'^admin/', include(admin.site.urls)),
url(r'^auto_auth/$', user_views.AutoAuth.as_view(), name='auto_auth'), url(r'^auto_auth/$', user_views.AutoAuth.as_view(), name='auto_auth'),
url(r'^health/$', include('health.urls')), url(r'^health/$', include('health.urls')),
......
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