diff --git a/.gitignore b/.gitignore index d798070..1f6ea85 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ local_settings.py db.sqlite3 db.sqlite3-journal media/ +logs/ # 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. diff --git a/access_controller/settings.py b/access_controller/settings.py index cee5805..92b3d29 100644 --- a/access_controller/settings.py +++ b/access_controller/settings.py @@ -143,41 +143,7 @@ AUTHENTICATION_BACKENDS = [ # Logging system # 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 = { 'engineer': 360005209000, diff --git a/main/extra_func.py b/main/extra_func.py index 8b75346..821e11a 100644 --- a/main/extra_func.py +++ b/main/extra_func.py @@ -1,3 +1,4 @@ +import logging import os from datetime import timedelta, datetime, date @@ -7,6 +8,7 @@ from django.utils import timezone from zenpy import Zenpy from zenpy.lib.exception import APIException + from access_controller.settings import ZENDESK_ROLES as ROLES, ONE_DAY, ZENDESK_GROUPS, SOLVED_TICKETS_EMAIL from main.models import UserProfile, RoleChangeLogs, UnassignedTicket, UnassignedTicketStatus @@ -139,7 +141,7 @@ class ZendeskAdmin: 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: Профиль пользователя :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']) @@ -191,13 +187,6 @@ def make_light_agent(user_profile: UserProfile, who_changes: User) -> UserProfil ticket.assignee = None ticket.group = ZendeskAdmin().get_group(ZENDESK_GROUPS['buffer']) 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']) @@ -607,3 +596,72 @@ class StatisticData: """ self.statistic.clear() 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) diff --git a/main/views.py b/main/views.py index 0a1a070..e41e254 100644 --- a/main/views.py +++ b/main/views.py @@ -3,10 +3,10 @@ import os from datetime import datetime 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.models import User, Permission 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.contenttypes.models import ContentType 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 check_user_exist, update_profile, get_user_organization, \ 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.serializers import ProfileSerializer from .models import UserProfile @@ -194,6 +194,7 @@ def user_update(zenpy_user: User, admin: User, request: WSGIRequest) -> UserProf admin.users.update(zenpy_user) request.user.userprofile.role = "agent" + request.user.userprofile.custom_role_id = zenpy_user.custom_role_id request.user.userprofile.save() messages.success(request, "Права были изменены") @@ -211,6 +212,7 @@ def work_hand_over(request: WSGIRequest) -> HttpResponseRedirect: if zenpy_user.custom_role_id == ZENDESK_ROLES['engineer']: zenpy_user.custom_role_id = ZENDESK_ROLES['light_agent'] user_update(zenpy_user, admin, request) + log(request.user.userprofile) 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']: zenpy_user.custom_role_id = ZENDESK_ROLES['engineer'] user_update(zenpy_user, admin, request) + log(request.user.userprofile) return HttpResponseRedirect(reverse('work', args=(request.user.id,))) @@ -275,10 +278,12 @@ class AdminPageView(LoginRequiredMixin, PermissionRequiredMixin,SuccessMessageMi """ for user in users: make_engineer(user, self.request.user) + log(user, self.request.user.userprofile) def make_light_agents(self, users): for user in users: make_light_agent(user, self.request.user) + log(user, self.request.user.userprofile) def get_context_data(self, **kwargs) -> dict: """