示例#1
0
    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'))
示例#2
0
    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'))
示例#3
0
    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'))
示例#4
0
    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'))
示例#5
0
    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))
示例#6
0
    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))
示例#7
0
    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
                   )
示例#8
0
    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'))
示例#9
0
    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)
示例#10
0
    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
示例#11
0
    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
示例#12
0
    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'))
示例#13
0
    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
            )
示例#14
0
    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)
                   )
示例#15
0
    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()
示例#16
0
    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()