Beispiel #1
0
class ViewTeam(MethodView):
    decorators = [
        team_member_required(need=False), \
        member_required(admin=False), \
        login_required('account.login')
    ]

    def get(self, organization, member, team, team_member):
        members = get_team_members(team.id)
        users = (get_user(member.uid) for member in members)
        page = request.args.get('p', 1)
        try:
            page = int(page)
        except ValueError:
            raise abort(403)
        data, list_page = render_activities_page(page,
                                                 t='team',
                                                 organization=organization,
                                                 team=team)
        return self.render_template(
                    organization=organization, \
                    team_member=team_member, \
                    team=team, member=member, \
                    users=users, \
                    data=self.render_activities(data, organization, team), \
                    list_page=list_page, \
               )

    def render_activities(self, data, organization, team):
        for action, original, _ in data:
            if action['type'] == 'push':
                yield render_push_action(action, organization, team=team)
            else:
                #TODO for other data
                continue
Beispiel #2
0
class Forks(MethodView):
    decorators = [
        repo_required(),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member, repo, admin, team, team_member):
        forks = get_repo_forks(repo.id)
        return self.render_template(
                    organization=organization, \
                    member=member, \
                    repo=repo, \
                    forks=self.render_forks(organization, forks, team)
                )

    def render_forks(self, organization, forks, team):
        for fork in forks:
            view_url = get_url(organization,
                               fork,
                               view='repos.view',
                               team=team)
            setattr(fork, 'view', view_url)
            setattr(fork, 'user', get_user(fork.uid))
            yield fork
Beispiel #3
0
class Activities(MethodView):
    decorators = [
        repo_required(),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member, repo, admin, team, team_member):
        page = request.args.get('p', 1)
        try:
            page = int(page)
        except ValueError:
            raise abort(403)
        data, list_page = render_activities_page(page, t='repo', repo=repo)
        return self.render_template(
                    data=self.render_activities(data, organization, repo, team), \
                    list_page=list_page, \
                    member=member, repo=repo, \
                    organization=organization, \
                    admin=admin, team=team, team_member=team_member, \
                )

    def render_activities(self, data, organization, repo, team):
        for action, original, timestamp in data:
            if action['type'] == 'push':
                yield render_push_action(action,
                                         organization,
                                         repo=repo,
                                         team=team)
            else:
                #TODO for merge data
                continue
Beispiel #4
0
class DeleteFile(MethodView):
    decorators = [
        repo_required(need_write=True),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self,
            organization,
            member,
            repo,
            admin,
            team,
            team_member,
            version=None,
            path=None):
        if not check_obj_type(repo, path, version, 'blob'):
            raise abort(403)
        error = update_file(
                organization, \
                g.current_user, \
                repo, {path: ''}, \
                version, \
                '%s %s' % (code.REPOS_DELETE_FILE, path)
        )
        if not error:
            path = path.rsplit('/', 1)[0] if '/' in path else None
        return redirect(repo.meta.get_view(version=version, path=path))
Beispiel #5
0
class Create(MethodView):
    decorators = [
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member):
        return self.render_template(
                    organization=organization, \
                    member=member, \
                    teams=self.get_joined_teams(organization)
                )

    def post(self, organization, member):
        repopath = request.form.get('path', '')
        name = request.form.get('name', '')
        summary = request.form.get('summary', '')
        teamname = repopath.strip('/').split('/', 1)[0]

        if not check_reponame(name):
            return self.render_template(
                        organization=organization, \
                        member=member, \
                        teams=self.get_joined_teams(organization), \
                        error = code.REPOS_NAME_INVALID, \
                    )

        team = get_team_by_name(organization.id,
                                teamname) if teamname else None
        if teamname and (not team
                         or not get_team_member(team.id, g.current_user.id)):
            return self.render_template(
                        organization=organization, \
                        member=member, \
                        teams=self.get_joined_teams(organization), \
                        error = code.REPOS_PATH_INVALID, \
                    )

        path = os.path.join(teamname, '%s.git' % name)
        repo, error = create_repo(name,
                                  path,
                                  g.current_user,
                                  organization,
                                  team=team,
                                  summary=summary)
        if error:
            return self.render_template(
                        organization=organization, \
                        member=member, \
                        teams=self.get_joined_teams(organization), \
                        error = error, \
                    )

        return redirect(get_url(organization, repo))

    def get_joined_teams(self, organization):
        for team in get_teams_by_ogranization(organization.id):
            if not get_team_member(team.id, g.current_user.id):
                continue
            yield team
