Browse Source

Add project update

master
Burathar 4 years ago
parent
commit
135f199c03
  1. 4
      biscd/biscd/errors.py
  2. 16
      biscd/biscd/froms.py
  3. 4
      biscd/biscd/models/project.py
  4. 36
      biscd/biscd/routes.py
  5. 3
      biscd/biscd/templates/400.html
  6. 6
      biscd/biscd/templates/401.html
  7. 3
      biscd/biscd/templates/project.html
  8. 15
      biscd/biscd/templates/project_add.html
  9. 20
      biscd/biscd/templates/project_settings.html
  10. 21
      installation-files/projects_example.yaml

4
biscd/biscd/errors.py

@ -5,6 +5,10 @@ from biscd import app, utils
def bad_request(error): def bad_request(error):
return render_template('400.html', title='400', error=error), 400 return render_template('400.html', title='400', error=error), 400
@app.errorhandler(401)
def unauthorized_error(error):
return render_template('401.html', title='401'), 401
@app.errorhandler(404) @app.errorhandler(404)
def not_found_error(error): def not_found_error(error):
return render_template('404.html', title='404'), 404 return render_template('404.html', title='404'), 404

16
biscd/biscd/froms.py

@ -1,6 +1,7 @@
from flask_wtf import FlaskForm from flask_wtf import FlaskForm
from wtforms import SubmitField, StringField, PasswordField, BooleanField from wtforms import SubmitField, StringField, PasswordField, BooleanField
from wtforms.validators import DataRequired, Email, EqualTo, Length, ValidationError from wtforms.validators import DataRequired, Email, EqualTo, Length, ValidationError
from git import cmd as git_cmd, GitCommandError
from .models import User, Project from .models import User, Project
@ -28,14 +29,27 @@ class RegistrationForm(FlaskForm):
if any(user): if any(user):
raise ValidationError('Please use a different email adress.') raise ValidationError('Please use a different email adress.')
class NewProjectForm(FlaskForm): class ProjectForm(FlaskForm):
projectname = StringField('Project Name', validators=[DataRequired()]) projectname = StringField('Project Name', validators=[DataRequired()])
git_repo = StringField('Git Repo')
public = BooleanField('Public Project')
submit = SubmitField('Add Project') submit = SubmitField('Add Project')
old_name = ''
def validate_projectname(self, projectname): def validate_projectname(self, projectname):
if projectname.data == self.old_name:
return
project = Project.get(name=projectname.data) project = Project.get(name=projectname.data)
if any(project): if any(project):
raise ValidationError('Please use a different projectname.') raise ValidationError('Please use a different projectname.')
def validate_git_repo(self, git_repo):
if not git_repo.data:
return
try:
git_cmd.Git().ls_remote(git_repo.data)
except GitCommandError as gce:
raise ValidationError('Please enter a valid git repository url') from gce
class EmptyForm(FlaskForm): class EmptyForm(FlaskForm):
submit = SubmitField('Submit') submit = SubmitField('Submit')

4
biscd/biscd/models/project.py

@ -22,12 +22,12 @@ class Project(YamlSerializable):
def _yaml_object_name(cls): def _yaml_object_name(cls):
return 'projects' return 'projects'
def __init__(self, name=None, branch='master'): def __init__(self, name=None, branch='master', git_repo = None):
super().__init__() super().__init__()
self.name = name self.name = name
self.branch = branch self.branch = branch
self.relative_production_path = None self.relative_production_path = None
self.git_repo = None self.git_repo = git_repo
self.access = {'public': False, 'owners': []} self.access = {'public': False, 'owners': []}
def __eq__(self, other): def __eq__(self, other):

36
biscd/biscd/routes.py

@ -4,7 +4,7 @@ from werkzeug.urls import url_parse
from biscd import app from biscd import app
from .utils import flash_result from .utils import flash_result
from .models import Project, User from .models import Project, User
from .froms import NewProjectForm, LoginForm, RegistrationForm from .froms import ProjectForm, LoginForm, RegistrationForm
@app.route('/', methods=['GET', 'POST']) @app.route('/', methods=['GET', 'POST'])
@app.route('/index', methods=['GET', 'POST']) @app.route('/index', methods=['GET', 'POST'])
@ -59,14 +59,40 @@ def public_projects():
@app.route('/project/add', methods=['GET', 'POST']) @app.route('/project/add', methods=['GET', 'POST'])
@login_required @login_required
def project_add(): def project_add():
form = NewProjectForm() project = Project(name='')
form = ProjectForm()
if form.validate_on_submit(): if form.validate_on_submit():
project = Project(name=form.projectname.data) project = Project(name=form.projectname.data, git_repo=form.git_repo.data)
project.access['owners'] = [current_user.name] project.access['public'] = form.public.data
if project.access['owners'] == []:
project.access['owners'] = [current_user.name]
project.save() project.save()
flash('Your project is created!', 'success') flash('Your project is created!', 'success')
return redirect(url_for('project_dashboard', project_name=project.name)) return redirect(url_for('project_dashboard', project_name=project.name))
return render_template('project_add.html', form=form) return render_template('project_settings.html', form=form, project=project)
@app.route('/project/<project_name>/settings', methods=['GET', 'POST'])
@login_required
def project_change_settings(project_name):
project = Project.first_or_404(name=project_name)
if project.user_access(current_user) != 'Owner':
abort(401)
form = ProjectForm()
form.old_name = project.name
if request.method == 'GET':
# pylint: disable=no-member
form.process()
form.public.data = project.access.get('public', False)
if form.validate_on_submit():
project = Project(name=form.projectname.data, git_repo=form.git_repo.data)
project.access['public'] = form.public.data
if project.access['owners'] == []:
project.access['owners'] = [current_user.name]
project.save()
flash(f"{project.name} was updated!", 'success')
return redirect(url_for('project_dashboard', project_name=project.name))
return render_template('project_settings.html', form=form, project=project)
@app.route('/project/<project_name>', methods=['GET']) @app.route('/project/<project_name>', methods=['GET'])
def project_dashboard(project_name): def project_dashboard(project_name):

