Beispiel #1
0
def project_subscribe(stub):
    project = Project.query.filter_by(stub=stub).first_or_404()
    if current_user in project.subscribed_users:
        project.subscribed_users.remove(current_user)
    else:
        project.subscribed_users.append(current_user)
    commit_or_rollback()
    return redirect(url_for('.project', stub=project.stub))
Beispiel #2
0
def project_download(stub, build_number):
    """Serves the build file to the client based on the project stub and build number.
    When the download link is fetched, the download counter on a build is updated
    atomically.
    """
    build = Build.query.join(Project)\
                       .filter(Project.stub == stub, Build.number == build_number)\
                       .first_or_404()
    build.downloads = Build.downloads + 1
    commit_or_rollback()
    return send_from_directory(current_app.config['BUILD_DIRECTORY'], build.filename,
                               as_attachment=True)
Beispiel #3
0
def project_edit(stub):
    project = Project.query.filter_by(stub=stub).first_or_404()
    form = forms.ProjectForm(obj=project)

    if form.validate_on_submit():
        form.populate_obj(project)
        if commit_or_rollback():
            return redirect(url_for('.index'))

    return render_template('management/project_form.html', form=form, project=project)
Beispiel #4
0
def project_add():
    form = forms.ProjectForm()

    if form.validate_on_submit():
        project = Project(**form.data)
        db.session.add(project)
        if commit_or_rollback():
            return redirect(url_for('.index'))

    return render_template('management/project_form.html', form=form)
Beispiel #5
0
    def post(self):
        """Adds a new build into Meido. Requires an authorization header, a build number
        and a file. Also accepts commit hash and message.
        """
        parser = reqparse.RequestParser()
        parser.add_argument('Authorization', location='headers')
        parser.add_argument('build_number', required=True, type=int)
        parser.add_argument('commit')
        parser.add_argument('commit_message')
        parser.add_argument('file',
                            required=True,
                            type=FileStorage,
                            location='files')
        self.args = parser.parse_args()

        project = self.get_project()
        filters = {
            'number': self.args.get('build_number'),
            'project': project,
        }
        if models.Build.query.filter_by(**filters).first() is not None:
            message = 'Build with same build number already exists'
            notifications.upload_failed(project, filters['number'], message)
            abort(409, message=message)

        build = self.get_build(project)
        build_file = self.args.get('file')
        destination = pathjoin(current_app.config['BUILD_DIRECTORY'],
                               build.generate_filename(build_file.filename))
        if project.github_shorthand:
            build.get_github_data()
        db.session.add(build)
        if commit_or_rollback():
            build_file.save(destination)
        else:
            message = 'Database error'
            notifications.upload_failed(project, build.number, message)
            abort(500, message=message)
        notifications.upload_successful(project, build.number)
        return {'success': True}
Beispiel #6
0
def project_generate_api_key(stub):
    project = Project.query.filter_by(stub=stub).first_or_404()
    project.generate_api_key()
    commit_or_rollback()
    return redirect(url_for('.project', stub=project.stub))