parent
08f78e7de4
commit
08ada3d771
@ -0,0 +1,21 @@ |
|||||||
|
from django.contrib import admin |
||||||
|
from rest_framework_api_key.admin import APIKeyModelAdmin |
||||||
|
from rest_framework_api_key.models import APIKey as DefaultAPIKey |
||||||
|
from .models import APIKey |
||||||
|
|
||||||
|
# Unregister the default APIKey admin |
||||||
|
admin.site.unregister(DefaultAPIKey) |
||||||
|
|
||||||
|
|
||||||
|
@admin.register(APIKey) |
||||||
|
class APIKeyAdmin(APIKeyModelAdmin): |
||||||
|
list_display = [*APIKeyModelAdmin.list_display, "user"] |
||||||
|
list_filter = [*APIKeyModelAdmin.list_filter, "user"] |
||||||
|
search_fields = [*APIKeyModelAdmin.search_fields, "user__username", "user__email"] |
||||||
|
|
||||||
|
def get_form(self, request, obj=None, **kwargs): |
||||||
|
form = super().get_form(request, obj, **kwargs) |
||||||
|
# Make user field required |
||||||
|
if 'user' in form.base_fields: |
||||||
|
form.base_fields['user'].required = True |
||||||
|
return form |
||||||
@ -0,0 +1,7 @@ |
|||||||
|
from django.apps import AppConfig |
||||||
|
|
||||||
|
|
||||||
|
class ApiConfig(AppConfig): |
||||||
|
default_auto_field = 'django.db.models.BigAutoField' |
||||||
|
name = 'api' |
||||||
|
verbose_name = 'API' |
||||||
@ -0,0 +1,24 @@ |
|||||||
|
from rest_framework_api_key.permissions import BaseHasAPIKey |
||||||
|
from .models import APIKey |
||||||
|
|
||||||
|
|
||||||
|
class HasAPIKey(BaseHasAPIKey): |
||||||
|
model = APIKey |
||||||
|
|
||||||
|
def has_permission(self, request, view): |
||||||
|
# First check if we have a valid API key |
||||||
|
has_api_key = super().has_permission(request, view) |
||||||
|
|
||||||
|
if has_api_key: |
||||||
|
# Get the API key from the request |
||||||
|
key = self.get_key(request) |
||||||
|
if key: |
||||||
|
try: |
||||||
|
api_key = APIKey.objects.get_from_key(key) |
||||||
|
# Set the request.user to the user associated with the API key |
||||||
|
request.user = api_key.user |
||||||
|
return True |
||||||
|
except APIKey.DoesNotExist: |
||||||
|
pass |
||||||
|
|
||||||
|
return False |
||||||
@ -0,0 +1,36 @@ |
|||||||
|
# Generated by Django 5.1 on 2025-09-17 07:49 |
||||||
|
|
||||||
|
import django.db.models.deletion |
||||||
|
from django.conf import settings |
||||||
|
from django.db import migrations, models |
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration): |
||||||
|
|
||||||
|
initial = True |
||||||
|
|
||||||
|
dependencies = [ |
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL), |
||||||
|
] |
||||||
|
|
||||||
|
operations = [ |
||||||
|
migrations.CreateModel( |
||||||
|
name='APIKey', |
||||||
|
fields=[ |
||||||
|
('id', models.CharField(editable=False, max_length=150, primary_key=True, serialize=False, unique=True)), |
||||||
|
('prefix', models.CharField(editable=False, max_length=8, unique=True)), |
||||||
|
('hashed_key', models.CharField(editable=False, max_length=150)), |
||||||
|
('created', models.DateTimeField(auto_now_add=True, db_index=True)), |
||||||
|
('name', models.CharField(default=None, help_text='A free-form name for the API key. Need not be unique. 50 characters max.', max_length=50)), |
||||||
|
('revoked', models.BooleanField(blank=True, default=False, help_text='If the API key is revoked, clients cannot use it anymore. (This cannot be undone.)')), |
||||||
|
('expiry_date', models.DateTimeField(blank=True, help_text='Once API key expires, clients cannot use it anymore.', null=True, verbose_name='Expires')), |
||||||
|
('user', models.ForeignKey(help_text='The user this API key belongs to', on_delete=django.db.models.deletion.CASCADE, related_name='api_keys', to=settings.AUTH_USER_MODEL)), |
||||||
|
], |
||||||
|
options={ |
||||||
|
'verbose_name': 'API Key', |
||||||
|
'verbose_name_plural': 'API Keys', |
||||||
|
'ordering': ('-created',), |
||||||
|
'abstract': False, |
||||||
|
}, |
||||||
|
), |
||||||
|
] |
||||||
@ -0,0 +1,23 @@ |
|||||||
|
from django.db import models |
||||||
|
from rest_framework_api_key.models import AbstractAPIKey |
||||||
|
from tournaments.models import CustomUser |
||||||
|
|
||||||
|
|
||||||
|
class APIKey(AbstractAPIKey): |
||||||
|
""" |
||||||
|
API Key model linked to a specific user. |
||||||
|
This allows filtering API access based on the user associated with the API key. |
||||||
|
""" |
||||||
|
user = models.ForeignKey( |
||||||
|
CustomUser, |
||||||
|
on_delete=models.CASCADE, |
||||||
|
related_name='api_keys', |
||||||
|
help_text='The user this API key belongs to' |
||||||
|
) |
||||||
|
|
||||||
|
class Meta(AbstractAPIKey.Meta): |
||||||
|
verbose_name = "API Key" |
||||||
|
verbose_name_plural = "API Keys" |
||||||
|
|
||||||
|
def __str__(self): |
||||||
|
return f"API Key for {self.user.username}" |
||||||
Loading…
Reference in new issue