[docs]classCSLApplicationAdmin(admin.ModelAdmin):""" Custom admin interface for the CSLApplication model. Adds display and filtering by relevant fields. Adds actions to sanction and unsanction applications. Registered by oauth2_provider.admin Communicated to oauth2_provider by settings.OAUTH2_PROVIDER.APPLICATION_ADMIN_CLASS """# Render user_has_oauth_and_api_access using checkmarks or crossesdefuser_has_oauth_and_api_access(self,obj):returnobj.user.oauth_and_api_accessuser_has_oauth_and_api_access.boolean=Truelist_display=("id","name","user","client_type","authorization_grant_type","sanctioned","skip_authorization","user_has_oauth_and_api_access",)list_filter=("sanctioned","skip_authorization","sanctioned_but_do_not_skip_authorization","user__oauth_and_api_access","client_type","authorization_grant_type",)radio_fields={"client_type":admin.HORIZONTAL,"authorization_grant_type":admin.VERTICAL,}search_fields=("name","user__username",)raw_id_fields=("user",)actions=["sanction_applications","unsanction_applications","skip_authorization_for_applications","do_not_skip_authorization_for_applications",]@admin.action(description="Sanction selected applications")defsanction_applications(self,request,queryset):updated=queryset.update(sanctioned=True,skip_authorization=True)self.message_user(request,ngettext(f"Successfully sanctioned {updated} application.",f"Successfully sanctioned {updated} applications.",updated,),messages.SUCCESS,)@admin.action(description="Unsanction selected applications")defunsanction_applications(self,request,queryset):updated=queryset.update(sanctioned=False,skip_authorization=False)self.message_user(request,ngettext(f"Successfully unsanctioned {updated} application.",f"Successfully unsanctioned {updated} applications.",updated,),messages.SUCCESS,)@admin.action(description="Skip authorization for selected applications")defskip_authorization_for_applications(self,request,queryset):updated=queryset.update(skip_authorization=True)self.message_user(request,ngettext(f"Successfully marked {updated} application to skip authorization.",f"Successfully marked {updated} applications to skip authorization.",updated,),messages.SUCCESS,)@admin.action(description="Do not skip authorization for selected applications")defdo_not_skip_authorization_for_applications(self,request,queryset):updated=queryset.update(skip_authorization=False)self.message_user(request,ngettext(f"Successfully marked {updated} application to not skip authorization.",f"Successfully marked {updated} applications to not skip authorization.",updated,),messages.SUCCESS,)