From 9eb35a898a9da7872d99739cdb7fb5b7300472bd Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 19 Jul 2013 11:58:15 +0200 Subject: [PATCH] Add RecoverPassword api view. --- greenmine/base/api.py | 37 +++++++++++++++++++++++++++-------- greenmine/base/models.py | 16 +++++++-------- greenmine/base/serializers.py | 2 +- greenmine/settings/common.py | 5 ----- 4 files changed, 38 insertions(+), 22 deletions(-) diff --git a/greenmine/base/api.py b/greenmine/base/api.py index f08c43df..59a28bc0 100644 --- a/greenmine/base/api.py +++ b/greenmine/base/api.py @@ -67,14 +67,6 @@ class RoleDetail(generics.RetrieveAPIView): permission_classes = (IsAuthenticated,) -#class UserFilter(django_filters.FilterSet): -# no_milestone = django_filters.NumberFilter(name="mileston", lookup_type='isnull') -# -# class Meta: -# model = UserStory -# fields = ['project', 'milestone', 'no_milestone'] - - class UserFilter(django_filters.FilterSet): class Meta: model = User @@ -107,6 +99,33 @@ class UserDetail(generics.RetrieveUpdateDestroyAPIView): serializer_class = UserSerializer permission_classes = (IsAuthenticated,) +import uuid +from django.db.models import Q +from djmail.template_mail import MagicMailBuilder + + +class RecoveryPassword(APIView): + def post(self, request): + username_or_email = request.DATA.get('username', None) + + if not username_or_email: + return Response({"detail": "Invalid username or password"}, status.HTTP_400_BAD_REQUEST) + + try: + queryset = User.objects.all() + user = queryset.get(Q(username=username_or_email) | + Q(email=username_or_email)) + except User.DoesNotExist: + return Response({"detail": "Invalid username or password"}, status.HTTP_400_BAD_REQUEST) + + user.token = str(uuid.uuid1()) + user.save(update_fields=["token"]) + + mbuilder = MagicMailBuilder() + email = mbuilder.password_recovery(user.email, {"user": user}) + + return Response({"detail": "Mail sended successful!"}) + class Login(APIView): def post(self, request, format=None): @@ -140,6 +159,8 @@ class Login(APIView): return Response({"detail": "Invalid username or password"}, status.HTTP_400_BAD_REQUEST) + + class Logout(APIView): def post(self, request, format=None): logout(request) diff --git a/greenmine/base/models.py b/greenmine/base/models.py index 91818a4b..0476ca55 100644 --- a/greenmine/base/models.py +++ b/greenmine/base/models.py @@ -30,21 +30,21 @@ def attach_uuid(sender, instance, **kwargs): instance.uuid = unicode(uuid.uuid1()) -class User(AbstractUser, WatcherMixin): +class User(WatcherMixin, AbstractUser): color = models.CharField(max_length=9, null=False, blank=False, default="#669933", - verbose_name=_('color')) + verbose_name=_('color')) description = models.TextField(null=False, blank=True, - verbose_name=_('description')) + verbose_name=_('description')) photo = models.FileField(upload_to='files/msg', max_length=500, null=True, blank=True, - verbose_name=_('photo')) + verbose_name=_('photo')) default_language = models.CharField(max_length=20, null=False, blank=True, default='', - verbose_name=_('default language')) + verbose_name=_('default language')) default_timezone = models.CharField(max_length=20, null=False, blank=True, default='', - verbose_name=_('default timezone')) + verbose_name=_('default timezone')) token = models.CharField(max_length=200, null=False, blank=True, default='', - verbose_name=_('token')) + verbose_name=_('token')) colorize_tags = models.BooleanField(null=False, blank=True, default=False, - verbose_name=_('colorize tags')) + verbose_name=_('colorize tags')) objects = UserManager() diff --git a/greenmine/base/serializers.py b/greenmine/base/serializers.py index 53f482f1..fab7d503 100644 --- a/greenmine/base/serializers.py +++ b/greenmine/base/serializers.py @@ -65,6 +65,7 @@ class UserSerializer(serializers.ModelSerializer): return [x.id for x in obj.projects.all()] + class RoleSerializer(serializers.ModelSerializer): class Meta: model = Role @@ -88,5 +89,4 @@ class SearchSerializer(serializers.Serializer): """ if instance is not None: return instance - return attrs diff --git a/greenmine/settings/common.py b/greenmine/settings/common.py index 84ff163c..b67c3fb4 100644 --- a/greenmine/settings/common.py +++ b/greenmine/settings/common.py @@ -15,7 +15,6 @@ OUT_PROJECT_ROOT = os.path.abspath( os.path.join(PROJECT_ROOT, "..") ) - LOGS_PATH = os.path.join(OUT_PROJECT_ROOT, 'logs') BACKUP_PATH = os.path.join(OUT_PROJECT_ROOT, 'exports') @@ -107,10 +106,6 @@ DJMAIL_SEND_ASYNC = False DJMAIL_MAX_RETRY_NUMBER = 3 DJMAIL_TEMPLATE_EXTENSION = 'jinja' - -SV_CSS_MENU_ACTIVE = 'selected' -SV_CONTEXT_VARNAME = 'menu' - # Message System #MESSAGE_STORAGE = 'django.contrib.messages.storage.cookie.CookieStorage' MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'