fga-gpp-mds/2016.2-SME_UnB

View on GitHub
src/users/views.py

Summary

Maintainability
B
5 hrs
Test Coverage
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from django.contrib.auth import authenticate
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User, Permission
from django.contrib.auth.views import login
from django.contrib.auth.views import logout
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.contrib import messages
from django.db import IntegrityError
from django.contrib.auth.decorators import user_passes_test

from django.http import HttpResponse
from django.core.mail import send_mail
from django.core import mail
from SME_UnB.settings import EMAIL_HOST_USER
from django.contrib.auth import update_session_auth_hash

import os

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import json
import logging
import hashlib
import datetime


def home(request):
    return render(request, 'users/home.html')


@login_required
def dashboard(request):
    return render(request, 'users/dashboard.html')


def show_login(request):
    if request.method == "GET":
        return render(request, "users/login.html")
    else:
        context = make_login(request)

        if context.get('is_logged'):
            return HttpResponseRedirect(reverse("users:dashboard"))
        else:
            return render(request, "users/login.html", context)


def make_login(request):
    form = request.POST
    username = form.get('username')
    password = form.get('password')

    user = authenticate(username=username, password=password)
    is_logged = False

    if user is not None:
        logger = logging.getLogger(__name__)
        logger.info(user.__str__() + ' User is logged')
        login(request, user)
        message = "Logged"

        is_logged = True
    else:
        message = "Incorrect user"

    context = {
        "is_logged": is_logged,
        "message": message,
    }

    return context


def logout_view(request, *args, **kwargs):
    kwargs['next_page'] = reverse('index')
    logger = logging.getLogger(__name__)
    logger.info(request.user.__str__() + ' Logout ')

    return logout(request, *args, **kwargs)


@login_required
@user_passes_test(lambda user: user.is_staff, login_url='/accounts/dashboard/')
def register(request):

    if request.method == "GET":
        return render(request, 'userRegister/register.html')
    else:
        form = request.POST
        first_name = form.get('first_name')
        last_name = form.get('last_name')
        password = form.get('password')
        confirmPassword = form.get('confirmPassword')
        email = form.get('email')
        user_type = form.get('user_type')

        resultCheck = fullValidationRegister(form)
        resultCheck += fullValidation(form)

        if len(resultCheck) != 0:
            return render(
                request,
                'userRegister/register.html',
                {'falha': resultCheck})

        # Fim do bloco que saira da view
    #    first_name = form.get('first_name')
    #    last_name = form.get('last_name')
    #    password = form.get('password')
    #    email = form.get('email')

        try:
            if user_type == 'common':
                user = User.objects.create_user(first_name=first_name,
                                                last_name=last_name,
                                                password=password,
                                                username=email)
            else:
                user = User.objects.create_superuser(first_name=first_name,
                                                     last_name=last_name,
                                                     password=password,
                                                     username=first_name,
                                                     email=email)

        except IntegrityError as e:
            return render(request, 'userRegister/register.html',
                          {'falha': 'Invalid email, email already exist'})
        except:
            return render(request, 'userRegister/register.html',
                          {'falha': 'unexpected error'})

        give_permission(request, user)
        user.save()
        messages.success(request, 'Usuario registrado com sucesso')


        logger = logging.getLogger(__name__)

        logger.info(request.user.__str__() + ' Registered ' + user.__str__() )

    from django.core import mail
    connection = mail.get_connection()

    # Manually open the connection
    connection.open()

    # Construct an email message that uses the connection
    email1 = mail.EmailMessage(
        'Hello',
        'Body goes here',
        'mds@sof2u.com',
        [email],
        connection=connection,
    )
    email1.send() # Send the email
# >>>>>>> forgot_password
#     """
#     send_mail(
#             'Account registered with success',
#             'Your account on SME-UNB was successfully created',
#             'mds@sof2u.com',
#             [email],
#             fail_silently=False,
#             )
#     """

    return render(request, 'users/dashboard.html')


def check_name(first_name, last_name):
    if not first_name.isalpha() or not last_name.isalpha():
        return 'Nome deve conter apenas letras'
    else:
        return ''


def check_email(email):
    if '@' not in email or '.' not in email or ' ' in email:
        return ' -- Email inválido! Esse e-mail não esta em um formato válido'
    else:
        return ''


def check_email_exist(email, original_email):
    if User.objects.filter(email=email).exists() and email != original_email:
        return ' -- E-mail já esta cadastrado no nosso banco de dados'
    else:
        return ''


def check_password_lenght(password, confirmPassword):
    if len(password) < 6 and password != confirmPassword:
        return ' -- Senha Inválida, digite uma senha com no mínimo 6 letras'
    else:
        return ''


def check_password(password, confirmPassword):
    if password != confirmPassword:
        return ' -- Senha inválida! Senhas de cadastros diferentes'
    else:
        return ''


def check_current_password(user, currentPassword):

    if not user.check_password(currentPassword):
        return ' -- Campo de Senha atual diferente da Senha Atual!'
    else:
        return ''


def fullValidation(form):
    first_name = form.get('first_name')
    last_name = form.get('last_name')
    email = form.get('email')
    original_email = form.get('original_email')

    resultCheck = ''
    resultCheck += check_name(first_name, last_name)
    resultCheck += check_email(email)
    resultCheck += check_email_exist(email, original_email)

    return resultCheck


