Ulrich Carmesin
2 years ago
27 changed files with 683 additions and 0 deletions
@ -0,0 +1,8 @@ |
|||
#!/usr/bin/bash |
|||
# script to start development web in webflask - port 5000 |
|||
export FLASK_APP=webflask |
|||
export FLASK_DEBUG=1 |
|||
# flask init-db |
|||
|
|||
flask run |
|||
|
@ -0,0 +1,57 @@ |
|||
import os |
|||
from flask import Flask |
|||
|
|||
|
|||
def create_app(test_config=None): |
|||
# create and configure the app |
|||
app = Flask(__name__, instance_relative_config=True) |
|||
app.config.from_mapping( |
|||
SECRET_KEY='dev', |
|||
DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'), |
|||
) |
|||
|
|||
if test_config is None: |
|||
# load the instance config, if it exists, when not testing |
|||
app.config.from_pyfile('config.py', silent=True) |
|||
else: |
|||
# load the test config if passed in |
|||
app.config.from_mapping(test_config) |
|||
|
|||
# ensure the instance folder exists |
|||
try: |
|||
os.makedirs(app.instance_path) |
|||
except OSError: |
|||
pass |
|||
|
|||
from . import db |
|||
db.init_app(app) |
|||
from . import auth |
|||
from . import index |
|||
from . import testcase |
|||
from . import testsuite |
|||
from . import components |
|||
from . import reports |
|||
from . import environment |
|||
app.register_blueprint(auth.bp) |
|||
app.register_blueprint(index.bp) |
|||
app.register_blueprint(testcase.bp) |
|||
app.register_blueprint(testsuite.bp) |
|||
app.register_blueprint(components.bp) |
|||
app.register_blueprint(reports.bp) |
|||
app.register_blueprint(environment.bp) |
|||
|
|||
# a simple page that says hello |
|||
@app.route('/hello') |
|||
def hello(): |
|||
return 'Hello, World!' |
|||
|
|||
return app |
|||
|
|||
@app.route('/') |
|||
def index(): |
|||
return 'Index Page' |
|||
|
|||
@app.route('/index') |
|||
def index(): |
|||
return 'Index Page 2' |
|||
|
@ -0,0 +1,31 @@ |
|||
# https://flask.palletsprojects.com/en/2.0.x/tutorial/views/ |
|||
# -------------------------------------------------------------- |
|||
import functools |
|||
|
|||
from flask import ( |
|||
Blueprint, flash, g, redirect, render_template, request, session, url_for |
|||
) |
|||
from werkzeug.security import check_password_hash, generate_password_hash |
|||
|
|||
from webflask.db import get_db |
|||
|
|||
bp = Blueprint('testcase', __name__, url_prefix='/testcase') |
|||
|
|||
@bp.route('/selection', methods=('GET', 'POST')) |
|||
def selection(): |
|||
if request.method == 'POST': |
|||
error = None |
|||
|
|||
flash(error) |
|||
|
|||
return render_template('testcase/selection.html') |
|||
|
|||
@bp.route('/overview', methods=('GET', 'POST')) |
|||
def overview(): |
|||
if request.method == 'POST': |
|||
error = None |
|||
|
|||
flash(error) |
|||
|
|||
return render_template('testcase/overview.html') |
|||
|
@ -0,0 +1,92 @@ |
|||
# https://flask.palletsprojects.com/en/2.0.x/tutorial/views/ |
|||
# -------------------------------------------------------------- |
|||
import functools |
|||
|
|||
from flask import ( |
|||
Blueprint, flash, g, redirect, render_template, request, session, url_for |
|||
) |
|||
from werkzeug.security import check_password_hash, generate_password_hash |
|||
|
|||
from webflask.db import get_db |
|||
|
|||
bp = Blueprint('auth', __name__, url_prefix='/auth') |
|||
|
|||
@bp.route('/login', methods=('GET', 'POST')) |
|||
def login(): |
|||
if request.method == 'POST': |
|||
username = request.form['username'] |
|||
password = request.form['password'] |
|||
db = get_db() |
|||
error = None |
|||
user = db.execute( |
|||
'SELECT * FROM user WHERE username = ?', (username,) |
|||
).fetchone() |
|||
|
|||
if user is None: |
|||
error = 'Incorrect username.' |
|||
elif not check_password_hash(user['password'], password): |
|||
error = 'Incorrect password.' |
|||
|
|||
if error is None: |
|||
session.clear() |
|||
session['user_id'] = user['id'] |
|||
return redirect(url_for('index')) |
|||
|
|||
flash(error) |
|||
|
|||
return render_template('auth/login.html') |
|||
|
|||
@bp.route('/register', methods=('GET', 'POST')) |
|||
def register(): |
|||
if request.method == 'POST': |
|||
username = request.form['username'] |
|||
password = request.form['password'] |
|||
db = get_db() |
|||
error = None |
|||
|
|||
if not username: |
|||
error = 'Username is required.' |
|||
elif not password: |
|||
error = 'Password is required.' |
|||
|
|||
if error is None: |
|||
try: |
|||
db.execute( |
|||
"INSERT INTO user (username, password) VALUES (?, ?)", |
|||
(username, generate_password_hash(password)), |
|||
) |
|||
db.commit() |
|||
except db.IntegrityError: |
|||
error = f"User {username} is already registered." |
|||
else: |
|||
return redirect(url_for("auth.login")) |
|||
|
|||
flash(error) |
|||
|
|||
return render_template('auth/register.html') |
|||
|
|||
@bp.before_app_request |
|||
def load_logged_in_user(): |
|||
user_id = session.get('user_id') |
|||
|
|||
if user_id is None: |
|||
g.user = None |
|||
else: |
|||
g.user = get_db().execute( |
|||
'SELECT * FROM user WHERE id = ?', (user_id,) |
|||
).fetchone() |
|||
|
|||
@bp.route('/logout') |
|||
def logout(): |
|||
session.clear() |
|||
return redirect(url_for('index')) |
|||
|
|||
def login_required(view): |
|||
@functools.wraps(view) |
|||
def wrapped_view(**kwargs): |
|||
if g.user is None: |
|||
return redirect(url_for('auth.login')) |
|||
|
|||
return view(**kwargs) |
|||
|
|||
return wrapped_view |
@ -0,0 +1,31 @@ |
|||
# https://flask.palletsprojects.com/en/2.0.x/tutorial/views/ |
|||
# -------------------------------------------------------------- |
|||
import functools |
|||
|
|||
from flask import ( |
|||
Blueprint, flash, g, redirect, render_template, request, session, url_for |
|||
) |
|||
from werkzeug.security import check_password_hash, generate_password_hash |
|||
|
|||
from webflask.db import get_db |
|||
|
|||
bp = Blueprint('components', __name__, url_prefix='/components') |
|||
|
|||
@bp.route('/selection', methods=('GET', 'POST')) |
|||
def selection(): |
|||
if request.method == 'POST': |
|||
error = None |
|||
|
|||
flash(error) |
|||
|
|||
return render_template('components/selection.html') |
|||
|
|||
@bp.route('/overview', methods=('GET', 'POST')) |
|||
def overview(): |
|||
if request.method == 'POST': |
|||
error = None |
|||
|
|||
flash(error) |
|||
|
|||
return render_template('components/overview.html') |
|||
|
@ -0,0 +1,31 @@ |
|||
# https://flask.palletsprojects.com/en/2.0.x/tutorial/views/ |
|||
# -------------------------------------------------------------- |
|||
import functools |
|||
|
|||
from flask import ( |
|||
Blueprint, flash, g, redirect, render_template, request, session, url_for |
|||
) |
|||
from werkzeug.security import check_password_hash, generate_password_hash |
|||
|
|||
from webflask.db import get_db |
|||
|
|||
bp = Blueprint('testcase', __name__, url_prefix='/testcase') |
|||
|
|||
@bp.route('/selection', methods=('GET', 'POST')) |
|||
def selection(): |
|||
if request.method == 'POST': |
|||
error = None |
|||
|
|||
flash(error) |
|||
|
|||
return render_template('testcase/selection.html') |
|||
|
|||
@bp.route('/overview', methods=('GET', 'POST')) |
|||
def overview(): |
|||
if request.method == 'POST': |
|||
error = None |
|||
|
|||
flash(error) |
|||
|
|||
return render_template('testcase/overview.html') |
|||
|
@ -0,0 +1,41 @@ |
|||
# https://flask.palletsprojects.com/en/2.0.x/tutorial/database/ |
|||
# ---------------------------------------------------------------------------- |
|||
import sqlite3 |
|||
|
|||
import click |
|||
from flask import current_app, g |
|||
from flask.cli import with_appcontext |
|||
|
|||
def init_db(): |
|||
db = get_db() |
|||
|
|||
with current_app.open_resource('schema.sql') as f: |
|||
db.executescript(f.read().decode('utf8')) |
|||
|
|||
def get_db(): |
|||
if 'db' not in g: |
|||
g.db = sqlite3.connect( |
|||
current_app.config['DATABASE'], |
|||
detect_types=sqlite3.PARSE_DECLTYPES |
|||
) |
|||
g.db.row_factory = sqlite3.Row |
|||
|
|||
return g.db |
|||
|
|||
|
|||
def close_db(e=None): |
|||
db = g.pop('db', None) |
|||
|
|||
if db is not None: |
|||
db.close() |
|||
|
|||
@click.command('init-db') |
|||
@with_appcontext |
|||
def init_db_command(): |
|||
"""Clear the existing data and create new tables.""" |
|||
init_db() |
|||
click.echo('Initialized the database.') |
|||
|
|||
def init_app(app): |
|||
app.teardown_appcontext(close_db) |
|||
app.cli.add_command(init_db_command) |
@ -0,0 +1,31 @@ |
|||
# https://flask.palletsprojects.com/en/2.0.x/tutorial/views/ |
|||
# -------------------------------------------------------------- |
|||
import functools |
|||
|
|||
from flask import ( |
|||
Blueprint, flash, g, redirect, render_template, request, session, url_for |
|||
) |
|||
from werkzeug.security import check_password_hash, generate_password_hash |
|||
|
|||
from webflask.db import get_db |
|||
|
|||
bp = Blueprint('environment', __name__, url_prefix='/environment') |
|||
|
|||
@bp.route('/selection', methods=('GET', 'POST')) |
|||
def selection(): |
|||
if request.method == 'POST': |
|||
error = None |
|||
|
|||
flash(error) |
|||
|
|||
return render_template('environment/selection.html') |
|||
|
|||
@bp.route('/overview', methods=('GET', 'POST')) |
|||
def overview(): |
|||
if request.method == 'POST': |
|||
error = None |
|||
|
|||
flash(error) |
|||
|
|||
return render_template('environment/overview.html') |
|||
|
@ -0,0 +1,23 @@ |
|||
# https://flask.palletsprojects.com/en/2.0.x/tutorial/views/ |
|||
# -------------------------------------------------------------- |
|||
import functools |
|||
|
|||
from flask import ( |
|||
Blueprint, flash, g, redirect, render_template, request, session, url_for |
|||
) |
|||
from werkzeug.security import check_password_hash, generate_password_hash |
|||
|
|||
from webflask.db import get_db |
|||
|
|||
bp = Blueprint('index', __name__, url_prefix='/') |
|||
|
|||
@bp.route('/', methods=('GET', 'POST')) |
|||
def index(): |
|||
if request.method == 'POST': |
|||
error = None |
|||
|
|||
flash(error) |
|||
|
|||
return render_template('index.html') |
|||
|
|||
|
@ -0,0 +1,31 @@ |
|||
# https://flask.palletsprojects.com/en/2.0.x/tutorial/views/ |
|||
# -------------------------------------------------------------- |
|||
import functools |
|||
|
|||
from flask import ( |
|||
Blueprint, flash, g, redirect, render_template, request, session, url_for |
|||
) |
|||
from werkzeug.security import check_password_hash, generate_password_hash |
|||
|
|||
from webflask.db import get_db |
|||
|
|||
bp = Blueprint('reports', __name__, url_prefix='/reports') |
|||
|
|||
@bp.route('/selection', methods=('GET', 'POST')) |
|||
def selection(): |
|||
if request.method == 'POST': |
|||
error = None |
|||
|
|||
flash(error) |
|||
|
|||
return render_template('reports/selection.html') |
|||
|
|||
@bp.route('/overview', methods=('GET', 'POST')) |
|||
def overview(): |
|||
if request.method == 'POST': |
|||
error = None |
|||
|
|||
flash(error) |
|||
|
|||
return render_template('reports/overview.html') |
|||
|
@ -0,0 +1,17 @@ |
|||
DROP TABLE IF EXISTS user; |
|||
DROP TABLE IF EXISTS post; |
|||
|
|||
CREATE TABLE user ( |
|||
id INTEGER PRIMARY KEY AUTOINCREMENT, |
|||
username TEXT UNIQUE NOT NULL, |
|||
password TEXT NOT NULL |
|||
); |
|||
|
|||
CREATE TABLE post ( |
|||
id INTEGER PRIMARY KEY AUTOINCREMENT, |
|||
author_id INTEGER NOT NULL, |
|||
created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
|||
title TEXT NOT NULL, |
|||
body TEXT NOT NULL, |
|||
FOREIGN KEY (author_id) REFERENCES user (id) |
|||
); |
@ -0,0 +1,20 @@ |
|||
addEventListener("load", addCollaps); |
|||
function addCollaps() { |
|||
var coll = document.getElementsByClassName("collapsible"); |
|||
for (var c of coll) { |
|||
c.addEventListener("click", function() { |
|||
this.nextElementSibling.classList.toggle("collapsed"); |
|||
}); |
|||
} |
|||
} |
|||
// TODO : kann raus
|
|||
function loadJson(filename, callback) { |
|||
var xhr = XMLHttpRequest(); |
|||
xhr.onreadystatechange = function() { |
|||
if(this.readyState == 4 && this.status == 200) { |
|||
callback(JSON.parse(xhr.responseText)); |
|||
} |
|||
} |
|||
xhr.open(get, filename); |
|||
xhr.send(); |
|||
} |
@ -0,0 +1,31 @@ |
|||
html { font-family: sans-serif; background: #eee; padding: 1rem; } |
|||
body { max-width: 960px; margin: 0 auto; background: white; } |
|||
h1 { font-family: serif; color: #377ba8; margin: 1rem 0; } |
|||
a { color: #377ba8; } |
|||
hr { border: none; border-top: 1px solid lightgray; } |
|||
nav { background: lightgray; display: flex; align-items: center; padding: 0 0.5rem; } |
|||
nav h1 { flex: auto; margin: 0; } |
|||
nav h1 a { text-decoration: none; padding: 0.25rem 0.5rem; } |
|||
nav ul { display: flex; list-style: none; margin: 0; padding: 0; } |
|||
nav ul li a, nav ul li span, header .action { display: block; padding: 0.5rem; } |
|||
.content { padding: 0 1rem 1rem; } |
|||
.content > header { border-bottom: 1px solid lightgray; display: flex; align-items: flex-end; } |
|||
.content > header h1 { flex: auto; margin: 1rem 0 0.25rem 0; } |
|||
.flash { margin: 1em 0; padding: 1em; background: #cae6f6; border: 1px solid #377ba8; } |
|||
.post > header { display: flex; align-items: flex-end; font-size: 0.85em; } |
|||
.post > header > div:first-of-type { flex: auto; } |
|||
.post > header h1 { font-size: 1.5em; margin-bottom: 0; } |
|||
.post .about { color: slategray; font-style: italic; } |
|||
.post .body { white-space: pre-line; } |
|||
.content:last-child { margin-bottom: 0; } |
|||
.content form { margin: 1em 0; display: flex; flex-direction: column; } |
|||
.content label { font-weight: bold; margin-bottom: 0.5em; } |
|||
.content input, .content textarea { margin-bottom: 1em; } |
|||
.content textarea { min-height: 12em; resize: vertical; } |
|||
input.danger { color: #cc2f2e; } |
|||
input[type=submit] { align-self: start; min-width: 10em; } |
|||
.collapsible { background-color: #777; color: white; cursor: pointer; padding: 5px; width: 100%; |
|||
border: none; text-align: left; outline: none; font-size: 15px; } |
|||
.collapsed { padding: 0 18px; display: none; overflow: hidden; } |
|||
.active, .collapsible:hover { background-color: #ccc; } |
|||
|
@ -0,0 +1,9 @@ |
|||
{% extends 'base.html' %} |
|||
|
|||
{% block header %} |
|||
<h1>{% block title %}Overview{% endblock %}</h1> |
|||
{% endblock %} |
|||
|
|||
{% block content %} |
|||
<p>Hier kommt Inhalt rein</p> |
|||
{% endblock %} |
@ -0,0 +1,16 @@ |
|||
{% extends 'base.html' %} |
|||
|
|||
{% block header %} |
|||
<h1>{% block title %}Log In{% endblock %}</h1> |
|||
{% endblock %} |
|||
|
|||
{% block content %} |
|||
<form method="post"> |
|||
<label for="username">Username</label> |
|||
<input name="username" id="username" required> |
|||
<label for="password">Password</label> |
|||
<input type="password" name="password" id="password" required> |
|||
<input type="submit" value="Log In"> |
|||
</form> |
|||
<p>hiermit sollte ein Workspace geoeffnet werden <br/> - bestehend aus eigenem testdata-repo und components-repo.</p> |
|||
{% endblock %} |
@ -0,0 +1,17 @@ |
|||
{% extends 'base.html' %} |
|||
|
|||
{% block header %} |
|||
<h1>{% block title %}Register{% endblock %}</h1> |
|||
{% endblock %} |
|||
|
|||
{% block content %} |
|||
<form method="post"> |
|||
<label for="username">Username</label> |
|||
<input name="username" id="username" required> |
|||
<label for="password">Password</label> |
|||
<input type="password" name="password" id="password" required> |
|||
<input type="submit" value="Register"> |
|||
</form> |
|||
<p>Durch das Registrieren sollte ein Workspace angelegt werden <br/> |
|||
- bestehend aus eine testdata-repo und einem components-repo </p> |
|||
{% endblock %} |
@ -0,0 +1,40 @@ |
|||
<!doctype html> |
|||
<head> |
|||
<title>{% block title %}{% endblock %} - Datest</title> |
|||
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}"> |
|||
<script type="text/javascript" src="{{ url_for('static', filename='script.js') }}"></script> |
|||
<script> |
|||
var jsonData = "{{ get_json() }}"; |
|||
</script> |
|||
</head> |
|||
<body> |
|||
<nav> |
|||
<h1>Datest</h1> |
|||
<ul> |
|||
{% if g.user %} |
|||
<li><span>{{ g.user['username'] }}</span> |
|||
<li><a href="{{ url_for('testcase.overview') }}">Testcase</a> |
|||
<li><a href="{{ url_for('testsuite.overview') }}">Testsuite</a> |
|||
<li><a href="{{ url_for('reports.overview') }}">Reports</a> |
|||
<li><a href="{{ url_for('components.overview') }}">Components</a> |
|||
<li><a href="{{ url_for('auth.logout') }}">Log Out</a> |
|||
{% else %} |
|||
<li><a href="{{ url_for('testcase.overview') }}">Testcase</a> |
|||
<li><a href="{{ url_for('testsuite.overview') }}">Testsuite</a> |
|||
<li><a href="{{ url_for('reports.overview') }}">Reports</a> |
|||
<li><a href="{{ url_for('components.overview') }}">Components</a> |
|||
<li><a href="{{ url_for('auth.register') }}">Register</a> |
|||
<li><a href="{{ url_for('auth.login') }}">Log In</a> |
|||
{% endif %} |
|||
</ul> |
|||
</nav> |
|||
<section class="content"> |
|||
<header> |
|||
{% block header %}{% endblock %} |
|||
</header> |
|||
{% for message in get_flashed_messages() %} |
|||
<div class="flash">{{ message }}</div> |
|||
{% endfor %} |
|||
{% block content %}{% endblock %} |
|||
</section> |
|||
</body> |
@ -0,0 +1,9 @@ |
|||
{% extends 'base.html' %} |
|||
|
|||
{% block header %} |
|||
<h1>{% block title %}Overview{% endblock %}</h1> |
|||
{% endblock %} |
|||
|
|||
{% block content %} |
|||
<p>Hier kommt Inhalt rein</p> |
|||
{% endblock %} |
@ -0,0 +1,9 @@ |
|||
{% extends 'base.html' %} |
|||
|
|||
{% block header %} |
|||
<h1>{% block title %}Overview{% endblock %}</h1> |
|||
{% endblock %} |
|||
|
|||
{% block content %} |
|||
<p>Hier kommt Inhalt rein</p> |
|||
{% endblock %} |
@ -0,0 +1,12 @@ |
|||
{% extends 'base.html' %} |
|||
|
|||
{% block header %} |
|||
<h1>{% block title %}Overview{% endblock %}</h1> |
|||
{% endblock %} |
|||
|
|||
{% block content %} |
|||
<p>Hier kommt Inhalt rein:<br/> |
|||
- info Datest allgemein -> ucarmesin.de/joomla |
|||
- Bereiche Testfaelle (anzahl) |
|||
- letzte Updates (git log) </p> |
|||
{% endblock %} |
@ -0,0 +1,9 @@ |
|||
{% extends 'base.html' %} |
|||
|
|||
{% block header %} |
|||
<h1>{% block title %}Overview{% endblock %}</h1> |
|||
{% endblock %} |
|||
|
|||
{% block content %} |
|||
<p>Hier kommt Inhalt rein</p> |
|||
{% endblock %} |
@ -0,0 +1,32 @@ |
|||
{% extends 'base.html' %} |
|||
|
|||
{% block header %} |
|||
<h1>{% block title %}Overview{% endblock %}</h1> |
|||
{% endblock %} |
|||
|
|||
{% block content %} |
|||
<p>Hier kommt Inhalt rein. <br/> |
|||
Bei angemeldetem User kann auf das eigene Repo schreibend zugegriffen werden, |
|||
als Gast nur lesend auf die Vorlage.</p> |
|||
<p>Statistische Daten zu dem Testfaellen: <br/> |
|||
- Anzahl in Projekten und Anwendungen <br/> |
|||
- letzte Durchfuehrungen (log) <br/> |
|||
- letzte Aenderungen (git log) <br/> |
|||
- info zu Begriff Testfall -> ucarmesin.de/joomla <br/> |
|||
- Suchfeld fuer speziellen Testfall -> Anzeige des Testfalls </p> |
|||
<button type="button" class="collapsible" data-toggle="collapse">Block Head/Option</button> |
|||
<div class="content collapsed" id="collapseOptions"> |
|||
<p>Diese Attribute ordnen den Testfall in einen Kontext ein und setzen Bearbeitungsparameter fuer die Durchfuehrung.</p> |
|||
</div> |
|||
<button type="button" class="collapsible" data-toggle="collapse">Block Steps</button> |
|||
<div class="content collapsed" id="collapseSteps"> |
|||
<p>Diese Attribute beschreiben die Schritte, die waehrend der Durchfuehrungsphase ausgefuehrt werden. |
|||
Die benoetigten Testdaten werden aus den Tabellen referenziert.</p> |
|||
</div> |
|||
<button type="collapscontent" class="collapsible" data-toggle="collapse">Block Tabellen</button> |
|||
<div class="content collapsed" id="collapseTables"> |
|||
<p>In den Tabellen sind die Testdaten hinterlegt, die waehrend der Initialisierungsphase vorbefuellt werden |
|||
oder waehrend der Durchfuehrungsphase eingespielt werden.</p> |
|||
</div> |
|||
|
|||
{% endblock %} |
@ -0,0 +1,9 @@ |
|||
{% extends 'base.html' %} |
|||
|
|||
{% block header %} |
|||
<h1>{% block title %}Overview{% endblock %}</h1> |
|||
{% endblock %} |
|||
|
|||
{% block content %} |
|||
<p>Hier kommt Inhalt rein</p> |
|||
{% endblock %} |
@ -0,0 +1,41 @@ |
|||
# https://flask.palletsprojects.com/en/2.0.x/tutorial/views/ |
|||
# -------------------------------------------------------------- |
|||
import functools |
|||
import utils.config_tool |
|||
|
|||
from flask import ( |
|||
Blueprint, flash, g, redirect, render_template, request, session, url_for |
|||
) |
|||
from werkzeug.security import check_password_hash, generate_password_hash |
|||
|
|||
from webflask.db import get_db |
|||
|
|||
bp = Blueprint('testcase', __name__, url_prefix='/testcase') |
|||
|
|||
@bp.route('/selection', methods=('GET', 'POST')) |
|||
def selection(): |
|||
if request.method == 'POST': |
|||
error = None |
|||
|
|||
flash(error) |
|||
|
|||
return render_template('testcase/selection.html') |
|||
|
|||
@bp.route('/overview', methods=('GET', 'POST')) |
|||
def overview(): |
|||
""" |
|||
it shows an overview to testcase |
|||
:param: nothing |
|||
:return: rendered page with jsondata |
|||
* info with link to ucarmesin.de/joomla |
|||
* last git-updates (specifications) |
|||
* last executions (-> reports) with status running|to-check|with-faults|ok |
|||
* selection of conrete testcase by application, testsuite, project, regex?, full name |
|||
""" |
|||
if request.method == 'POST': |
|||
error = None |
|||
|
|||
flash(error) |
|||
|
|||
return render_template('testcase/overview.html') |
|||
|
@ -0,0 +1,31 @@ |
|||
# https://flask.palletsprojects.com/en/2.0.x/tutorial/views/ |
|||
# -------------------------------------------------------------- |
|||
import functools |
|||
|
|||
from flask import ( |
|||
Blueprint, flash, g, redirect, render_template, request, session, url_for |
|||
) |
|||
from werkzeug.security import check_password_hash, generate_password_hash |
|||
|
|||
from webflask.db import get_db |
|||
|
|||
bp = Blueprint('testsuite', __name__, url_prefix='/testsuite') |
|||
|
|||
@bp.route('/selection', methods=('GET', 'POST')) |
|||
def selection(): |
|||
if request.method == 'POST': |
|||
error = None |
|||
|
|||
flash(error) |
|||
|
|||
return render_template('testsuite/selection.html') |
|||
|
|||
@bp.route('/overview', methods=('GET', 'POST')) |
|||
def overview(): |
|||
if request.method == 'POST': |
|||
error = None |
|||
|
|||
flash(error) |
|||
|
|||
return render_template('testsuite/overview.html') |
|||
|
Loading…
Reference in new issue