def _process_mods_element(self, base_element, location_sections, data_vals): #handle various MODS elements if base_element['element'] == u'mods:mods': if 'ID' in base_element['attributes']: self._xml_obj.id = data_vals[0][0] elif base_element['element'] == u'mods:name': if not self._cleared_fields.get(u'names', None): self._xml_obj.names = [] self._cleared_fields[u'names'] = True self._add_name_data(base_element, location_sections, data_vals) elif base_element['element'] == u'mods:namePart': #grab the last name that was added name = self._xml_obj.names[-1] np = mods.NamePart(text=data_vals[0][0]) if u'type' in base_element[u'attributes']: np.type = base_element[u'attributes'][u'type'] name.name_parts.append(np) elif base_element[u'element'] == u'mods:titleInfo': if not self._cleared_fields.get(u'title_info_list', None): self._xml_obj.title_info_list = [] self._cleared_fields[u'title_info_list'] = True self._add_title_data(base_element, location_sections, data_vals) elif base_element[u'element'] == u'mods:language': if not self._cleared_fields.get(u'languages', None): self._xml_obj.languages = [] self._cleared_fields[u'languages'] = True for data in data_vals: language = mods.Language() language_term = mods.LanguageTerm(text=data[0]) if u'authority' in location_sections[0][0]['attributes']: language_term.authority = location_sections[0][0][ 'attributes']['authority'] if u'type' in location_sections[0][0]['attributes']: language_term.type = location_sections[0][0][ u'attributes'][u'type'] language.terms.append(language_term) self._xml_obj.languages.append(language) elif base_element[u'element'] == u'mods:genre': if not self._cleared_fields.get(u'genres', None): self._xml_obj.genres = [] self._cleared_fields[u'genres'] = True for data in data_vals: genre = mods.Genre(text=data[0]) if 'authority' in base_element['attributes']: genre.authority = base_element['attributes']['authority'] self._xml_obj.genres.append(genre) elif base_element['element'] == 'mods:originInfo': if not self._cleared_fields.get(u'origin_info', None): self._xml_obj.origin_info = None self._cleared_fields[u'origin_info'] = True self._xml_obj.create_origin_info() self._add_origin_info_data(base_element, location_sections, data_vals) elif base_element['element'] == 'mods:physicalDescription': if not self._cleared_fields.get(u'physical_description', None): self._xml_obj.physical_description = None self._cleared_fields[u'physical_description'] = True #can only have one physical description currently self._xml_obj.create_physical_description() data_divs = data_vals[0] for index, section in enumerate(location_sections): if section[0][u'element'] == 'mods:extent': self._xml_obj.physical_description.extent = data_divs[ index] elif section[0][u'element'] == 'mods:digitalOrigin': try: self._xml_obj.physical_description.digital_origin = data_divs[ index] except: self._xml_obj.physical_description.digital_origin = section[ 0][u'data'] elif section[0][u'element'] == 'mods:note': self._xml_obj.physical_description.note = data_divs[index] elif base_element['element'] == 'mods:typeOfResource': if not self._cleared_fields.get(u'typeOfResource', None): self._xml_obj.resource_type = None self._cleared_fields[u'typeOfResource'] = True self._xml_obj.resource_type = data_vals[0][0] elif base_element['element'] == 'mods:targetAudience': if not self._cleared_fields.get(u'targetAudience', None): self._xml_obj.resource_type = None self._cleared_fields[u'targetAudience'] = True ta = mods.TargetAudience(text=data_vals[0][0]) self._xml_obj.target_audiences.append(ta) elif base_element['element'] == 'mods:abstract': if not self._cleared_fields.get(u'abstract', None): self._xml_obj.abstract = None self._cleared_fields[u'abstract'] = True #can only have one abstract currently self._xml_obj.create_abstract() self._xml_obj.abstract.text = data_vals[0][0] elif base_element['element'] == 'mods:note': if not self._cleared_fields.get(u'notes', None): self._xml_obj.notes = [] self._cleared_fields[u'notes'] = True for data in data_vals: note = mods.Note(text=data[0]) if 'type' in base_element['attributes']: note.type = base_element['attributes']['type'] if 'displayLabel' in base_element['attributes']: note.label = base_element['attributes']['displayLabel'] self._xml_obj.notes.append(note) elif base_element['element'] == 'mods:subject': if not self._cleared_fields.get(u'subjects', None): self._xml_obj.subjects = [] self._cleared_fields[u'subjects'] = True for data in data_vals: subject = mods.Subject() if 'authority' in base_element['attributes']: subject.authority = base_element['attributes']['authority'] data_divs = data for section, div in zip(location_sections, data_divs): if section[0]['element'] == 'mods:topic': topic = mods.Topic(text=div) subject.topic_list.append(topic) elif section[0]['element'] == 'mods:temporal': temporal = mods.Temporal(text=div) subject.temporal_list.append(temporal) elif section[0]['element'] == 'mods:geographic': subject.geographic = div elif section[0][ 'element'] == 'mods:hierarchicalGeographic': hg = mods.HierarchicalGeographic() if section[1]['element'] == 'mods:country': if 'data' in section[1]: hg.country = section[1]['data'] if section[2]['element'] == 'mods:state': hg.state = div else: hg.country = div subject.hierarchical_geographic = hg self._xml_obj.subjects.append(subject) elif base_element['element'] == 'mods:identifier': if not self._cleared_fields.get(u'identifiers', None): self._xml_obj.identifiers = [] self._cleared_fields[u'identifiers'] = True for data in data_vals: identifier = mods.Identifier(text=data[0]) if 'type' in base_element['attributes']: identifier.type = base_element['attributes']['type'] if 'displayLabel' in base_element['attributes']: identifier.label = base_element['attributes'][ 'displayLabel'] self._xml_obj.identifiers.append(identifier) elif base_element['element'] == u'mods:location': if not self._cleared_fields.get(u'locations', None): self._xml_obj.locations = [] self._cleared_fields[u'locations'] = True for data in data_vals: loc = mods.Location() data_divs = data for section, div in zip(location_sections, data_divs): if section[0]['element'] == u'mods:url': if section[0]['data']: loc.url = section[0]['data'] else: loc.url = div elif section[0]['element'] == u'mods:physicalLocation': if section[0]['data']: loc.physical = mods.PhysicalLocation( text=section[0]['data']) else: loc.physical = mods.PhysicalLocation(text=div) elif section[0]['element'] == u'mods:holdingSimple': hs = mods.HoldingSimple() if section[1]['element'] == u'mods:copyInformation': if section[2]['element'] == u'mods:note': note = mods.Note(text=div) ci = mods.CopyInformation() ci.notes.append(note) hs.copy_information.append(ci) loc.holding_simple = hs self._xml_obj.locations.append(loc) elif base_element['element'] == u'mods:relatedItem': if not self._cleared_fields.get(u'related', None): self._xml_obj.related_items = [] self._cleared_fields[u'related'] = True for data in data_vals: related_item = mods.RelatedItem() if u'type' in base_element[u'attributes']: related_item.type = base_element[u'attributes'][u'type'] if u'displayLabel' in base_element[u'attributes']: related_item.label = base_element[u'attributes'][ u'displayLabel'] if location_sections[0][0][u'element'] == u'mods:titleInfo': if location_sections[0][1][u'element'] == u'mods:title': related_item.title = data[0] self._xml_obj.related_items.append(related_item) else: raise RuntimeError('unhandled MODS element: %s' % base_element)
def get_mods_obj(self, update=False): if self._mods_obj: #if we have mods already, and we're not updating, just return it if not update: return self._mods_obj else: #no self._mods_obj if update: raise Exception('no mods obj - can\'t update') self._mods_obj = mods.make_mods() #at this point, we want to put the form data into the mods obj (could be update or new) self._mods_obj.title_info_list = [] #clear out any old titles title = mods.TitleInfo() title.title = self._form_data['title'] if self._form_data['title_language']: title.node.set('lang', self._form_data['title_language']) self._mods_obj.title_info_list.append(title) if self._form_data['english_title']: english_title = mods.TitleInfo() english_title.title = self._form_data['english_title'] english_title.node.set('lang', 'en') self._mods_obj.title_info_list.append(english_title) if self._form_data['genre']: self._mods_obj.genres = [] #clear out any old genres genre = mods.Genre(text=self._form_data['genre'].text) genre.authority = 'aat' self._mods_obj.genres.append(genre) if self._form_data['abstract']: if not self._mods_obj.abstract: self._mods_obj.create_abstract() self._mods_obj.abstract.text = self._form_data[ 'abstract'] #overwrites old abstract if present if self._form_data['impression_date']: #clear out old dateOther data, or create originInfo if needed if self._mods_obj.origin_info: self._mods_obj.origin_info.other = [] else: self._mods_obj.create_origin_info() date_other = mods.DateOther( date=self._form_data['impression_date']) date_other.type = 'impression' self._mods_obj.origin_info.other.append(date_other) #clear out any old names: # if this is a new object, there aren't any names anyway. # if this is an update, either the new names will be put in, or they don't want any names. self._mods_obj.names = [] for p in self._person_formset_data: name = mods.Name() np = mods.NamePart(text=p['person'].name) name.name_parts.append(np) role = mods.Role(text=p['role'].text) name.roles.append(role) href = '{%s}href' % app_settings.XLINK_NAMESPACE name.node.set(href, p['person'].trp_id) self._mods_obj.names.append(name) #clear out old notes data, preserving any annotor info self._mods_obj.notes = [ note for note in self._mods_obj.notes if note.type == 'resp' ] for i in self._inscription_formset_data: note = mods.Note(text=i['text']) note.type = 'inscription' note.label = i['location'] self._mods_obj.notes.append(note) annotator_note = mods.Note(text=self._annotator) annotator_note.type = 'resp' self._mods_obj.notes.append(annotator_note) return self._mods_obj
def _get_notes(self): candidate = self.thesis.candidate note_text = 'Thesis (%s)--Brown University, %s' % (candidate.degree.abbreviation, candidate.year) return [mods.Note(type='thesis', text=note_text)]