[PATCH 2 of 2 saem_ref V2] [hook] export EAC ARK on AuthorityRecordId

Philippe Pepiot philippe.pepiot at logilab.fr
Fri Feb 24 16:09:14 CET 2017


On 02/24/2017 03:51 PM, Sylvain Thénault wrote:
>
>
> Le 24/02/2017 à 15:37, Philippe Pepiot a écrit :
>> # HG changeset patch
>> # User Philippe Pepiot <philippe.pepiot at logilab.fr>
>> # Date 1487946737 -3600
>> #      Fri Feb 24 15:32:17 2017 +0100
>> # Node ID bfa49acea3f1b7271ec74f85d85c1d1cba253d66
>> # Parent  5b36edccfd6eab8e7cf78107a779335654ec4a91
>> # Available At https://hg.logilab.org/review/cubes/saem_ref
>> #              hg pull https://hg.logilab.org/review/cubes/saem_ref -r bfa49acea3f1
>> # Tested at: https://jenkins.logilab.org/job/cubicweb-saem_ref/101/
>> [hook] export EAC ARK on AuthorityRecordId
>>
>> Copy (eventually) created recordId to otherRecordId and set recordId to ARK
>> (thus export ARK in a <recordId /> field).
>>
>> Do this in hooks as well as in dataimport machinery which use MassiveStore and
>> doesn't trigger hooks.
>>
>> Closes extranet #12572781
>>
>> diff --git a/cubicweb_saem_ref/hooks.py b/cubicweb_saem_ref/hooks.py
>> --- a/cubicweb_saem_ref/hooks.py
>> +++ b/cubicweb_saem_ref/hooks.py
>> @@ -222,6 +222,20 @@ def extract_ark(url):
>>      return ark
>>
>>
>> +class AuthorityRecordIdHook(hook.Hook):
>> +    __regid__ = 'saem_ref.authority_record_id'
>> +    __select__ = hook.Hook.__select__ & is_instance('AuthorityRecord')
>> +    events = ('after_add_entity',)
>> +
>> +    def __call__(self):
>> +        entity = self.entity
>> +        if entity.record_id:
>> +            # move record_id to eac_other_record_id
>> +            self._cw.create_entity('EACOtherRecordId', value=entity.record_id,
>> +                                   eac_other_record_id_of=entity)
>> +        entity.cw_set(record_id=entity.ark)
>> +
>> +
>>  # Life-cycle logging ###########################################################
>>
>>  class Record(object):
>> diff --git a/cubicweb_saem_ref/sobjects/__init__.py b/cubicweb_saem_ref/sobjects/__init__.py
>> --- a/cubicweb_saem_ref/sobjects/__init__.py
>> +++ b/cubicweb_saem_ref/sobjects/__init__.py
>> @@ -19,6 +19,7 @@ from six.moves import map as imap
>>
>>  from cubicweb.predicates import match_user_groups, match_kwargs
>>  from cubicweb.server import Service
>> +from cubicweb.dataimport.importer import ExtEntity
>>  from cubicweb.dataimport.stores import MetadataGenerator
>>
>>  from cubicweb_eac import sobjects as eac
>> @@ -56,7 +57,8 @@ class SAEMMetadataGenerator(MetadataGene
>>      def entity_attrs(self, etype):
>>          entity_attrs = super(SAEMMetadataGenerator, self).entity_attrs(etype)
>>          if etype in ('ConceptScheme', 'Concept', 'AuthorityRecord', 'Agent'):
>> -            entity_attrs.insert(0, 'ark')  # insert before cwuri
>> +            # insert before cwuri
>> +            entity_attrs = ['ark', 'record_id'] + entity_attrs
>>          return entity_attrs
>
> on AuthorityRecords have record_id, not other

Indeed.

>>
>>      def gen_ark(self, etype, eid, attrs):
>> @@ -66,6 +68,9 @@ class SAEMMetadataGenerator(MetadataGene
>>          # implementation
>>          return attrs['ark']
>>
>> +    def gen_record_id(self, etype, eid, attrs):
>> +        return attrs['ark']
>> +
>>
> I wouldn't have botherered with the metadata generator, only the
> transform function below should be enough. Simpli add
> values['record_id'] = values['ark] there.


I cant since extentities doesn't have ark yet, it's added in 
MetadataGenerator.

>>  class EACImportService(eac.EACImportService):
>>      """Service to import an AuthorityRecord from an EAC XML file - overriden from the EAC cube to
>> @@ -99,7 +104,21 @@ class EACImportService(eac.EACImportServ
>>                  extentity.values['authority'] = set([self._authority.cwuri])
>>              return extentity
>>
>> -        return imap(set_authority_or_naa, extentities)
>> +        def move_record_id(extentities):
>> +            for extentity in extentities:
>> +                if (extentity.etype == 'AuthorityRecord'
>> +                        and 'record_id' in extentity.values):
>> +                    yield ExtEntity(etype='EACOtherRecordId',
>> +                                    extid='EACOtherRecordId-{0}'.format(extentity.extid),
>> +                                    values={
>> +                                        'value': extentity.values.pop('record_id'),
>> +                                        'eac_other_record_id_of': set([extentity.extid]),
>> +                                    })
>> +                yield extentity
>> +
>> +        extentities = imap(set_authority_or_naa, extentities)
>> +        extentities = move_record_id(extentities)
>> +        return extentities
>>
>>
>>  class AllocateArk(Service):
>> diff --git a/test/test_ccplugin.py b/test/test_ccplugin.py
>> --- a/test/test_ccplugin.py
>> +++ b/test/test_ccplugin.py
>> @@ -70,6 +70,9 @@ class ImportEacDataCommandTC(testlib.Cub
>>              record = cnx.find('AuthorityRecord').one()
>>              self.assertEqual(record.dc_title(), u"Centre d'information et d'orientation (CIO)")
>>              self.assertTrue(record.ark.startswith('0/r0'), record.ark)
>> +            self.assertEqual(record.record_id, record.ark)
>> +            self.assertEqual([r.value for r in record.reverse_eac_other_record_id_of],
>> +                             ['D33-100'])
>>
>>      def test_bad_authority(self):
>>          code, output = self.run_import_eac('--authority', 'unexisting')
>> diff --git a/test/test_eac.py b/test/test_eac.py
>> --- a/test/test_eac.py
>> +++ b/test/test_eac.py
>> @@ -33,6 +33,20 @@ class EACExportTC(CubicWebTC):
>>              self.assertIn('<agent>admin</agent>', eac_xml)
>>              self.assertIn('<agent>007</agent>', eac_xml)
>>
>> +    def test_record_id(self):
>> +        with self.admin_access.cnx() as cnx:
>> +            # ark should be copied to record_id
>> +            record = testutils.authority_record(cnx, u'test 1')
>> +            self.assertEqual(record.record_id, record.ark)
>> +
>> +            # If created with a record_id, copy it to eac_other_record_id and
>> +            # copy ark to record_id
>> +            record = testutils.authority_record(cnx, u'test 2',
>> +                                                record_id=u'Record ID')
>> +            self.assertEqual(
>> +                set([r.value for r in record.reverse_eac_other_record_id_of]),
>> +                set(['Record ID']))
>> +
>>
>>  if __name__ == '__main__':
>>      import unittest
>> diff --git a/test/unittest_dataimport.py b/test/unittest_dataimport.py
>> --- a/test/unittest_dataimport.py
>> +++ b/test/unittest_dataimport.py
>> @@ -31,7 +31,7 @@ class EACDataImportTC(CubicWebTC):
>>              cnx.user.cw_set(authority=testutils.authority_with_naa(cnx))
>>              cnx.commit()
>>
>> -    def test_imported_activities(self):
>> +    def test_import(self):
>>          fpath = self.datapath('EAC', 'FRAD033_EAC_dataimport.xml')
>>          with self.admin_access.repo_cnx() as cnx:
>>              import_log = SimpleImportLog(basename(fpath))
>> @@ -43,6 +43,11 @@ class EACDataImportTC(CubicWebTC):
>>              rset = cnx.execute('Any A WHERE A generated X, X eid %(x)s', {'x': record.eid})
>>              # Two activities imported from EAC-CPF file, one created by our hook.
>>              self.assertEqual(len(rset), 3)
>> +            # recordId should go in eac_other_record_id and ark should be
>> +            # copied to record_id instead.
>> +            self.assertEqual(record.record_id, record.ark)
>> +            self.assertEqual([r.value for r in record.reverse_eac_other_record_id_of],
>> +                             ['FRAD033_EAC_00001'])
>>
>>
>>  if __name__ == '__main__':
>>
>



More information about the saem-devel mailing list