Commit a6d7327f authored by John Red Medrano's avatar John Red Medrano

Merge pull request #581 in RMS/api-main-service from red-develop to RMSv2

* commit 'f0c821a8':
  red-develop
parents 45083098 f0c821a8
...@@ -9,7 +9,7 @@ from rest_framework.authentication import TokenAuthentication ...@@ -9,7 +9,7 @@ from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import AllowAny from rest_framework.permissions import AllowAny
from django.db import transaction from django.db import transaction
from app.helper import decorators from app.helper import decorators
from app.applicationlayer.management.user.serializers import ( from app.applicationlayer.management.account.serializer import (
UserManagementRetreiveSerializer UserManagementRetreiveSerializer
) )
from app.entities.models import User, AuthToken from app.entities.models import User, AuthToken
......
from rest_framework import serializers from rest_framework import serializers
from app.entities.models import User, Department, UserImage
import ast import ast
from django.contrib.auth.hashers import make_password, check_password from django.contrib.auth.hashers import make_password, check_password
import re import re
from django.contrib.auth import authenticate from django.contrib.auth import authenticate
from app.applicationlayer.utils import model_to_dict from app.applicationlayer.utils import model_to_dict
from app.entities import enums
from django.db.models import Q
from app.applicationlayer.management.module.serializer import ModuleSerializer
from app.entities.models import (
User, Department, UserImage, AllowedCompany, Application, Module
)
class UserManagementRetreiveSerializer(serializers.ModelSerializer):
image = serializers.SerializerMethodField()
applications = serializers.SerializerMethodField()
department = serializers.SerializerMethodField()
company = serializers.SerializerMethodField()
create_form = serializers.SerializerMethodField()
create_template = serializers.SerializerMethodField()
class Meta:
model = User
fields = (
'id',
'create_form',
'create_template',
'code', 'name',
'username', 'contact_no',
'image', 'company',
'department', 'applications',
'email', 'default_app',
'user_type', 'is_active',
'doa',
)
# exclude = ['password', 'application', 'groups', 'user_permissions']
def get_department(self, user):
data = {
"id": user.department.id,
"code": user.department.code,
"name": user.department.name
}
return data
def get_company(self, user):
data = {
"id": user.department.company.id,
"code": user.department.company.code,
"name": user.department.company.name
}
return data
def get_create_form(self, user):
check_user = AllowedCompany.objects.filter(
Q(id_number=user.code) &
Q(create_change_request=True)
).count()
if check_user <= 0:
permission = False
else:
permission = True
return permission
def get_create_template(self, user):
check_user = AllowedCompany.objects.filter(
Q(id_number=user.code) &
Q(create_change_request_template=True)
).count()
if check_user <= 0:
permission = False
else:
permission = True
return permission
def get_image(self, user):
request = self.context.get('request')
primayPic = user.user_images.filter(is_primary=True).first()
if primayPic:
return request.build_absolute_uri(primayPic.image.url)
else:
return request.build_absolute_uri('/media/no-user.png')
def get_applications(self, user):
if user.user_type.upper() == enums.UserTypeEnum.USER.value:
app = user.application.exclude(id=1)
else:
rms = Application.objects.filter(id=1)
app = user.application.all()
app = app.union(app, rms)
list_app = []
for data in app.order_by('id'):
if data.id == 1 and user.user_type.upper() == enums.UserTypeEnum.SUPER_USER.value:
mod = data.modules.all()
elif data.id == 1 and user.user_type.upper() != enums.UserTypeEnum.USER.value:
mod = Module.objects.filter(
name__icontains="user"
)
else:
mod = data.modules.all()
if user.user_type.upper() != enums.UserTypeEnum.USER.value:
user_module = Module.objects.filter(name__icontains="user")
mod = mod.union(mod, user_module)
else:
mod = mod
mod = mod.order_by("parent", "sort_id")
mod = ModuleSerializer(data=mod, many=True)
mod.is_valid()
app_body = {}
app_body['app_code'] = data.code
app_body['name'] = data.name
app_body['modules'] = mod.data
list_app.append(app_body)
return list_app
class UserSerializer(serializers.ModelSerializer): class UserSerializer(serializers.ModelSerializer):
......
...@@ -232,194 +232,6 @@ class UserViewSet(viewsets.ModelViewSet): ...@@ -232,194 +232,6 @@ class UserViewSet(viewsets.ModelViewSet):
status=status.HTTP_200_OK status=status.HTTP_200_OK
) )
# @rms.user_create
# @action(detail=False,
# methods=['put'],
# url_path='batch-upload',
# name="upload User")
# @decorators.error_safe
# @transaction.atomic
# def BatchUpload(self, request):
# csv_file = request.FILES['file']
# df = pd.read_csv(csv_file, sep=',', skiprows=0)
# logged_user_type = request.user.user_type
# logged_user_company = request.user.department.company.name
# logged_user_department = request.user.department.name
# logged_user_email = request.user.email
# email_users = []
# for data, keys in df.iterrows():
# try:
# user_department = Department.objects.filter(
# Q(name__icontains=keys['department']) &
# Q(company__name__icontains=logged_user_company)
# ).first()
# if logged_user_type == 'CUA':
# user_department = Department.objects.filter(
# Q(name__icontains=keys['department']) &
# Q(company__name__icontains=logged_user_company)
# ).first()
# if user_department == None:
# msg = f"company is not the same with the logged user at row {data + 2}"
# return Response(
# {"message": msg},
# status=status.HTTP_400_BAD_REQUEST
# )
# elif logged_user_type == 'DUA':
# user_department = Department.objects.get(
# name__icontains=logged_user_department
# )
# elif logged_user_type == 'USR':
# return Response(
# {"message": "Logged User is not allowed"},
# status=status.HTTP_400_BAD_REQUEST
# )
# else:
# user_department = Department.objects.get(
# name__icontains=keys['department']
# )
# default_app = Application.objects.filter(
# excel_code=keys['default_app']
# ).first()
# enums_super = enums.UserTypeEnum.SUPER_USER.value
# enums_OUA = enums.UserTypeEnum.OVERALL_USER_ADMIN.value
# enums_company = enums.UserTypeEnum.COMPANY_USER_ADMIN.value
# enums_department = enums.UserTypeEnum.DEPARTMENT_USER_ADMIN.value
# enums_user = enums.UserTypeEnum.USER.value
# if keys['user_type'].lower() == 'super user' and logged_user_type == enums_super:
# user_type = enums.UserTypeEnum.SUPER_USER.value
# elif keys['user_type'].lower() == 'super user' and logged_user_type != enums_super:
# return Response(
# {"message": f"This user is not allowed to create super user. data error at row {data + 2}"},
# status=status.HTTP_201_CREATED
# )
# elif keys['user_type'].lower() == 'overall user admin':
# user_type = enums.UserTypeEnum.OVERALL_USER_ADMIN.value
# elif keys['user_type'].lower() == 'company user admin':
# user_type = enums.UserTypeEnum.COMPANY_USER_ADMIN.value
# elif keys['user_type'].lower() == 'department user admin':
# user_type = enums.UserTypeEnum.DEPARTMENT_USER_ADMIN.value
# else:
# user_type = enums.UserTypeEnum.USER.value
# users = {
# "username": keys['username'],
# "name": keys['name'],
# "department": user_department,
# "email": keys['email'],
# "contact_no": keys['contact_no'],
# "default_app": default_app,
# "user_type": user_type
# }
# current_user = User.objects.create(
# **users
# )
# password = User.objects.make_random_password(length=10)
# password_hash = make_password(password)
# current_user.password = password_hash
# current_user.save()
# app = Application.objects.filter(
# excel_code__in=keys['application'].split(',')
# )
# update_user = current_user.application.set(app)
# for instance in keys['privilege'].split(';'):
# privilege_list = instance.split(',')
# this_company = Company.objects.filter(
# name__icontains=privilege_list[0]
# ).first()
# this_department = Department.objects.filter(
# name__icontains=privilege_list[1]
# ).first()
# if privilege_list[2] == 0:
# privilege_list[2] = False
# else:
# privilege_list[2] = True
# if privilege_list[3] == 0:
# privilege_list[3] = False
# else:
# privilege_list[3] = True
# if privilege_list[4] == 0:
# privilege_list[4] = False
# else:
# privilege_list[4] = True
# current_user = User.objects.get(id=current_user.id)
# try:
# privilege_object = {
# "id_number": current_user,
# "company_pivot": this_company,
# "group_pivots": this_department,
# "create_change_request": privilege_list[2],
# "create_change_request_template": privilege_list[3],
# "view_all_change_request": privilege_list[4],
# "approve_cr": privilege_list[5]
# }
# AllowedCompany.objects.create(**privilege_object)
# except IntegrityError as e:
# return Response(
# {"message": f"Duplicate user privilege at row {data + 2}"},
# status=status.HTTP_400_BAD_REQUEST
# )
# except IntegrityError as e:
# return Response(
# {"message": f"Record already exist at row {data + 2}"},
# status=status.HTTP_400_BAD_REQUEST
# )
# except KeyError as e:
# return Response(
# {"message": "Missing column user_type"},
# status=status.HTTP_400_BAD_REQUEST
# )
# del users['department']
# del users['contact_no']
# del users['default_app']
# del users['user_type']
# users['password'] = password
# UserHistory.objects.create(
# **users
# )
# users['admin'] = logged_user_email
# send_mail = UserHistory.objects.filter(sent=False)[0:100].values(
# 'name', 'username', 'email', 'password'
# )
# df = pd.DataFrame(send_mail)
# df.to_csv("users.csv", index=False)
# args = ["users.csv", logged_user_email]
# main_threading(args, sender.batch_email_admin)
# args = [send_mail, logged_user_email]
# main_threading(args, sender.batch_email_users)
# return Response(
# {"message": "File already uploaded"},
# status=status.HTTP_201_CREATED
# )
@action(detail=True, @action(detail=True,
methods=['put'], methods=['put'],
url_path='reset-password', url_path='reset-password',
......
from django.apps import AppConfig
class UserManagementConfig(AppConfig):
name = 'user_management'
from rest_framework import serializers
from app.applicationlayer import serializers as app_serializers
from app.entities import models
from django.db.models import Q
from app.applicationlayer.management.module.serializer import ModuleSerializer
from app.entities import enums
# Used for Create and Update
class UserManagementSerializer(serializers.ModelSerializer):
image = serializers.SerializerMethodField()
class Meta:
model = models.User
exclude = ['password']
def get_image(self, user):
request = self.context.get('request')
primayPic = user.user_images.filter(is_primary=True).first()
if primayPic:
return request.build_absolute_uri(primayPic.image.url)
else:
return request.build_absolute_uri('/media/no-user.png')
# Used for Retrieve and List
class UserManagementRoleSerializer(serializers.ModelSerializer):
permissions = serializers.SlugRelatedField(many=True,
read_only=True,
slug_field='code')
class Meta:
model = models.Role
fields = '__all__'
read_only_fields = ['createdby', 'modifiedby', 'created', 'modified']
# Used for Retrieve and List
class UserManagementRetreiveSerializer(serializers.ModelSerializer):
image = serializers.SerializerMethodField()
applications = serializers.SerializerMethodField()
department = serializers.SerializerMethodField()
company = serializers.SerializerMethodField()
create_form = serializers.SerializerMethodField()
create_template = serializers.SerializerMethodField()
class Meta:
model = models.User
fields = (
'id',
'create_form',
'create_template',
'code', 'name',
'username', 'contact_no',
'image', 'company',
'department', 'applications',
'email', 'default_app',
'user_type', 'is_active',
'doa',
)
# exclude = ['password', 'application', 'groups', 'user_permissions']
def get_department(self, user):
data = {
"id": user.department.id,
"code": user.department.code,
"name": user.department.name
}
return data
def get_company(self, user):
data = {
"id": user.department.company.id,
"code": user.department.company.code,
"name": user.department.company.name
}
return data
def get_create_form(self, user):
check_user = models.AllowedCompany.objects.filter(
Q(id_number=user.code) &
Q(create_change_request=True)
).count()
if check_user <= 0:
permission = False
else:
permission = True
return permission
def get_create_template(self, user):
check_user = models.AllowedCompany.objects.filter(
Q(id_number=user.code) &
Q(create_change_request_template=True)
).count()
if check_user <= 0:
permission = False
else:
permission = True
return permission
def get_image(self, user):
request = self.context.get('request')
primayPic = user.user_images.filter(is_primary=True).first()
if primayPic:
return request.build_absolute_uri(primayPic.image.url)
else:
return request.build_absolute_uri('/media/no-user.png')
def get_applications(self, user):
if user.user_type.upper() == enums.UserTypeEnum.USER.value:
app = user.application.exclude(id=1)
else:
rms = models.Application.objects.filter(id=1)
app = user.application.all()
app = app.union(app, rms)
list_app = []
for data in app.order_by('id'):
if data.id == 1 and user.user_type.upper() == enums.UserTypeEnum.SUPER_USER.value:
mod = data.modules.all()
elif data.id == 1 and user.user_type.upper() != enums.UserTypeEnum.USER.value:
mod = models.Module.objects.filter(
name__icontains="user"
)
else:
mod = data.modules.all()
if user.user_type.upper() != enums.UserTypeEnum.USER.value:
user_module = models.Module.objects.filter(name__icontains="user")
mod = mod.union(mod, user_module)
else:
mod = mod
mod = mod.order_by("parent", "sort_id")
mod = ModuleSerializer(data=mod, many=True)
mod.is_valid()
app_body = {}
app_body['app_code'] = data.code
app_body['name'] = data.name
app_body['modules'] = mod.data
list_app.append(app_body)
return list_app
class ChangePasswordSerializer(serializers.Serializer):
old_password = serializers.CharField(max_length=100, required=True)
new_password = serializers.CharField(max_length=100, required=True)
new_password_confirm = serializers.CharField(max_length=100, required=True)
class Meta:
fields = '__all__'
# class UserSpecialPermissionSerializer(serializers.Serializer):
# special_permissions = app_serializers.PermissionSerializer(required=True,
# many=True)
# class Meta:
# fields = '__all__'
from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities import models
from django.db.models import Q
class UserManagementFilter(filters.FilterSet):
search = filters.CharFilter(method='search_bar', label='search')
def search_bar(self, queryset, name, value):
return queryset.filter(
Q(username__icontains=value) |
Q(first_name__icontains=value) |
Q(last_name__icontains=value))
class Meta:
model = models.User
fields = '__all__'
import copy
import json
from app.entities import enums
# from app.businesslayer import log_save
from app.applicationlayer.utils import model_to_dict
from django.shortcuts import render
from rest_framework.response import Response
from app.entities import models
from django.db import transaction
from app.helper import decorators
from rest_framework import viewsets, status
from rest_framework.decorators import action
from app.applicationlayer.management.user import table_filters
from django_filters.rest_framework import DjangoFilterBackend
from app.applicationlayer import paginators
from app.applicationlayer import serializers as app_serializers
from . import serializers, table_filters
from django.conf import settings
from django.contrib.auth import authenticate
from app.helper.file_manager import FileHelper
from app.applicationlayer.utils import (
CustomPagination, status_message_response, log_save, QuerySetHelper
)
from django.db.models import (Q, F, Sum, OuterRef, Subquery, Q, Case, When,
Value, Func, Count,
CharField,
IntegerField,
DecimalField,
BooleanField)
# Create your views here.
class UsersManagementViewSet(viewsets.ModelViewSet):
"""ViewSet for the Requisition"""
queryset = models.User.objects.all()
serializer_class = serializers.UserManagementSerializer
filter_backends = (DjangoFilterBackend,)
filter_class = table_filters.UserManagementFilter
pagination_class = CustomPagination
@transaction.atomic
def destroy(self, request, *args, **kwargs):
instance = self.get_object()
new_instance = model_to_dict(instance)
instance.applications.remove()
self.perform_destroy(instance)
log_save(
enums.LogEnum.DELETED.value,
enums.LogEntitiesEnum.USER.value,
new_instance['id'],
new_instance,
''
)
return Response(status=status.HTTP_204_NO_CONTENT)
@decorators.error_safe
def list(self, request, *args, **kwargs):
self.serializer_class = serializers.UserManagementRetreiveSerializer
return super(UsersManagementViewSet, self).list(request)
@decorators.error_safe
def retrieve(self, request, *args, **kwargs):
self.serializer_class = serializers.UserManagementRetreiveSerializer
instance = self.get_object()
serializer = self.get_serializer(instance)
return Response(serializer.data)
@decorators.error_safe
@transaction.atomic
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
pk = serializer.data['id']
createdUser = models.User.objects.filter(id=pk).first()
createdUser.set_password(settings.USER_DEFAULT_PASSWORD)
createdUser.save()
# LOG ADD
log_save.log_save(
enums.LogEnum.ADD.value,
enums.LogEntitiesEnum.USER.value,
model_to_dict(createdUser))
return Response(serializer.data,
status=status.HTTP_201_CREATED,
headers=headers)
@decorators.error_safe
@transaction.atomic
def perform_update(self, serializer):
fromObj = copy.copy(serializer.instance)
serializer.save()
toObj = copy.copy(serializer.instance)
log_save.log_save(
enums.LogEnum.UPDATE.value,
enums.LogEntitiesEnum.USER.value,
model_to_dict(fromObj),
model_to_dict(toObj))
@action(detail=True,
methods=['put'],
url_path='upload-profile-picture',
name="Uploads Profile Picture of User")
@decorators.error_safe
@transaction.atomic
def UploadProfilePicture(self, request, pk=None):
existingUser = models.User.objects.filter(id=pk).first()
if existingUser:
eximages = models.UserImage.objects.filter(user_id=pk)
if (eximages):
for item in eximages:
item.delete()
# DELETE FROM PHYSICAL
FileHelper.DeleteFile(path=item.image.path)
self.serializer_class = app_serializers.UserImageSerializer
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data,
status=status.HTTP_201_CREATED,
headers=headers)
else:
raise Exception('User not found')
return Response(data={"detail": "Success"})
@action(detail=True,
methods=['put'],
url_path='reset-password',
name="Reset Password of User")
@decorators.error_safe
@transaction.atomic
def ResetPassword(self, request, pk=None):
existingUser = models.User.objects.filter(id=pk).first()
if existingUser:
existingUser.set_password(settings.USER_DEFAULT_PASSWORD)
fromObj = copy.copy(existingUser)
existingUser.save()
toObj = copy.copy(existingUser)
log_save.log_save(
enums.LogEnum.UPDATE.value,
enums.LogEntitiesEnum.ROBOT.value,
model_to_dict(fromObj),
model_to_dict(toObj))
else:
raise Exception('User not found')
return Response(data={"detail": "Success"})
@action(detail=True,
methods=['put'],
url_path='change-password',
name="Change Password of User")
@decorators.error_safe
@transaction.atomic
def ChangePassword(self, request, pk=None):
self.serializer_class = serializers\
.ChangePasswordSerializer
serializer = self.get_serializer(data=request.data)
if serializer.is_valid():
form = copy.deepcopy(serializer.validated_data)
if form['new_password'] != form['new_password_confirm']:
raise Exception('Passwords must match')
existingUser = models.User.objects.filter(id=pk).first()
if existingUser:
user = authenticate(
username=existingUser.username,
password=form['old_password'])
if user:
existingUser.set_password(form['new_password_confirm'])
fromObj = copy.copy(existingUser)
existingUser.save()
toObj = copy.copy(existingUser)
log_save.log_save(
enums.LogEnum.UPDATE.value,
enums.LogEntitiesEnum.ROBOT.value,
model_to_dict(fromObj),
model_to_dict(toObj))
return Response(data={"detail": "Success"},
status=200)
else:
raise Exception("Invalid Old Password")
else:
raise Exception('User not found')
else:
serializer.is_valid(raise_exception=True)
return Response(data={"detail": "Error"}, status=500)
@action(detail=True,
methods=['put'],
url_path='add-special-permissions',
name="Adds special permissions to user")
@decorators.error_safe
@transaction.atomic
def UserSpecialPermissions(self, request, pk=None):
user = models.User.objects.filter(id=pk).first()
if not user:
raise Exception('User not found')
# CLEARES ALL USER'S SPECIAL PERMISSION'
for i in user.special_permissions.all():
i.delete()
user.save()
# LOAD NEW USER'S NEW SPECIAL PERMISSIONS
form = copy.deepcopy(request.data)
for spid in form['special_permissions']:
sp = models.Permission.objects.filter(id=spid).first()
if not sp:
raise Exception(F"{spid} does not exists")
return Response(data={"detail": "Success"}, status=200)
# # Lists ALL Application Permissions (No Pagination)
# @action(detail=False,
# methods=['get'],
# url_path='all-permissions',
# name="Lists all Application's Permissions")
# @decorators.error_safe
# def AllPermissions(self, request, *args, **kwargs):
# return Response(
# models.Permission.objects.values(
# permissionId=F('id'),
# permissionCode=F('code')
# )
# )
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment