from lcsh.namespaces import SKOS, DCTERMS import simplejson # TODO: replace this with some generic rdflib Resource type of object class ConceptWidget: """ This is a class that makes it easy to hand off a SKOS concept to a template. """ def __init__(self, uri=None, graph=None, n=1): self.uri = uri self.doc_uri = uri.replace('#concept', '') self.created = None self.modifield = None self.lccn = uri.split('/')[-1].split('#')[0] self.pref_label = None self.lcc = None self.alt_labels = [] self.broader = [] self.narrower = [] self.related = [] self.editorial_notes = [] self.scope_notes = [] for p, o in graph.predicate_objects(subject=uri): if p == SKOS.prefLabel: self.pref_label = o elif p == SKOS.altLabel: self.alt_labels.append(o) elif p == SKOS.broader and n > 0: self.broader.append(ConceptWidget(o, graph, n-1)) elif p == SKOS.narrower and n > 0: self.narrower.append(ConceptWidget(o, graph, n-1)) elif p == SKOS.related and n > 0: self.related.append(ConceptWidget(o, graph, n-1)) elif p == SKOS.scopeNote: self.scope_notes.append(o) elif p == SKOS.editorialNote: self.editorial_notes.append(o) elif p == SKOS.changeNote: self.editorial_notes.append(o) elif p == DCTERMS.created: self.created = o elif p == DCTERMS.modified: self.modified = o elif p == DCTERMS.LCC: self.lcc = o def concept_sort(a,b): return cmp(a.pref_label, b.pref_label) self.alt_labels.sort() self.broader.sort(concept_sort) self.narrower.sort(concept_sort) self.related.sort(concept_sort) self.scope_notes.sort() self.editorial_notes.sort() def json(self): c = {} c['pref_label'] = self.pref_label c['alt_labels'] = self.alt_labels c['scope_notes'] = self.scope_notes c['editorial_notes'] = self.editorial_notes c['lccn'] = self.lccn c['created'] = self.created c['modified'] = self.modified c['lcc'] = self.lcc def unpack(c): return {'pref_label': c.pref_label, 'uri': c.uri} c['broader'] = map(unpack, self.broader) c['narrower'] = map(unpack, self.narrower) c['related'] = map(unpack, self.related) return simplejson.dumps(c, sort_keys=True, indent=2)