Exemplo n.º 1
0
    def post(self, request, *args, **kwargs):
        """Send password reset email or OTP to user's phone."""
        email = request.data.get('email', None)
        phone_number = request.data.get('phone', None)

        if not email and not phone_number:
            raise ValidationError(
                "Please provide an email address or phone number to proceed to reset password."
            )
        if email:
            user = self.get_user(email)
            context = get_email_context(user)
            if user.first_name:
                context['first_name'] = user.first_name
            else:
                context['first_name'] = None
            context['url'] = django_settings.PASSWORD_RESET_CONFIRM_URL.format(
                **context)
            ResetPasswordEmailNotification(user.email, context=context).send()
            return Response(
                {"results": "Reset Password email sucessfully sent."})

        if phone_number:
            user = self.get_user(phone=phone_number)
            try:
                sms_passcode = random.randint(100000, 999999)
                send_sms(
                    phone_number,
                    RESET_PASSWORD_OTP_SMS.format(**{'otp': sms_passcode}))
                user.sms_passcode = sms_passcode
                user.save()
                return Response(
                    {"success": "Reset Passoword SMS sent successfully."})
            except Exception as e:
                raise e
Exemplo n.º 2
0
    def post(self, request, *args, **kwargs):

        data = request.data.copy()
        email = data.get("email")
        phone = data.get("phone")
        uid = data.get("uid")
        if not any([email, phone, uid]):
            raise ValidationError(
                detail="At least one of email, phone or uid is required.")
        if uid:
            # if user id is given it is given highest priority so we send email, sms to his/her email and phone only.
            try:
                user = User.objects.get(id=uid)
            except User.DoesNotExist:
                raise NotFound("User Not Found.")
            email = user.email
            phone = user.phone

        if email:
            subject = request.data.get("subject")
            email_message = request.data.get("email_message")
            if not all([subject, email_message]):
                raise ValidationError(
                    "Subject and email_message both required to send an email."
                )
            context = {"subject": subject, "email_message": email_message}
            NotifyUser(email, context=context).send()
        if phone:
            sms_message = request.data.get("sms_message")
            if not sms_message:
                raise ValidationError(
                    "sms_message is required to send an sms.")
            send_sms(phone, sms_message)
        return Response({"result": "Success"})
Exemplo n.º 3
0
def user_signed_up_(request, user, **kwargs):
    """Send email only if user signed up by email."""
    percentage = 0
    for key in PERCENTAGE_BASIC_DETAILS_FIELDS.keys():
        if getattr(user, key) not in ['NS', None]:
            percentage += PERCENTAGE_BASIC_DETAILS_FIELDS[key]

    User.objects.filter(id=user.id).update(
        profile_completion_percentage=percentage)

    if user.email:
        context = get_email_context(user)
        if user.first_name:
            context['first_name'] = user.first_name
        else:
            context['first_name'] = None
        context['url'] = django_settings.ACTIVATION_URL.format(**context)
        if user._password:
            context['password_line'] = EMAIL_PASSWORD_LINE.format(
                **{'password': user._password})
        WelcomeEmailNotification(user.email, context=context).send()
    if user.phone:
        if user._password:
            send_sms(user.phone, SMS_ON_SIGN_UP_WITH_PASSWORD)
        else:
            send_sms(user.phone, SMS_ON_SIGN_UP)
Exemplo n.º 4
0
def send_verification_reminder_sms(user):
    """Remind signed up user to verify email."""
    # # check for his email preference.
    import django
    django.setup()
    from .models import User
    user = User.objects.get(id=user.id)
    if not user.is_phone_verified:
        send_sms(
            user.phone,
            REMINDER_VERIFY_PHONE_SMS.format(**{
                'otp_url':
                django_settings.DOMAIN + "/" + django_settings.OTP_URL
            }))
    return None
Exemplo n.º 5
0
 def send_otp_sms(self, request, *args, **kwargs):
     """Send otp sms to user."""
     user = request.user
     phone_number = user.phone
     if phone_number:
         if not user.is_phone_verified:
             try:
                 sms_passcode = random.randint(100000, 999999)
                 send_sms(phone_number,
                          OTP_SMS.format(**{'otp': sms_passcode}))
                 user.sms_passcode = sms_passcode
                 user.save()
                 return Response(
                     {"success": "SMS passcode sent successfully."})
             except Exception as e:
                 raise e
         else:
             raise ValidationError(
                 "User's phone number is already verified.")
     else:
         raise NotFound("User's phone number does not exists.")
Exemplo n.º 6
0
    def post(self, request):
        # check if number is valid
        mobile_number = request.POST.get('mobile_number')
        if not mobile_number:
            message = _("POST data doesn`t contain mobile_number")
            return Response(message, status=status.HTTP_404_NOT_FOUND)
        email = request.POST.get('email')
        if not email:
            message = _("POST data doesn`t contain email")
            return Response(message, status=status.HTTP_404_NOT_FOUND)
        # try if Resident with such mobile number exists or already registered
        try:
            user = User.objects.get(mobile_number=mobile_number, is_registered=False)
        # except return status.HTTP_404_NOT_FOUND
        except User.DoesNotExist:
            message = _("Resident with such mobile number doesn`t exist or already registered")
            return Response(message, status=status.HTTP_404_NOT_FOUND)
        serializer = UserSerializer(user, data=request.data, partial=True)
        # check if serializer is valid
        if serializer.is_valid():
            serializer.save()
            # send activation email with token
            mail_subject = _('Activate your DimOnline account.')
            domain = settings.FRONT_SITE_URL
            uid = urlsafe_base64_encode(force_bytes(user.pk))
            token = account_activation_token.make_token(user)
            message = render_to_string('email/account_activation_email.txt', {
                'first_name': user.first_name,
                'account_activation_url': f"{domain}/registration/{uid}/{token}/",
            })
            send_email(mail_subject, message, to=[user.email]) # TODO add delay
            # send activation sms with otp
            hotp = pyotp.HOTP(settings.OTP_SECRET)
            mobile_number_international = '38' + mobile_number
            otp = hotp.at(user.pk)
            send_sms([mobile_number_international], otp) # TODO add delay
            message = _('User registered. Please activate your account from email link or enter OTP code from sms:')
            return Response(message, status=status.HTTP_200_OK)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)