diff --git a/apps/authentication/api/__init__.py b/apps/authentication/api/__init__.py index c2a4a740f..4f6475124 100644 --- a/apps/authentication/api/__init__.py +++ b/apps/authentication/api/__init__.py @@ -5,3 +5,4 @@ from .auth import * from .token import * from .mfa import * from .access_key import * +from .login_confirm import * diff --git a/apps/authentication/api/login_confirm.py b/apps/authentication/api/login_confirm.py new file mode 100644 index 000000000..3ce26f84d --- /dev/null +++ b/apps/authentication/api/login_confirm.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# +from rest_framework.generics import UpdateAPIView +from django.shortcuts import get_object_or_404 + +from common.permissions import IsOrgAdmin +from ..models import LoginConfirmSetting +from ..serializers import LoginConfirmSettingSerializer + +__all__ = ['LoginConfirmSettingUpdateApi'] + + +class LoginConfirmSettingUpdateApi(UpdateAPIView): + permission_classes = (IsOrgAdmin,) + serializer_class = LoginConfirmSettingSerializer + + def get_object(self): + from users.models import User + user_id = self.kwargs.get('user_id') + user = get_object_or_404(User, pk=user_id) + defaults = {'user': user} + s, created = LoginConfirmSetting.objects.get_or_create( + defaults, user=user, + ) + return s diff --git a/apps/authentication/migrations/0003_loginconfirmsetting.py b/apps/authentication/migrations/0003_loginconfirmsetting.py new file mode 100644 index 000000000..c8043bc87 --- /dev/null +++ b/apps/authentication/migrations/0003_loginconfirmsetting.py @@ -0,0 +1,32 @@ +# Generated by Django 2.2.5 on 2019-10-31 10:23 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('authentication', '0002_auto_20190729_1423'), + ] + + operations = [ + migrations.CreateModel( + name='LoginConfirmSetting', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), + ('created_by', models.CharField(blank=True, max_length=32, null=True, verbose_name='Created by')), + ('date_created', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date created')), + ('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')), + ('is_active', models.BooleanField(default=True, verbose_name='Is active')), + ('reviewers', models.ManyToManyField(blank=True, related_name='review_login_confirm_settings', to=settings.AUTH_USER_MODEL, verbose_name='Reviewers')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='login_confirm_setting', to=settings.AUTH_USER_MODEL, verbose_name='User')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/apps/authentication/models.py b/apps/authentication/models.py index f50305651..4f0e06fb6 100644 --- a/apps/authentication/models.py +++ b/apps/authentication/models.py @@ -1,7 +1,7 @@ import uuid from django.db import models from django.utils import timezone -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import ugettext_lazy as _, ugettext as __ from rest_framework.authtoken.models import Token from django.conf import settings @@ -40,8 +40,8 @@ class PrivateToken(Token): class LoginConfirmSetting(CommonModelMixin): - user = models.OneToOneField('users.User', on_delete=models.CASCADE, verbose_name=_("User"), related_name=_("login_confirmation_setting")) - reviewers = models.ManyToManyField('users.User', verbose_name=_("Reviewers"), related_name=_("review_login_confirmation_settings")) + user = models.OneToOneField('users.User', on_delete=models.CASCADE, verbose_name=_("User"), related_name="login_confirm_setting") + reviewers = models.ManyToManyField('users.User', verbose_name=_("Reviewers"), related_name="review_login_confirm_settings", blank=True) is_active = models.BooleanField(default=True, verbose_name=_("Is active")) @classmethod @@ -50,7 +50,7 @@ class LoginConfirmSetting(CommonModelMixin): def create_confirm_order(self, request=None): from orders.models import LoginConfirmOrder - title = _('User login confirm: {}'.format(self.user)) + title = _('User login confirm: {}').format(self.user) if request: remote_addr = get_request_ip(request) city = get_ip_city(remote_addr) diff --git a/apps/authentication/serializers.py b/apps/authentication/serializers.py index 584da768f..7463d30ca 100644 --- a/apps/authentication/serializers.py +++ b/apps/authentication/serializers.py @@ -4,17 +4,16 @@ from django.core.cache import cache from rest_framework import serializers from users.models import User -from .models import AccessKey +from .models import AccessKey, LoginConfirmSetting __all__ = [ 'AccessKeySerializer', 'OtpVerifySerializer', 'BearerTokenSerializer', - 'MFAChallengeSerializer', + 'MFAChallengeSerializer', 'LoginConfirmSettingSerializer', ] class AccessKeySerializer(serializers.ModelSerializer): - class Meta: model = AccessKey fields = ['id', 'secret', 'is_active', 'date_created'] @@ -87,3 +86,9 @@ class MFAChallengeSerializer(BearerTokenMixin, serializers.Serializer): username = self.context["username"] return self.create_response(username) + +class LoginConfirmSettingSerializer(serializers.ModelSerializer): + class Meta: + model = LoginConfirmSetting + fields = ['id', 'user', 'reviewers', 'date_created', 'date_updated'] + read_only_fields = ['date_created', 'date_updated'] diff --git a/apps/authentication/templates/authentication/login_wait_confirm.html b/apps/authentication/templates/authentication/login_wait_confirm.html index 0a14e8515..0167236df 100644 --- a/apps/authentication/templates/authentication/login_wait_confirm.html +++ b/apps/authentication/templates/authentication/login_wait_confirm.html @@ -61,9 +61,6 @@