diff --git a/openedx/core/djangoapps/discussions/models.py b/openedx/core/djangoapps/discussions/models.py index ec511fee5be3718a9d832712428658727e1bfa12..1dbb438a9066782929c7bef260fb456896fd0601 100644 --- a/openedx/core/djangoapps/discussions/models.py +++ b/openedx/core/djangoapps/discussions/models.py @@ -1,6 +1,8 @@ """ Provide django models to back the discussions app """ +from __future__ import annotations + from django.core.exceptions import ValidationError from django.db import models from django.utils.translation import ugettext_lazy as _ @@ -67,3 +69,24 @@ class DiscussionsConfiguration(TimeStampedModel): provider=self.provider_type, enabled=self.enabled, ) + + @classmethod + def is_enabled(cls, context_key) -> bool: + """ + Check if there is an active configuration for a given course key + + Default to False, if no configuration exists + """ + configuration = cls.get(context_key) + return configuration.enabled + + @classmethod + def get(cls, context_key) -> cls: + """ + Lookup a model by context_key + """ + try: + configuration = cls.objects.get(context_key=context_key) + except cls.DoesNotExist: + configuration = cls(context_key=context_key, enabled=False) + return configuration diff --git a/openedx/core/djangoapps/discussions/tests/test_models.py b/openedx/core/djangoapps/discussions/tests/test_models.py index 3a52752c77fe08626ff3c385347473ae24f22904..f3aaefbfb1ef5d41bcbe1a4e8d83809e84b2a712 100644 --- a/openedx/core/djangoapps/discussions/tests/test_models.py +++ b/openedx/core/djangoapps/discussions/tests/test_models.py @@ -82,3 +82,57 @@ class DiscussionsConfigurationModelTest(TestCase): assert configuration.lti_configuration is None assert configuration.plugin_configuration['url'] == 'http://localhost' assert configuration.provider_type == 'cs_comments_service' + + def test_is_enabled_nonexistent(self): + """ + Assert that discussions are disabled, when no configuration exists + """ + is_enabled = DiscussionsConfiguration.is_enabled(self.course_key_without_config) + assert not is_enabled + + def test_is_enabled_default(self): + """ + Assert that discussions are enabled by default, when a configuration exists + """ + is_enabled = DiscussionsConfiguration.is_enabled(self.course_key_with_defaults) + assert is_enabled + + def test_is_enabled_explicit(self): + """ + Assert that discussions can be explitly disabled + """ + is_enabled = DiscussionsConfiguration.is_enabled(self.course_key_with_values) + assert not is_enabled + + def test_get_nonexistent(self): + """ + Assert we get an "empty" model back for nonexistent records + """ + configuration = DiscussionsConfiguration.get(self.course_key_without_config) + assert configuration is not None + assert not configuration.enabled + assert not configuration.lti_configuration + assert not configuration.plugin_configuration + assert not configuration.provider_type + + def test_get_defaults(self): + """ + Assert we can lookup a record with default values + """ + configuration = DiscussionsConfiguration.get(self.course_key_with_defaults) + assert configuration is not None + assert configuration.enabled + assert not configuration.lti_configuration + assert not configuration.plugin_configuration + assert not configuration.provider_type + + def test_get_explicit(self): + """ + Assert we can lookup a record with explicitly-set values + """ + configuration = DiscussionsConfiguration.get(self.course_key_with_values) + assert configuration is not None + assert not configuration.enabled + assert not configuration.lti_configuration + assert configuration.plugin_configuration + assert configuration.provider_type == 'cs_comments_service'