Skip to content

Commit

Permalink
Add rest framework, API endpoint for identity, basic auth
Browse files Browse the repository at this point in the history
  • Loading branch information
lullis committed May 14, 2024
1 parent fff29e7 commit bf7fba4
Show file tree
Hide file tree
Showing 8 changed files with 97 additions and 1 deletion.
Empty file added admin/__init__.py
Empty file.
68 changes: 68 additions & 0 deletions admin/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
from django.contrib.auth.password_validation import validate_password
from rest_framework import serializers

from users.models.domain import Domain
from users.models.identity import Identity
from users.models.user import User
from users.services import IdentityService
from users.views.admin.domains import DomainValidator


class IdentityCreateSerializer(serializers.ModelSerializer):
email_address = serializers.EmailField(write_only=True)
initial_password = serializers.CharField(write_only=True)
username = serializers.CharField(write_only=True)
domain = serializers.CharField(validators=[DomainValidator], write_only=True)

def validate_email_address(self, value):
if User.objects.filter(email=value).exists():
raise serializers.ValidationError("This user is already registered")
return value

def validate_initial_password(self, value):
if value:
validate_password(value)
return value

def validate_domain(self, value):
if not value:
return None

if Domain.objects.filter(domain=value).exists():
raise serializers.ValidationError("Domain name is already registered")

return value

def create(self, validated_data):
user = User.objects.create_user(
email=validated_data["email_address"],
password=validated_data["initial_password"],
)
domain = Domain.objects.create(
domain=validated_data["domain"],
service_domain=None,
public=False,
default=False,
local=True,
)
domain.users.add(user)
username = validated_data["username"]
return IdentityService.create(
user=user,
username=username,
domain=domain,
name=username,
discoverable=True,
)

class Meta:
model = Identity
fields = (
"id",
"actor_uri",
"email_address",
"initial_password",
"username",
"domain",
)
read_only_fields = ("id", "actor_uri")
7 changes: 7 additions & 0 deletions admin/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from django.urls import path

from . import views

urlpatterns = [
path("identities", views.IdentityCreateView.as_view(), name="identity-create"),
]
10 changes: 10 additions & 0 deletions admin/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from rest_framework import generics

from users.models.identity import Identity

from . import serializers


class IdentityCreateView(generics.CreateAPIView):
serializer_class = serializers.IdentityCreateSerializer
model = Identity
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ django-hatchway~=0.5.2
django-htmx~=1.13.0
django-oauth-toolkit~=2.2.0
django-storages[google,boto3]~=1.13.1
djangorestframework~=3.15.1
django~=4.2.0
email-validator~=1.3.0
gunicorn~=20.1.0
Expand Down
9 changes: 9 additions & 0 deletions takahe/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,8 @@ class Config:
"mediaproxy",
"stator",
"users",
"rest_framework",
"rest_framework.authtoken",
]

MIDDLEWARE = [
Expand Down Expand Up @@ -275,6 +277,13 @@ class Config:
}
}

REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": [
"rest_framework.authentication.BasicAuthentication",
"rest_framework.authentication.SessionAuthentication",
]
}

AUTH_PASSWORD_VALIDATORS = [
{
"NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
Expand Down
1 change: 1 addition & 0 deletions takahe/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,7 @@
admin.Stator.as_view(),
name="admin_stator",
),
path("admin/api/", include("admin.urls")),
# Identity views
path("@<handle>/", identity.ViewIdentity.as_view()),
path("@<handle>/replies/", identity.ViewIdentity.as_view(with_replies=True)),
Expand Down
2 changes: 1 addition & 1 deletion users/views/admin/users.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ def form_valid(self, form):
user=user,
username=username,
domain=domain,
name=f"{username}@{domain.domain}",
name=username,
discoverable=True,
)
return redirect(User.urls.admin)
Expand Down

0 comments on commit bf7fba4

Please sign in to comment.