3
biscd/biscd/templates/400.html

@ -1,10 +1,9 @@
{% extends "base.html" %} {% extends "base.html" %}
{% block app_content %} {% block app_content %}
<h1>404 Page Not Found</h1> <h1>400 Bad Request</h1>
<p><a href="{{ url_for('index') }}">Back</a></p> <p><a href="{{ url_for('index') }}">Back</a></p>
<h1>400 Bad Request</h1>
<h2>Error Message:</h2> <h2>Error Message:</h2>
{{ error }} {{ error }}
{% endblock %} {% endblock %}

6
biscd/biscd/templates/401.html

@ -0,0 +1,6 @@
{% extends "base.html" %}
{% block app_content %}
<h1>401 Unauthorized</h1>
<p><a href="{{ url_for('index') }}">Back</a></p>
{% endblock %}

3
biscd/biscd/templates/project.html

@ -5,6 +5,9 @@
<h1>{{ project.name }}</h1> <h1>{{ project.name }}</h1>
{% if owner %} {% if owner %}
<row> <row>
<a href="{{ url_for('project_change_settings', project_name=project.name) }}">
<button class="btn btn-primary">Change Settings</button>
</a>
<a href="{{ url_for('project_update', project_name=project.name) }}"> <a href="{{ url_for('project_update', project_name=project.name) }}">
<button class="btn btn-success">Update Repo</button> <button class="btn btn-success">Update Repo</button>
</a> </a>

15
biscd/biscd/templates/project_add.html

@ -1,15 +0,0 @@
{% extends "base.html" %}
{% import 'bootstrap/wtf.html' as wtf %}
{% block app_content %}
<div class="row">
<div class="col-xs-0 col-md-1"></div>
<div class="col-xs-8 col-md-4">
<h1>Add Project</h1>
<br>
{{ wtf.quick_form(form, button_map={'submit': 'primary'}) }}
</div>
<div class="col-xs-0 col-md-7"></div>
</div>
{% endblock %}

20
biscd/biscd/templates/project_settings.html

@ -0,0 +1,20 @@
{% extends "base.html" %}
{% import 'bootstrap/wtf.html' as wtf %}
{% block app_content %}
<div class="row">
<div class="col-xs-0 col-md-1"></div>
<div class="col-xs-8 col-md-4">
<div class="row">
<form action="" method="post" class="form" role="form">
{{ form.hidden_tag() }}
{{ wtf.form_field(form.projectname, class='form-control', value=project.name) }}
{{ wtf.form_field(form.git_repo, class='form-control', value=(project.git_repo or '')) }}
{{ wtf.form_field(form.public, class='form-control') }}
{{ wtf.form_field(form.submit, class='btn btn-primary', value="Update") }}
</form>
</div>
</div>
</div>
{% endblock %}

21
installation-files/projects_example.yaml

@ -1,18 +1,31 @@
projects: projects:
- The Hunt: - The Hunt:
access:
owners:
- Carl
public: true
branch: master
git_repo: https://git.sciuro.org/Burathar/The-Hunt
- Foo:
branch: master branch: master
git_repo: https://git.sciuro.org/Burathar/The-Hunt git_repo: https://git.sciuro.org/Burathar/The-Hunt
relative_production_path: Foo045878
requirements_file: requirements.txt requirements_file: requirements.txt
secret: thisissecret secret: thisissecret
tests: tests.py tests: tests.py
- Bar:
access: access:
public: true public: false
owners:
- Carl
- Foo:
branch: master branch: master
git_repo: https://git.sciuro.org/Burathar/The-Hunt git_repo: https://git.sciuro.org/Burathar/The-Hunt
relative_production_path: Foo045878 relative_production_path: Foo045878
requirements_file: requirements.txt requirements_file: requirements.txt
secret: thisissecret secret: thisissecret
tests: tests.py tests: tests.py
- biscd:
access:
owners:
- Carl
public: false
branch: master
git_repo: git@git.sciuro.org:Burathar/biscd.git
Loading…
Cancel
Save