diff --git a/Dockerfile.dev b/Dockerfile.dev index 5a69edf..8d89237 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -1,15 +1,17 @@ FROM python:3.6-alpine +ENV PYTHONUNBUFFERED=1 ENV CONFIG_FILE=/code/config.yaml ENV PIP_NO_CACHE_DIR=false RUN apk add gcc python3-dev musl-dev postgresql-dev zlib-dev jpeg-dev libpq &&\ pip install pipenv -RUN mkdir /code WORKDIR /code COPY Pipfile Pipfile.lock /code/ RUN pipenv install --system --dev -ENTRYPOINT ["./docker-entrypoint.sh"] +COPY . /code/ + +ENTRYPOINT ["sh", "docker-entrypoint.sh"] diff --git a/src/account/auth_pipeline.py b/src/account/auth_pipeline.py index 09bf423..5c2f674 100644 --- a/src/account/auth_pipeline.py +++ b/src/account/auth_pipeline.py @@ -1,11 +1,23 @@ from django.core import exceptions +from django.shortcuts import redirect +from social_core.pipeline.partial import partial from . import models -def create_profile(backend, user, response, *args, **kwargs): +@partial +def set_display_name(strategy, backend, is_new=False, *args, **kwargs): + if backend.name == "authsch" and is_new: + display_name = strategy.session_get("displayName", None) + if not display_name: + return redirect("/first-login") + + +def create_profile(strategy, backend, request, details, user, *args, **kwargs): if backend.name == "authsch": try: user.profile except exceptions.ObjectDoesNotExist: - models.Profile.objects.create(user=user) + display_name = strategy.session_get("displayName", None) + models.Profile.objects.create(user=user, display_name=display_name) + diff --git a/src/account/migrations/0005_profile_display_name.py b/src/account/migrations/0005_profile_display_name.py new file mode 100644 index 0000000..f3c4346 --- /dev/null +++ b/src/account/migrations/0005_profile_display_name.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.9 on 2020-02-09 18:49 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('account', '0004_auto_20190315_1033'), + ] + + operations = [ + migrations.AddField( + model_name='profile', + name='display_name', + field=models.CharField(default='', max_length=50), + preserve_default=False, + ), + ] diff --git a/src/account/models.py b/src/account/models.py index c1485a3..4994113 100644 --- a/src/account/models.py +++ b/src/account/models.py @@ -9,6 +9,7 @@ class Profile(SoftDeleteModel): about_me = models.TextField(blank=True) is_score_visible = models.BooleanField(default=False) ranked = models.BooleanField(default=False) + display_name = models.CharField(max_length=50) @property def full_name(self): diff --git a/src/account/urls.py b/src/account/urls.py index 9d8ddcc..c9ded82 100644 --- a/src/account/urls.py +++ b/src/account/urls.py @@ -9,5 +9,6 @@ router.register(r"avatar", views.AvatarViewSet) urlpatterns = router.urls + [ - path("logout/", LogoutView.as_view(next_page="/"), name="logout") + path("logout/", LogoutView.as_view(next_page="/"), name="logout"), + path("auth/display-name/", views.set_display_name), ] diff --git a/src/account/views.py b/src/account/views.py index 65c4cac..3fc8bc2 100644 --- a/src/account/views.py +++ b/src/account/views.py @@ -3,6 +3,8 @@ from rest_framework import permissions from rest_framework.decorators import action from rest_framework.response import Response +from django.shortcuts import redirect +from rest_framework.decorators import api_view from common.mixins import RelativeURLFieldMixin from .permissions import IsSafeMethodOrIsOwnOrIsAdmin @@ -10,6 +12,14 @@ from . import serializers +@api_view(["POST"]) +def set_display_name(request): + if len(request.session.values()) == 0: + return Response(status=401) + request.session["displayName"] = request.data["displayName"] + return redirect("/api/v1/complete/authsch") + + class ProfileViewSet( RelativeURLFieldMixin, generics.ListAPIView, diff --git a/src/vikoverflow/middlewares.py b/src/vikoverflow/middlewares.py index f06dc6a..9d50531 100644 --- a/src/vikoverflow/middlewares.py +++ b/src/vikoverflow/middlewares.py @@ -12,6 +12,7 @@ def __call__(self, request): if ( "/api/v1/login" in request.path or "/api/v1/complete" in request.path + or "/api/v1/auth" in request.path or base.ALLOWED_USERS == ["*"] ): return self.get_response(request) diff --git a/src/vikoverflow/settings/base.py b/src/vikoverflow/settings/base.py index 3b477df..2219b8e 100644 --- a/src/vikoverflow/settings/base.py +++ b/src/vikoverflow/settings/base.py @@ -129,6 +129,7 @@ "social_core.pipeline.social_auth.auth_allowed", "social_core.pipeline.social_auth.social_user", "social_core.pipeline.user.get_username", + "account.auth_pipeline.set_display_name", "social_core.pipeline.user.create_user", "account.auth_pipeline.create_profile", "social_core.pipeline.social_auth.associate_user",