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