From 502a2c4e0ea91e07ab11a2638d08926c0d129517 Mon Sep 17 00:00:00 2001 From: Harry Bridge Date: Sat, 5 Jan 2019 19:58:17 +0000 Subject: [PATCH] Importer scripts for old asset DB --- management/commands/import_old_db.py | 229 ++++++++++++++++++++++ management/commands/update_old_db_file.py | 112 +++++++++++ 2 files changed, 341 insertions(+) create mode 100644 management/commands/import_old_db.py create mode 100644 management/commands/update_old_db_file.py diff --git a/management/commands/import_old_db.py b/management/commands/import_old_db.py new file mode 100644 index 00000000..4e2ef08a --- /dev/null +++ b/management/commands/import_old_db.py @@ -0,0 +1,229 @@ +import os +from django.core.management.base import BaseCommand, CommandError +from django.conf import settings +import datetime +import xml.etree.ElementTree as ET + +from assets import models + + +class Command(BaseCommand): + help = 'Imports old db from XML dump' + + epoch = datetime.date(1970, 1, 1) + + def handle(self, *args, **options): + self.import_categories() + self.import_statuses() + self.import_suppliers() + self.import_collections() + self.import_assets() + self.import_cables() + + @staticmethod + def xml_path(file): + return os.path.join(settings.BASE_DIR, 'data/DB_Dump/{}'.format(file)) + + @staticmethod + def parse_xml(file): + tree = ET.parse(file) + + return tree.getroot() + + def import_categories(self): + # 0: updated, 1: created + tally = [0, 0] + root = self.parse_xml(self.xml_path('TEC_Asset_Categories.xml')) + + for child in root: + obj, created = models.AssetCategory.objects.update_or_create( + pk=int(child.find('AssetCategoryID').text), + name=child.find('AssetCategory').text + ) + + if created: + tally[1] += 1 + else: + tally[0] += 1 + + print('Categories - Updated: {}, Created: {}'.format(tally[0], tally[1])) + + def import_statuses(self): + # 0: updated, 1: created + tally = [0, 0] + root = self.parse_xml(self.xml_path('TEC_Asset_Status_new.xml')) + + for child in root: + obj, created = models.AssetStatus.objects.update_or_create( + pk=int(child.find('StatusID').text), + name=child.find('Status').text + ) + + if created: + tally[1] += 1 + else: + tally[0] += 1 + + print('Statuses - Updated: {}, Created: {}'.format(tally[0], tally[1])) + + def import_suppliers(self): + # 0: updated, 1: created + tally = [0, 0] + root = self.parse_xml(self.xml_path('TEC_Asset_Suppliers_new.xml')) + + for child in root: + obj, created = models.Supplier.objects.update_or_create( + pk=int(child.find('Supplier_x0020_Id').text), + name=child.find('Supplier_x0020_Name').text + ) + + if created: + tally[1] += 1 + else: + tally[0] += 1 + + print('Suppliers - Updated: {}, Created: {}'.format(tally[0], tally[1])) + + def import_assets(self): + # 0: updated, 1: created + tally = [0, 0] + root = self.parse_xml(self.xml_path('TEC_Assets.xml')) + + for child in root: + defaults = dict() + + # defaults['pk'] = int(child.find('ID').text) + defaults['asset_id'] = child.find('AssetID').text + + try: + defaults['description'] = child.find('AssetDescription').text + except AttributeError: + defaults['description'] = 'None' + + defaults['category'] = models.AssetCategory.objects.get(pk=int(child.find('AssetCategoryID').text)) + defaults['status'] = models.AssetStatus.objects.get(pk=int(child.find('StatusID').text)) + + try: + defaults['serial_number'] = child.find('SerialNumber').text + except AttributeError: + pass + + try: + defaults['purchased_from'] = models.Supplier.objects.get(pk=int(child.find('Supplier_x0020_Id').text)) + except AttributeError: + pass + + try: + defaults['date_acquired'] = datetime.datetime.strptime(child.find('DateAcquired').text, '%d/%m/%Y').date() + except AttributeError: + defaults['date_acquired'] = self.epoch + + try: + defaults['date_sold'] = datetime.datetime.strptime(child.find('DateSold').text, '%d/%m/%Y').date() + except AttributeError: + pass + + try: + defaults['purchase_price'] = float(child.find('Replacement_x0020_Value').text) + except AttributeError: + pass + + try: + defaults['salvage_value'] = float(child.find('SalvageValue').text) + except AttributeError: + pass + + try: + defaults['comments'] = child.find('Comments').text + except AttributeError: + pass + + try: + date = child.find('NextSchedMaint').text.split('T')[0] + defaults['next_sched_maint'] = datetime.datetime.strptime(date, '%Y-%m-%d').date() + except AttributeError: + pass + + print(defaults) + + obj, created = models.Asset.objects.update_or_create(**defaults) + + if created: + tally[1] += 1 + else: + tally[0] += 1 + + print('Assets - Updated: {}, Created: {}'.format(tally[0], tally[1])) + + def import_collections(self): + tally = [0, 0] + root = self.parse_xml(self.xml_path('TEC_Cable_Collections.xml')) + + for child in root: + defaults = dict() + + defaults['pk'] = int(child.find('ID').text) + defaults['name'] = child.find('Cable_x0020_Trunk').text + + obj, created = models.Collection.objects.update_or_create(**defaults) + + if created: + tally[1] += 1 + else: + tally[0] += 1 + + print('Collections - Updated: {}, Created: {}'.format(tally[0], tally[1])) + + def import_cables(self): + tally = [0, 0] + root = self.parse_xml(self.xml_path('TEC_Cables.xml')) + + for child in root: + defaults = dict() + + defaults['asset_id'] = child.find('Asset_x0020_Number').text + + try: + defaults['description'] = child.find('Type_x0020_of_x0020_Cable').text + except AttributeError: + defaults['description'] = 'None' + + defaults['is_cable'] = True + defaults['category'] = models.AssetCategory.objects.get(pk=9) + + try: + defaults['length'] = child.find('Length_x0020__x0028_m_x0029_').text + except AttributeError: + pass + + defaults['status'] = models.AssetStatus.objects.get(pk=int(child.find('Status').text)) + + try: + defaults['comments'] = child.find('Comments').text + except AttributeError: + pass + + try: + collection_id = int(child.find('Collection').text) + if collection_id != 0: + defaults['collection'] = models.Collection.objects.get(pk=collection_id) + except AttributeError: + pass + + try: + defaults['purchase_price'] = float(child.find('Purchase_x0020_Price').text) + except AttributeError: + pass + + defaults['date_acquired'] = self.epoch + + print(defaults) + + obj, created = models.Asset.objects.update_or_create(**defaults) + + if created: + tally[1] += 1 + else: + tally[0] += 1 + + print('Collections - Updated: {}, Created: {}'.format(tally[0], tally[1])) diff --git a/management/commands/update_old_db_file.py b/management/commands/update_old_db_file.py new file mode 100644 index 00000000..f49593e1 --- /dev/null +++ b/management/commands/update_old_db_file.py @@ -0,0 +1,112 @@ +import os +from django.core.management.base import BaseCommand, CommandError +from django.conf import settings +import datetime +import xml.etree.ElementTree as ET + +from assets import models + + +class Command(BaseCommand): + help = 'Imports old db from XML dump' + + epoch = datetime.date(1970, 1, 1) + + def handle(self, *args, **options): + # self.update_statuses() + # self.update_suppliers() + self.update_cable_statuses() + + @staticmethod + def xml_path(file): + return os.path.join(settings.BASE_DIR, 'data/DB_Dump/{}'.format(file)) + + @staticmethod + def parse_xml(file): + tree = ET.parse(file) + + return tree.getroot() + + def update_statuses(self): + file = self.xml_path('TEC_Assets.xml') + tree = ET.parse(file) + root = tree.getroot() + + # map old status pk to new status pk + status_map = { + 2: 2, + 3: 4, + 4: 3, + 5: 5, + 6: 1 + } + + for child in root: + status = int(child.find('StatusID').text) + child.find('StatusID').text = str(status_map[status]) + + tree.write(file) + + def update_suppliers(self): + old_file = self.xml_path('TEC_Asset_Suppliers.xml') + old_tree = ET.parse(old_file) + old_root = old_tree.getroot() + + new_file = self.xml_path('TEC_Asset_Suppliers_new.xml') + new_tree = ET.parse(new_file) + new_root = new_tree.getroot() + + # map old supplier pk to new supplier pk + supplier_map = dict() + + def find_in_old(name, root): + for child in root: + found_id = child.find('Supplier_x0020_Id').text + found_name = child.find('Supplier_x0020_Name').text + + if found_name == name: + return found_id + + for new_child in new_root: + new_id = new_child.find('Supplier_x0020_Id').text + new_name = new_child.find('Supplier_x0020_Name').text + + old_id = find_in_old(new_name, old_root) + + supplier_map[int(old_id)] = int(new_id) + + file = self.xml_path('TEC_Assets.xml') + tree = ET.parse(file) + root = tree.getroot() + + for child in root: + try: + supplier = int(child.find('Supplier_x0020_Id').text) + child.find('Supplier_x0020_Id').text = str(supplier_map[supplier]) + except AttributeError: + pass + + tree.write(file) + + def update_cable_statuses(self): + file = self.xml_path('TEC_Cables.xml') + tree = ET.parse(file) + root = tree.getroot() + + # map old status pk to new status pk + status_map = { + 0: 7, + 1: 3, + 3: 2, + 4: 5, + 6: 6, + 7: 1, + 8: 4, + 9: 2, + } + + for child in root: + status = int(child.find('Status').text) + child.find('Status').text = str(status_map[status]) + + tree.write(file)