|
|
- 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')
|