def register_item_metadata(item): """Upload file content. :argument list_record -- {list} list item import. file_path -- {str} file path. """ item_id = str(item.get('id')) try: pid = PersistentIdentifier.query.filter_by( pid_type='recid', pid_value=item_id ).first() record = WekoDeposit.get_record(pid.object_uuid) _deposit_data = record.dumps().get("_deposit") deposit = WekoDeposit(record, record.model) new_data = dict( **item.get('metadata'), **_deposit_data, **{ '$schema': item.get('$schema'), 'title': handle_get_title(item.get('Title')), } ) item_status = { 'index': new_data['path'], 'actions': 'publish', } if not new_data.get('pid'): new_data = dict(**new_data, **{ 'pid': { 'revision_id': 0, 'type': 'recid', 'value': item_id } }) deposit.update(item_status, new_data) deposit.commit() deposit.publish() with current_app.test_request_context(): first_ver = deposit.newversion(pid) if first_ver: first_ver.publish() db.session.commit() except Exception as ex: db.session.rollback() current_app.logger.error('item id: %s update error.' % item_id) current_app.logger.error(ex) return { 'success': False, 'error': str(ex) } return { 'success': True }
def process_item(record, resync, counter): """Process item.""" event_counter('processed_items', counter) event = ItemEvents.INIT xml = etree.tostring(record, encoding='utf-8').decode() mapper = JPCOARMapper(xml) resyncid = PersistentIdentifier.query.filter_by( pid_type='syncid', pid_value=gen_resync_pid_value(resync, mapper.identifier())).first() if resyncid: r = RecordMetadata.query.filter_by(id=resyncid.object_uuid).first() recid = PersistentIdentifier.query.filter_by( pid_type='recid', object_uuid=resyncid.object_uuid).first() recid.status = PIDStatus.REGISTERED pubdate = dateutil.parser.parse( r.json['pubdate']['attribute_value']).date() dep = WekoDeposit(r.json, r) indexes = dep['path'].copy() event = ItemEvents.UPDATE elif mapper.is_deleted(): return else: dep = WekoDeposit.create({}) PersistentIdentifier.create(pid_type='syncid', pid_value=gen_resync_pid_value( resync, mapper.identifier()), status=PIDStatus.REGISTERED, object_type=dep.pid.object_type, object_uuid=dep.pid.object_uuid) indexes = [] event = ItemEvents.CREATE indexes.append(str(resync.index_id)) if str( resync.index_id) not in indexes else None if mapper.is_deleted(): soft_delete(recid.pid_value) event = ItemEvents.DELETE else: json = mapper.map() json['$schema'] = '/items/jsonschema/' + str(mapper.itemtype.id) dep['_deposit']['status'] = 'draft' dep.update({'actions': 'publish', 'index': indexes}, json) dep.commit() dep.publish() # add item versioning pid = PersistentIdentifier.query.filter_by( pid_type='recid', pid_value=dep.pid.pid_value).first() with current_app.test_request_context() as ctx: first_ver = dep.newversion(pid) first_ver.publish() db.session.commit() if event == ItemEvents.CREATE: event_counter('created_items', counter) elif event == ItemEvents.UPDATE: event_counter('updated_items', counter) elif event == ItemEvents.DELETE: event_counter('deleted_items', counter)
def process_item(record, harvesting, counter): """Process item.""" event_counter('processed_items', counter) event = ItemEvents.INIT xml = etree.tostring(record, encoding='utf-8').decode() if harvesting.metadata_prefix == 'oai_dc': mapper = DCMapper(xml) elif harvesting.metadata_prefix == 'jpcoar' or \ harvesting.metadata_prefix == 'jpcoar_1.0': mapper = JPCOARMapper(xml) elif harvesting.metadata_prefix == 'oai_ddi25' or \ harvesting.metadata_prefix == 'ddi': mapper = DDIMapper(xml) else: return hvstid = PersistentIdentifier.query.filter_by( pid_type='hvstid', pid_value=mapper.identifier()).first() if hvstid: r = RecordMetadata.query.filter_by(id=hvstid.object_uuid).first() recid = PersistentIdentifier.query.filter_by( pid_type='recid', object_uuid=hvstid.object_uuid).first() recid.status = PIDStatus.REGISTERED pubdate = dateutil.parser.parse( r.json['pubdate']['attribute_value']).date() dep = WekoDeposit(r.json, r) indexes = dep['path'].copy() event = ItemEvents.UPDATE elif mapper.is_deleted(): return else: dep = WekoDeposit.create({}) PersistentIdentifier.create(pid_type='hvstid', pid_value=mapper.identifier(), object_type=dep.pid.object_type, object_uuid=dep.pid.object_uuid) indexes = [] event = ItemEvents.CREATE if int(harvesting.auto_distribution): for i in map_indexes(mapper.specs(), harvesting.index_id): indexes.append(str(i)) if i not in indexes else None else: indexes.append(str(harvesting.index_id)) if str( harvesting.index_id) not in indexes else None if hvstid and pubdate >= mapper.datestamp() and \ indexes == dep['path'] and harvesting.update_style == '1': return if mapper.is_deleted(): soft_delete(recid.pid_value) event = ItemEvents.DELETE else: json = mapper.map() json['$schema'] = '/items/jsonschema/' + str(mapper.itemtype.id) dep['_deposit']['status'] = 'draft' dep.update({'actions': 'publish', 'index': indexes}, json) dep.commit() dep.publish() # add item versioning pid = PersistentIdentifier.query.filter_by( pid_type='recid', pid_value=dep.pid.pid_value).first() idt_list = mapper.identifiers from weko_workflow.utils import IdentifierHandle idt = IdentifierHandle(pid.object_uuid) for it in idt_list: if not it.get('type'): continue pid_type = it['type'].lower() pid_obj = idt.get_pidstore(pid_type) if not pid_obj: idt.register_pidstore(pid_type, it['identifier']) with current_app.test_request_context() as ctx: first_ver = dep.newversion(pid) first_ver.publish() harvesting.item_processed = harvesting.item_processed + 1 db.session.commit() if event == ItemEvents.CREATE: event_counter('created_items', counter) elif event == ItemEvents.UPDATE: event_counter('updated_items', counter) elif event == ItemEvents.DELETE: event_counter('deleted_items', counter)