Merge branch 'main' of https://gitea.staxriver.com/staxriver/padelclub_backend
commit
1482f7f670
@ -0,0 +1,22 @@ |
||||
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"] |
||||
raw_id_fields = ['user'] |
||||
|
||||
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