def cli_revert_to_revision(revid): """Submit specified record revision REVID upload, to replace current version. """ if not revision_format_valid_p(revid): print('ERROR: revision %s is invalid; ' \ 'must be NNN.YYYYMMDDhhmmss.' % revid) sys.exit(1) xml_record = get_marcxml_of_revision_id(revid) if xml_record == '': print('ERROR: Revision %s does not exist. ' % revid) sys.exit(1) recid = split_revid(revid)[0] if record_locked_by_other_user(recid, -1): print('The record is currently being edited. ' \ 'Please try again in a few minutes.') sys.exit(1) if record_locked_by_queue(recid): print('The record is locked because of unfinished upload tasks. ' \ 'Please try again in a few minutes.') sys.exit(1) save_xml_record(recid, 0, xml_record) print('Your modifications have now been submitted. They will be ' \ 'processed as soon as the task queue is empty.')
def _get_record_slave(recid, result, mode=None, uid=None): """Check if record exists and return it in dictionary format. If any kind of error occurs returns None. If mode=='revision' then recid parameter is considered as revid.""" record = None if recid == 'none': mode = 'none' if mode == 'recid': record_status = record_exists(recid) #check for errors if record_status == 0: result['resultCode'], result[ 'resultText'] = 1, 'Non-existent record: %s' % recid elif record_status == -1: result['resultCode'], result[ 'resultText'] = 1, 'Deleted record: %s' % recid elif record_locked_by_queue(recid): result['resultCode'], result[ 'resultText'] = 1, 'Record %s locked by queue' % recid else: record = create_record(print_record(recid, 'xm'))[0] elif mode == 'tmpfile': file_path = '%s_%s.xml' % (_get_file_path( recid, uid), cfg['CFG_BIBEDIT_TO_MERGE_SUFFIX']) if not os.path.isfile(file_path): #check if file doesn't exist result['resultCode'], result[ 'resultText'] = 1, 'Temporary file doesnt exist' else: #open file tmpfile = open(file_path, 'r') record = create_record(tmpfile.read())[0] tmpfile.close() elif mode == 'revision': if revision_format_valid_p(recid): marcxml = get_marcxml_of_revision_id(recid) if marcxml: record = create_record(marcxml)[0] else: result['resultCode'], result[ 'resultText'] = 1, 'The specified revision does not exist' else: result['resultCode'], result[ 'resultText'] = 1, 'Invalid revision id' elif mode == 'none': return {} else: result['resultCode'], result[ 'resultText'] = 1, 'Invalid record mode for record2' record_order_subfields(record) return record
def _get_record_slave(recid, result, mode=None, uid=None): """Check if record exists and return it in dictionary format. If any kind of error occurs returns None. If mode=='revision' then recid parameter is considered as revid.""" record = None if recid == 'none': mode = 'none' if mode == 'recid': record_status = record_exists(recid) #check for errors if record_status == 0: result['resultCode'], result['resultText'] = 1, 'Non-existent record: %s' % recid elif record_status == -1: result['resultCode'], result['resultText'] = 1, 'Deleted record: %s' % recid elif record_locked_by_queue(recid): result['resultCode'], result['resultText'] = 1, 'Record %s locked by queue' % recid else: record = create_record( print_record(recid, 'xm') )[0] record_order_subfields(record) elif mode == 'tmpfile': file_path = '%s_%s.xml' % (_get_file_path(recid, uid), CFG_BIBEDIT_TO_MERGE_SUFFIX) if not os.path.isfile(file_path): #check if file doesn't exist result['resultCode'], result['resultText'] = 1, 'Temporary file doesnt exist' else: #open file tmpfile = open(file_path, 'r') record = create_record( tmpfile.read() )[0] tmpfile.close() elif mode == 'revision': if revision_format_valid_p(recid): marcxml = get_marcxml_of_revision_id(recid) if marcxml: record = create_record(marcxml)[0] else: result['resultCode'], result['resultText'] = 1, 'The specified revision does not exist' else: result['resultCode'], result['resultText'] = 1, 'Invalid revision id' elif mode == 'none': return {} else: result['resultCode'], result['resultText'] = 1, 'Invalid record mode for record2' return record
def _get_record(recid, uid, result, fresh_record=False): """Retrieve record structure. """ record = None mtime = None cache_dirty = None record_status = record_exists(recid) existing_cache = cache_exists(recid, uid) if record_status == 0: result['resultCode'], result[ 'resultText'] = 1, 'Non-existent record: %s' % recid elif record_status == -1: result['resultCode'], result[ 'resultText'] = 1, 'Deleted record: %s' % recid elif not existing_cache and record_locked_by_other_user(recid, uid): result['resultCode'], result[ 'resultText'] = 1, 'Record %s locked by user' % recid elif existing_cache and cache_expired(recid, uid) and \ record_locked_by_other_user(recid, uid): result['resultCode'], result[ 'resultText'] = 1, 'Record %s locked by user' % recid elif record_locked_by_queue(recid): result['resultCode'], result[ 'resultText'] = 1, 'Record %s locked by queue' % recid else: if fresh_record: delete_cache(recid, uid) existing_cache = False if not existing_cache: record_revision, record = create_cache(recid, uid) mtime = get_cache_mtime(recid, uid) cache_dirty = False else: tmpRes = get_cache_contents(recid, uid) cache_dirty, record_revision, record = tmpRes[0], tmpRes[ 1], tmpRes[2] touch_cache(recid, uid) mtime = get_cache_mtime(recid, uid) if not latest_record_revision(recid, record_revision): result['cacheOutdated'] = True result['resultCode'], result['resultText'], result[ 'cacheDirty'], result[ 'cacheMTime'] = 0, 'Record OK', cache_dirty, mtime record_order_subfields(record) return record
def _get_record(recid, uid, result, fresh_record=False): """Retrieve record structure. """ record = None mtime = None cache_dirty = None record_status = record_exists(recid) existing_cache = cache_exists(recid, uid) if record_status == 0: result['resultCode'], result['resultText'] = 1, 'Non-existent record: %s' % recid elif record_status == -1: result['resultCode'], result['resultText'] = 1, 'Deleted record: %s' % recid elif not existing_cache and record_locked_by_other_user(recid, uid): result['resultCode'], result['resultText'] = 1, 'Record %s locked by user' % recid elif existing_cache and cache_expired(recid, uid) and \ record_locked_by_other_user(recid, uid): result['resultCode'], result['resultText'] = 1, 'Record %s locked by user' % recid elif record_locked_by_queue(recid): result['resultCode'], result['resultText'] = 1, 'Record %s locked by queue' % recid else: if fresh_record: delete_cache(recid, uid) existing_cache = False if not existing_cache: record_revision, record = create_cache(recid, uid) mtime = get_cache_mtime(recid, uid) cache_dirty = False else: tmpRes = get_cache_contents(recid, uid) cache_dirty, record_revision, record = tmpRes[0], tmpRes[1], tmpRes[2] touch_cache(recid, uid) mtime = get_cache_mtime(recid, uid) if not latest_record_revision(recid, record_revision): result['cacheOutdated'] = True result['resultCode'], result['resultText'], result['cacheDirty'], result['cacheMTime'] = 0, 'Record OK', cache_dirty, mtime record_order_subfields(record) return record
def perform_request_test_search(search_criteria, update_commands, output_format, page_to_display, language, outputTags, collection="", compute_modifications=0, upload_mode='-c', checked_records=None): """Returns the results of a test search. @param search_criteria: search criteria used in the test search @type search_criteria: string @param update_commands: list of commands used to update record contents @type update_commands: list of objects @param output_format: specifies the output format as expected from bibformat @type output_format: string (hm, hb, hd, xm, xn, hx) @param page_to_display: the number of the page that should be displayed to the user @type page_to_display: int @param language: the language used to format the content @param outputTags: list of tags to be displayed in search results @type outputTags: list of strings @param collection: collection to be filtered in the results @type collection: string @param compute_modifications: if equals 0 do not compute else compute modifications @type compute_modifications: int """ RECORDS_PER_PAGE = 100 response = {} if collection == "Any collection": collection = "" record_IDs = search_engine.perform_request_search(p=search_criteria, c=collection) # initializing checked_records if not initialized yet or empty if checked_records is None or not checked_records: checked_records = record_IDs number_of_records = len(record_IDs) if page_to_display < 1: page_to_display = 1 last_page_number = number_of_records / RECORDS_PER_PAGE + 1 if page_to_display > last_page_number: page_to_display = last_page_number first_record_to_display = RECORDS_PER_PAGE * (page_to_display - 1) last_record_to_display = (RECORDS_PER_PAGE * page_to_display) - 1 if not compute_modifications: record_IDs = record_IDs[first_record_to_display:last_record_to_display + 1] # displayed_records is a list containing IDs of records that will be displayed on current page displayed_records = record_IDs[:RECORDS_PER_PAGE] records_content = [] record_modifications = 0 locked_records = [] for record_id in record_IDs: if upload_mode == '-r' and record_locked_by_queue(record_id): locked_records.append(record_id) current_modifications = [current_command._modifications for current_command in update_commands] formated_record = _get_formated_record(record_id=record_id, output_format=output_format, update_commands=update_commands, language=language, outputTags=outputTags, run_diff=record_id in displayed_records, checked=record_id in checked_records) new_modifications = [current_command._modifications for current_command in update_commands] if new_modifications > current_modifications: record_modifications += 1 records_content.append((record_id, formated_record)) total_modifications = [] if compute_modifications: field_modifications = 0 subfield_modifications = 0 for current_command in update_commands: field_modifications += current_command._modifications for subfield_command in current_command._subfield_commands: subfield_modifications += subfield_command._modifications if record_modifications: total_modifications.append(record_modifications) total_modifications.append(field_modifications) total_modifications.append(subfield_modifications) records_content = records_content[first_record_to_display:last_record_to_display + 1] response['display_info_box'] = compute_modifications or locked_records response['info_html'] = multiedit_templates.info_box(language=language, total_modifications=total_modifications) if locked_records: response['info_html'] += multiedit_templates.tmpl_locked_record_list(language=language, locked_records=locked_records) response['search_html'] = multiedit_templates.search_results(records=records_content, number_of_records=number_of_records, current_page=page_to_display, records_per_page=RECORDS_PER_PAGE, language=language, output_format=output_format, checked_records=checked_records) response['checked_records'] = checked_records return response