diff --git a/docs/samples/config/mscolab/mscolab_settings.py.sample b/docs/samples/config/mscolab/mscolab_settings.py.sample index 48a0bd1f8..f6621b4ea 100644 --- a/docs/samples/config/mscolab/mscolab_settings.py.sample +++ b/docs/samples/config/mscolab/mscolab_settings.py.sample @@ -69,3 +69,9 @@ STUB_CODE = """ """ + +# looks for a given category forn a operation ending with GROUP_POSTFIX +# e.g. category = Tex will look for TexGroup +# all users in that Group are set to the operations of that category +# having the roles in the TexGroup +GROUP_POSTFIX = "Group" diff --git a/mslib/mscolab/conf.py b/mslib/mscolab/conf.py index 8c11ac201..59f0c59c5 100644 --- a/mslib/mscolab/conf.py +++ b/mslib/mscolab/conf.py @@ -69,6 +69,13 @@ class default_mscolab_settings: """ + + # looks for a given category forn a operation ending with GROUP_POSTFIX + # e.g. category = Tex will look for TexGroup + # all users in that Group are set to the operations of that category + # having the roles in the TexGroup + GROUP_POSTFIX = "Group" + enable_basic_http_authentication = False # enable verification by Mail diff --git a/mslib/mscolab/file_manager.py b/mslib/mscolab/file_manager.py index 429ba3acb..900bcddf3 100644 --- a/mslib/mscolab/file_manager.py +++ b/mslib/mscolab/file_manager.py @@ -62,6 +62,11 @@ def create_operation(self, path, description, user, last_used=None, content=None perm = Permission(user.id, operation_id, "creator") db.session.add(perm) db.session.commit() + # here we can import the permissions from Group file + if not path.endswith(mscolab_settings.GROUP_POSTFIX): + import_op = Operation.query.filter_by(path=f"{category}{mscolab_settings.GROUP_POSTFIX}").first() + if import_op is not None: + self.import_permissions(import_op.id, operation_id, user.id) data = fs.open_fs(self.data_dir) data.makedir(operation.path) operation_file = data.open(fs.path.combine(operation.path, 'main.ftml'), 'w') @@ -420,6 +425,17 @@ def add_bulk_permission(self, op_id, user, new_u_ids, access_level): if Permission.query.filter_by(u_id=u_id, op_id=op_id).first() is None: new_permissions.append(Permission(u_id, op_id, access_level)) db.session.add_all(new_permissions) + operation = Operation.query.filter_by(id=op_id).first() + if operation.path.endswith(mscolab_settings.GROUP_POSTFIX): + # the members of this gets added to all others of same category + category = operation.path.split(mscolab_settings.GROUP_POSTFIX)[0] + # all operation with that category + ops_category = Operation.query.filter_by(category=category) + new_permissions = [] + for ops in ops_category: + if not ops.path.endswith(mscolab_settings.GROUP_POSTFIX): + new_permissions.append(Permission(u_id, ops.id, access_level)) + db.session.add_all(new_permissions) try: db.session.commit() return True @@ -437,6 +453,17 @@ def modify_bulk_permission(self, op_id, user, u_ids, new_access_level): .filter(Permission.u_id.in_(u_ids))\ .update({Permission.access_level: new_access_level}, synchronize_session='fetch') + operation = Operation.query.filter_by(id=op_id).first() + if operation.path.endswith(mscolab_settings.GROUP_POSTFIX): + # the members of this gets added to all others of same category + category = operation.path.split(mscolab_settings.GROUP_POSTFIX)[0] + # all operation with that category + ops_category = Operation.query.filter_by(category=category) + for ops in ops_category: + Permission.query \ + .filter(Permission.op_id == ops.id) \ + .filter(Permission.u_id.in_(u_ids)) \ + .update({Permission.access_level: new_access_level}, synchronize_session='fetch') try: db.session.commit() return True @@ -467,6 +494,18 @@ def delete_bulk_permission(self, op_id, user, u_ids): .filter(Permission.u_id.in_(u_ids)) \ .delete(synchronize_session='fetch') + operation = Operation.query.filter_by(id=op_id).first() + if operation.path.endswith(mscolab_settings.GROUP_POSTFIX): + # the members of this gets added to all others of same category + category = operation.path.split(mscolab_settings.GROUP_POSTFIX)[0] + # all operation with that category + ops_category = Operation.query.filter_by(category=category) + for ops in ops_category: + Permission.query \ + .filter(Permission.op_id == ops.id) \ + .filter(Permission.u_id.in_(u_ids)) \ + .delete(synchronize_session='fetch') + db.session.commit() return True