Files

67 lines
1.8 KiB
Python

import binascii
import os
from typing import List
from django.conf import settings
from django.db import models
from bitfield import BitField
from glitchtip.base_models import CreatedModel
def generate_token():
return binascii.hexlify(os.urandom(32)).decode()
class APIToken(CreatedModel):
"""
Ideas borrowed from rest_framework.authtoken and sentry.apitoken
"""
token = models.CharField(
max_length=64, unique=True, editable=False, default=generate_token
)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
label = models.CharField(max_length=255, blank=True)
scopes = BitField(
flags=(
"project:read",
"project:write",
"project:admin",
"project:releases",
"team:read",
"team:write",
"team:admin",
"event:read",
"event:write",
"event:admin",
"org:read",
"org:write",
"org:admin",
"member:read",
"member:write",
"member:admin",
)
)
def __str__(self):
return self.token
def get_scopes(self):
"""
Return array of set scope flags.
Example: ["project:read"]
"""
return [i[0] for i in self.scopes.items() if i[1] is True]
def add_permission(self, permission: str):
"""Add permission flag to scopes and save"""
setattr(self.scopes, permission, True)
self.save(update_fields=["scopes"])
def add_permissions(self, permissions: List[str]):
"""Add permission flags to scopes and save"""
for permission in permissions:
setattr(self.scopes, permission, True)
self.save(update_fields=["scopes"])