Skip to content

Commit 39dbf19

Browse files
authored
Merge pull request #56 from Shivansh-yadav13/feat_ufp
feat: update_filtered_policies
2 parents 2222d9a + 6799bc8 commit 39dbf19

2 files changed

Lines changed: 62 additions & 0 deletions

File tree

casbin_sqlalchemy_adapter/adapter.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,3 +246,45 @@ def update_policies(
246246
"""
247247
for i in range(len(old_rules)):
248248
self.update_policy(sec, ptype, old_rules[i], new_rules[i])
249+
250+
def update_filtered_policies(
251+
self, sec, ptype, new_rules: [[str]], field_index, *field_values
252+
) -> [[str]]:
253+
"""update_filtered_policies updates all the policies on the basis of the filter."""
254+
255+
filter = Filter()
256+
filter.ptype = ptype
257+
258+
# Creating Filter from the field_index & field_values provided
259+
for i in range(len(field_values)):
260+
if field_index <= i and i < field_index + len(field_values):
261+
setattr(filter, f"v{i}", field_values[i - field_index])
262+
else:
263+
break
264+
265+
self._update_filtered_policies(new_rules, filter)
266+
267+
def _update_filtered_policies(self, new_rules, filter) -> [[str]]:
268+
"""_update_filtered_policies updates all the policies on the basis of the filter."""
269+
270+
with self._session_scope() as session:
271+
272+
# Load old policies
273+
274+
query = session.query(self._db_class).filter(
275+
self._db_class.ptype == filter.ptype
276+
)
277+
filtered_query = self.filter_query(query, filter)
278+
old_rules = filtered_query.all()
279+
280+
# Delete old policies
281+
282+
self.remove_policies("p", filter.ptype, old_rules)
283+
284+
# Insert new policies
285+
286+
self.add_policies("p", filter.ptype, new_rules)
287+
288+
# return deleted rules
289+
290+
return old_rules

tests/test_adapter.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,3 +364,23 @@ def test_update_policies(self):
364364

365365
self.assertFalse(e.enforce("data2_admin", "data2", "write"))
366366
self.assertTrue(e.enforce("data2_admin", "data_test", "write"))
367+
368+
def test_update_filtered_policies(self):
369+
e = get_enforcer()
370+
371+
e.update_filtered_policies(
372+
[
373+
["data2_admin", "data3", "read"],
374+
["data2_admin", "data3", "write"],
375+
],
376+
0,
377+
"data2_admin",
378+
)
379+
self.assertTrue(e.enforce("data2_admin", "data3", "write"))
380+
self.assertTrue(e.enforce("data2_admin", "data3", "read"))
381+
382+
e.update_filtered_policies([["alice", "data1", "write"]], 0, "alice")
383+
self.assertTrue(e.enforce("alice", "data1", "write"))
384+
385+
e.update_filtered_policies([["bob", "data2", "read"]], 0, "bob")
386+
self.assertTrue(e.enforce("bob", "data2", "read"))

0 commit comments

Comments
 (0)