Skip to content

[Tbc 217] Core refactor for auth flow #84

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 12 commits into
base: dev
Choose a base branch
from
4 changes: 2 additions & 2 deletions api/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@

urlpatterns = [
path("admin/", admin.site.urls),
path("user/", include("apps.core.urls")),
path("app/", include("apps.core.urls_core")),
path("member/", include("apps.core.urls_member")),
path("mentorship/", include("apps.mentorship.urls")),
Expand All @@ -28,5 +27,6 @@
path("company-profile/", include("apps.company.urls_company")),
path("event/", include("apps.event.urls")),
path("api/", include("apps.core.urls_internal")),
path("auth/", include("apps.core.urls_auth")),
path('api/core/', include('apps.core.urls_new')),
path('api/member/', include('apps.member.urls')),
]
2 changes: 0 additions & 2 deletions apps/core/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,3 @@ class CoreConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "apps.core"

def ready(self):
import apps.core.signals
16 changes: 16 additions & 0 deletions apps/core/auth_backends.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# In a new file, e.g., core/auth_backends.py
from django.contrib.auth import get_user_model
from django.contrib.auth.backends import ModelBackend


class EmailBackend(ModelBackend):
def authenticate(self, request, email=None, password=None, **kwargs):
UserModel = get_user_model()
try:
user = UserModel.objects.get(email=email)
except UserModel.DoesNotExist:
return None
else:
if user.check_password(password):
return user
return None
196 changes: 0 additions & 196 deletions apps/core/serializers.py

This file was deleted.

5 changes: 5 additions & 0 deletions apps/core/serializers/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from .user_serializers import *
from .profile_serializers import *
from .talent_serializers import *
from .company_serializers import *
from .misc_serializers import *
27 changes: 27 additions & 0 deletions apps/core/serializers/company_serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# TODO | CODE CLEAN UP: SHOULD BE MOVED TO COMPANY.SERIALIZERS

from rest_framework import serializers
from apps.company.models import CompanyProfile
from apps.core.models import CustomUser


class CompanyProfileSerializer(serializers.ModelSerializer):
"""
Serializer for CompanyProfile model.
"""
current_employees = serializers.PrimaryKeyRelatedField(queryset=CustomUser.objects.all(), many=True, required=False)

class Meta:
model = CompanyProfile
fields = ["id", "company_name", "company_url", "current_employees"]
extra_kwargs = {
'company_name': {'required': False, 'allow_blank': True},
'company_url': {'required': False, 'allow_blank': True},
}

def create(self, validated_data):
if not validated_data.get("company_name") or not validated_data.get("company_url"):
raise serializers.ValidationError("Both company_name and company_url must be provided for new companies.")
company = CompanyProfile.objects.create(**validated_data)
company.current_employees.add(self.context["request"].user)
return company
20 changes: 20 additions & 0 deletions apps/core/serializers/misc_serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from rest_framework import serializers
from apps.core.models import CommunityNeeds


class CommunityNeedsSerializer(serializers.ModelSerializer):
"""
Serializer for CommunityNeeds model.
"""

class Meta:
model = CommunityNeeds
fields = '__all__'


class GenericBreakdownSerializer(serializers.Serializer):
"""
Generic serializer for breakdown data.
"""
name = serializers.CharField(read_only=True)
user_count = serializers.IntegerField()
103 changes: 103 additions & 0 deletions apps/core/serializers/profile_serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
from rest_framework import serializers
from apps.core.models import UserProfile
from apps.core.serializers.misc_serializers import CommunityNeedsSerializer
from apps.member.models import MemberProfile
from utils.urls_utils import prepend_https_if_not_empty


class BaseUserProfileSerializer(serializers.ModelSerializer):
"""
Base serializer for UserProfile model.
"""
identity_pronouns = serializers.SlugRelatedField(many=True, read_only=True, slug_field='name')

class Meta:
model = UserProfile
fields = "__all__"

def to_representation(self, instance):
ret = super().to_representation(instance)
hidden_fields = [
("identity_sexuality", "is_identity_sexuality_displayed"),
("identity_gender", "is_identity_gender_displayed"),
("identity_ethic", "is_identity_ethic_displayed"),
("identity_pronouns", "is_pronouns_displayed"),
("disability", "is_disability_displayed"),
("care_giver", "is_care_giver_displayed"),
("veteran_status", "is_veteran_status_displayed"),
]
for field, display_field in hidden_fields:
if not getattr(instance, display_field):
ret.pop(field, None)
return ret


class CustomURLField(serializers.URLField):
def to_internal_value(self, data):
"""
Convert the input value to a valid URL format if necessary.
"""
data = prepend_https_if_not_empty(data)
return super().to_internal_value(data)


class UserProfileSerializer(BaseUserProfileSerializer):
"""
Serializer for UserProfile model with additional tbc_program_interest field.
"""
tbc_program_interest = serializers.SerializerMethodField()
linkedin = CustomURLField(required=False, allow_blank=True)
github = CustomURLField(required=False, allow_blank=True)
youtube = CustomURLField(required=False, allow_blank=True)
personal = CustomURLField(required=False, allow_blank=True)

def validate(self, data):
url_fields = ['linkedin', 'github', 'youtube', 'personal']
for field in url_fields:
if field in data:
data[field] = prepend_https_if_not_empty(data[field])
return data

def get_tbc_program_interest(self, obj):
return CommunityNeedsSerializer(obj.tbc_program_interest.all(), many=True).data


class ReadOnlyUserProfileSerializer(BaseUserProfileSerializer):
"""
Read-only serializer for UserProfile model with specific fields excluded.
"""

class Meta(BaseUserProfileSerializer.Meta):
exclude = ['access_token', 'how_connection_made', 'is_terms_agree', 'marketing_events', 'marketing_jobs',
'marketing_org_updates', 'marketing_monthly_newsletter', 'marketing_identity_based_programing',
'tbc_program_interest']


class UpdateProfileAccountDetailsSerializer(serializers.ModelSerializer):
"""
Serializer for updating profile account details.
"""
first_name = serializers.CharField(source="user.first_name")
last_name = serializers.CharField(source="user.last_name")
email = serializers.EmailField(source="user.email")

class Meta:
model = MemberProfile
fields = ["first_name", "last_name", "email", "postal_code", "location", "state", "city"]

def update(self, instance, validated_data):
user_data = validated_data.pop("user", {})
for attr, value in validated_data.items():
setattr(instance, attr, value)
instance.save()

user_instance = instance.user
member_profile = user_instance.userprofile
for attr, value in user_data.items():
setattr(user_instance, attr, value)
setattr(member_profile, attr, value)
user_instance.save()
member_profile.save()

return instance

Loading