dosubot[bot] commented on issue #29504:
URL: https://github.com/apache/superset/issues/29504#issuecomment-2211079508

   <!-- Answer -->
   To clean up deprecated permissions after upgrading Apache Superset from 
version 1.5.2 to 4.0.2, you can use the `cleanup_permissions` function provided 
in the `scripts/permissions_cleanup.py` script. This function handles the 
cleanup of duplicate permissions, permissions with `None` values, and empty 
roles.
   
   Here is the relevant code snippet for cleaning up permissions:
   
   ```python
   from collections import defaultdict
   from superset import security_manager
   from superset.utils.decorators import transaction
   
   @transaction()
   def cleanup_permissions() -> None:
       # 1. Clean up duplicates.
       pvms = security_manager.get_session.query(
           security_manager.permissionview_model
       ).all()
       print(f"# of permission view menus is: {len(pvms)}")
       pvms_dict = defaultdict(list)
       for pvm in pvms:
           pvms_dict[(pvm.permission, pvm.view_menu)].append(pvm)
       duplicates = [v for v in pvms_dict.values() if len(v) > 1]
   
       for pvm_list in duplicates:
           first_prm = pvm_list[0]
           roles = set(first_prm.role)
           for pvm in pvm_list[1:]:
               roles = roles.union(pvm.role)
               security_manager.get_session.delete(pvm)
           first_prm.roles = list(roles)
   
       pvms = security_manager.get_session.query(
           security_manager.permissionview_model
       ).all()
       print(f"Stage 1: # of permission view menus is: {len(pvms)}")
   
       # 2. Clean up None permissions or view menus
       pvms = security_manager.get_session.query(
           security_manager.permissionview_model
       ).all()
       for pvm in pvms:
           if not (pvm.view_menu and pvm.permission):
               security_manager.get_session.delete(pvm)
   
       pvms = security_manager.get_session.query(
           security_manager.permissionview_model
       ).all()
       print(f"Stage 2: # of permission view menus is: {len(pvms)}")
   
       # 3. Delete empty permission view menus from roles
       roles = 
security_manager.get_session.query(security_manager.role_model).all()
       for role in roles:
           role.permissions = [p for p in role.permissions if p]
   
       # 4. Delete empty roles from permission view menus
       pvms = security_manager.get_session.query(
           security_manager.permissionview_model
       ).all()
       for pvm in pvms:
           pvm.role = [r for r in pvm.role if r]
   
   cleanup_permissions()
   ```
   
   To use this function, simply run the `cleanup_permissions` function. This 
will handle the deletion of duplicate permissions, permissions with `None` 
values, and empty roles, ensuring that your permissions are properly cleaned up 
after the upgrade 
<sup>[[1]](https://github.com/apache/superset/blob/master/scripts/permissions_cleanup.py)</sup>.
   
   
   <!-- Dosu Comment Footer -->
   *To continue talking to [Dosu](https://dosu.dev), mention @dosu.*
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to