Skip to content

Commit

Permalink
Added the format_dict.py module that converts normal csv dicitonaries to
Browse files Browse the repository at this point in the history
Pynetbox friendly dictionaries
  • Loading branch information
khalford committed Oct 6, 2023
1 parent 62cb7fc commit 45673fa
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 6 deletions.
14 changes: 8 additions & 6 deletions Netbox_CSV_Read/CSV/csv_utils.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,21 @@
import pandas as pd
import pandas


class CsvUtils:
"""
This class provides methods to read data from CSV files and allow the data to be easily read and used elsewhere.
"""
@staticmethod
def csv_to_python(file_path: str) -> dict:
def __init__(self):
self.pd = pandas

def csv_to_python(self, file_path: str) -> dict:
"""
This method reads data from csv files and writes them to a dictionary.
:param file_path: The file path of the CSV file to be read from.
:return: Returns the data from the csv as a dictionary.
"""
with pd.read_csv(file_path) as dataframe:
dataframe = dataframe.to_dict(orient="list")
dataframe = self.pd.read_csv(file_path)
dataframe = dataframe.to_dict(orient="list")
return dataframe

@staticmethod
Expand All @@ -24,7 +26,7 @@ def separate_data(data: dict) -> list:
:return: Returns a list of dictionaries which each represent a row of data from CSV.
"""
data_keys = list(data.keys())
len_rows = len(data[data_keys[0]]) - 1
len_rows = len(data[data_keys[0]])
dicts = []
for index in range(len_rows):
new_dict = {}
Expand Down
69 changes: 69 additions & 0 deletions Netbox_CSV_Read/CSV/format_dict.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
from typing import Optional
from Enums.dcim_device_id import DeviceInfoID
from Enums.dcim_device_no_id import DeviceInfoNoID
from Netbox_Api.netbox_connect import NetboxConnect
from operator import attrgetter


class FormatDict(NetboxConnect):

def __init__(self, url: str, token: str, dicts: list, api: Optional = None):
"""
This method initialises the class with the following parameters.
Also, it allows dependency injection testing.
:param url: Netbox website URL.
:param token: Netbox authentication token.
:param dicts: A list of dictionaries to format.
"""
if not api:
self.netbox = NetboxConnect(url, token).api_object()
else:
self.netbox = api
self.dicts = dicts
self.enums_id = DeviceInfoID
self.enums_no_id = DeviceInfoNoID

def iterate_dicts(self) -> list:
"""
This method iterates through each dictionary and calls a format method on each.
:return: Returns the formatted dictionaries.
"""
new_dicts = []
for dictionary in self.dicts:
new_dicts.append(self.format_dict(dictionary))
return new_dicts

def format_dict(self, dictionary) -> dict:
"""
This method iterates through each value in the dictionary.
If the value needs to be converted into a Pynetbox ID it calls the .get() method.
:param dictionary: The dictionary to be formatted
:return: Returns the formatted dictionary
"""
for key in dictionary:
if key not in list(self.enums_no_id.__members__):
value = self.get_id(key, dictionary[key], dictionary["site"])
dictionary[key] = value
return dictionary

def get_id(self, attr_string: str, netbox_value: str, site_value: str) -> id:
"""
This method uses the Pynetbox Api .get() method to retrieve the ID of a string value from Netbox.
:param attr_string: The attribute string to get.
:param netbox_value: The value to search for in Netbox.
:param site_value: The value of the site key in the dictionary
:return: Returns the value/ID
"""
attr_string = attr_string.upper()
attr_to_look_for = getattr(self.enums_id, attr_string).value # Gets Enums value
value = attrgetter(attr_to_look_for)(self.netbox) # Gets netbox attr
if attr_string == "DEVICE_TYPE":
value = value.get(slug=netbox_value).id
elif attr_string == "LOCATION":
if type(site_value) == int:
site_name = self.netbox.dcim.sites.get(site_value).name
site_slug = site_name.replace(" ", "-").lower()
value = value.get(name=netbox_value, site=site_slug)
else:
value = value.get(name=netbox_value).id
return value
12 changes: 12 additions & 0 deletions Netbox_CSV_Read/Enums/dcim_device_id.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from enum import Enum


class DeviceInfoID(Enum):
DEVICE_ROLE = "dcim.device_roles"
DESCRIPTION = "dcim.devices"
DEVICE_TYPE = "dcim.device_types"
RACK = "dcim.racks"
LOCATION = "dcim.locations"
TENANT = "tenancy.tenants"
SITE = "dcim.sites"
MANUFACTURER = "dcim.manufacturers"
10 changes: 10 additions & 0 deletions Netbox_CSV_Read/Enums/dcim_device_no_id.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from enum import Enum


class DeviceInfoNoID(Enum):
position = "position"
name = "name"
serial = "serial"
airflow = "airflow"
status = "status"
face = "face"

0 comments on commit 45673fa

Please sign in to comment.