def setUp(self): super().setUp() self.course = CourseFactory.create( start=datetime(2020, 1, 1), end=datetime(2028, 1, 1), enrollment_start=datetime(2020, 1, 1), enrollment_end=datetime(2028, 1, 1), emit_signals=True, modulestore=self.store, discussion_topics={"Test Topic": { "id": "test_topic" }}, ) chapter = ItemFactory(parent=self.course, category='chapter') ItemFactory(parent=chapter, category='sequential') self.client.login(username=self.user.username, password=self.user_password) CourseEnrollment.enroll(self.user, self.course.id) self.request = RequestFactory().get('foo') self.request.user = self.user config = ForumsConfig.current() config.enabled = True config.save()
def setUpClass(cls): super().setUpClass() cls.discussion_id = 'dummy_discussion_id' cls.course = CourseOverviewFactory.create(language='fr') # Patch the comment client user save method so it does not try # to create a new cc user when creating a django user with mock.patch('common.djangoapps.student.models.cc.User.save'): cls.thread_author = UserFactory(username='******', password='******', email='email') cls.comment_author = UserFactory(username='******', password='******', email='email') CourseEnrollmentFactory(user=cls.thread_author, course_id=cls.course.id) CourseEnrollmentFactory(user=cls.comment_author, course_id=cls.course.id) config = ForumsConfig.current() config.enabled = True config.save() cls.create_thread_and_comments()
def setUpClass(cls): super(TaskTestCase, cls).setUpClass() cls.discussion_id = 'dummy_discussion_id' cls.course = CourseOverviewFactory.create(language='fr') # Patch the comment client user save method so it does not try # to create a new cc user when creating a django user with mock.patch('student.models.cc.User.save'): cls.thread_author = UserFactory( username='******', password='******', email='email' ) cls.comment_author = UserFactory( username='******', password='******', email='email' ) CourseEnrollmentFactory( user=cls.thread_author, course_id=cls.course.id ) CourseEnrollmentFactory( user=cls.comment_author, course_id=cls.course.id ) config = ForumsConfig.current() config.enabled = True config.save() cls.create_thread_and_comments()
def check_forum_heartbeat(): """ Check the forum connection via its built-in heartbeat service and create an answer which can be used in the LMS heartbeat django application. This function can be connected to the LMS heartbeat checker through the HEARTBEAT_CHECKS variable. """ # To avoid dependency conflict from openedx.core.djangoapps.django_comment_common.models import ForumsConfig config = ForumsConfig.current() if not config.enabled: # If this check is enabled but forums disabled, don't connect, just report no error return 'forum', True, 'OK' try: res = requests.get( '%s/heartbeat' % COMMENTS_SERVICE, timeout=config.connection_timeout ).json() if res['OK']: return 'forum', True, 'OK' else: return 'forum', False, res.get('check', 'Forum heartbeat failed') except Exception as fail: return 'forum', False, unicode(fail)
def setUp(self): super(TestCreateCommentsServiceUser, self).setUp() self.username = "******" self.url = reverse("create_account") self.params = { "username": self.username, "email": "*****@*****.**", "password": "******", "name": "Test User", "honor_code": "true", "terms_of_service": "true", } config = ForumsConfig.current() config.enabled = True config.save()
def setUp(self): super(ForumsEnableMixin, self).setUp() config = ForumsConfig.current() config.enabled = True config.save()
def perform_request(method, url, data_or_params=None, raw=False, metric_action=None, metric_tags=None, paged_results=False): # To avoid dependency conflict from openedx.core.djangoapps.django_comment_common.models import ForumsConfig config = ForumsConfig.current() if not config.enabled: raise CommentClientMaintenanceError('service disabled') if metric_tags is None: metric_tags = [] metric_tags.append(u'method:{}'.format(method)) if metric_action: metric_tags.append(u'action:{}'.format(metric_action)) if data_or_params is None: data_or_params = {} headers = { 'X-Edx-Api-Key': config.api_key, 'Accept-Language': get_language(), } request_id = uuid4() request_id_dict = {'request_id': request_id} if method in ['post', 'put', 'patch']: data = data_or_params params = request_id_dict else: data = None params = data_or_params.copy() params.update(request_id_dict) response = requests.request(method, url, data=data, params=params, headers=headers, timeout=config.connection_timeout) metric_tags.append(u'status_code:{}'.format(response.status_code)) status_code = int(response.status_code) if status_code > 200: metric_tags.append(u'result:failure') else: metric_tags.append(u'result:success') if 200 < status_code < 500: # lint-amnesty, pylint: disable=no-else-raise raise CommentClientRequestError(response.text, response.status_code) # Heroku returns a 503 when an application is in maintenance mode elif status_code == 503: raise CommentClientMaintenanceError(response.text) elif status_code == 500: raise CommentClient500Error(response.text) else: if raw: return response.text else: try: data = response.json() except ValueError: raise CommentClientError( # lint-amnesty, pylint: disable=raise-missing-from u"Invalid JSON response for request {request_id}; first 100 characters: '{content}'" .format(request_id=request_id, content=response.text[:100])) return data
def perform_request(method, url, data_or_params=None, raw=False, metric_action=None, metric_tags=None, paged_results=False): # To avoid dependency conflict from openedx.core.djangoapps.django_comment_common.models import ForumsConfig config = ForumsConfig.current() if not config.enabled: raise CommentClientMaintenanceError('service disabled') if metric_tags is None: metric_tags = [] metric_tags.append(u'method:{}'.format(method)) if metric_action: metric_tags.append(u'action:{}'.format(metric_action)) if data_or_params is None: data_or_params = {} headers = { 'X-Edx-Api-Key': config.api_key, 'Accept-Language': get_language(), } request_id = uuid4() request_id_dict = {'request_id': request_id} if method in ['post', 'put', 'patch']: data = data_or_params params = request_id_dict else: data = None params = data_or_params.copy() params.update(request_id_dict) response = requests.request(method, url, data=data, params=params, headers=headers, timeout=config.connection_timeout) metric_tags.append(u'status_code:{}'.format(response.status_code)) status_code = int(response.status_code) if status_code > 200: metric_tags.append(u'result:failure') else: metric_tags.append(u'result:success') if 200 < status_code < 500: log.error( u"Comment Client Request Error on url={url} with error message='{text}' and " u"status_code={status_code}".format( url=url, status_code=response.status_code, text=response.text)) raise CommentClientRequestError(response.text, response.status_code) elif status_code in (502, 504): log.error( u"Comment Client Gateway Error on url={url} with error message='{text}' and " u"status_code={status_code}".format( url=url, status_code=response.status_code, text=response.text)) raise CommentClientGatewayError(response.text, response.status_code) # Heroku returns a 503 when an application is in maintenance mode elif status_code == 503: log.error( u"Comment Client Maintenance Error on url={url} with error message='{text}' and " u"status_code={status_code}".format( url=url, status_code=response.status_code, text=response.text)) raise CommentClientMaintenanceError(response.text, response.status_code) elif status_code == 500: log.error( u"Comment Client 500 Error on url={url} with error message='{text}' and " u"status_code={status_code}".format( url=url, status_code=response.status_code, text=response.text)) raise CommentClient500Error( u"Internal Server Error: {}".format(response.text), response.status_code) else: if raw: return response.text else: try: data = response.json() except ValueError: #This error message is modified only for debugging purpose and will be revert back in future. raise CommentClientError( u"Invalid JSON response for request {request_id} with status code: {status_code}" u" and response length: {length}; first 100 characters: '{content}'" .format(request_id=request_id, content=response.text[:100], length=len(response.text), status_code=response.status_code)) return data
def setUp(self): super(ForumsEnableMixin, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments config = ForumsConfig.current() config.enabled = True config.save()
def setUp(self): super().setUp() config = ForumsConfig.current() config.enabled = True config.save()
def perform_request(method, url, data_or_params=None, raw=False, metric_action=None, metric_tags=None, paged_results=False): # To avoid dependency conflict from openedx.core.djangoapps.django_comment_common.models import ForumsConfig config = ForumsConfig.current() if not config.enabled: raise CommentClientMaintenanceError('service disabled') if metric_tags is None: metric_tags = [] metric_tags.append(u'method:{}'.format(method)) if metric_action: metric_tags.append(u'action:{}'.format(metric_action)) if data_or_params is None: data_or_params = {} headers = { 'X-Edx-Api-Key': config.api_key, 'Accept-Language': get_language(), } request_id = uuid4() request_id_dict = {'request_id': request_id} if method in ['post', 'put', 'patch']: data = data_or_params params = request_id_dict else: data = None params = data_or_params.copy() params.update(request_id_dict) response = requests.request( method, url, data=data, params=params, headers=headers, timeout=config.connection_timeout ) metric_tags.append(u'status_code:{}'.format(response.status_code)) if response.status_code > 200: metric_tags.append(u'result:failure') else: metric_tags.append(u'result:success') if 200 < response.status_code < 500: raise CommentClientRequestError(response.text, response.status_code) # Heroku returns a 503 when an application is in maintenance mode elif response.status_code == 503: raise CommentClientMaintenanceError(response.text) elif response.status_code == 500: raise CommentClient500Error(response.text) else: if raw: return response.text else: try: data = response.json() except ValueError: raise CommentClientError( u"Invalid JSON response for request {request_id}; first 100 characters: '{content}'".format( request_id=request_id, content=response.text[:100] ) ) return data