7 changed files with 301 additions and 76 deletions
-
17apps/api/admin.py
-
78apps/api/migrations/0002_supportmessage.py
-
42apps/api/models.py
-
142apps/api/permissions.py
-
35apps/api/serializers.py
-
3apps/api/urls.py
-
60apps/api/views/api_views.py
@ -0,0 +1,78 @@ |
|||
from django.db import migrations, models |
|||
import phonenumber_field.modelfields |
|||
import utils.validators |
|||
|
|||
|
|||
class Migration(migrations.Migration): |
|||
dependencies = [ |
|||
("api", "0001_initial"), |
|||
] |
|||
|
|||
operations = [ |
|||
migrations.CreateModel( |
|||
name="SupportMessage", |
|||
fields=[ |
|||
( |
|||
"id", |
|||
models.BigAutoField( |
|||
auto_created=True, |
|||
primary_key=True, |
|||
serialize=False, |
|||
verbose_name="ID", |
|||
), |
|||
), |
|||
( |
|||
"sender_name", |
|||
models.CharField( |
|||
help_text="Full name of the sender", |
|||
max_length=255, |
|||
verbose_name="Sender Name", |
|||
), |
|||
), |
|||
( |
|||
"sender_email", |
|||
models.EmailField( |
|||
help_text="Email address of the sender", |
|||
max_length=254, |
|||
verbose_name="Sender Email", |
|||
), |
|||
), |
|||
( |
|||
"subject", |
|||
models.CharField( |
|||
help_text="Message subject", |
|||
max_length=255, |
|||
verbose_name="Subject", |
|||
), |
|||
), |
|||
( |
|||
"sender_phone", |
|||
phonenumber_field.modelfields.PhoneNumberField( |
|||
blank=True, |
|||
help_text="e.g., +49 151 12345678", |
|||
max_length=128, |
|||
null=True, |
|||
region=None, |
|||
validators=[utils.validators.validate_possible_number], |
|||
verbose_name="Sender Phone", |
|||
), |
|||
), |
|||
( |
|||
"message", |
|||
models.TextField( |
|||
help_text="Support message body", |
|||
verbose_name="Message", |
|||
), |
|||
), |
|||
( |
|||
"created_at", |
|||
models.DateTimeField(auto_now_add=True, verbose_name="Created At"), |
|||
), |
|||
], |
|||
options={ |
|||
"verbose_name": "Support Message", |
|||
"verbose_name_plural": "Support Messages", |
|||
"ordering": ["-created_at"], |
|||
}, |
|||
), |
|||
] |
|||
@ -1,71 +1,71 @@ |
|||
from rest_framework import permissions |
|||
from rest_framework.authtoken.models import Token |
|||
from django.contrib.auth.models import AnonymousUser |
|||
|
|||
|
|||
class SwaggerTokenPermission(permissions.BasePermission): |
|||
""" |
|||
Custom permission for Swagger that allows access to authenticated users via token |
|||
or admin users via session authentication |
|||
""" |
|||
|
|||
def has_permission(self, request, view): |
|||
# Check if user is admin (for session-based access) |
|||
if request.user and request.user.is_authenticated and request.user.is_staff: |
|||
return True |
|||
|
|||
# Check for token in session (from our custom auth system) |
|||
swagger_token = request.session.get('swagger_token') |
|||
if swagger_token: |
|||
try: |
|||
token_obj = Token.objects.get(key=swagger_token) |
|||
if token_obj.user.is_active: |
|||
return True |
|||
except Token.DoesNotExist: |
|||
pass |
|||
|
|||
# Check for Authorization header |
|||
auth_header = request.META.get('HTTP_AUTHORIZATION', '') |
|||
if auth_header.startswith('Token '): |
|||
token = auth_header.split(' ')[1] |
|||
try: |
|||
token_obj = Token.objects.get(key=token) |
|||
if token_obj.user.is_active: |
|||
return True |
|||
except Token.DoesNotExist: |
|||
pass |
|||
|
|||
return False |
|||
|
|||
|
|||
class IsAdminOrSwaggerToken(permissions.BasePermission): |
|||
""" |
|||
Permission that allows access to admin users or users with valid swagger token |
|||
""" |
|||
|
|||
def has_permission(self, request, view): |
|||
# Allow admin users |
|||
if request.user and request.user.is_authenticated and request.user.is_staff: |
|||
return True |
|||
|
|||
# Check swagger token in session |
|||
swagger_token = request.session.get('swagger_token') |
|||
if swagger_token: |
|||
try: |
|||
token_obj = Token.objects.get(key=swagger_token) |
|||
return token_obj.user.is_active |
|||
except Token.DoesNotExist: |
|||
pass |
|||
|
|||
return False |
|||
|
|||
|
|||
class IsProfessorUser(permissions.BasePermission): |
|||
""" |
|||
Permission that allows access only to professors or admin users. |
|||
""" |
|||
|
|||
def has_permission(self, request, view): |
|||
if not (request.user and request.user.is_authenticated): |
|||
return False |
|||
return request.user.user_type == 'professor' or request.user.is_staff |
|||
from rest_framework import permissions |
|||
from rest_framework.authtoken.models import Token |
|||
from django.contrib.auth.models import AnonymousUser |
|||
|
|||
|
|||
class SwaggerTokenPermission(permissions.BasePermission): |
|||
""" |
|||
Custom permission for Swagger that allows access to authenticated users via token |
|||
or admin users via session authentication |
|||
""" |
|||
|
|||
def has_permission(self, request, view): |
|||
# Check if user is admin (for session-based access) |
|||
if request.user and request.user.is_authenticated and request.user.is_staff: |
|||
return True |
|||
|
|||
# Check for token in session (from our custom auth system) |
|||
swagger_token = request.session.get('swagger_token') |
|||
if swagger_token: |
|||
try: |
|||
token_obj = Token.objects.get(key=swagger_token) |
|||
if token_obj.user.is_active: |
|||
return True |
|||
except Token.DoesNotExist: |
|||
pass |
|||
|
|||
# Check for Authorization header |
|||
auth_header = request.META.get('HTTP_AUTHORIZATION', '') |
|||
if auth_header.startswith('Token '): |
|||
token = auth_header.split(' ')[1] |
|||
try: |
|||
token_obj = Token.objects.get(key=token) |
|||
if token_obj.user.is_active: |
|||
return True |
|||
except Token.DoesNotExist: |
|||
pass |
|||
|
|||
return False |
|||
|
|||
|
|||
class IsAdminOrSwaggerToken(permissions.BasePermission): |
|||
""" |
|||
Permission that allows access to admin users or users with valid swagger token |
|||
""" |
|||
|
|||
def has_permission(self, request, view): |
|||
# Allow admin users |
|||
if request.user and request.user.is_authenticated and request.user.is_staff: |
|||
return True |
|||
|
|||
# Check swagger token in session |
|||
swagger_token = request.session.get('swagger_token') |
|||
if swagger_token: |
|||
try: |
|||
token_obj = Token.objects.get(key=swagger_token) |
|||
return token_obj.user.is_active |
|||
except Token.DoesNotExist: |
|||
pass |
|||
|
|||
return False |
|||
|
|||
|
|||
class IsProfessorUser(permissions.BasePermission): |
|||
""" |
|||
Permission that allows access only to professors or admin users. |
|||
""" |
|||
|
|||
def has_permission(self, request, view): |
|||
if not (request.user and request.user.is_authenticated): |
|||
return False |
|||
return request.user.user_type == 'professor' or request.user.is_staff |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue