def get_xml_from_textmarc(recid, textmarc_record, uid=None): """ Convert textmarc to marcxml and return the result of the conversion @param recid: id of the record that is being converted @type: int @param textmarc_record: record content in textmarc format @type: string @return: dictionary with the following keys: * resultMsg: message describing conversion status * resultXML: xml resulting from conversion * parse_error: in case of error, a description of it @rtype: dict """ response = {} # Let's remove empty lines textmarc_record = os.linesep.join( [s for s in textmarc_record.splitlines() if s]) # Create temp file with textmarc to be converted by textmarc2xmlmarc (file_descriptor, file_name) = tempfile.mkstemp() f = os.fdopen(file_descriptor, "w") # If there is a cache file, add the controlfields if cache_exists(recid, uid): record = get_cache_contents(recid, uid)[2] for tag in record: if tag.startswith("00") and tag != "001": # It is a controlfield f.write( "%09d %s %s\n" % (recid, tag + "__", record_get_field_value(record, tag))) # Write content appending sysno at beginning for line in textmarc_record.splitlines(): f.write("%09d %s\n" % (recid, re.sub(r"\s+", " ", line.strip()))) f.close() old_stdout = sys.stdout try: # Redirect output, transform, restore old references new_stdout = StringIO() sys.stdout = new_stdout try: transform_file(file_name) response['resultMsg'] = 'textmarc_parsing_success' response['resultXML'] = new_stdout.getvalue() except ParseError, e: # Something went wrong, notify user response['resultXML'] = "" response['resultMsg'] = 'textmarc_parsing_error' response['parse_error'] = [ e.lineno, " ".join(e.linecontent.split()[1:]), e.message ] finally: sys.stdout = old_stdout return response
def get_xml_from_textmarc(recid, textmarc_record, uid=None): """ Convert textmarc to marcxml and return the result of the conversion @param recid: id of the record that is being converted @type: int @param textmarc_record: record content in textmarc format @type: string @return: dictionary with the following keys: * resultMsg: message describing conversion status * resultXML: xml resulting from conversion * parse_error: in case of error, a description of it @rtype: dict """ response = {} # Let's remove empty lines textmarc_record = os.linesep.join([s for s in textmarc_record.splitlines() if s]) # Create temp file with textmarc to be converted by textmarc2xmlmarc (file_descriptor, file_name) = tempfile.mkstemp() f = os.fdopen(file_descriptor, "w") # If there is a cache file, add the controlfields if cache_exists(recid, uid): record = get_cache_contents(recid, uid)[2] for tag in record: if tag.startswith("00") and tag != "001": # It is a controlfield f.write("%09d %s %s\n" % (recid, tag + "__", record_get_field_value(record, tag))) # Write content appending sysno at beginning for line in textmarc_record.splitlines(): f.write("%09d %s\n" % (recid, re.sub(r"\s+", " ", line.strip()))) f.close() old_stdout = sys.stdout try: # Redirect output, transform, restore old references new_stdout = StringIO() sys.stdout = new_stdout try: transform_file(file_name) response['resultMsg'] = 'textmarc_parsing_success' response['resultXML'] = new_stdout.getvalue() except ParseError, e: # Something went wrong, notify user response['resultXML'] = "" response['resultMsg'] = 'textmarc_parsing_error' response['parse_error'] = [e.lineno, " ".join(e.linecontent.split()[1:]), e.message] finally: sys.stdout = old_stdout return response
def user_can_edit_record_collection(req, recid): """ Check if user has authorization to modify a collection the recid belongs to """ def remove_volatile(field_value): """ Remove volatile keyword from field value """ if field_value.startswith(VOLATILE_PREFIX): field_value = field_value[len(VOLATILE_PREFIX):] return field_value # Get the collections the record belongs to record_collections = get_all_collections_of_a_record(recid) user_info = collect_user_info(req) uid = user_info["uid"] # In case we are creating a new record if cache_exists(recid, uid): record = get_cache_contents(recid, uid)[2] values = record_get_field_values(record, '980', code="a") record_collections.extend([remove_volatile(v) for v in values]) normalized_collections = [] for collection in record_collections: # Get the normalized collection name present in the action table res = run_sql( """SELECT value FROM accARGUMENT WHERE keyword='collection' AND value=%s;""", (collection, )) if res: normalized_collections.append(res[0][0]) if not normalized_collections: # Check if user has access to all collections auth_code, dummy_message = acc_authorize_action(req, 'runbibedit', collection='') if auth_code == 0: return True else: for collection in normalized_collections: auth_code, dummy_message = acc_authorize_action( req, 'runbibedit', collection=collection) if auth_code == 0: return True return False
def user_can_edit_record_collection(req, recid): """ Check if user has authorization to modify a collection the recid belongs to """ def remove_volatile(field_value): """ Remove volatile keyword from field value """ if field_value.startswith(VOLATILE_PREFIX): field_value = field_value[len(VOLATILE_PREFIX):] return field_value # Get the collections the record belongs to record_collections = get_all_collections_of_a_record(recid) user_info = collect_user_info(req) uid = user_info["uid"] # In case we are creating a new record if cache_exists(recid, uid): record = get_cache_contents(recid, uid)[2] values = record_get_field_values(record, '980', code="a") record_collections.extend([remove_volatile(v) for v in values]) normalized_collections = [] for collection in record_collections: # Get the normalized collection name present in the action table res = run_sql("""SELECT value FROM accARGUMENT WHERE keyword='collection' AND value=%s;""", (collection,)) if res: normalized_collections.append(res[0][0]) if not normalized_collections: # Check if user has access to all collections auth_code, dummy_message = acc_authorize_action(req, 'runbibedit', collection='') if auth_code == 0: return True else: for collection in normalized_collections: auth_code, dummy_message = acc_authorize_action(req, 'runbibedit', collection=collection) if auth_code == 0: return True return False