From 667268a2cfeef9c390b6050de0ff602c6fadcea4 Mon Sep 17 00:00:00 2001 From: Andreas Kloeckner Date: Thu, 28 Apr 2016 11:51:28 -0500 Subject: [PATCH] Add support for if_started_before --- course/utils.py | 25 ++++++++++++++++++------- course/validation.py | 2 ++ doc/flow.rst | 10 ++++++++++ 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/course/utils.py b/course/utils.py index d9af3e35..cdcb479f 100644 --- a/course/utils.py +++ b/course/utils.py @@ -107,6 +107,19 @@ def _eval_generic_conditions(rule, course, role, now_datetime): return True +def _eval_generic_session_conditions(rule, session, role, now_datetime): + if hasattr(rule, "if_has_tag"): + if session.access_rules_tag != rule.if_has_tag: + return False + + if hasattr(rule, "if_started_before"): + ds = parse_date_spec(session.course, rule.if_started_before) + if not session.start_time < ds: + return False + + return True + + def get_flow_rules(flow_desc, kind, participation, flow_id, now_datetime, consider_exceptions=True, default_rules_desc=[]): if (not hasattr(flow_desc, "rules") @@ -233,14 +246,13 @@ def get_session_access_rule(session, role, flow_desc, now_datetime, if not _eval_generic_conditions(rule, session.course, role, now_datetime): continue + if not _eval_generic_session_conditions(rule, session, role, now_datetime): + continue + if hasattr(rule, "if_in_facility"): if rule.if_in_facility not in facilities: continue - if hasattr(rule, "if_has_tag"): - if session.access_rules_tag != rule.if_has_tag: - continue - if hasattr(rule, "if_in_progress"): if session.in_progress != rule.if_in_progress: continue @@ -308,9 +320,8 @@ def get_session_grading_rule(session, role, flow_desc, now_datetime): if role not in rule.if_has_role: continue - if hasattr(rule, "if_has_tag"): - if session.access_rules_tag != rule.if_has_tag: - continue + if not _eval_generic_session_conditions(rule, session, role, now_datetime): + continue if hasattr(rule, "if_completed_before"): ds = parse_date_spec(session.course, rule.if_completed_before) diff --git a/course/validation.py b/course/validation.py index 77059100..e5da23fd 100644 --- a/course/validation.py +++ b/course/validation.py @@ -553,6 +553,7 @@ def validate_session_access_rule(vctx, location, arule, tags): allowed_attrs=[ ("if_after", datespec_types), ("if_before", datespec_types), + ("if_started_before", datespec_types), ("if_has_role", list), ("if_in_facility", str), ("if_has_tag", (six.string_types, type(None))), @@ -618,6 +619,7 @@ def validate_session_grading_rule(vctx, location, grule, tags, grade_identifier) allowed_attrs=[ ("if_has_role", list), ("if_has_tag", (six.string_types, type(None))), + ("if_started_before", datespec_types), ("if_completed_before", datespec_types), ("credit_percent", (int, float)), diff --git a/doc/flow.rst b/doc/flow.rst index cab426c9..34873c44 100644 --- a/doc/flow.rst +++ b/doc/flow.rst @@ -389,6 +389,11 @@ Rules about accessing and interacting with a flow (Optional) A :ref:`datespec ` that determines a date/time before which this rule applies. + .. attribute:: if_started_before + + (Optional) A :ref:`datespec `. Rule applies if the session was started before + this time. + .. attribute:: if_has_role (Optional) A list of a subset of ``[unenrolled, ta, student, instructor]``. @@ -464,6 +469,11 @@ Determining how final (overall) grades of flows are computed (Optional) A list of a subset of ``[unenrolled, ta, student, instructor]``. + .. attribute:: if_started_before + + (Optional) A :ref:`datespec `. Rule applies if the session was started before + this time. + .. attribute:: if_has_tag (Optional) Rule applies if session has this tag (see :attr:`FlowStartRules.tag_session`), -- GitLab