diff --git a/xmodule/course_block.py b/xmodule/course_block.py index a74abdb3f617..52422ffa3427 100644 --- a/xmodule/course_block.py +++ b/xmodule/course_block.py @@ -108,6 +108,7 @@ class EmailString(String): """ Parse String with email validation """ + def from_json(self, value): if value: validate_email(value) @@ -226,6 +227,7 @@ class ProctoringProvider(String): ProctoringProvider field, which includes validation of the provider and default that pulls from edx platform settings. """ + def from_json(self, value): """ Return ProctoringProvider as full featured Python type. Perform validation on the provider @@ -1457,15 +1459,18 @@ def get_discussion_blackout_datetimes(self): @property def forum_posts_allowed(self): """ - Return whether forum posts are allowed by the discussion_blackouts - setting + Return whether forum posts are allowed by the discussion_blackouts setting + Checks if posting restrictions are enabled or if there's a currently ongoing blackout period. """ + blackouts = self.get_discussion_blackout_datetimes() + posting_restrictions = self.discussions_settings.get('posting_restrictions', 'disabled') now = datetime.now(utc) - for blackout in blackouts: - if blackout["start"] <= now <= blackout["end"]: - return False - return True + + if posting_restrictions == 'enabled': + return False + + return all(not (blackout["start"] <= now <= blackout["end"]) for blackout in blackouts) @property def number(self): diff --git a/xmodule/modulestore/tests/factories.py b/xmodule/modulestore/tests/factories.py index 9e0a2aa5cfd1..4467215fac4a 100644 --- a/xmodule/modulestore/tests/factories.py +++ b/xmodule/modulestore/tests/factories.py @@ -44,6 +44,7 @@ class XModuleFactoryLock(threading.local): after ensuring that a) the modulestore will be cleaned up, and b) that XModuleFactoryLock.disable will be called. """ + def __init__(self): super().__init__() self._enabled = False @@ -123,6 +124,7 @@ def _create(cls, target_class, **kwargs): # lint-amnesty, pylint: disable=argum run = kwargs.pop('run', name) user_id = kwargs.pop('user_id', ModuleStoreEnum.UserID.test) emit_signals = kwargs.pop('emit_signals', False) + # By default course has enrollment_start in the future which means course is closed for enrollment. # We're setting the 'enrollment_start' field to None to reduce number of arguments needed to setup course. # Use the 'default_enrollment_start=True' kwarg to skip this and use the default enrollment_start date. @@ -478,6 +480,7 @@ class StackTraceCounter: """ A class that counts unique stack traces underneath a particular stack frame. """ + def __init__(self, stack_depth, include_arguments=True): """ Arguments: