def reg_usr(self, user_info): # 注册用户 user = User() user.name = user_info['display_name'] user.email = user_info['email'] user.reg_time = Date.time() user.save() # 绑定角色 user_role = UserRole() user_role.user = user user_role.role = Role.get(Role.code == 'user') user_role.save() # 绑定 oauth user_oauth = UserOAuth() user_oauth.user = user user_oauth.oauth_id = self.uid user_oauth.set_token(self.access_token) user_oauth.save() # 为用户进行登陆 user.login(self) # 添加同步任务 self.add_task(route.url_for('task.SyncPath', user.id, 0), 99) self.redirect(route.url_for('wiki.Index'))
def reg_usr(self, user_info): # 注册用户 user = User() user.name = user_info['display_name'] user.email = user_info['email'] user.reg_time = Date.time() user.save() # 绑定角色 user_role = UserRole() user_role.user = user user_role.role = Role.get(Role.code == 'user') user_role.save() # 绑定 oauth user_oauth = UserOAuth() user_oauth.user = user user_oauth.oauth_id = self.uid user_oauth.set_token(self.access_token) user_oauth.save() # 为用户进行登陆 user.login(self) # 添加同步任务 self.add_task( route.url_for('task.SyncPath', user.id, 0), 99 ) self.redirect(route.url_for('wiki.Index'))
def post(self): if not self.form.validate(): self.render('admin/login.html', form=self.form) return # 防止穷举 yield gen.Task(IOLoop.instance().add_timeout, time.time() + 1.5) post = self.form.data user = User.select().where(User.email == post['email'])\ .where(User.password == sha1(post['password'])) if 0 == (yield gen.Task(user.count)): self.form.email.errors.append('Email 或 密码错误') self.render('admin/login.html', form=self.form) return user = yield gen.Task(user.get) role_codes, role_ids = yield gen.Task(user.get_roles) # 写入 session self.set_current_user({ 'id': user.id, 'gravatar': user.gravatar_url(80), 'name': user.name, 'email': user.email, 'sex': user.sex, 'roles': role_codes }) self.redirect(route.url_for('admin.Index'))
def post(self): if not self.form.validate(): self.render('admin/login.html', form=self.form ) return # 防止穷举 yield gen.Task(IOLoop.instance().add_timeout, time.time() + 1.5) post = self.form.data user = User.select().where(User.email == post['email'])\ .where(User.password == sha1(post['password'])) if 0 == (yield gen.Task(user.count)): self.form.email.errors.append('Email 或 密码错误') self.render('admin/login.html', form=self.form ) return user = yield gen.Task(user.get) role_codes, role_ids = yield gen.Task(user.get_roles) # 写入 session self.set_current_user({ 'id': user.id, 'gravatar': user.gravatar_url(80), 'name': user.name, 'email': user.email, 'sex': user.sex, 'roles': role_codes }) self.redirect(route.url_for('admin.Index'))
def get(self): # 分段同步, 每次同步 10 用户, 前期每 15 分钟同步一次 # 总根目录数 count = wiki.Metadata.select()\ .where(wiki.Metadata.root_id == 0)\ .where(wiki.Metadata.is_dir == 1)\ .count() # 计算要分多少段 count = int(math.ceil(count / 10)) if 0 == count: self.add_task(route.url_for('task.SyncStep', 1)) return for page in range(1, count): self.add_task(route.url_for('task.SyncStep', page))
def get(self): # 分段同步, 每次同步 10 用户, 前期每 15 分钟同步一次 # 总根目录数 count = wiki.Metadata.select()\ .where(wiki.Metadata.root_id == 0)\ .where(wiki.Metadata.is_dir == 1)\ .count() # 计算要分多少段 count = int( math.ceil( count / 10 ) ) if 0 == count: self.add_task(route.url_for('task.SyncStep', 1)) return for page in range(1, count): self.add_task(route.url_for('task.SyncStep', page))
def get(self, path): path = "/%s" % path.strip() user = self.current_user # 检查 对应的页面 是否存在 user_ar = User.get(User.id == user['user_id']) ar = wiki.Metadata\ .select()\ .where(wiki.Metadata.user == user_ar)\ .where(wiki.Metadata.path == path) if 0 == ar.count(): return self.write_error(msg='页面不存在') metadata = ar.get() ar = wiki.Data.select()\ .where(wiki.Data.metadata == metadata) if 0 == ar.count(): self.add_task( route.url_for('task.SyncFile', metadata.id), 99 ) return self.write_error(msg='页面正在同步中, 请稍候刷新') ar = ar.get() # 查找相关wiki related = [] for v in ar.get_related(): item = { 'tag' : v.tag.tag , 'url' : route.url_for('wiki.File', v.data.metadata.path.strip('/')) } related.append(item) html = ar.html self.render('wiki/index.html', html = html, title = get_title_by_html(html), related = related )
def _on_check_user(self, response): # 检查用户信息 user_info = Json.decode(response.body) response.rethrow() user_oauth = UserOAuth.select()\ .where(UserOAuth.source == 'dropbox')\ .where(UserOAuth.oauth_id == self.uid) # 判断用户是否已经注册 if 0 == user_oauth.count(): return self.reg_usr(user_info) # 更新 access_token user_oauth = user_oauth.get() user_oauth.set_token(self.access_token) user_oauth.save() user = user_oauth.user # 为用户进行登陆 user.login(self) # 执行一次手动更新 ar = wiki.Metadata.select()\ .where(wiki.Metadata.user == user)\ .where(wiki.Metadata.is_dir == 1)\ .where(wiki.Metadata.root_id == 0) # 墙的存在,可能初始化不成功,再执行 if ar.count() == 0: self.add_task( route.url_for('task.SyncPath', user.id, 0), 99 ) else: self.add_task( route.url_for('task.SyncPath', user.id, ar.get().id), 1 ) self.redirect(route.url_for('wiki.Index'))
def get(self, page): page = int(page) if page < 1: return ar = wiki.Metadata.select()\ .where(wiki.Metadata.root_id == 0)\ .where(wiki.Metadata.is_dir == 1)\ .paginate(page, 10)\ .order_by(wiki.Metadata.id.asc()) for v in ar: self.add_task(route.url_for('task.SyncPath', v.user.id, v.id), 1)
def build_url(self, page_num): url_args = deepcopy(self.url_args) if '_page_' in self.args: self.args[self.args.index('_page_')] = page_num else: url_args.append('page=%s' % page_num) url = route.url_for(self.route_name, *self.args) if len(url_args) > 0: url = url + '?' + '&'.join(url_args) return url
def _on_check_user(self, response): # 检查用户信息 user_info = Json.decode(response.body) response.rethrow() user_oauth = UserOAuth.select()\ .where(UserOAuth.source == 'dropbox')\ .where(UserOAuth.oauth_id == self.uid) # 判断用户是否已经注册 if 0 == user_oauth.count(): return self.reg_usr(user_info) # 更新 access_token user_oauth = user_oauth.get() user_oauth.set_token(self.access_token) user_oauth.save() user = user_oauth.user # 为用户进行登陆 user.login(self) # 执行一次手动更新 ar = wiki.Metadata.select()\ .where(wiki.Metadata.user == user)\ .where(wiki.Metadata.is_dir == 1)\ .where(wiki.Metadata.root_id == 0) # 墙的存在,可能初始化不成功,再执行 if ar.count() == 0: self.add_task(route.url_for('task.SyncPath', user.id, 0), 99) else: self.add_task(route.url_for('task.SyncPath', user.id, ar.get().id), 1) self.redirect(route.url_for('wiki.Index'))
def get(self, page): page = int(page) if page < 1: return ar = wiki.Metadata.select()\ .where(wiki.Metadata.root_id == 0)\ .where(wiki.Metadata.is_dir == 1)\ .paginate(page, 10)\ .order_by(wiki.Metadata.id.asc()) for v in ar: self.add_task( route.url_for('task.SyncPath', v.user.id, v.id), 1 )
def get(self): user = self.current_user # 检查 /index.md 是否存在 user_ar = User.get(User.id == user['user_id']) ar = wiki.Metadata\ .select()\ .where(wiki.Metadata.user == user_ar)\ .where(wiki.Metadata.path == '/index.md') if 0 == ar.count(): # 显示帮助页面 path = os.path.join(self.settings['root_path'], 'README.md') html = '' if os.path.isfile(path): md_file = open(path) md = md_file.read() md_file.close() html = markdown(md) else: metadata = ar.get() ar = wiki.Data.select()\ .where(wiki.Data.metadata == metadata) if 0 == ar.count(): self.add_task( route.url_for('task.SyncFile', metadata.id), 99 ) return self.write_error(msg='页面正在同步中, 请稍候刷新') html = ar.get().html self.render('wiki/index.html', html = html, title = get_title_by_html(html) )
def callback(self, response): if response.error: self.write('Init User(%s) Metadata Error : %s' % (self.user.id, response.error)) self.finish() return json = Json.decode(response.body) if len(json.get('path', '')) > 255: self.write('Path Too long.') self.finish() return hash_key = json.get('hash', False) or json.get('rev', '') if '' == hash_key: # 中文目录,先删除处理 self.metadata.remove() self.finish() return if self.metadata: metadata = self.metadata # 没有变更 # if hash_key == str(metadata.hash_key): # self.finish() # return else: # 初始化根目录 metadata = wiki.Metadata() metadata.user = self.user metadata.path = json['path'] metadata.bytes = json['bytes'] metadata.is_dir = json['is_dir'] and 1 or 0 if json.get('modified', False): metadata.modified = Date.str_to_time( json['modified'].split('+')[0], '%a, %d %b %Y %H:%M:%S ') metadata.hash_key = hash_key metadata.save() task_affair = wiki.TaskAffairs.add(metadata, self.affair_parent) # 取目录下文件 path 列表, 与新数据比对 # 存在的 path 删除, 列表中留下的path , # 就是需要删除的 文件 / 目录 path_list = [] for v in wiki.Metadata.select(wiki.Metadata.path)\ .where(wiki.Metadata.root_id == metadata.id): path_list.append(v.path) for v in json.get('contents', []): if len(json['path']) < 255: if v['path'] in path_list: path_list.remove(v['path']) is_dir = v['is_dir'] and 1 or 0 hash_key = v.get('rev', False) or v['hash'] if 0 == is_dir: uri, ext = os.path.splitext(v['path']) # 不支持的文件类型, 跳过 if ext.lower() not in self.settings['support_ext']: continue # 判断是否存在 ar = wiki.Metadata.select()\ .where(wiki.Metadata.root_id == metadata.id)\ .where(wiki.Metadata.path == v['path'])\ .where(wiki.Metadata.is_dir == is_dir) if ar.count() == 0: ar = wiki.Metadata() ar.user = self.user ar.root_id = metadata.id ar.path = v['path'] ar.is_dir = is_dir else: ar = ar.get() # 没有更改, 跳过 if 0 == is_dir and hash_key == ar.hash_key: continue ar.bytes = v['bytes'] ar.hash_key = hash_key if v.get('modified', False): ar.modified = Date.str_to_time(v['modified'].split('+')[0], '%a, %d %b %Y %H:%M:%S ') ar.save() # 子事务 child_task_affair = wiki.TaskAffairs.add(ar, task_affair.id) if v['is_dir']: self.add_task( route.url_for('task.SyncPath', self.user.id, ar.id) + '?parent=%s' % child_task_affair.id, 1) else: self.add_task( route.url_for('task.SyncFile', ar.id) + '?affair=%s' % child_task_affair.id, 2) # 删除不存在的文件/目录 for v in path_list: ar = wiki.Metadata.select()\ .where(wiki.Metadata.root_id == metadata.id)\ .where(wiki.Metadata.path == v) if ar.count() != 0: ar.get().remove() self.finish()
def callback(self, response): if response.error: self.write('Init User(%s) Metadata Error : %s' % (self.user.id, response.error) ) self.finish() return json = Json.decode(response.body) if len(json.get('path','')) > 255: self.write('Path Too long.') self.finish() return hash_key = json.get('hash', False) or json.get('rev','') if '' == hash_key: # 中文目录,先删除处理 self.metadata.remove() self.finish() return if self.metadata: metadata = self.metadata # 没有变更 # if hash_key == str(metadata.hash_key): # self.finish() # return else: # 初始化根目录 metadata = wiki.Metadata() metadata.user = self.user metadata.path = json['path'] metadata.bytes = json['bytes'] metadata.is_dir = json['is_dir'] and 1 or 0 if json.get('modified', False): metadata.modified = Date.str_to_time(json['modified'].split('+')[0], '%a, %d %b %Y %H:%M:%S ') metadata.hash_key = hash_key metadata.save() task_affair = wiki.TaskAffairs.add( metadata, self.affair_parent ) # 取目录下文件 path 列表, 与新数据比对 # 存在的 path 删除, 列表中留下的path , # 就是需要删除的 文件 / 目录 path_list = [] for v in wiki.Metadata.select(wiki.Metadata.path)\ .where(wiki.Metadata.root_id == metadata.id): path_list.append(v.path) for v in json.get('contents', []): if len(json['path']) < 255: if v['path'] in path_list: path_list.remove(v['path']) is_dir = v['is_dir'] and 1 or 0 hash_key = v.get('rev', False) or v['hash'] if 0 == is_dir: uri, ext = os.path.splitext(v['path']) # 不支持的文件类型, 跳过 if ext.lower() not in self.settings['support_ext']: continue # 判断是否存在 ar = wiki.Metadata.select()\ .where(wiki.Metadata.root_id == metadata.id)\ .where(wiki.Metadata.path == v['path'])\ .where(wiki.Metadata.is_dir == is_dir) if ar.count() == 0: ar = wiki.Metadata() ar.user = self.user ar.root_id = metadata.id ar.path = v['path'] ar.is_dir = is_dir else: ar = ar.get() # 没有更改, 跳过 if 0 == is_dir and hash_key == ar.hash_key: continue ar.bytes = v['bytes'] ar.hash_key = hash_key if v.get('modified', False): ar.modified = Date.str_to_time(v['modified'].split('+')[0], '%a, %d %b %Y %H:%M:%S ') ar.save() # 子事务 child_task_affair = wiki.TaskAffairs.add( ar, task_affair.id ) if v['is_dir']: self.add_task( route.url_for('task.SyncPath', self.user.id, ar.id) + '?parent=%s' % child_task_affair.id, 1 ) else: self.add_task( route.url_for('task.SyncFile', ar.id) + '?affair=%s' % child_task_affair.id, 2 ) # 删除不存在的文件/目录 for v in path_list: ar = wiki.Metadata.select()\ .where(wiki.Metadata.root_id == metadata.id)\ .where(wiki.Metadata.path == v) if ar.count() != 0: ar.get().remove() self.finish()