Beispiel #6
0
class Alias(MethodView):
    decorators = [login_required('account.login')]

    def get(self):
        error = request.args.get('error', None)
        return self.render_template(error)

    def post(self):
        email = request.form.get('email', None)
        if not check_email(email):
            return self.render_template(error=code.ACCOUNT_EMAIL_INVAILD)
        if get_alias_by_email(email):
            return redirect(
                url_for('account.alias', error=code.ACCOUNT_EMAIL_EXISTS))
        url = url_for('account.verifyalias',
                      stub=self.encode(email),
                      _external=True)
        send_verify_mail(email, url)
        return self.render_template(send=code.ACCOUNT_EMAIL_VERIFY)

    def render_template(self, error=None, send=None):
        alias = get_alias_by_uid(g.current_user.id)
        return MethodView.render_template(self,
                                          alias=alias,
                                          send=send,
                                          error=error)

    def encode(self, email):
        s = TimestampSigner(config.SECRET_KEY)
        e = s.sign(email)
        s = URLSafeSerializer(config.SECRET_KEY)
        e = s.dumps(e)
        return e
Beispiel #7
0
class View(MethodView):
    decorators = [
        gist_require(),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member, gist, version='master'):
        jagare = get_jagare(gist.id, gist.parent)
        error, tree = jagare.ls_tree(gist.get_real_path(), version=version)
        if not error:
            tree, meta = tree['content'], tree['meta']
            tree = render_tree(jagare,
                               tree,
                               gist,
                               organization,
                               version=version)
        watcher = get_gist_watcher(g.current_user.id, gist.id)
        return self.render_template(
                    organization=organization, \
                    member=member, \
                    error=error, \
                    tree=tree, \
                    gist=gist, \
                    watcher=watcher, \
                )
Beispiel #8
0
class Login(MethodView):
    decorators = [login_required(need=False), csrf_exempt]

    def get(self):
        login_url = url_for('account.login', **request.args)
        return self.render_template(login_url=login_url)

    def post(self):
        login_url = url_for('account.login', **request.args)
        password = request.form.get('password', None)
        email = request.form.get('email', None)
        check, error = check_login_info(email, password)
        if not check:
            return self.render_template(login_info=error, login_url=login_url)

        user = get_user_by(email=email).limit(1).first()
        if not user:
            logger.info('no such user')
            return self.render_template(login_info=code.ACCOUNT_NO_SUCH_USER,
                                        login_url=login_url)
        if not user.check_password(password):
            logger.info('invaild passwd')
            return self.render_template(
                login_info=code.ACCOUNT_LOGIN_INFO_INVAILD,
                login_url=login_url)

        account_login(user)
        redirect_url = request.args.get('redirect', None)
        return redirect(redirect_url or url_for('index'))
Beispiel #9
0
class Commit(MethodView):
    decorators = [
        repo_required(),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member, repo, admin, team, team_member,
            version):
        jagare = get_jagare(repo.id, repo.parent)
        error, commits = jagare.get_log(
                repo.get_real_path(), \
                size=1, start=version, \
        )
        if not commits:
            raise abort(404)
        commit = commits[0]
        render_commit(commit, organization, repo)
        commit['diffs'] = split_diff(commit['diff'])
        return self.render_template(
                    member=member, repo=repo, \
                    organization=organization, \
                    admin=admin, team=team, team_member=team_member, \
                    commit=commit, \
                )
Beispiel #10
0
class Blob(MethodView):
    decorators = [
        repo_required(),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member, repo, admin, team, team_member,
            version, path):
        watcher = get_repo_watcher(g.current_user.id, repo.id)
        jagare = get_jagare(repo.id, repo.parent)
        tname = team.name if team else None

        content, content_type, content_length = format_content(jagare,
                                                               repo,
                                                               path,
                                                               version=version)

        return self.render_template(
                    member=member, repo=repo, \
                    organization=organization, \
                    watcher=watcher, file_path=path, \
                    branches=get_branches(repo, jagare), \
                    content=content, \
                    content_length=content_length, \
                    content_type=content_type, \
                    admin=admin, team=team, team_member=team_member, \
                    version=version, \
                    path=render_path(
                            path, version, organization.git, tname, repo.name
                    )
                )
Beispiel #11
0
class DelKey(MethodView):
    decorators = [login_required('account.login')]
    def get(self, kid):
        key = get_key_by_id(kid)
        if key and key.uid == g.current_user.id:
            key.delete()
            clear_key_cache(key, g.current_user)
        return redirect(url_for('account.keys'))
Beispiel #12
0
class DelAlias(MethodView):
    decorators = [login_required('account.login')]

    def get(self, aid):
        alias = get_alias_by_id(aid)
        if alias or alias.uid == g.current_user.id:
            alias.delete()
            clear_alias_cache(g.current_user, alias.email, aid)
        return redirect(url_for('account.alias'))
Beispiel #13
0
class CreateTeam(MethodView):
    decorators = [
        member_required(admin=False),
        login_required('account.login'),
    ]

    def get(self, organization, member):
        if not self.check_permits(organization, member):
            raise abort(403)
        return self.render_template(
                    organization=organization, \
                    member=member, \
                )

    def post(self, organization, member):
        if not self.check_permits(organization, member):
            raise abort(403)
        name = request.form.get('name', None)
        display = request.form.get('display', None)
        private = 1 if 'private' in request.form else 0
        status = check_git(name)
        if not status:
            return self.render_template(
                        organization=organization, \
                        member=member, \
                        error=code.ORGANIZATION_GITNAME_INVALID, \
                    )
        status = check_team_name(display)
        if not status:
            return self.render_template(
                            organization=organization, \
                            member=member, \
                            error=code.ORGANIZATION_NAME_INVALID, \
                    )
        team, error = create_team(name,
                                  display,
                                  g.current_user,
                                  organization,
                                  private=private,
                                  members=1)
        if error:
            return self.render_template(
                    organization=organization, \
                    member=member, \
                    error=error, \
                    )
        return redirect(
            url_for('organization.viewteam',
                    git=organization.git,
                    tname=team.name))

    def check_permits(self, organization, member):
        if organization.allow:
            return True
        if member.admin:
            return True
        return False
Beispiel #14
0
class Delete(MethodView):
    decorators = [
        repo_required(admin=True),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member, repo, admin, team, team_member):
        delete_repo(organization, repo, team)
        return redirect(url_for('organization.view', git=organization.git))
Beispiel #15
0
class Delete(MethodView):
    decorators = [
        gist_require(owner=True),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member, gist):
        delete_gist(g.current_user, gist, organization)
        return redirect(url_for('organization.view', git=organization.git))
Beispiel #16
0
class Create(MethodView):
    decorators = [
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member):
        return self.render_template(
                    organization=organization, \
                    member=member, \
                )

    def post(self, organization, member):
        summary = request.form.get('summary')
        filenames = request.form.getlist('filename')
        codes = request.form.getlist('code')
        private = create_token(20) if request.form.get('private') else None
        data = {}
        if len(filenames) != len(codes):
            raise abort(400)
        for filename, content in zip(filenames, codes):
            if not filename and not content:
                continue
            if not filename or not content:
                return self.render_template(
                            organization=organization, \
                            member=member, \
                            error=code.GIST_WITHOUT_FILENAME if not filename else code.GIST_WITHOUT_CONTENT, \
                            filenames=filenames, \
                            codes=codes, \
                        )
            if data.get(filename):
                return self.render_template(
                            organization=organization, \
                            member=member, \
                            error=code.GIST_FILENAME_EXISTS, \
                            filenames=filenames, \
                            codes=codes, \
                        )
            data[filename] = content
        gist, err = create_gist(organization,
                                g.current_user,
                                summary,
                                data=data,
                                private=private,
                                watchers=1)
        if err:
            return self.render_template(
                        organization=organization, \
                        member=member, \
                        error=code.GIST_CREATE_FAILED, \
                        filenames=filenames, \
                        codes=codes, \
                    )
        return redirect(get_url(organization, gist))
Beispiel #17
0
class Unwatch(MethodView):
    decorators = [
        gist_require(),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member, gist):
        watcher = get_gist_watcher(g.current_user.id, gist.id)
        if watcher:
            delete_watcher(g.current_user, watcher, gist, organization)
        return redirect(gist.meta.view)
Beispiel #18
0
class Watch(MethodView):
    decorators = [
        repo_required(),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member, repo, admin, team, team_member):
        watcher = get_repo_watcher(g.current_user.id, repo.id)
        if not watcher:
            create_watcher(g.current_user, repo, organization, team=team)
        return redirect(repo.meta.view)
Beispiel #19
0
class QuitTeam(MethodView):
    decorators = [
        team_member_required(), \
        member_required(admin=False), \
        login_required('account.login')
    ]

    def post(self, organization, member, team, team_member):
        quit_team(organization, team, team_member, g.current_user)
        return redirect(
            url_for('organization.viewteam',
                    git=organization.git,
                    tname=team.name))
Beispiel #20
0
class RemoveCommiter(MethodView):
    decorators = [
        repo_required(admin=True),
        member_required(admin=False),
        login_required('account.login')
    ]

    def post(self, organization, member, repo, admin, team, team_member):
        name = request.form.get('name')
        user = get_user(name)
        if not user or user.id == repo.uid:
            return redirect(repo.meta.commiter)
        commiter = get_repo_commiter(user.id, repo.id)
        if user and commiter:
            delete_commiter(user, commiter, repo, organization, team)
        return redirect(repo.meta.commiter)
Beispiel #21
0
class Revisions(MethodView):
    decorators = [gist_require(owner=True), member_required(admin=False), login_required('account.login')]
    def get(self, organization, member, gist):
        page = request.args.get('p', 1)
        try:
            page = int(page)
        except ValueError:
            raise abort(403)
        jagare = get_jagare(gist.id, gist.parent)
        error, revisions = jagare.get_log(gist.get_real_path(), page=page, size=config.REVISIONS_PER_PAGE)
        if not revisions:
            raise abort(404)
        list_page = render_revisions_page(gist, page)
        revisions = self.render_revisions(organization, gist, revisions, list_page)
        return self.render_template(
                    organization=organization, \
                    member=member, \
                    error=error, \
                    revisions=revisions, \
                    gist=gist, \
                    list_page=list_page, \
                )

    def render_revisions(self, organization, gist, revisions, list_page):
        for rev in revisions[:-1]:
            self.render_rev(rev, organization, gist)
            rev['type'] = 'update'
            yield rev
        rev = revisions[-1]
        self.render_rev(rev, organization, gist)
        rev['type'] = 'create' if not list_page.has_next else 'update'
        yield rev

    def render_rev(self, rev, organization, gist):
        rev['view'] = get_url(organization, gist, version=rev['sha'])
        rev['committer_time'] = format_time(rev['committer_time'])
        author = reqcache.get(rev['author_email'])
        if not author:
            author = get_user_from_alias(rev['author_email'])
            reqcache.set(rev['author_email'], author)
        if not author:
            author = Obj()
            author.email = rev['author_email']
            author.name = None
        rev['author'] = author
        rev['diff'] = render_diff(rev['diff'])
Beispiel #22
0
class Commiters(MethodView):
    decorators = [
        repo_required(admin=True),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member, repo, admin, team, team_member):
        return self.render_template(
                    member=member, repo=repo, organization=organization, \
                    commiters=self.get_commiters(repo), \
                    admin=admin, team=team, team_member=team_member, \
                )

    def post(self, organization, member, repo, admin, team, team_member):
        name = request.form.get('name')
        user = get_user(name)
        if not user:
            return self.render_template(
                        member=member, repo=repo, organization=organization, \
                        commiters = self.get_commiters(repo), \
                        error=code.ACCOUNT_NO_SUCH_USER, \
                        admin=admin, team=team, team_member=team_member, \
                    )
        if user.id == repo.uid:
            return self.render_template(
                        member=member, repo=repo, organization=organization, \
                        commiters = self.get_commiters(repo), \
                        error=code.REPOS_COMMITER_EXISTS, \
                        admin=admin, team=team, team_member=team_member, \
                    )
        is_member = get_organization_member(organization.id, user.id)
        if not is_member:
            return self.render_template(
                        member=member, repo=repo, organization=organization, \
                        commiters = self.get_commiters(repo), \
                        error=code.ORGANIZATION_MEMBER_NOT_EXISTS, \
                        admin=admin, team=team, team_member=team_member, \
                    )
        create_commiter(user, repo, organization, team)
        return redirect(repo.meta.commiter)

    def get_commiters(self, repo):
        commiters = get_repo_commiters(repo.id)
        commiters = (get_user(commiter.uid) for commiter in commiters)
        return commiters
Beispiel #23
0
class Fork(MethodView):
    decorators = [
        gist_require(),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member, gist):
        private = create_token(20) if gist.private else None
        fork_gist, err = create_gist(organization,
                                     g.current_user,
                                     gist.summary,
                                     parent=gist,
                                     private=private,
                                     watchers=1)
        if err:
            return redirect(gist.meta.view)
        return redirect(get_url(organization, fork_gist))
Beispiel #24
0
class Raw(MethodView):
    decorators = [
        gist_require(),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member, gist, path):
        jagare = get_jagare(gist.id, gist.parent)
        error, res = jagare.cat_file(gist.get_real_path(), path)
        if error:
            raise abort(error)
        resp = Response(stream_with_context(res))
        resp.headers['X-Accel-Buffering'] = 'no'
        resp.headers['Cache-Control'] = 'no-cache'
        resp.headers['Content-Type'] = res.headers.get(
            'content-type', 'application/octet-stream')
        return resp
Beispiel #25
0
class Forget(MethodView):
    decorators = [login_required(need=False), csrf_exempt]

    def get(self):
        return self.render_template()

    def post(self):
        email = request.form.get('email', None)
        if not check_email(email):
            return self.render_template(error=code.ACCOUNT_EMAIL_INVAILD)
        user = get_user_by_email(email=email)
        if user:
            stub = create_token(20)
            forget, error = create_forget(user.id, stub)
            if error:
                return self.render_template(error=error)
            send_forget_mail(user, forget)
        return self.render_template(send=code.ACCOUNT_EMAIL_FORGET)
Beispiel #26
0
class Transport(MethodView):
    decorators = [
        repo_required(admin=True),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member, repo, admin, team, team_member):
        return self.render_template(
                    member=member, repo=repo, organization=organization, \
                    admin=admin, team=team, team_member=team_member, \
                )

    def post(self, organization, member, repo, admin, team, team_member):
        name = request.form.get('name')
        user = get_user(name)
        if not user:
            return self.render_template(
                        member=member, repo=repo, organization=organization, \
                        error=code.ACCOUNT_NO_SUCH_USER, \
                        admin=admin, team=team, team_member=team_member, \
                    )
        if user.id == repo.uid:
            return self.render_template(
                        member=member, repo=repo, organization=organization, \
                        error=code.REPOS_CANT_TRANSPORT_SELF, \
                        admin=admin, team=team, team_member=team_member, \
                    )
        is_member = get_organization_member(organization.id, user.id)
        if not is_member:
            return self.render_template(
                        member=member, repo=repo, organization=organization, \
                        error=code.ORGANIZATION_MEMBER_NOT_EXISTS, \
                        admin=admin, team=team, team_member=team_member, \
                    )

        error = transport_repo(organization, user, repo, team)
        if error:
            return self.render_template(
                        member=member, repo=repo, organization=organization, \
                        error=error, \
                        admin=admin, team=team, team_member=team_member, \
                    )
        return redirect(repo.meta.transport)
Beispiel #27
0
class Watchers(MethodView):
    decorators = [
        repo_required(),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member, repo, admin, team, team_member):
        watchers = get_repo_watchers(repo.id)
        return self.render_template(
                    member=member, repo=repo, organization=organization, \
                    watchers=self.render_watchers(watchers), \
                    admin=admin, team=team, team_member=team_member, \
                )

    def render_watchers(self, watchers):
        for watcher in watchers:
            setattr(watcher, 'user', get_user(watcher.uid))
            yield watcher
Beispiel #28
0
class Fork(MethodView):
    decorators = [
        repo_required(),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member, repo, admin, team, team_member):
        return self.render_template(
                    organization=organization, \
                    member=member, \
                    repo=repo, \
                )

    def post(self, organization, member, repo, admin, team, team_member):
        name = request.form.get('name', '')
        summary = request.form.get('summary', '')
        teamname = '' if not team else team.name

        if not check_reponame(name):
            return self.render_template(
                        organization=organization, \
                        member=member, \
                        repo=repo, \
                        error = code.REPOS_NAME_INVALID, \
                    )

        path = os.path.join(teamname, '%s.git' % name)
        fork_repo, error = create_repo(
                name, path, g.current_user, organization, \
                team=team, summary=summary, parent=repo, \
                default=repo.default
        )

        if error:
            return self.render_template(
                        organization=organization, \
                        member=member, \
                        repo=repo, \
                        error = error, \
                    )

        return redirect(get_url(organization, fork_repo))
Beispiel #29
0
class Watchers(MethodView):
    decorators = [
        gist_require(),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member, gist):
        watchers = get_gist_watchers(gist.id)
        return self.render_template(
                    organization=organization, \
                    member=member, \
                    gist=gist, \
                    watchers=self.render_watchers(watchers)
                )

    def render_watchers(self, watchers):
        for watcher in watchers:
            setattr(watcher, 'user', get_user(watcher.uid))
            yield watcher
Beispiel #30
0
class Setting(MethodView):
    decorators = [login_required('account.login')]

    def get(self):
        return self.render_template()

    def post(self):
        user = g.current_user
        password = request.form.get('password', None)
        display = request.form.get('display', None)
        city = request.form.get('city', '')
        title = request.form.get('title', '')

        attrs = {}

        if display != user.display:
            status = check_display(display)
            if not status:
                return self.render_template(
                    error=code.ACCOUNT_USERNAME_INVAILD)
            attrs['display'] = display

        if password:
            status = check_password(password)
            if not status:
                return self.render_template(
                    error=code.ACCOUNT_PASSWORD_INVAILD)
            attrs['password'] = password

        attrs['city'] = city
        attrs['title'] = title

        error = update_account(user, **attrs)
        if error:
            return self.render_template(error=error)

        #relogin
        account_login(user)
        g.current_user = get_current_user()
        return self.render_template(error=code.ACCOUNT_SETTING_SUCCESS)