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 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 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 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 perform_request(method, url, data_or_params=None, raw=False, metric_action=None, metric_tags=None, paged_results=False): # To avoid dependency conflict from 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 = merge_dict(data_or_params, request_id_dict) with request_timer(request_id, method, url, metric_tags): 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') dog_stats_api.increment('comment_client.request.count', tags=metric_tags) 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] ) ) if paged_results: dog_stats_api.histogram( 'comment_client.request.paged.result_count', value=len(data.get('collection', [])), tags=metric_tags ) dog_stats_api.histogram( 'comment_client.request.paged.page', value=data.get('page', 1), tags=metric_tags ) dog_stats_api.histogram( 'comment_client.request.paged.num_pages', value=data.get('num_pages', 1), tags=metric_tags ) return data
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 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 = merge_dict(data_or_params, request_id_dict) with request_timer(request_id, method, url, metric_tags): 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') dog_stats_api.increment('comment_client.request.count', tags=metric_tags) 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: message = (u"Comments service returned invalid JSON " "for request {request_id} at url {url} " "with HTTP status code {status_code}; " "first 100 characters: '{content}'") raise CommentClientError( message.format( request_id=request_id, url=response.url, status_code=response.status_code, content=response.text[:100], )) if paged_results: dog_stats_api.histogram( 'comment_client.request.paged.result_count', value=len(data.get('collection', [])), tags=metric_tags) dog_stats_api.histogram('comment_client.request.paged.page', value=data.get('page', 1), tags=metric_tags) dog_stats_api.histogram( 'comment_client.request.paged.num_pages', value=data.get('num_pages', 1), tags=metric_tags) 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 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