393 lines
13 KiB
Python
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
|