Skip to content

Instantly share code, notes, and snippets.

@greghaynes
Created April 2, 2020 20:45
Show Gist options
  • Save greghaynes/307719de2c32c9f6d09952222f2a47b9 to your computer and use it in GitHub Desktop.
Save greghaynes/307719de2c32c9f6d09952222f2a47b9 to your computer and use it in GitHub Desktop.
from collections import namedtuple
import dataclasses
# BEWARE this is not 3.7+ compatible. For python 3.7+ we need to use the built
# in dataclass module
@dataclasses.dataclass
class IssueData:
id: str
container_id: str
root_cause_id: str
title: str
description: str
issue_type_id: str
issue_subtype_id: str
staus: str
assigned_to: str
assigned_to_type: str
due_date: str
location_id: str
location_details: str
snapshot_urn: str
linked_documents: list
links: list
official_response: dict
permitted_attributes: list
permitted_actions: list
comment_count: int
attachment_count: int
opened_by: str
opened_at: str
closed_at: str
created_by: str
created_at: str
updated_by: str
updated_at: str
issue_template_id: str
pemitted_statuses: list
class IdenticalField:
def __init__(self, data_field, cis_pg_field):
self.data_field = data_field
self.cis_field = cis_pg_field
self.pg_field = cis_pg_field
def pg_data(self, issue_data: IssueData):
return issue_data[self.pg_field]
class RenamedField:
def __init__(self, data_field, pg_field, cis_field):
self.data_field = data_field
self.pg_field = pg_field
self.cis_field = cis_field
def pg_data(self, issue_data: IssueData):
return issue_data[self.data_field]
class AssignedToMapper:
def __init__(self, data_field):
self.data_field = data_field
self.pg_field = 'assigned_to'
def pg_data(self, issue_data: IssueData):
return {
'uid': issue_data['assigned_to'],
'type': issue_data['assigned_to_type']
}
class Issue:
_fields = (
RenamedField('id', 'uid', 'id'),
RenamedField('root_cause_id', 'root_cause_uid', 'root_cause_id'),
IdenticalField('title', 'title'),
IdenticalField('description', 'description'),
IdenticalField('status', 'status'),
AssignedToMapper('assigned_to')
)
def __init__(self, data: IssueData):
self.data = data
def to_cis_dict(self) -> dict:
return {
field.cis_field: self.data[field.data_field]
for field in Issue._fields
}
def to_pg_dict(self) -> dict:
return {
field.pg_field: field.pg_data(self.data)
for field in Issue._fields
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment