def restore(self, user): group_dashboard_mappings = DomainMapping.objects.get_group_dashboard_mappings( self.default_group.id) group_dashboard_clone_mappings = DomainMapping.objects. \ get_group_dashboard_clone_mappings(group_dashboard_mappings) user_dashboards_for_group = Dashboard.objects.filter(pk__in=list( group_dashboard_clone_mappings.values_list("src_id", flat=True)), user=user) for user_dashboard in user_dashboards_for_group: Dashboard.restore(user_dashboard) group_dashboard_ids = group_dashboard_mappings.values_list("dest_id", flat=True) user_cloned_dashboards_ids_for_group = DomainMapping.objects.filter( src_id__in=list( user_dashboards_for_group.values_list("id", flat=True)), src_type=MappingType.dashboard, relationship_type=RelationshipType.cloneOf, dest_type=MappingType.dashboard).values_list("dest_id", flat=True) # Create missing dashboards # TODO: extract this into a method for reuse. Same logic exists in people/models.py # TODO: modify this to use .exclude(). This was originally refactored, because of issues # using .difference() on querysets with mysql. missing_dashboard_ids = [] for group_dashboard_id in group_dashboard_ids: if group_dashboard_id not in user_cloned_dashboards_ids_for_group: missing_dashboard_ids.append(group_dashboard_id) Dashboard.create_missing_dashboards_for_user(user, missing_dashboard_ids)