MODIFIERS = ( ("A", "Not Applicable"), ("B", "Continuous"), ("C", "Intermittent"), ("D", "Fails After Warm Up"), ("E", "Environmental"), ("F", "Configuration: Peripheral"), ("G", "Damaged"), ) GROUPS = ( ('0', 'General'), ('1', 'Visual'), ('2', 'Displays'), ('3', 'Mass Storage'), ('4', 'Input Devices'), ('5', 'Boards'), ('6', 'Power'), ('7', 'Printer'), ('8', 'Multi-function Device'), ('9', 'Communication Devices'), ('A', 'Share'), ('B', 'iPhone'), ('E', 'iPod'), ('F', 'iPad'), ) class CompTIA(object): "Stores and accesses CompTIA codes." def __init__(self): """ Initialize CompTIA symptoms from JSON file """ df = open(os.path.join(os.path.dirname(__file__), 'comptia.json')) self.data = json.load(df) def fetch(self): """ The CompTIA Codes Lookup API retrieves a list of CompTIA groups and modifiers. Here we must resort to raw XML parsing since SUDS throws this: suds.TypeNotFound: Type not found: 'comptiaDescription' when calling CompTIACodes()... >>> CompTIA().fetch() {'A': {'972': 'iPod not recognized',... """ global COMPTIA_CACHE if COMPTIA_CACHE.get("comptia"): return COMPTIA_CACHE.get("comptia") CLIENT.set_options(retxml=True) dt = CLIENT.factory.create("ns3:comptiaCodeLookupRequestType") dt.userSession = SESSION try: xml = CLIENT.service.CompTIACodes(dt) except suds.WebFault, e: raise GsxError(fault=e) root = ET.fromstring(xml).findall('.//%s' % 'comptiaInfo')[0] for el in root.findall(".//comptiaGroup"): group = {} comp_id = el[0].text for ci in el.findall('comptiaCodeInfo'): group[ci[0].text] = ci[1].text self.data[comp_id] = group COMPTIA_CACHE.put("comptia", self.data) return self.data def symptoms(self, component=None): """ Returns all known CompTIA symptom codes or just the ones belonging to the given component code. """ r = dict() for g, codes in self.data.items(): r[g] = list() for k, v in codes.items(): r[g].append((k, v,)) return r[component] if component else r