Skip to content

Commit e588e10

Browse files
authored
Merge pull request #16 from sofeikov/STUD-72-reject-changes-if-the-rule-is-locked
Reject rule changes if the rule is locked
2 parents d87c25d + 9eed843 commit e588e10

File tree

2 files changed

+14
-6
lines changed

2 files changed

+14
-6
lines changed

backend/ezruleapp.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@
1414
from models.backend_core import User, Role
1515

1616
from flask_security import (
17+
current_user,
1718
Security,
1819
auth_required,
1920
SQLAlchemySessionUserDatastore,
2021
)
21-
from core.rule import RuleFactory, RuleConverter, Rule
2222
from core.outcomes import FixedOutcome
2323
from core.rule import RuleFactory, RuleConverter, Rule
2424
from core.rule_checkers import (
@@ -145,6 +145,8 @@ def show_rule(rule_id=None, revision_number=None):
145145
del form.rid
146146
revision_list = fsrm.get_rule_revision_list(rule)
147147
rule_lock = rule_locker.is_record_locked(rule)
148+
if rule_lock:
149+
del form["submit"]
148150
return render_template(
149151
"show_rule.html",
150152
rule=rule_json,
@@ -163,7 +165,13 @@ def show_rule(rule_id=None, revision_number=None):
163165
return redirect(url_for("show_rule", rule_id=rule_id))
164166
app.logger.info(request.form)
165167
rule = fsrm.load_rule(rule_id)
166-
# TODO reject the change is the rule is locked
168+
lock_record = rule_locker.is_record_locked(rule)
169+
if lock_record is not None:
170+
if lock_record.locked_by != current_user.email:
171+
flash(
172+
f"Changes to {rule_id} were NOT saved. Rule is locked by {lock_record.locked_by}"
173+
)
174+
return redirect(url_for("show_rule", rule_id=rule_id))
167175
app.logger.info(f"Current rule state {rule}")
168176
rule.description = form.description.data
169177
rule.logic = form.logic.data
@@ -224,7 +232,7 @@ def test_rule():
224232
@csrf.exempt
225233
def lock_rule(rule_id):
226234
rule = fsrm.load_rule(rule_id)
227-
success, result = rule_locker.lock_storage(rule)
235+
success, result = rule_locker.lock_storage(rule, locked_by=current_user.email)
228236
return {"success": success, **result._asdict()}
229237

230238

core/rule_locker.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
class RuleStorageLocker(abc.ABC):
1414
@abc.abstractmethod
15-
def lock_storage(self, rule: Rule) -> bool:
15+
def lock_storage(self, rule: Rule, locked_by: str) -> bool:
1616
"""Lock storage for a specific rule."""
1717

1818
@abc.abstractmethod
@@ -44,11 +44,11 @@ def to_lock_record(self) -> LockRecord:
4444
def __init__(self, table_name: str):
4545
self.DBLockRecord.Meta.table_name = table_name
4646

47-
def lock_storage(self, rule: Rule) -> Tuple[bool, LockRecord]:
47+
def lock_storage(self, rule: Rule, locked_by: str) -> Tuple[bool, LockRecord]:
4848
current_lock = self.is_record_locked(rule)
4949
if current_lock is None:
5050
db_lock_item = self.DBLockRecord(
51-
rid=rule.rid, expires_on=timedelta(hours=1)
51+
rid=rule.rid, expires_on=timedelta(hours=1), locked_by=locked_by
5252
)
5353
db_lock_item.save()
5454
return True, db_lock_item.to_lock_record()

0 commit comments

Comments
 (0)