def fullValidationRegister(form, user=None):
    currentPassword = form.get('currentPassword')
    password = form.get('password')
    confirmPassword = form.get('confirmPassword')

    resultCheck = ''
    if user is not None:
        resultCheck += check_current_password(user, currentPassword)
        resultCheck += check_password_lenght(password, confirmPassword)
        resultCheck += check_password(password, confirmPassword)

    return resultCheck


@login_required
def list_user_edit(request):

    return __list__(request, 'users/list_user_edit.html')


@login_required
def list_user_delete(request):

    return __list__(request, 'users/list_user_delete.html')


def check_permissions(user):

    has_report_permission = 'checked' if user. \
        has_perm('report.can_generate') else ''
    has_transductor_permission = 'checked' if user. \
        has_perm('transductor.can_view_transductors') else ''
    has_edit_user_permission = 'checked' if user. \
        has_perm('users.can_edit_user') else ''
    has_delete_user_permission = 'checked' if user. \
        has_perm('users.can_delete_user') else ''
    has_see_logging_permission = 'checked' if user. \
        has_perm('users.can_see_logging') else ''

    context = {
        'user': user,
        "can_generate": has_report_permission,
        "view_transductors": has_transductor_permission,
        "edit_users": has_edit_user_permission,
        "delete_users": has_delete_user_permission,
        "see_logging": has_see_logging_permission,
    }

    return context


@login_required
def change_password(request):
    user = User.objects.get(pk=request.user.id)

    if request.method == "GET":
        return render(request, 'users/change_password.html',)

    else:
        form = request.POST
        password = form.get('password')
        currentPassword = form.get('confirmPassword')
        print(currentPassword)

        resultCheck = fullValidationRegister(form, user)
        if len(resultCheck) != 0:
            return __prepare_error_render_self__(request, resultCheck, user)

        user.set_password(password)
        user.save()
        update_session_auth_hash(request, user)
        logger = logging.getLogger(__name__)
        logger.info(request.user.__str__() + ' edited  password')
    return render(request, 'users/dashboard.html')


@login_required
def self_edit_user(request):

    user = User.objects.get(pk=request.user.id)

    if request.method == "GET":
        return render(request, 'users/self_edit.html',)

    else:
        form = request.POST
        first_name = form.get('first_name')
        last_name = form.get('last_name')
        # email = form.get('email')
        email = request.user.username

        resultCheck = fullValidationRegister(form)
        resultCheck += fullValidation(form)

        user.first_name = first_name
        user.last_name = last_name
        user.username = email
        user.email = email
        user.save()

        # login(request,user)
        update_session_auth_hash(request, user)

        logger = logging.getLogger(__name__)
        logger.info(request.user.__str__() + ' edited ' + user.__str__())

        return render(request, 'users/dashboard.html')


@login_required
def edit_user(request, user_id):

    user = User.objects.get(id=user_id)

    if request.method == "GET":
        context = check_permissions(user)
        return render(request, 'users/edit_user.html', context)

    else:
        form = request.POST
        first_name = form.get('first_name')
        last_name = form.get('last_name')
        email = form.get('email')
        user_type = form.get('user_type')
        resultCheck = fullValidation(form)

        if len(resultCheck) != 0:
            return __prepare_error_render__(request, resultCheck, user)

        user.first_name = first_name
        user.last_name = last_name
        user.username = email
        user.email = email

        if user_type == 'common':
            user.is_superuser = False
        else:
            user.is_superuser = True

        give_permission(request, user)

        context = check_permissions(user)
        logger = logging.getLogger(__name__)
        logger.info(request.user.__str__() + ' edited ' + user.__str__())
        context['info'] = 'usuario modificado com sucesso'

        return render(request, 'users/edit_user.html', context)


def give_permission(request, user):

    report_checkbox = request.POST.get('can_generate')
    transductor_checkbox = request.POST.get('view_transductors')
    useredit_checkbox = request.POST.get('edit_users')
    userdelete_checkbox = request.POST.get('delete_users')
    seelogging_checkbox = request.POST.get('seelogging_checkbox')

    user.user_permissions.clear()

    __permision__(report_checkbox, 'can_generate', user)
    __permision__(transductor_checkbox, 'can_view_transductors', user)
    __permision__(useredit_checkbox, 'can_edit_user', user)
    __permision__(userdelete_checkbox, 'can_delete_user', user)
    __permision__(seelogging_checkbox, 'can_see_logging', user)

    user.save()


@login_required
def delete_user(request, user_id):

    user = User.objects.get(id=user_id)
    if request.method == "GET":
        return render(request, 'users/delete_user.html', {'user': user})
    else:

        logger = logging.getLogger(__name__)
        logger.info(request.user.__str__() + ' deleted  ' + user.__str__())
        user.delete()
    return render(request, 'users/dashboard.html',
                  {'info': 'usuario deletado com sucesso'})


@login_required
def logging_list(request):
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    file = open(BASE_DIR + '/SME_UnB/logging.logging', 'r')
    file_contentes = file.read()

    return render(request, 'users/logging_list.html',
                  {'logging': file_contentes})


def __list__(request, template):

    users = User.objects.all()

    return render(request, template, {'users': users})


def __prepare_error_render__(request, fail_message, user):

    return render(request, 'users/edit_user.html',
                  {'falha': fail_message, 'user': user})


def __prepare_error_render_self__(request, fail_message, user):

    return render(request, 'users/change_password.html',
                  {'falha': fail_message, 'user': user})


def __permision__(permision_type, codename, user):

    if permision_type == 'on':
        permision = Permission.objects.get(codename=codename)
        user.user_permissions.add(permision)