PhysioTag: An Open-Source Platform for Collaborative Annotation of Physiological Waveforms 1.0.0

File: <base>/waveform-django/website/views.py (5,812 bytes)
from django.contrib import messages
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.decorators import login_required
from django.contrib.sites.shortcuts import get_current_site
from django.shortcuts import render, redirect
from django.utils import timezone

from .forms import CreateUserForm, ResetPasswordForm, ChangePasswordForm
from waveforms.models import InvitedEmails, User, UserSettings
from website.settings import base


def redirect_home(request):
    """
    Redirects users to home page
    """
    return redirect(login_page)


def register_page(request):
    """
    Create a new account upon request.

    Parameters
    ----------
    request : Request object
        The current HTTP request.

    Returns
    -------
    N/A

    """
    if request.user.is_authenticated:
        return redirect('waveform_published_home')
    else:
        form = CreateUserForm()
        if request.method == 'POST':
            form = CreateUserForm(request.POST)
            if form.is_valid():
                form.save()
                username = form.cleaned_data.get('username')
                email = form.cleaned_data.get('email')
                try:
                    invited_user = InvitedEmails.objects.get(email=email)
                    invited_user.joined = True
                    invited_user.joined_username = username
                    invited_user.save()
                except InvitedEmails.DoesNotExist:
                    pass
                messages.success(request,
                                 f'Account was created for {username}')
                # Create the default profile and settings for that user
                new_user = User(username=username, email=email,
                                is_admin=False)
                new_user.save()
                UserSettings(user=new_user).save()
                # Send email to all admins notifying about new user
                admin_users = User.objects.filter(is_admin=True)
                current_site = get_current_site(request)
                domain = current_site.domain
                context = {
                    'protocol': 'http' if domain.startswith('localhost') else 'https',
                    'domain': domain,
                    'site_name': current_site.name,
                    'email': email
                }
                email_form = ResetPasswordForm()
                for admin_user in admin_users:
                    email_form.send_mail(
                        'registration/new_user_subject.txt',
                        'registration/new_user_email.html', context,
                        base.EMAIL_FROM, admin_user.email
                    )
                return redirect('login')
        return render(request, 'website/register.html', {'form': form})


def login_page(request):
    """
    Login the user upon request.

    Parameters
    ----------
    request : Request object
        The current HTTP request.

    Returns
    -------
    N/A

    """
    if request.user.is_authenticated:
        return redirect('waveform_published_home')
    else:
        if request.method == 'POST':
            username = request.POST.get('username')
            password =request.POST.get('password')
            user = authenticate(request, username=username, password=password)
            if user is not None:
                login(request, user)
                user = User.objects.get(username=username)
                user.last_login = timezone.now()
                user.save()
                if 'annotations' in request.environ['QUERY_STRING']:
                    return redirect('render_annotations')
                else:
                    return redirect('waveform_published_home')
            else:
                messages.info(request, 'Username OR password is incorrect')
                return render(request, 'website/login.html', {})
        else:
            if (request.GET.dict() == {}) or not (request.user.is_authenticated):
                return render(request, 'website/login.html', {})
            elif 'annotations' in request.GET.dict()['next']:
                return redirect('render_annotations')
            else:
                return redirect('waveform_published_home')


def reset_password(request):
    """
    Reset the user's password.

    Parameters
    ----------
    request : Request object
        The current HTTP request.

    Returns
    -------
    N/A

    """
    form = ResetPasswordForm()
    if request.method == 'POST':
        form = ResetPasswordForm(request.POST)
        if form.is_valid():
            form.save(
                from_email = base.EMAIL_FROM,
                request = request
            )
            return redirect('password_reset_done')
    return render(request, 'registration/password_reset_form.html',
                  {'form': form})


def change_password(request):
    """
    Change the user's password.

    Parameters
    ----------
    request : Request object
        The current HTTP request.

    Returns
    -------
    N/A

    """
    form = ChangePasswordForm()
    if request.method == 'POST':
        form = ChangePasswordForm(request.POST)
        if form.is_valid():
            form.save()
            messages.info(request, 'Changed password successfully!')
            return redirect('login')
    return render(request, 'registration/password_reset_confirm.html',
                  {'form': form})


@login_required
def logout_user(request):
    """
    Logout the user upon request.

    Parameters
    ----------
    request : Request object
        The current HTTP request.

    Returns
    -------
    N/A

    """
    logout(request)
    messages.info(request, 'Logged out successfully!')
    return redirect('login')