Coverage for django_napse/auth/models/keys/key.py: 81%

21 statements  

« prev     ^ index     » next       coverage.py v7.4.3, created at 2024-03-12 13:49 +0000

1import contextlib 

2 

3from django.db import IntegrityError, models 

4from rest_framework_api_key.models import APIKey 

5 

6from django_napse.auth.models.permissions import KeyPermission 

7from django_napse.utils.errors import NapseKeyError 

8 

9 

10class NapseAPIKey(APIKey): 

11 is_master_key = models.BooleanField(default=False) 

12 description = models.TextField(blank=True) 

13 

14 def save(self, *args, **kwargs) -> None: 

15 if self.is_master_key: 

16 self.name = "Napse Master Key" 

17 if self.is_master_key and NapseAPIKey.objects.filter(is_master_key=True).count() > (1 if self.pk else 0): 

18 error_msg = "Only one master key can exist at a time." 

19 raise NapseKeyError.DuplicateMasterkey(error_msg) 

20 return super().save(*args, **kwargs) 

21 

22 def add_permission(self, space, permission): 

23 with contextlib.suppress(IntegrityError): 

24 KeyPermission.objects.create(key=self, space=space, permission_type=permission) 

25 

26 def revoke(self): 

27 self.revoked = True 

28 self.save()