Files
FireGame/AuthApp/funcs.py
2023-05-16 17:14:16 +03:00

393 lines
13 KiB
Python

# -*- coding: utf-8 -*-
from .models import *
from datetime import datetime, timedelta, date
from django.db.models import Q, F, Value as V
from django.db.models.functions import ExtractYear, Concat, Coalesce
from functools import reduce
from operator import or_
sales_department_groups = [
'Отдел продаж: Начальник отдела продаж',
'Отдел продаж: Менеджер отдела продаж',
'Отдел продаж: Региональный руководитель отдела продаж',
'Отдел продаж: Стажер отдела продаж'
]
heads_of_sales_groups = [
'Отдел продаж: Начальник отдела продаж',
'Отдел продаж: Региональный руководитель отдела продаж',
]
def get_personal_companies_by_managers_list(managers_list, filter_kwargs={}, exclude_kwargs={}, only_emails=False):
try:
users = User.objects.filter(
user_profile__company_obj__manager_obj__in=managers_list,
**filter_kwargs
).exclude(
**exclude_kwargs
).order_by('-is_active', 'last_name', 'first_name')
if only_emails:
users = list(users.values_list('email', flat=True))
except Exception as e:
msg = f'get_personal_companies_by_managers_list Error = {str(e)}'
users = []
return users
def get_head_staffs_by_user_email(user_email, only_emails=False):
try:
user = User.objects.get(email=user_email)
heads = get_head_staffs(user.user_profile, only_emails=True)
except User.DoesNotExist as e:
heads = None
return heads
def get_head_staffs(user_profile_or_user_ID, only_emails=False):
if type(user_profile_or_user_ID) == str:
user = User.objects.get(id=int(user_profile_or_user_ID))
user_profile = user.user_profile
else:
user_profile = user_profile_or_user_ID
user = user_profile.user
groups = user.groups.all()
groups_name_list = groups.values_list('name', flat=True)
Q_list = []
if user_profile.is_sales_department_staff():
if 'Отдел продаж: Менеджер отдела продаж' in groups_name_list:
groups_list = ['Отдел продаж: Региональный руководитель отдела продаж']
kwargs = {
'groups__name__in': groups_list,
'user_profile__regions__in': user.user_profile.regions.all(),
}
Q_list.append(Q(**kwargs))
if not 'Отдел продаж: Начальник отдела продаж' in groups_name_list:
groups_list = ['Отдел продаж: Начальник отдела продаж']
kwargs = {'groups__name__in': groups_list}
Q_list.append(Q(**kwargs))
# groups_list = ['Управляющий']
# kwargs.update({'groups__name__in': groups_list})
if not 'Управляющий' in groups_name_list:
kwargs = {'is_superuser': True}
Q_list.append(Q(**kwargs))
Q_obj = reduce(lambda p1, p2: (p1 | p2), Q_list)
heads = User.objects.filter(
Q_obj,
is_active=True,
is_staff=True
)
heads = heads.distinct().order_by('-is_active', 'last_name', 'first_name')
if only_emails:
heads = list(heads.values_list('email', flat=True))
return heads
def get_bosses_and_subordinate_staff_ids(user, only_active=False, include_cur_user=False, only_emails=False):
users = []
kwargs = {
'is_staff': True,
}
if only_active:
kwargs.update({'is_active': True})
groups = user.groups.all()
groups_name_list = groups.values_list('name', flat=True)
Q_obj = Q()
if 'Отдел продаж: Начальник отдела продаж' in groups_name_list:
Q_obj.add(Q(is_superuser=True), Q.OR)
elif 'Отдел продаж: Региональный руководитель отдела продаж' in groups_name_list:
Q_obj.add(Q(is_superuser=True), Q.OR)
Q_obj.add(Q(groups__name='Отдел продаж: Начальник отдела продаж'), Q.OR)
elif 'Отдел продаж: Менеджер отдела продаж' in groups_name_list:
Q_obj.add(Q(is_superuser=True), Q.OR)
Q_obj.add(Q(groups__name='Отдел продаж: Начальник отдела продаж'), Q.OR)
Q_obj.add(Q(
groups__name='Отдел продаж: Региональный руководитель отдела продаж',
user_profile__regions__in=user.user_profile.regions.all()), Q.OR)
subordinate_users = get_subordinate_staff(
user, only_active=only_active, include_cur_user=include_cur_user, only_emails=only_emails
)
res_val = 'id'
if only_emails:
res_val = 'user_profile__email'
subordinate_users = subordinate_users.values_list(res_val, flat=True)
if user.is_superuser:
users = subordinate_users
else:
bosses = User.objects.filter(Q_obj, **kwargs).values_list(res_val, flat=True)
users = set(subordinate_users) | set(bosses)
return users
def get_subordinate_sales_staff(user, groups, only_active=False, only_emails=False, include_cur_user=False):
kwargs = {
'is_staff': True,
}
if only_active:
kwargs.update({'is_active': True})
Q_obj = Q()
if 'Отдел продаж: Начальник отдела продаж' in groups:
kwargs_groups = [
'Отдел продаж: Менеджер отдела продаж',
'Отдел продаж: Региональный руководитель отдела продаж',
'Отдел продаж: Стажер отдела продаж'
]
Q_obj.add(Q(groups__name__in=kwargs_groups), Q.OR)
elif u'Отдел продаж: Региональный руководитель отдела продаж' in groups:
kwargs_groups = [
'Отдел продаж: Менеджер отдела продаж',
'Отдел продаж: Стажер отдела продаж'
]
Q_obj.add(Q(groups__name__in=kwargs_groups, user_profile__regions__in=user.user_profile.regions.all()), Q.OR)
elif u'Отдел продаж: Менеджер отдела продаж' in groups:
kwargs_groups = [
'Отдел продаж: Стажер отдела продаж'
]
Q_obj.add(Q(groups__name__in=kwargs_groups, user_profile__regions__in=user.user_profile.regions.all()), Q.OR)
elif 'Отдел закупок: Начальник отдела закупок' in groups:
kwargs_groups = [
'Отдел закупок: Менеджер отдела закупок',
]
Q_obj.add(Q(groups__name__in=kwargs_groups), Q.OR)
if include_cur_user:
Q_obj.add(Q(id=user.id), Q.OR)
users = User.objects.filter(Q_obj, **kwargs).exclude(is_superuser=True)
users = users.distinct().order_by('-is_active', 'last_name', 'first_name')
# if kwargs:
# other_users = User.objects.filter(
# **kwargs
# ).exclude(
# is_superuser=True
# )
# users = users.union(other_users)
# users = users.distinct().order_by('-is_active', 'last_name', 'first_name')
if only_emails:
users = list(users.values_list('email', flat=True))
return users
def get_subordinate_staff(user, only_active=False, include_cur_user=False, only_emails=False):
users = []
groups = user.groups.all()
groups_name_list = groups.values_list('name', flat=True)
# отдел продаж
if set(groups_name_list):
users = get_subordinate_sales_staff(user, groups_name_list, include_cur_user=include_cur_user)
if not users and user.is_superuser:
users = get_all_staff()
if not users and include_cur_user:
users = User.objects.filter(id=user.id)
if users and only_active:
users = users.filter(is_active=True)
if only_emails:
users = list(users.values_list('email', flat=True))
return users
def get_all_staff(only_active=False, only_emails=False):
kwargs = {
'is_staff': True,
}
if only_active:
kwargs.update({'is_active': True})
users = User.objects.filter(**kwargs).order_by('-is_active', 'last_name', 'first_name')
if only_emails:
users = list(users.values_list('email', flat=True))
return users
def get_managers_wo_work():
managers = get_sales_managers()
managers = managers.filter(
user_profile__last_web_request__lt=datetime.now() - timedelta(minutes=20),
user_profile__last_web_request__contains=date.today()
)
return managers
def get_birthdays(manager=None, for_next_count_days=None, only_first=False):
from_D = datetime.now()
Q_obj = Q()
Q_obj.add(Q(Q(birthdate__day=from_D.day) & Q(birthdate__month=from_D.month)), Q.OR)
# в for_next_count_days количество будущих дней для которых собираем дни рождения
if for_next_count_days:
for i in range(1, for_next_count_days):
Q_obj.add(Q(Q(birthdate__day=(from_D + timedelta(days=i)).day) & Q(
birthdate__month=(from_D + timedelta(days=i)).month)), Q.OR)
kwargs = {}
if manager:
kwargs.update({
'company_obj__manager_obj': manager,
})
from .models import UserProfile
user_profiles = UserProfile.objects.filter(
Q_obj,
# birthdate__lte=(datetime.now() + timedelta(days=3)).date(),
# birthdate__gte=datetime.now().date()
**kwargs
).annotate(
age=datetime.now().year - ExtractYear('birthdate')
).order_by('company_obj__manager_obj', 'birthdate')
if user_profiles and only_first:
return user_profiles[0]
return user_profiles
def get_sales_managers(only_active=False, only_emails=False):
from CompaniesApp.models import Company
kwargs = {
'is_staff': True,
'companies_for_manager__company_type': 'client',
}
if only_active:
kwargs.update({'is_active': True})
managers = User.objects.filter(**kwargs).exclude(companies_for_manager=None).distinct().order_by('-is_active',
'last_name',
'first_name')
# managers = Company.objects.filter(
# company_type='client'
# ).values_list('manager_obj', flat=True).distinct()
if only_emails:
managers = list(managers.values_list('email', flat=True))
return managers
def get_full_names_by_id(ids):
names = User.objects.filter(
id__in=ids
).annotate(
fullname=Concat(F('last_name'), V(' '), F('first_name'))
).values('id', 'fullname')
names = {item['id']: item['fullname'] for item in names}
return names
def fullname_for_user(user):
full_name = '%s %s' % (user.last_name, user.first_name)
return full_name.strip()
def get_heads_of_sales(only_active=False, only_emails=False):
kwargs = {
'is_staff': True,
}
Q_obj = Q(groups__name__in=heads_of_sales_groups) | Q(is_superuser=True)
if only_active:
kwargs.update({'is_active': True})
users = User.objects.filter(
Q_obj,
**kwargs
).order_by('-is_active', 'last_name', 'first_name')
if only_emails:
users = list(users.values_list('email', flat=True))
return users
def get_sales_department_staff(regions=None, only_active=False, only_emails=False):
kwargs = {
'is_staff': True,
}
if not regions:
sales_department_groups = [
'Отдел продаж: Менеджер отдела продаж', 'Отдел продаж: Начальник отдела продаж',
'Отдел продаж: Региональный руководитель отдела продаж',
'Отдел продаж: Стажер отдела продаж'
]
kwargs.update({
'groups__name__in': sales_department_groups,
})
else:
sales_department_groups = [
'Отдел продаж: Менеджер отдела продаж',
'Отдел продаж: Региональный руководитель отдела продаж',
'Отдел продаж: Стажер отдела продаж'
]
kwargs.update({
'groups__name__in': sales_department_groups,
})
if only_active:
kwargs.update({'is_active': True})
users = User.objects.filter(**kwargs).exclude(is_superuser=True).order_by('-is_active', 'last_name', 'first_name')
if only_emails:
users = list(users.values_list('email', flat=True))
return users
def get_marketing_departament_persons(only_active=False, only_emails=False):
kwargs = {
'is_staff': True,
'groups__name': 'Маркетинг: Маркетолог',
}
if only_active:
kwargs.update({'is_active': True})
users = User.objects.filter(**kwargs).order_by('-is_active', 'last_name', 'first_name')
if only_emails:
users = list(users.values_list('email', flat=True))
return users