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))
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)
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)
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)
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}
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))