def accept_quest(agent_uid, accept_uid, qid): from services.content_manager import update_quest from services.resource_manager import get_all_resources_under_path, change_resource_uploader from services.user_services import get_user_by_uid, update_user from models import db agent_uid = str(agent_uid) # check agent privilege if agent_uid != accept_uid: if not get_user_by_uid(agent_uid).privilege.operate_quest: return 2 # check user privilege if not get_user_by_uid(accept_uid).privilege.accept_quest: return 1 quest = get_quest_by_qid(qid) # check quest availability if quest.status != "HIRING": return 3 # TODO: solve simultaneous problem quest.accept_uid = accept_uid quest.accept_on = db.func.now() update_quest(quest) quest.status = "WORKING" db.session.commit() update_user(accept_uid) # assign uploader to resources if exist if quest.resource is not None: resources = get_all_resources_under_path(".sys/quest/" + str(qid)) for resource in resources: try: change_resource_uploader(resource, accept_uid) except: pass return 0
def quest_check(qid): quest, chapter, manga = get_quest_by_qid(qid) if quest is None: abort(404) from services.user_services import get_user_by_uid from services.user_services import get_users if quest.quest_type == "PROOFREADING": return render_template('quest/proofreading.html', user=get_user_by_uid(session.get('uid')), quest=quest, get_users=get_users) return render_template('quest/article.html', user=get_user_by_uid(session.get('uid')), quest=quest, get_users=get_users)
def chapter_mark(uid, cid, mark, force=False): from services.user_services import get_user_by_uid from models import db # check user privilege if force is not True and get_user_by_uid( uid).privilege.operate_chapter is not True: return 1 chapter, useless = get_chapter_by_cid(cid) if chapter.status == "FINISHED" and mark == "WORKING": chapter.status = "WORKING" if chapter.status == "WORKING" and mark == "FINISHED": chapter.status = "FINISHED" if chapter.status == "WORKING" and mark == "HALT": chapter.status = "HALT" # halt all non-finished quests from services.quest_manager import close_quest for quest in chapter.quests: if quest.status != "FINISHED": try: code = close_quest(uid, quest.qid) except: pass if chapter.status == "HALT" and mark == "WORKING": chapter.status = "WORKING" # reopen all non-finished quests from services.quest_manager import reopen_quest for quest in chapter.quests: if quest.status != "FINISHED": try: code = reopen_quest(uid, quest.qid) except: pass db.session.commit() return 0
def upload_resource(file, uid, filepath, public_access, filename=None, file_ext=None): from models.resource import Resource from services.user_services import get_user_by_uid from models import db from os import path from os import makedirs secure_filename(file.filename) secure_filepath(filepath) # check user privilege if get_user_by_uid(uid).privilege.upload_file is False: return None if not path.exists(RESOURCE_FOLDER + filepath): makedirs(RESOURCE_FOLDER + filepath) if filename is None: filename = file.filename else: if file_ext is None: filename = filename + path.splitext(file.filename)[1] else: filename = filename + '.' + file_ext # filename clash resolve if path.exists(path.join(RESOURCE_FOLDER + filepath, file.filename)): ext = '.' + filename.split('.')[-1] name = filename[:len(filename)-len(ext)] count = 1 while path.exists(path.join(RESOURCE_FOLDER + filepath, name + '(' + str(count) + ')' + ext)): count += 1 filename = name + '(' + str(count) + ')' + ext # save file file.save(path.join(RESOURCE_FOLDER + filepath, filename)) # update database new_resource = Resource(resource_name=filename, resource_path=filepath, uploader_uid=uid, public_access=public_access) db.session.add(new_resource) db.session.commit() return new_resource
def transfer_quest(uid, qid): from models import db from services.user_services import get_user_by_uid from services.resource_manager import delete_resource, change_resource_uploader, get_all_resources_under_path # check user privilege quest = get_quest_by_qid(qid) user = get_user_by_uid(uid) if not user.privilege.operate_quest: return 1 # update quest quest.status = "HIRING" quest.accept_uid = None res = quest.resource # quest.resource_rid = None db.session.commit() if res is not None: # delete_resource(res, res.uploader_uid) # change the owner of all files under the quest folder to nobody resources = get_all_resources_under_path(".sys/quest/" + str(qid)) for resource in resources: try: change_resource_uploader(resource, None) except: pass return 0
def manga_cover(uid, new_cover, mid): from models import db from services.user_services import get_user_by_uid from services.resource_manager import upload_resource, delete_resource, compress_image from os.path import join # check user privilege user = get_user_by_uid(uid) if not user.privilege.operate_quest: return 1 # check manga existence manga = get_manga_by_mid(mid) if manga is None: return 2 # change cover old_cover = manga.manga_cover manga.manga_cover_rid = None db.session.commit() delete_resource(old_cover, uid) resource = upload_resource(new_cover, uid, '.sys/manga/' + str(manga.mid), True, filename='cover') manga.manga_cover_rid = resource.rid db.session.commit() compress_image(join(resource.resource_path, resource.resource_name)) update_manga(manga) return 0
def quest(): from services.user_services import get_user_by_uid from services.content_manager import get_quests from services.statistics import count_iter return render_template('dashboard/quest.html', user=get_user_by_uid(session['uid']), get_quests=get_quests, count_iter=count_iter)
def manga(): from services.user_services import get_user_by_uid from services.content_manager import get_mangas from services import statistics return render_template('manga.html', user=get_user_by_uid(session.get('uid')), mangas=get_mangas(), statistics=statistics)
def change_resource_accessibility(res, uid, new_accessibility): from services.user_services import get_user_by_uid from models import db user = get_user_by_uid(uid) # check user privilege if user.privilege.operate_file is not True: return 1 res.public_access = new_accessibility db.session.commit()
def new_dir(uid, filepath, dir_name): from services.user_services import get_user_by_uid from os import path, makedirs # check user privilege if get_user_by_uid(uid).privilege.operate_file is not True: return 1 if not path.exists(path.join(RESOURCE_FOLDER, filepath, dir_name)): makedirs(path.join(RESOURCE_FOLDER, filepath, dir_name)) return 0
def icode(): if request.method == 'GET': from services.user_services import get_user_by_uid return render_template('dashboard/invitation.html', user=get_user_by_uid(session['uid'])) privilege = 2 # TODO: For now, only issue privilege 2 code, i_code = user_services.issue_invitation(session['uid'], privilege) response = {'code': code, 'i_code': i_code} return JSONEncoder().encode(response)
def chapter_check(cid): chapter, manga = get_chapter_by_cid(cid) if chapter is None: abort(404) from services.user_services import get_user_by_uid return render_template('chapter_template.html', user=get_user_by_uid(session.get('uid')), chapter=chapter, manga=manga)
def index(): from services.user_services import get_user_by_uid from services.content_manager import get_quests from services import statistics from services.content_manager import get_mangas return render_template('index.html', user=get_user_by_uid(session.get('uid')), get_quests=get_quests, mangas=get_mangas(), statistics=statistics)
def manga_check(mid): from services import statistics manga = get_manga_by_mid(mid) if manga is None: abort(404) from services.user_services import get_user_by_uid return render_template('manga_template.html', user=get_user_by_uid(session.get('uid')), manga=manga, statistics=statistics)
def delete_resource(res, uid): from models import db from services.user_services import get_user_by_uid from os import path, remove # check user privilege if res.uploader_uid != uid and get_user_by_uid(uid).privilege.operate_file is not True: return 1 filepath = get_resource_filepath(res) remove(filepath) db.session.delete(res) db.session.commit() return 0
def close_quest(uid, qid): from models import db from services.user_services import get_user_by_uid # check user privilege quest = get_quest_by_qid(qid) user = get_user_by_uid(uid) if not user.privilege.operate_quest: return 1 # mark it close quest.complete_on = db.func.now() quest.status = "CLOSED" db.session.commit() return 0
def reopen_quest(uid, qid, force=False): from models import db from services.user_services import get_user_by_uid # check user privilege quest = get_quest_by_qid(qid) user = get_user_by_uid(uid) if force is not True and not user.privilege.operate_quest: return 1 # mark it open quest.complete_on = db.func.now() if quest.accept_uid is not None: quest.status = "WORKING" else: quest.status = "HIRING" db.session.commit() return 0
def manga_title(uid, new_title, mid): from models import db from services.user_services import get_user_by_uid # check user privilege user = get_user_by_uid(uid) if not user.privilege.operate_quest: return 1 # check manga existence manga = get_manga_by_mid(mid) if manga is None: return 2 # change title manga.manga_name = new_title db.session.commit() update_manga(manga) return 0
def delete_chapter(uid, cid): from models import db from services.user_services import get_user_by_uid from services.quest_manager import delete_quest # check user privilege chapter, useless = get_chapter_by_cid(cid) user = get_user_by_uid(uid) if not user.privilege.operate_chapter: return 1 # delete quests for quest in chapter.quests: delete_quest(uid, quest.qid) # delete chapter db.session.delete(chapter) db.session.commit() return 0
def create_resource(filename, uid, filepath, public_access): from models.resource import Resource from services.user_services import get_user_by_uid from models import db from os import path from os import makedirs secure_filename(filename) # check user privilege if get_user_by_uid(uid).privilege.upload_file is False: return None if not path.exists(RESOURCE_FOLDER + filepath): makedirs(RESOURCE_FOLDER + filepath) new_file = open(path.join(RESOURCE_FOLDER + filepath, filename), "w") new_resource = Resource(resource_name=filename, resource_path=filepath, uploader_uid=uid, public_access=public_access) db.session.add(new_resource) db.session.commit() return new_resource
def manga_status(uid, new_status, mid): from models import db from services.user_services import get_user_by_uid # check user privilege user = get_user_by_uid(uid) if not user.privilege.operate_quest: return 1 # check manga existence manga = get_manga_by_mid(mid) if manga is None: return 2 # check status validity if new_status not in ["WORKING", "HALT", "FINISHED"]: return 3 manga.status = new_status db.session.commit() return 0
def delete_quest(uid, qid): from models import db from services.user_services import get_user_by_uid from services.resource_manager import get_all_resources_under_path, delete_resource # check user privilege quest = get_quest_by_qid(qid) user = get_user_by_uid(uid) if not user.privilege.operate_quest: return 1 # delete all resources under the quest file try: resources = get_all_resources_under_path(".sys/quest/" + qid) for res in resources: delete_resource(res, uid) except: pass db.session.delete(quest) db.session.commit() return 0
def change_quest_accessibility(uid, qid, new_accessibility): from models import db from services.user_services import get_user_by_uid from services.resource_manager import get_all_resources_under_path, change_resource_accessibility # check user privilege quest = get_quest_by_qid(qid) user = get_user_by_uid(uid) if not user.privilege.operate_quest: return 1 # check quest status if quest.status != "FINISHED" and quest.status != "CLOSED": return 2 # change resources accessibility resources = get_all_resources_under_path('.sys/quest/' + qid) for res in resources: change_resource_accessibility(res, uid, new_accessibility) # change quest accessibility quest.public_access = new_accessibility db.session.commit() return 0
def create_manga(uid, name, cover): from models import db from services.user_services import get_user_by_uid from services.resource_manager import upload_resource, compress_image from models.manga import Manga from os.path import join # check user privilege user = get_user_by_uid(uid) if not user.privilege.operate_manga: return 1 # create manga new_manga = Manga(manga_name=name) db.session.add(new_manga) db.session.commit() resource = upload_resource(cover, uid, '.sys/manga/' + str(new_manga.mid), True, filename='cover') new_manga.manga_cover_rid = resource.rid db.session.commit() compress_image(join(resource.resource_path, resource.resource_name)) update_manga(new_manga) return 0
def finish_quest(uid, qid): from services.user_services import get_user_by_uid, update_user from models import db # check user privilege quest = get_quest_by_qid(qid) if quest.accept_uid != uid and not get_user_by_uid( uid).privilege.operate_quest: return 1 # mark it finish quest.complete_on = db.func.now() quest.status = "FINISHED" db.session.commit() update_user(uid) # chain opener quests = quest.chapter.quests if quest.quest_type == "TRANSLATION" or quest.quest_type == "PROOFREADING": if quest.quest_type == "TRANSLATION": unfinished_translation = [] proofreading = [] typesetting = [] for q in quests: if q.quest_type == "TRANSLATION" and (q.status == "WORKING" or q.status == "HIRING"): unfinished_translation.append(q) elif q.quest_type == "PROOFREADING": proofreading.append(q) elif q.quest_type == "TYPESETTING": typesetting.append(q) if len(unfinished_translation) == 0: if len(proofreading) > 0: for q in proofreading: if q.status == "CLOSED": reopen_quest(uid, q.qid, force=True) else: for q in typesetting: if q.status == "CLOSED": reopen_quest(uid, q.qid, force=True) if quest.quest_type == "PROOFREADING": unfinished_translation = [] unfinished_proofreading = [] typesetting = [] for q in quests: if q.quest_type == "TRANSLATION" and (q.status == "WORKING" or q.status == "HIRING"): unfinished_translation.append(q) elif q.quest_type == "PROOFREADING" and ( q.status == "WORKING" or q.status == "HIRING"): unfinished_proofreading.append(q) elif q.quest_type == "TYPESETTING": typesetting.append(q) if len(unfinished_translation) == 0 and len( unfinished_proofreading) == 0: for q in typesetting: if q.status == "CLOSED": reopen_quest(uid, q.qid, force=True) # auto finishing chapter for q in quests: if q.status != "FINISHED": return 0 from services.content_manager import chapter_mark chapter_mark(uid, quest.chapter.cid, "FINISHED", force=True) return 0
def about(): from services.user_services import get_user_by_uid return render_template('about.html', user=get_user_by_uid(session.get('uid')))
def members(): from services.user_services import get_user_by_uid, get_users from services.statistics import count_iter from services.content_manager import get_quests return render_template('members.html', user=get_user_by_uid(session.get('uid')), get_users=get_users, get_quests=get_quests, count_iter=count_iter)
def members_check(uid): from services.user_services import get_user_by_uid from services.content_manager import get_quests return render_template('member_template.html', user=get_user_by_uid(session.get('uid')), member=get_user_by_uid(uid), get_quests=get_quests)
def content(): from services.user_services import get_user_by_uid return render_template('dashboard/content.html', user=get_user_by_uid(session['uid']))
def profile(): from services.user_services import get_user_by_uid return render_template('dashboard/profile.html', user=get_user_by_uid(session['uid']))