def update_instance(self): # override default update to handle extra fields (collection & dates) # NOTE: collection membership can only be set when a CollectionObject # was passed in as form instance super(CollectionForm, self).update_instance() # cleaned data only available when the form is valid, # but xmlobjectform is_valid calls update_instance if hasattr(self, 'cleaned_data'): # set date created - could be a single date or a date range # remove existing dates and re-add self.instance.create_origin_info() for i in range(len(self.instance.origin_info.created)): self.instance.origin_info.created.pop() self.instance.origin_info.created.append(mods.DateCreated( date=self.cleaned_data['date_created'], key_date=True, )) # if there is a date end, store it and set end & start attributes if 'date_end' in self.cleaned_data and self.cleaned_data['date_end']: self.instance.create_origin_info() self.instance.origin_info.created.append(mods.DateCreated( date=self.cleaned_data['date_end'], point='end', )) self.instance.origin_info.created[0].point = 'start' # set relation to archive object when an instance was passed in if hasattr(self, 'object_instance'): self.object_instance.collection = self.object_instance.get_object(self.cleaned_data['collection']) # must return mods portion because XmlObjectForm depends on it for validation return self.instance
def englishdocs_collection(): repo = Repository() obj = repo.get_object(type=CollectionObject) obj.label = 'English documents collection' obj.mods.content.title = 'English documents collection' obj.mods.content.source_id = '309' obj.collection = repo.get_object(FedoraFixtures.archives()[1].uri) obj.mods.content.create_origin_info() obj.mods.content.origin_info.created.append( mods.DateCreated(date=1509, point='start')) obj.mods.content.origin_info.created.append( mods.DateCreated(date=1805, point='end')) return obj
def esterbrook_collection(): repo = Repository() obj = repo.get_object(type=CollectionObject) obj.label = 'Thomas Esterbrook letter books' obj.mods.content.title = 'Thomas Esterbrook letter books' obj.mods.content.source_id = '123' obj.collection = repo.get_object(FedoraFixtures.archives()[2].uri) obj.mods.content.create_origin_info() obj.mods.content.origin_info.created.append( mods.DateCreated(date=1855, point='start')) obj.mods.content.origin_info.created.append( mods.DateCreated(date=1861, point='end')) obj.mods.content.create_name() obj.mods.content.name.name_parts.append( mods.NamePart(text='Thomas Esterbrook')) return obj
def rushdie_collection(): repo = Repository() obj = repo.get_object(type=CollectionObject) obj.label = 'Salman Rushdie Collection' obj.mods.content.title = 'Salman Rushdie Collection' obj.mods.content.source_id = '1000' obj.collection = repo.get_object(FedoraFixtures.archives()[1].uri) obj.mods.content.create_origin_info() obj.mods.content.origin_info.created.append( mods.DateCreated(date=1947, point='start')) obj.mods.content.origin_info.created.append( mods.DateCreated(date=2008, point='end')) obj.mods.content.create_name() obj.mods.content.name.name_parts.append( mods.NamePart(text='Salman Rushdie')) return obj
def test_create_mods(self): # test creating MODS from scratch - ensure sub-xmlobject definitions are correct # and produce schema-valid MODS mymods = mods.MODS() mymods.create_title_info() # titleInfo subfields mymods.title_info.non_sort = 'A ' mymods.title_info.title = 'Record' mymods.title_info.subtitle = ': for testing' mymods.title_info.part_number = '1' mymods.title_info.part_name = 'first installment' mymods.title_info_list.append(mods.TitleInfo(non_sort='An ', title='Alternative Title', subtitle=': for testing', part_number = '1', part_name='first installment', label='First line')) mymods.resource_type = 'text' mymods.create_name() mymods.name.type = 'personal' mymods.name.authority = 'local' mymods.name.name_parts.extend([mods.NamePart(type='family', text='Schmoe'), mods.NamePart(type='given', text='Joe')]) mymods.name.roles.append(mods.Role(type='text', authority='local', text='Test Subject')) mymods.create_abstract() mymods.abstract.text = 'A testing record with made up content.' mymods.create_note() mymods.note.type = 'general' mymods.note.text = 'general note' mymods.create_origin_info() mymods.origin_info.created.append(mods.DateCreated(date='2001-10-02')) mymods.origin_info.issued.append(mods.DateIssued(date='2001-12-01')) mymods.create_record_info() mymods.record_info.record_id = 'id:1' mymods.identifiers.extend([mods.Identifier(type='uri', text='http://ur.l'), mods.Identifier(type='local', text='332')]) mymods.access_conditions.extend([mods.AccessCondition(type='restriction', text='unavailable'), mods.AccessCondition(type='use', text='Tuesdays only')]) mymods.related_items.extend([mods.RelatedItem(type='host', title='EU Archives'), mods.RelatedItem(type='isReferencedBy', title='Finding Aid')]) mymods.subjects.extend([mods.Subject(authority='keyword', topic='automated testing'), mods.Subject(authority='keyword', topic='test records')]) mymods.parts.append(mods.Part()) mymods.parts[0].details.extend([mods.PartDetail(type='volume', number='90'), mods.PartDetail(type='issue', number='2')]) mymods.parts[0].create_extent() mymods.parts[0].extent.unit = 'pages' mymods.parts[0].extent.start = '339' mymods.parts[0].extent.end = '361' xml = mymods.serialize(pretty=True) self.assert_(b'<mods:mods ' in xml) self.assert_(b'xmlns:mods="http://www.loc.gov/mods/v3"' in xml) self.assertTrue(mymods.is_valid(), "MODS created from scratch should be schema-valid")
def test_is_empty_date_values(self): self.origin_info.created.append(mods.DateCreated(date='300')) self.assertFalse(self.origin_info.is_empty()) self.origin_info.issued.append(mods.DateIssued(date='450')) self.assertFalse(self.origin_info.is_empty())
def test_is_empty_with_empty_dates(self): self.origin_info.created.append(mods.DateCreated()) self.assertTrue(self.origin_info.is_empty()) self.origin_info.issued.append(mods.DateIssued()) self.assertTrue(self.origin_info.is_empty())
def setUp(self): super(TestModsDate, self).setUp() self.date = mods.DateCreated()
def generate_collection(self): '''Generate a :class:`CollectionObject` with fields pre-populated based on the contents of the current Finding Aid object. ''' repo = Repository() coll = repo.get_object(type=CollectionObject) # TODO: archive membership? # title - using 'short' form without unitdate, stripping any trailing whitespace & . or , # TODO/FIXME: does NOT work for unittitles with nested tags, e.g. title - see pomerantz coll.mods.content.title = unicode(self.unittitle.short).rstrip().rstrip('.,') # main entry/name - origination, if any if self.archdesc.did.origination: name_text = unicode(self.archdesc.did.origination) # determine type of name colltype = self.archdesc.did.node.xpath('''local-name(e:origination/e:persname | e:origination/e:corpname | e:origination/e:famname)''', namespaces=self.ROOT_NAMESPACES) if colltype == 'persname': name_type = 'personal' elif colltype == 'famname': name_type = 'family' # family names consistently end with a period, which can be removed name_text = name_text.rstrip('.') elif colltype == 'corpname': name_type = 'corporate' if name_type is not None: coll.mods.content.create_name() coll.mods.content.name.type = name_type authority = self.archdesc.did.node.xpath('string(e:origination/*/@source)', namespaces=self.ROOT_NAMESPACES) # lcnaf in the EAD is equivalent to naf in MODS if authority == 'lcnaf': coll.mods.content.name.authority = 'naf' coll.mods.content.name.name_parts.append(mods.NamePart(text=name_text)) # date coverage if self.coverage: date_encoding = {'encoding': 'w3cdtf'} # date range coll.mods.content.create_origin_info() if '/' in self.coverage: start, end = self.coverage.split('/') coll.mods.content.origin_info.created.append(mods.DateCreated(date=start, point='start', key_date=True, **date_encoding)) coll.mods.content.origin_info.created.append(mods.DateCreated(date=end, point='end', **date_encoding)) # single date else: coll.mods.content.origin_info.created.append(mods.DateCreated(date=self.coverage, key_date=True, **date_encoding)) # source id - numeric form of the manuscript/archive collection number coll.mods.content.source_id = self.archdesc.did.unitid.identifier # access restriction if self.archdesc.access_restriction: coll.mods.content.create_restrictions_on_access() coll.mods.content.restrictions_on_access.text = "\n".join([ unicode(c) for c in self.archdesc.access_restriction.content]) # use & reproduction if self.archdesc.use_restriction: coll.mods.content.create_use_and_reproduction() coll.mods.content.use_and_reproduction.text = "\n".join([ unicode(c) for c in self.archdesc.use_restriction.content]) # set initial mods:typeOfResource - not specified in EAD, but all # collections shoud be mixed material coll.mods.content.resource_type = 'mixed material' # EAD url - where does this go? # accessible at self.eadid.url return coll