Advertisement
Guest User

Untitled

a guest
Mar 31st, 2020
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.72 KB | None | 0 0
  1. import os
  2.  
  3. import environ
  4. from django.db.models import Q
  5.  
  6. from communicator.models import CommunicatorAuthentication
  7. from django.core.management.base import BaseCommand
  8. from django.db import transaction
  9.  
  10. import MySQLdb
  11.  
  12. from customers.models import EnrollWizard
  13. from freeswitch.models import Channels
  14. from kamailio.models import Location
  15. from provisioning.models import Dss, ProvisioningAccount, ProvisioningDevice, ProvisioningMultiCellDevice, Repeater
  16. from rest_framework.authtoken.models import Token
  17. from voip_platform.models import (
  18.     Account,
  19.     CalendarPreset,
  20.     CallFlow,
  21.     ConferenceRoom,
  22.     DidRouting,
  23.     Extension,
  24.     ExtensionGroup,
  25.     ExtensionGroupMember,
  26.     Fax,
  27.     FifoQueue,
  28.     FifoQueueChime,
  29.     FifoQueueMember,
  30.     Group,
  31.     MediaFile,
  32.     Phonebook,
  33.     PhonebookContact,
  34.     RateCallBundle,
  35.     RateDiscount,
  36.     RingGroup,
  37.     RingGroupMember,
  38.     Site,
  39.     VoicemailBox,
  40.     VoicemailMessage,
  41.     WakeupCall,
  42.     DidRoutingHistory,
  43. )
  44.  
  45. from telsy_v3.users.models import User, UserProfile
  46.  
  47. env = environ.Env()
  48. env.read_env(".env")
  49.  
  50.  
  51. class Command(BaseCommand):
  52.     help = "Clear all redundant data in DB."
  53.  
  54.     KAMAILIO = "kamailio"
  55.     FREESWITCH = "freeswitch"
  56.  
  57.     kamailio_exclude_tables = ["location"]
  58.     freeswitch_exclude_tables = ["channels"]
  59.  
  60.     @transaction.atomic
  61.     def handle(self, *args, **options):
  62.         if "production" not in os.environ.get("DJANGO_SETTINGS_MODULE"):
  63.             telsmart_group_ids = [583, 585, 587]
  64.             platform_domains = ["g583.ctx.phoneserver.io", "g585.ctx.phoneserver.io", "g587.ctx.phoneserver.io"]
  65.             telsmarts = Group.objects.filter(pk__in=telsmart_group_ids)
  66.             account_ids = [4, 235]
  67.             did_routings = DidRouting.objects.exclude(account_id__in=account_ids, group__in=telsmarts)
  68.             did_histories = DidRoutingHistory.objects.filter(did__in=did_routings)
  69.             did_histories.delete()
  70.             did_routings.delete()
  71.             call_flows = CallFlow.objects.exclude(group__in=telsmarts)
  72.             call_flows.delete()
  73.             conference_rooms = ConferenceRoom.objects.exclude(group__in=telsmarts)
  74.             conference_rooms.delete()
  75.  
  76.             extensions = Extension.objects.exclude(group__in=telsmarts)
  77.             media_files = MediaFile.objects.filter(
  78.                 recorded_by_extension__in=list(extensions.values_list("id", flat=True))
  79.             )
  80.             wakeup_calls = WakeupCall.objects.filter(extension__in=list(extensions.values_list("id", flat=True)))
  81.             wakeup_calls.delete()
  82.             fifo_queue_chimes = FifoQueueChime.objects.filter(
  83.                 media_file__in=list(media_files.values_list("id", flat=True))
  84.             )
  85.             fifo_queue_chimes.delete()
  86.             media_files.delete()
  87.  
  88.             ring_groups = RingGroup.objects.exclude(group__in=telsmarts)
  89.             phonebooks = Phonebook.objects.exclude(group__in=telsmarts)
  90.             contacts = PhonebookContact.objects.filter(phonebook__in=list(phonebooks.values_list("id", flat=True)))
  91.             fifo_queue_members = FifoQueueMember.objects.filter(
  92.                 extension__in=list(extensions.values_list("id", flat=True))
  93.             )
  94.             fifo_queue_members.delete()
  95.             fifo_queue_members = FifoQueueMember.objects.filter(contact__in=list(contacts.values_list("id", flat=True)))
  96.             fifo_queue_members.delete()
  97.             fifo_queue_members = FifoQueueMember.objects.filter(
  98.                 ring_group__in=list(ring_groups.values_list("id", flat=True))
  99.             )
  100.             fifo_queues = FifoQueue.objects.exclude(group__in=telsmarts)
  101.             fifo_queue_members = FifoQueueMember.objects.filter(
  102.                 queue__in=list(fifo_queues.values_list("id", flat=True))
  103.             )
  104.             fifo_queue_members.delete()
  105.             fifo_queue_chimes = FifoQueueChime.objects.filter(
  106.                 fifo_queue__in=list(fifo_queues.values_list("id", flat=True))
  107.             )
  108.             fifo_queue_chimes.delete()
  109.             fifo_queues.delete()
  110.  
  111.             ring_group_members = RingGroupMember.objects.filter(
  112.                 extension__in=list(extensions.values_list("id", flat=True))
  113.             )
  114.             ring_group_members.delete()
  115.             ring_groups.delete()
  116.             contacts.delete()
  117.             provisioning_accounts = ProvisioningAccount.objects.filter(
  118.                 extension__in=list(extensions.values_list("id", flat=True))
  119.             )
  120.             provisioning_devices = ProvisioningDevice.objects.filter(
  121.                 phonebook__in=list(phonebooks.values_list("id", flat=True))
  122.             )
  123.             provisioning_dss = Dss.objects.filter(device__in=list(provisioning_devices.values_list("id", flat=True)))
  124.             provisioning_repeaters = Repeater.objects.filter(
  125.                 device__in=list(provisioning_devices.values_list("id", flat=True))
  126.             )
  127.             provisioning_repeaters.delete()
  128.             provisioning_dss.delete()
  129.             provisioning_accounts.delete()
  130.             multicells = ProvisioningMultiCellDevice.objects.filter(
  131.                 device__in=list(provisioning_devices.values_list("id", flat=True))
  132.             )
  133.             multicells.delete()
  134.             provisioning_devices.delete()
  135.             phonebooks.delete()
  136.             extension_group_members = ExtensionGroupMember.objects.filter(
  137.                 extension__in=list(extensions.values_list("id", flat=True))
  138.             )
  139.             extension_group_members.delete()
  140.             extension_groups = ExtensionGroup.objects.exclude(group__in=telsmarts)
  141.             extension_groups.delete()
  142.  
  143.             user_ids = list(UserProfile.objects.filter(group_id__in=telsmarts).values_list("user_id", flat=True))
  144.  
  145.             # delete all enroll wizard data since it's only customer data
  146.             EnrollWizard.objects.all().delete()
  147.  
  148.             telsy_commauths = CommunicatorAuthentication.objects.exclude(user_id__in=user_ids)
  149.             telsy_commauths.delete()
  150.  
  151.             tokens = Token.objects.exclude(user_id__in=user_ids)
  152.             tokens.delete()
  153.             UserProfile.objects.exclude(user_id__in=user_ids).delete()
  154.             User.objects.exclude(pk__in=user_ids).delete()
  155.  
  156.             extensions.delete()
  157.  
  158.             faxes = Fax.objects.exclude(group__in=telsmarts)
  159.             faxes.delete()
  160.             accounts = Account.objects.exclude(pk__in=account_ids)
  161.             rate_discounts = RateDiscount.objects.filter(account__in=list(accounts.values_list("id", flat=True)))
  162.             rate_discounts.delete()
  163.             rate_call_bundles = RateCallBundle.objects.filter(account__in=list(accounts.values_list("id", flat=True)))
  164.             rate_call_bundles.delete()
  165.             accounts.delete()
  166.             vm_boxes = VoicemailBox.objects.exclude(group__in=telsmarts)
  167.             devices = ProvisioningDevice.objects.filter(voicemail_box__in=list(vm_boxes.values_list("id", flat=True)))
  168.             devices.update(voicemail_box=None)
  169.             VoicemailMessage.objects.exclude(voicemail_box__group__in=telsmarts).delete()
  170.             vm_boxes.delete()
  171.  
  172.             groups = Group.objects.exclude(id__in=telsmart_group_ids)
  173.             calendar_presets = CalendarPreset.objects.filter(group__in=list(groups.values_list("id", flat=True)))
  174.             calendar_presets.delete()
  175.             media_files = MediaFile.objects.exclude(group__in=telsmarts)
  176.             media_files.delete()
  177.  
  178.             sites = Site.objects.exclude(group__in=telsmarts)
  179.             sites.delete()
  180.             groups.delete()
  181.  
  182.             locations = Location.objects.using(self.KAMAILIO).exclude(domain__in=platform_domains)
  183.             locations.delete()
  184.  
  185.             channels = Channels.objects.using(self.FREESWITCH).exclude(
  186.                 Q(name__contains=platform_domains[0]) | Q(name__contains=platform_domains[1])
  187.             )
  188.             channels.delete()
  189.  
  190.             self.delete_useless_tables(exclude_tables=self.kamailio_exclude_tables, database=self.KAMAILIO)
  191.             self.delete_useless_tables(exclude_tables=self.freeswitch_exclude_tables, database=self.FREESWITCH)
  192.  
  193.             self.delete_useless_views(database=self.FREESWITCH)
  194.  
  195.             self.stdout.write(self.style.SUCCESS("Done"))
  196.  
  197.     def delete_useless_tables(self, exclude_tables=[], database=""):
  198.         tables = []
  199.         cnx = MySQLdb.connect(
  200.             user=env("LOCAL_DB_USER"), password=env("LOCAL_DB_PASSWORD"), host=env("LOCAL_DB_HOST"), database=database
  201.         )
  202.         cursor = cnx.cursor()
  203.         query = "SHOW TABLES;"
  204.         cursor.execute(query)
  205.         for t in cursor:
  206.             table_name = ",".join(t)
  207.  
  208.             if table_name not in exclude_tables:
  209.                 tables.append(table_name)
  210.  
  211.         drop_list = ", ".join(tables)
  212.         if drop_list:
  213.             drop_query = f"DROP TABLE IF EXISTS {drop_list};"
  214.             cursor.execute(drop_query)
  215.  
  216.         cursor.close()
  217.         cnx.close()
  218.  
  219.     def delete_useless_views(self, exclude_views=[], database=""):
  220.         views = []
  221.         cnx = MySQLdb.connect(
  222.             user=env("LOCAL_DB_USER"), password=env("LOCAL_DB_PASSWORD"), host=env("LOCAL_DB_HOST"), database=database
  223.         )
  224.         cursor = cnx.cursor()
  225.         query = f"SELECT TABLE_NAME FROM information_schema.VIEWS WHERE TABLE_SCHEMA LIKE '{database}';"
  226.         cursor.execute(query)
  227.         for t in cursor:
  228.             view_name = ",".join(t)
  229.  
  230.             if view_name not in exclude_views:
  231.                 views.append(view_name)
  232.  
  233.         drop_list = ", ".join(views)
  234.         if drop_list:
  235.             drop_query = f"DROP VIEW IF EXISTS {drop_list};"
  236.             cursor.execute(drop_query)
  237.  
  238.         cursor.close()
  239.         cnx.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement