from requests.exceptions import RequestException from django.contrib.auth.mixins import LoginRequiredMixin from django.views.generic import TemplateView from typing import Dict, Optional, Set from lemoncurry.requests import mf2 class ClientsDict(dict): def __missing__(self, client_id): self[client_id] = Client(client_id) return self[client_id] class Client: id: str count: int scopes: Set[str] app: Optional[Dict[str, str]] def __init__(self, client_id): self.id = client_id self.count = 0 self.scopes = set() try: apps = mf2(self.id).to_dict(filter_by_type="h-x-app") self.app = apps[0]["properties"] except (RequestException, IndexError): self.app = None class TokensListView(LoginRequiredMixin, TemplateView): template_name = "lemonauth/tokens.html" def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) clients = ClientsDict() for token in self.request.user.token_set.all(): client = clients[token.client_id] client.count += 1 client.scopes |= set(token.scope.split(" ")) context.update({"clients": clients, "title": "tokens"}) return context