From 1aef81a2c911d729db966afa16e7b4ed87779726 Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Mon, 22 Apr 2019 11:33:54 +0300 Subject: [PATCH] process exception for redis connection --- abonapp/views.py | 40 +++++++++++++++++++++++++--------------- clientsideapp/views.py | 3 +++ devapp/views.py | 10 ++++++---- msg_app/models.py | 27 ++++++++++++++++----------- taskapp/handle.py | 20 ++++++++++++-------- 5 files changed, 62 insertions(+), 38 deletions(-) diff --git a/abonapp/views.py b/abonapp/views.py index 0362ad0..b30d403 100644 --- a/abonapp/views.py +++ b/abonapp/views.py @@ -1,5 +1,6 @@ from datetime import datetime from typing import Dict, Optional +from kombu.exceptions import OperationalError from abonapp.tasks import customer_nas_command, customer_nas_remove from agent.commands.dhcp import dhcp_commit, dhcp_expiry, dhcp_release @@ -194,7 +195,7 @@ class DelAbonDeleteView(LoginAdminMixin, PermissionRequiredMixin, DeleteView): }).strip()) messages.success(request, _('delete abon success msg')) return redirect('abonapp:people_list', gid=gid) - except NasNetworkError as e: + except (NasNetworkError, OperationalError) as e: messages.error(self.request, e) except NasFailedResult as e: messages.error(self.request, _("NAS says: '%s'") % e) @@ -332,8 +333,12 @@ class AbonHomeUpdateView(LoginAdminMixin, PermissionRequiredMixin, UpdateView): def form_valid(self, form): r = super(AbonHomeUpdateView, self).form_valid(form) abon = self.object - customer_nas_command.delay(abon.pk, 'sync') - messages.success(self.request, _('edit abon success msg')) + try: + customer_nas_command.delay(abon.pk, 'sync') + except OperationalError as e: + messages.error(self.request, str(e)) + else: + messages.success(self.request, _('edit abon success msg')) return r def form_invalid(self, form): @@ -442,9 +447,7 @@ def pick_tariff(request, gid: int, uname): messages.success(request, _('Tariff has been picked')) return redirect('abonapp:abon_services', gid=gid, uname=abon.username) - except (lib.LogicError, NasFailedResult) as e: - messages.error(request, e) - except NasNetworkError as e: + except (lib.LogicError, NasFailedResult, NasNetworkError, OperationalError) as e: messages.error(request, e) return redirect('abonapp:abon_services', gid=gid, uname=abon.username) except Tariff.DoesNotExist: @@ -485,7 +488,7 @@ def unsubscribe_service(request, gid: int, uname, abon_tariff_id: int): messages.success(request, _('User has been detached from service')) except NasFailedResult as e: messages.error(request, e) - except NasNetworkError as e: + except (NasNetworkError, OperationalError) as e: messages.warning(request, e) except lib.MultipleException as errs: for err in errs.err_list: @@ -608,8 +611,12 @@ class IpUpdateView(LoginAdminPermissionMixin, UpdateView): def form_valid(self, form): r = super(IpUpdateView, self).form_valid(form) abon = self.object - customer_nas_command.delay(abon.pk, 'sync') - messages.success(self.request, _('Ip successfully updated')) + try: + customer_nas_command.delay(abon.pk, 'sync') + except OperationalError as e: + messages.error(self.request, str(e)) + else: + messages.success(self.request, _('Ip successfully updated')) return r def get_context_data(self, **kwargs): @@ -1193,12 +1200,15 @@ class UserSessionFree(LoginRequiredMixin, OnlyAdminsMixin, PermissionRequiredMix def post(self, request, *args, **kwargs): self.object = self.get_object() abon = self.object - if abon.ip_address: - abon.free_ip_addr() - customer_nas_command.delay(abon.pk, 'remove') - messages.success(request, _('Ip lease has been freed')) - else: - messages.error(request, _('User not have ip')) + try: + if abon.ip_address: + abon.free_ip_addr() + customer_nas_command.delay(abon.pk, 'remove') + messages.success(request, _('Ip lease has been freed')) + else: + messages.error(request, _('User not have ip')) + except OperationalError as e: + messages.error(request, e) return redirect( 'abonapp:abon_home', gid=self.kwargs.get('gid'), diff --git a/clientsideapp/views.py b/clientsideapp/views.py index 7174381..e618a73 100644 --- a/clientsideapp/views.py +++ b/clientsideapp/views.py @@ -1,3 +1,4 @@ +from kombu.exceptions import OperationalError from django.contrib.auth.decorators import login_required from django.shortcuts import render, get_object_or_404, redirect from django.contrib import messages @@ -74,6 +75,8 @@ def buy_service(request, srv_id): messages.error(request, e) except NasFailedResult as e: messages.error(request, e) + except OperationalError: + pass return redirect('client_side:services') diff --git a/devapp/views.py b/devapp/views.py index 0cfef9f..ab06acf 100644 --- a/devapp/views.py +++ b/devapp/views.py @@ -1,6 +1,8 @@ import re from ipaddress import ip_address +from kombu.exceptions import OperationalError + from django.conf import settings from django.contrib import messages from django.contrib.auth.decorators import login_required @@ -93,7 +95,7 @@ class DeviceDeleteView(LoginAdminPermissionMixin, DeleteView): onu_register.delay( tuple(dev.pk for dev in Device.objects.exclude(group=None).only('pk').iterator()) ) - except (DeviceDBException, PermissionError) as e: + except (DeviceDBException, PermissionError, OperationalError) as e: messages.error(request, e) messages.success(request, _('Device successfully deleted')) return res @@ -152,7 +154,7 @@ class DeviceUpdate(LoginAdminPermissionMixin, UpdateView): tuple(dev.pk for dev in Device.objects.exclude(group=None).only('pk').iterator()) ) messages.success(self.request, _('Device info has been saved')) - except PermissionError as e: + except (PermissionError, OperationalError) as e: messages.error(self.request, e) return r @@ -226,7 +228,7 @@ class DeviceCreateView(LoginAdminMixin, PermissionRequiredMixin, CreateView): tuple(dev.pk for dev in Device.objects.exclude(group=None).only('pk').iterator()) ) messages.success(self.request, _('Device info has been saved')) - except PermissionError as e: + except (PermissionError, OperationalError) as e: messages.error(self.request, e) return r @@ -779,7 +781,7 @@ class OnDeviceMonitoringEvent(global_base_views.SecureApiView): return { 'text': 'notification successfully sent' } - except ValueError as e: + except (ValueError, OperationalError) as e: return { 'text': str(e) } diff --git a/msg_app/models.py b/msg_app/models.py index 7a06148..68ed4b1 100644 --- a/msg_app/models.py +++ b/msg_app/models.py @@ -1,3 +1,5 @@ +from kombu.exceptions import OperationalError + from django.db import models from django.utils.translation import gettext_lazy as _ from accounts_app.models import UserProfile @@ -206,17 +208,20 @@ class Conversation(models.Model): text=text, conversation=self, attachment=attachment, author=author ) - if with_status: - for participant in self.participants.filter(is_active=True): - if participant == author: - continue - MessageStatus.objects.create(msg=msg, user=participant) - if participant.flags.notify_msg: - send_email_notify.delay( - msg_text=text, - account_id=participant.pk - ) - return msg + try: + if with_status: + for participant in self.participants.filter(is_active=True): + if participant == author: + continue + MessageStatus.objects.create(msg=msg, user=participant) + if participant.flags.notify_msg: + send_email_notify.delay( + msg_text=text, + account_id=participant.pk + ) + return msg + except OperationalError as e: + raise MessageError(e) @staticmethod def remove_message(msg): diff --git a/taskapp/handle.py b/taskapp/handle.py index 18e8618..0356b8c 100644 --- a/taskapp/handle.py +++ b/taskapp/handle.py @@ -1,4 +1,5 @@ -# -*- coding: utf-8 -*- +from kombu.exceptions import OperationalError + from django.template.loader import render_to_string from django.utils.translation import gettext as _ from djing.tasks import send_email_notify # , multicast_email_notify @@ -31,10 +32,13 @@ def handle(task, author, recipients): 'task_status': task_status }) - if task.state == 'F' or task.state == 'C': - # If task completed or failed than send one message to author - send_email_notify.delay(fulltext, author.pk) - send_viber_message.delay(None, author.pk, fulltext) - else: - #multicast_email_notify.delay(fulltext, profile_ids) - multicast_viber_notify.delay(None, profile_ids, fulltext) + try: + if task.state == 'F' or task.state == 'C': + # If task completed or failed than send one message to author + send_email_notify.delay(fulltext, author.pk) + send_viber_message.delay(None, author.pk, fulltext) + else: + #multicast_email_notify.delay(fulltext, profile_ids) + multicast_viber_notify.delay(None, profile_ids, fulltext) + except OperationalError as e: + raise TaskException(e)