Merge branch 'feature/logging/func' into 'develop'
Feature/logging/func See merge request 2020-2021/online/s101/group-02/access_controller!36
This commit is contained in:
commit
4e3804d7e7
1
.gitignore
vendored
1
.gitignore
vendored
@ -12,6 +12,7 @@ local_settings.py
|
|||||||
db.sqlite3
|
db.sqlite3
|
||||||
db.sqlite3-journal
|
db.sqlite3-journal
|
||||||
media/
|
media/
|
||||||
|
logs/
|
||||||
|
|
||||||
# If your build process includes running collectstatic, then you probably don't need or want to include staticfiles/
|
# If your build process includes running collectstatic, then you probably don't need or want to include staticfiles/
|
||||||
# in your Git repository. Update and uncomment the following line accordingly.
|
# in your Git repository. Update and uncomment the following line accordingly.
|
||||||
|
@ -143,41 +143,7 @@ AUTHENTICATION_BACKENDS = [
|
|||||||
|
|
||||||
# Logging system
|
# Logging system
|
||||||
# https://docs.djangoproject.com/en/3.1/topics/logging/
|
# https://docs.djangoproject.com/en/3.1/topics/logging/
|
||||||
LOGGING = {
|
|
||||||
'version': 1,
|
|
||||||
'disable_existing_loggers': False,
|
|
||||||
'formatters': {
|
|
||||||
'verbose': {
|
|
||||||
'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
|
|
||||||
'style': '{',
|
|
||||||
},
|
|
||||||
'simple': {
|
|
||||||
'format': '{levelname} {message}',
|
|
||||||
'style': '{',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
'handlers': {
|
|
||||||
'console': {
|
|
||||||
'level': 'INFO',
|
|
||||||
'class': 'logging.StreamHandler',
|
|
||||||
'formatter': 'simple'
|
|
||||||
},
|
|
||||||
'mail_admins': {
|
|
||||||
'level': 'ERROR',
|
|
||||||
'class': 'django.utils.log.AdminEmailHandler',
|
|
||||||
}
|
|
||||||
},
|
|
||||||
'loggers': {
|
|
||||||
'django': {
|
|
||||||
'handlers': ['console'],
|
|
||||||
'propagate': True,
|
|
||||||
},
|
|
||||||
'main.index': {
|
|
||||||
'handlers': ['console'],
|
|
||||||
'level': 'INFO',
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ZENDESK_ROLES = {
|
ZENDESK_ROLES = {
|
||||||
'engineer': 360005209000,
|
'engineer': 360005209000,
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import logging
|
||||||
import os
|
import os
|
||||||
from datetime import timedelta, datetime, date
|
from datetime import timedelta, datetime, date
|
||||||
|
|
||||||
@ -7,6 +8,7 @@ from django.utils import timezone
|
|||||||
from zenpy import Zenpy
|
from zenpy import Zenpy
|
||||||
from zenpy.lib.exception import APIException
|
from zenpy.lib.exception import APIException
|
||||||
|
|
||||||
|
|
||||||
from access_controller.settings import ZENDESK_ROLES as ROLES, ONE_DAY, ZENDESK_GROUPS, SOLVED_TICKETS_EMAIL
|
from access_controller.settings import ZENDESK_ROLES as ROLES, ONE_DAY, ZENDESK_GROUPS, SOLVED_TICKETS_EMAIL
|
||||||
from main.models import UserProfile, RoleChangeLogs, UnassignedTicket, UnassignedTicketStatus
|
from main.models import UserProfile, RoleChangeLogs, UnassignedTicket, UnassignedTicketStatus
|
||||||
|
|
||||||
@ -139,7 +141,7 @@ class ZendeskAdmin:
|
|||||||
raise ValueError('invalid access_controller`s login data')
|
raise ValueError('invalid access_controller`s login data')
|
||||||
|
|
||||||
|
|
||||||
def update_role(user_profile: UserProfile, role: str) -> UserProfile:
|
def update_role(user_profile: UserProfile, role: int) -> UserProfile:
|
||||||
"""
|
"""
|
||||||
Функция меняет роль пользователя.
|
Функция меняет роль пользователя.
|
||||||
|
|
||||||
@ -162,12 +164,6 @@ def make_engineer(user_profile: UserProfile, who_changes: User) -> UserProfile:
|
|||||||
:param user_profile: Профиль пользователя
|
:param user_profile: Профиль пользователя
|
||||||
:return: Вызов функции **update_role** с параметрами: профиль пользователя, роль "engineer"
|
:return: Вызов функции **update_role** с параметрами: профиль пользователя, роль "engineer"
|
||||||
"""
|
"""
|
||||||
RoleChangeLogs.objects.create(
|
|
||||||
user=user_profile.user,
|
|
||||||
old_role=user_profile.custom_role_id,
|
|
||||||
new_role=ROLES['engineer'],
|
|
||||||
changed_by=who_changes
|
|
||||||
)
|
|
||||||
update_role(user_profile, ROLES['engineer'])
|
update_role(user_profile, ROLES['engineer'])
|
||||||
|
|
||||||
|
|
||||||
@ -191,13 +187,6 @@ def make_light_agent(user_profile: UserProfile, who_changes: User) -> UserProfil
|
|||||||
ticket.assignee = None
|
ticket.assignee = None
|
||||||
ticket.group = ZendeskAdmin().get_group(ZENDESK_GROUPS['buffer'])
|
ticket.group = ZendeskAdmin().get_group(ZENDESK_GROUPS['buffer'])
|
||||||
ZendeskAdmin().admin.tickets.update(ticket)
|
ZendeskAdmin().admin.tickets.update(ticket)
|
||||||
|
|
||||||
RoleChangeLogs.objects.create(
|
|
||||||
user=user_profile.user,
|
|
||||||
old_role=user_profile.custom_role_id,
|
|
||||||
new_role=ROLES['light_agent'],
|
|
||||||
changed_by=who_changes
|
|
||||||
)
|
|
||||||
update_role(user_profile, ROLES['light_agent'])
|
update_role(user_profile, ROLES['light_agent'])
|
||||||
|
|
||||||
|
|
||||||
@ -607,3 +596,72 @@ class StatisticData:
|
|||||||
"""
|
"""
|
||||||
self.statistic.clear()
|
self.statistic.clear()
|
||||||
self.fill_daterange(self.start_date, self.end_date + timedelta(days=1), 0)
|
self.fill_daterange(self.start_date, self.end_date + timedelta(days=1), 0)
|
||||||
|
|
||||||
|
|
||||||
|
class DatabaseHandler(logging.Handler):
|
||||||
|
def __init__(self):
|
||||||
|
logging.Handler.__init__(self)
|
||||||
|
|
||||||
|
def emit(self, record):
|
||||||
|
database = RoleChangeLogs()
|
||||||
|
users = record.msg
|
||||||
|
if users[1]:
|
||||||
|
user = users[0]
|
||||||
|
admin = users[1]
|
||||||
|
elif not users[1]:
|
||||||
|
user = users[0]
|
||||||
|
admin = users[0]
|
||||||
|
database.name = user.name
|
||||||
|
database.user = user.user
|
||||||
|
database.changed_by = admin.user
|
||||||
|
if user.custom_role_id == ROLES['engineer']:
|
||||||
|
database.old_role = ROLES['light_agent']
|
||||||
|
elif user.custom_role_id == ROLES['light_agent']:
|
||||||
|
database.old_role = ROLES['engineer']
|
||||||
|
database.new_role = user.custom_role_id
|
||||||
|
database.save()
|
||||||
|
|
||||||
|
|
||||||
|
class CsvFormatter(logging.Formatter):
|
||||||
|
def __init__(self):
|
||||||
|
logging.Formatter.__init__(self)
|
||||||
|
|
||||||
|
def format(self, record):
|
||||||
|
users = record.msg
|
||||||
|
if users[1]:
|
||||||
|
user = users[0]
|
||||||
|
admin = users[1]
|
||||||
|
elif not users[1]:
|
||||||
|
user = users[0]
|
||||||
|
admin = users[0]
|
||||||
|
msg = ''
|
||||||
|
msg += user.name
|
||||||
|
if user.custom_role_id == ROLES['engineer']:
|
||||||
|
msg += ',engineer,'
|
||||||
|
elif user.custom_role_id == ROLES['light_agent']:
|
||||||
|
msg += ',light_agent,'
|
||||||
|
time = str(timezone.now().today())
|
||||||
|
msg += time[:16]
|
||||||
|
msg += ','
|
||||||
|
msg += admin.name
|
||||||
|
return msg
|
||||||
|
|
||||||
|
|
||||||
|
def log(user, admin=0):
|
||||||
|
"""
|
||||||
|
Осуществляет запись логов в базу данных и csv файл
|
||||||
|
:param admin:
|
||||||
|
:param user:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
users = [user, admin]
|
||||||
|
logger = logging.getLogger('MY_LOGGER')
|
||||||
|
if not logger.hasHandlers():
|
||||||
|
dbhandler = DatabaseHandler()
|
||||||
|
csvformatter = CsvFormatter()
|
||||||
|
csvhandler = logging.FileHandler('logs/logs.csv', "a")
|
||||||
|
csvhandler.setFormatter(csvformatter)
|
||||||
|
logger.addHandler(dbhandler)
|
||||||
|
logger.addHandler(csvhandler)
|
||||||
|
logger.setLevel('INFO')
|
||||||
|
logger.info(users)
|
||||||
|
@ -3,10 +3,10 @@ import os
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
from django.contrib.auth.forms import PasswordResetForm
|
|
||||||
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
|
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
|
||||||
from django.contrib.auth.models import User, Permission
|
from django.contrib.auth.models import User, Permission
|
||||||
from django.contrib.auth.tokens import default_token_generator
|
from django.contrib.auth.tokens import default_token_generator
|
||||||
|
from django.contrib.auth.forms import PasswordResetForm
|
||||||
from django.contrib.auth.views import LoginView
|
from django.contrib.auth.views import LoginView
|
||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
from django.contrib.messages.views import SuccessMessageMixin
|
from django.contrib.messages.views import SuccessMessageMixin
|
||||||
@ -29,7 +29,7 @@ from access_controller.settings import EMAIL_HOST_USER, ZENDESK_ROLES, ZENDESK_M
|
|||||||
from main.extra_func import ZendeskAdmin
|
from main.extra_func import ZendeskAdmin
|
||||||
from main.extra_func import check_user_exist, update_profile, get_user_organization, \
|
from main.extra_func import check_user_exist, update_profile, get_user_organization, \
|
||||||
make_engineer, make_light_agent, get_users_list, update_users_in_model, count_users, \
|
make_engineer, make_light_agent, get_users_list, update_users_in_model, count_users, \
|
||||||
StatisticData
|
StatisticData, log
|
||||||
from main.forms import AdminPageUsers, CustomRegistrationForm, CustomAuthenticationForm, StatisticForm
|
from main.forms import AdminPageUsers, CustomRegistrationForm, CustomAuthenticationForm, StatisticForm
|
||||||
from main.serializers import ProfileSerializer
|
from main.serializers import ProfileSerializer
|
||||||
from .models import UserProfile
|
from .models import UserProfile
|
||||||
@ -194,6 +194,7 @@ def user_update(zenpy_user: User, admin: User, request: WSGIRequest) -> UserProf
|
|||||||
|
|
||||||
admin.users.update(zenpy_user)
|
admin.users.update(zenpy_user)
|
||||||
request.user.userprofile.role = "agent"
|
request.user.userprofile.role = "agent"
|
||||||
|
request.user.userprofile.custom_role_id = zenpy_user.custom_role_id
|
||||||
request.user.userprofile.save()
|
request.user.userprofile.save()
|
||||||
messages.success(request, "Права были изменены")
|
messages.success(request, "Права были изменены")
|
||||||
|
|
||||||
@ -211,6 +212,7 @@ def work_hand_over(request: WSGIRequest) -> HttpResponseRedirect:
|
|||||||
if zenpy_user.custom_role_id == ZENDESK_ROLES['engineer']:
|
if zenpy_user.custom_role_id == ZENDESK_ROLES['engineer']:
|
||||||
zenpy_user.custom_role_id = ZENDESK_ROLES['light_agent']
|
zenpy_user.custom_role_id = ZENDESK_ROLES['light_agent']
|
||||||
user_update(zenpy_user, admin, request)
|
user_update(zenpy_user, admin, request)
|
||||||
|
log(request.user.userprofile)
|
||||||
return HttpResponseRedirect(reverse('work', args=(request.user.id,)))
|
return HttpResponseRedirect(reverse('work', args=(request.user.id,)))
|
||||||
|
|
||||||
|
|
||||||
@ -226,6 +228,7 @@ def work_become_engineer(request: WSGIRequest) -> HttpResponseRedirect:
|
|||||||
if zenpy_user.custom_role_id == ZENDESK_ROLES['light_agent']:
|
if zenpy_user.custom_role_id == ZENDESK_ROLES['light_agent']:
|
||||||
zenpy_user.custom_role_id = ZENDESK_ROLES['engineer']
|
zenpy_user.custom_role_id = ZENDESK_ROLES['engineer']
|
||||||
user_update(zenpy_user, admin, request)
|
user_update(zenpy_user, admin, request)
|
||||||
|
log(request.user.userprofile)
|
||||||
return HttpResponseRedirect(reverse('work', args=(request.user.id,)))
|
return HttpResponseRedirect(reverse('work', args=(request.user.id,)))
|
||||||
|
|
||||||
|
|
||||||
@ -275,10 +278,12 @@ class AdminPageView(LoginRequiredMixin, PermissionRequiredMixin,SuccessMessageMi
|
|||||||
"""
|
"""
|
||||||
for user in users:
|
for user in users:
|
||||||
make_engineer(user, self.request.user)
|
make_engineer(user, self.request.user)
|
||||||
|
log(user, self.request.user.userprofile)
|
||||||
|
|
||||||
def make_light_agents(self, users):
|
def make_light_agents(self, users):
|
||||||
for user in users:
|
for user in users:
|
||||||
make_light_agent(user, self.request.user)
|
make_light_agent(user, self.request.user)
|
||||||
|
log(user, self.request.user.userprofile)
|
||||||
|
|
||||||
def get_context_data(self, **kwargs) -> dict:
|
def get_context_data(self, **kwargs) -> dict:
|
||||||
"""
|
"""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user