import os, argparse, json, re from datetime import date from app import ipfs_client, db, Paper def check_length(x, limit=30, allow_null=False): return (x and len(x) <= limit) or (allow_null and not x) if __name__ == "__main__": # parse arguments parser = argparse.ArgumentParser(description='add multiple learning resources simultaneously') parser.add_argument('path', type = str, nargs = 1, help = 'the root path to the resources') args = parser.parse_args() path = args.path[0] if not os.path.isdir(path): raise Exception(f'{path} is not a directory, which should have been the root path to the resources.') # load resources for course in os.listdir(path): course_path = os.path.join(path, course) if os.path.isdir(course_path): for d in os.listdir(course_path): dir_path = os.path.join(course_path, d) if os.path.isdir(dir_path): print(f'item {dir_path}') fm = None for r in os.listdir(dir_path): res_path = os.path.join(dir_path, r) if r == 'format.json': with open(res_path, 'r') as f: fm = json.load(f) jsonExistence = True if fm is None: raise Exception(f'there\'s no format.json in {dir_path}.') if len(os.listdir(dir_path)) == 1: raise Exception(f'there\'s no normal file in {dir_path}.') if fm['course'] != course: raise Exception('the course name in json {} is not equal to the directory name {}'.format(fm['course'], course)) # check length if not check_length(fm['author']): raise Exception('the length of the name of author is too long: {}'.format(fm['author'])) if not check_length(fm['teacher']): raise Exception('the length of the name of teacher is too long: {}'.format(fm['teacher'])) if not check_length(fm['note'], 200, True): raise Exception('the legnth of the name of note is too long: {}'.format(fm['note'])) # add directory and immediate files in the directory except format.json res = ipfs_client.add(dir_path, recursive = True, pattern = re.compile(r'^(?!format.json$)')) file_hash = '' for r in res: if r.get('Name') == d: file_hash = r.get('Hash') if file_hash == '': raise Exception('the directory is not put into IPFS, something wrong happened.') if not Paper.query.filter_by(file_hash = file_hash).count(): paper = Paper( course = fm['course'], teacher = fm['teacher'], year = fm['year'], notes = fm['note'], anon = fm['author'] == '匿名', author = fm['author'], create_date = date.today(), file_hash = file_hash ) db.session.add(paper) db.session.commit() print(f'item {dir_path} is added with hash {file_hash}') else: print(f'{dir_path} has been added with hash {file_hash} before')