login für den finanzer
übersicht für den finanzer finanzer kann ausgleiche hinzufügen TODO: der Code sieht ekelhaft aus bis zum gehtnicht mehr ... vltt verbessern?
This commit is contained in:
parent
9f796caa8e
commit
4648aa8b0c
|
@ -1,11 +1,17 @@
|
||||||
from flask import Flask, g
|
from flask import Flask, g
|
||||||
from flask_sqlalchemy import SQLAlchemy
|
from flask_sqlalchemy import SQLAlchemy
|
||||||
|
from flask_bcrypt import Bcrypt
|
||||||
|
from flask_login import LoginManager
|
||||||
|
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
app.config['SECRET_KEY'] = '0a657b97ef546da90b2db91862ad4e29'
|
app.config['SECRET_KEY'] = '0a657b97ef546da90b2db91862ad4e29'
|
||||||
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
|
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
|
||||||
db = SQLAlchemy(app)
|
db = SQLAlchemy(app)
|
||||||
|
bcrypt = Bcrypt(app)
|
||||||
|
login_manager = LoginManager(app)
|
||||||
|
login_manager.login_view = 'login'
|
||||||
|
login_manager.login_message_category = 'info'
|
||||||
|
|
||||||
|
|
||||||
from geruecht import routes
|
from geruecht import routes
|
|
@ -1,5 +1,5 @@
|
||||||
from flask_wtf import FlaskForm
|
from flask_wtf import FlaskForm
|
||||||
from wtforms import StringField, SubmitField
|
from wtforms import StringField, SubmitField, PasswordField;
|
||||||
from wtforms.validators import DataRequired, Length, ValidationError
|
from wtforms.validators import DataRequired, Length, ValidationError
|
||||||
from geruecht.model import User
|
from geruecht.model import User
|
||||||
|
|
||||||
|
@ -14,3 +14,10 @@ class RegistrationForm(FlaskForm):
|
||||||
|
|
||||||
if user:
|
if user:
|
||||||
raise ValidationError('Bist du behindert!? Der Name ist vergeben!!')
|
raise ValidationError('Bist du behindert!? Der Name ist vergeben!!')
|
||||||
|
|
||||||
|
|
||||||
|
class FinanzerLogin(FlaskForm):
|
||||||
|
username = StringField('Name', validators=[DataRequired(), Length(min=2, max=20)])
|
||||||
|
password = PasswordField('Password', validators=[DataRequired()])
|
||||||
|
submit = SubmitField('Login')
|
||||||
|
|
||||||
|
|
|
@ -1,20 +1,313 @@
|
||||||
from geruecht import db
|
from geruecht import db, login_manager
|
||||||
from threading import Timer
|
from threading import Timer
|
||||||
|
from flask_login import UserMixin
|
||||||
|
from datetime import date
|
||||||
|
|
||||||
|
|
||||||
|
@login_manager.user_loader
|
||||||
|
def load_finanzer(finanzer_id):
|
||||||
|
return Finanzer.query.get(int(finanzer_id))
|
||||||
|
|
||||||
|
|
||||||
class User(db.Model):
|
class User(db.Model):
|
||||||
id = db.Column(db.Integer, primary_key=True)
|
id = db.Column(db.Integer, primary_key=True)
|
||||||
username = db.Column(db.String(20), unique=True, nullable=False)
|
username = db.Column(db.String(20), unique=True, nullable=False)
|
||||||
sum = db.Column(db.Float, nullable=False, default=0.0)
|
sum = db.Column(db.Float, nullable=False, default=0.0)
|
||||||
|
|
||||||
|
jan = db.Column(db.Float, nullable=False, default=0)
|
||||||
|
jan_sub = db.Column(db.Float, nullable=False, default=0)
|
||||||
|
jan_year = db.Column(db.Integer, nullable=False, default=date.today().year)
|
||||||
|
|
||||||
|
feb = db.Column(db.Float, nullable=False, default=0)
|
||||||
|
feb_sub = db.Column(db.Float, nullable=False, default=0)
|
||||||
|
feb_year = db.Column(db.Integer, nullable=False, default=date.today().year)
|
||||||
|
|
||||||
|
maer = db.Column(db.Float, nullable=False, default=0)
|
||||||
|
maer_sub = db.Column(db.Float, nullable=False, default=0)
|
||||||
|
maer_year = db.Column(db.Integer, nullable=False, default=date.today().year)
|
||||||
|
|
||||||
|
apr = db.Column(db.Float, nullable=False, default=0)
|
||||||
|
apr_sub = db.Column(db.Float, nullable=False, default=0)
|
||||||
|
apr_year = db.Column(db.Integer, nullable=False, default=date.today().year)
|
||||||
|
|
||||||
|
mai = db.Column(db.Float, nullable=False, default=0)
|
||||||
|
mai_sub = db.Column(db.Float, nullable=False, default=0)
|
||||||
|
mai_year = db.Column(db.Integer, nullable=False, default=date.today().year)
|
||||||
|
|
||||||
|
jun = db.Column(db.Float, nullable=False, default=0)
|
||||||
|
jun_sub = db.Column(db.Float, nullable=False, default=0)
|
||||||
|
jun_year = db.Column(db.Integer, nullable=False, default=date.today().year)
|
||||||
|
|
||||||
|
jul = db.Column(db.Float, nullable=False, default=0)
|
||||||
|
jul_sub = db.Column(db.Float, nullable=False, default=0)
|
||||||
|
jul_year = db.Column(db.Integer, nullable=False, default=date.today().year)
|
||||||
|
|
||||||
|
aug = db.Column(db.Float, nullable=False, default=0)
|
||||||
|
aug_sub = db.Column(db.Float, nullable=False, default=0)
|
||||||
|
aug_year = db.Column(db.Integer, nullable=False, default=date.today().year)
|
||||||
|
|
||||||
|
sep = db.Column(db.Float, nullable=False, default=0)
|
||||||
|
sep_sub = db.Column(db.Float, nullable=False, default=0)
|
||||||
|
sep_year = db.Column(db.Integer, nullable=False, default=date.today().year)
|
||||||
|
|
||||||
|
okt = db.Column(db.Float, nullable=False, default=0)
|
||||||
|
okt_sub = db.Column(db.Float, nullable=False, default=0)
|
||||||
|
okt_year = db.Column(db.Integer, nullable=False, default=date.today().year)
|
||||||
|
|
||||||
|
nov = db.Column(db.Float, nullable=False, default=0)
|
||||||
|
nov_sub = db.Column(db.Float, nullable=False, default=0)
|
||||||
|
nov_year = db.Column(db.Integer, nullable=False, default=date.today().year)
|
||||||
|
|
||||||
|
dez = db.Column(db.Float, nullable=False, default=0)
|
||||||
|
dez_sub = db.Column(db.Float, nullable=False, default=0)
|
||||||
|
dez_year = db.Column(db.Integer, nullable=False, default=date.today().year)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def getsum(self):
|
||||||
|
jan = self.jan - self.jan_sub
|
||||||
|
feb = self.feb - self.feb_sub
|
||||||
|
maer = self.maer - self.maer_sub
|
||||||
|
apr = self.apr - self.apr_sub
|
||||||
|
mai = self.mai - self.mai_sub
|
||||||
|
jun = self.jun - self.jun_sub
|
||||||
|
jul = self.jul - self.jul_sub
|
||||||
|
aug = self.aug - self.aug_sub
|
||||||
|
sep = self.sep - self.sep_sub
|
||||||
|
okt = self.okt - self.okt_sub
|
||||||
|
nov = self.nov - self.nov_sub
|
||||||
|
dez = self.dez - self.dez_sub
|
||||||
|
|
||||||
|
result = jan + feb + maer + apr + mai + jun + jul + aug + sep + okt + nov + dez
|
||||||
|
return result
|
||||||
|
|
||||||
|
def add_sub(self, value):
|
||||||
|
year = date.today().year
|
||||||
|
month = date.today().month
|
||||||
|
|
||||||
|
if month == 1:
|
||||||
|
if year == self.jan_year:
|
||||||
|
self.jan_sub += value
|
||||||
|
else:
|
||||||
|
self.jan = 0
|
||||||
|
self.jan_sub = value
|
||||||
|
self.jan_year = year;
|
||||||
|
elif month == 2:
|
||||||
|
if year == self.feb_year:
|
||||||
|
self.feb_sub += value
|
||||||
|
else:
|
||||||
|
self.feb = 0
|
||||||
|
self.feb_sub = value
|
||||||
|
self.feb_year = year
|
||||||
|
elif month == 3:
|
||||||
|
if year == self.maer_year:
|
||||||
|
self.maer_sub += value
|
||||||
|
else:
|
||||||
|
self.maer = 0
|
||||||
|
self.maer_sub = value
|
||||||
|
self.maer_year = year
|
||||||
|
elif month == 4:
|
||||||
|
if year == self.apr_year:
|
||||||
|
self.apr_sub += value
|
||||||
|
else:
|
||||||
|
self.apr = 0
|
||||||
|
self.apr_sub = value
|
||||||
|
self.apr_year = year
|
||||||
|
elif month == 5:
|
||||||
|
if year == self.mai_year:
|
||||||
|
self.mai_sub += value
|
||||||
|
else:
|
||||||
|
self.mai = 0
|
||||||
|
self.mai_sub = value
|
||||||
|
self.mai_year = year
|
||||||
|
elif month == 6:
|
||||||
|
if year == self.jun_year:
|
||||||
|
self.jun_sub += value
|
||||||
|
else:
|
||||||
|
self.jun = 0
|
||||||
|
self.jun_sub = value
|
||||||
|
self.jun_year = year
|
||||||
|
elif month == 7:
|
||||||
|
if year == self.jul_year:
|
||||||
|
self.jul_sub += value
|
||||||
|
else:
|
||||||
|
self.jul = 0
|
||||||
|
self.jul_sub = value
|
||||||
|
self.jul_year = year
|
||||||
|
elif month == 8:
|
||||||
|
if year == self.aug_year:
|
||||||
|
self.aug_sub += value
|
||||||
|
else:
|
||||||
|
self.aug = 0
|
||||||
|
self.aug_sub = value
|
||||||
|
self.aug_year = year
|
||||||
|
elif month == 9:
|
||||||
|
if year == self.sep_year:
|
||||||
|
self.sep_sub += value
|
||||||
|
else:
|
||||||
|
self.sep = 0
|
||||||
|
self.sep_sub = value
|
||||||
|
self.sep_year = year
|
||||||
|
elif month == 10:
|
||||||
|
if year == self.okt_year:
|
||||||
|
self.okt_sub += value
|
||||||
|
else:
|
||||||
|
self.okt = 0
|
||||||
|
self.okt_sub = value
|
||||||
|
self.okt_year = year
|
||||||
|
elif month == 11:
|
||||||
|
if year == self.nov_year:
|
||||||
|
self.nov_sub += value
|
||||||
|
else:
|
||||||
|
self.nov = 0
|
||||||
|
self.nov_sub = value
|
||||||
|
self.nov_year = year
|
||||||
|
elif month == 12:
|
||||||
|
if year == self.dez_year:
|
||||||
|
self.dez_sub += value
|
||||||
|
else:
|
||||||
|
self.dez = 0
|
||||||
|
self.dez_sub = value
|
||||||
|
self.dez_year = year
|
||||||
|
else:
|
||||||
|
raise IndexError('Mehr monate gibt es nicht')
|
||||||
|
|
||||||
|
|
||||||
def add(self, value):
|
def add(self, value):
|
||||||
self.sum += value
|
|
||||||
def storner(self, value):
|
year = date.today().year
|
||||||
self.sum = self.sum - value
|
month = date.today().month
|
||||||
|
|
||||||
|
if month == 1 :
|
||||||
|
if year == self.jan_year:
|
||||||
|
self.jan += value
|
||||||
|
else:
|
||||||
|
self.jan = value
|
||||||
|
self.jan_sub = 0
|
||||||
|
self.jan_year = year
|
||||||
|
elif month == 2:
|
||||||
|
if year == self.feb_year:
|
||||||
|
self.feb += value
|
||||||
|
else:
|
||||||
|
self.feb = value
|
||||||
|
self.feb_sub = 0
|
||||||
|
self.feb_year = year
|
||||||
|
elif month == 3:
|
||||||
|
if year == self.maer_year:
|
||||||
|
self.maer += value
|
||||||
|
else:
|
||||||
|
self.maer = value
|
||||||
|
self.mear_sub = 0
|
||||||
|
self.mear_year = year
|
||||||
|
elif month == 4:
|
||||||
|
if year == self.apr_year:
|
||||||
|
self.apr += value
|
||||||
|
else:
|
||||||
|
self.apr = value
|
||||||
|
self.apr_sub = 0
|
||||||
|
self.apr_year = year
|
||||||
|
elif month == 5:
|
||||||
|
if year == self.mai_year:
|
||||||
|
self.mai += value
|
||||||
|
else:
|
||||||
|
self.mai = value
|
||||||
|
self.mai_sub = 0
|
||||||
|
self.mai_year = year
|
||||||
|
elif month == 6:
|
||||||
|
if year == self.jun_year:
|
||||||
|
self.jun += value
|
||||||
|
else:
|
||||||
|
self.jun = value
|
||||||
|
self.jun_sub = 0
|
||||||
|
self.jun_year = year
|
||||||
|
elif month == 7:
|
||||||
|
if year == self.jul_year:
|
||||||
|
self.jul += value
|
||||||
|
else:
|
||||||
|
self.jul = value
|
||||||
|
self.jul_sub = 0
|
||||||
|
self.jul_year = year
|
||||||
|
elif month == 8:
|
||||||
|
if year == self.aug_year:
|
||||||
|
self.aug += value
|
||||||
|
else:
|
||||||
|
self.aug = value
|
||||||
|
self.aug_sub = 0
|
||||||
|
self.aug_year = year
|
||||||
|
elif month == 9:
|
||||||
|
if year == self.sep_year:
|
||||||
|
self.sep += value
|
||||||
|
else:
|
||||||
|
self.sep = value
|
||||||
|
self.sep_sub = 0
|
||||||
|
self.sep_year = year
|
||||||
|
elif month == 10:
|
||||||
|
if year == self.okt_year:
|
||||||
|
self.okt += value
|
||||||
|
else:
|
||||||
|
self.okt = value
|
||||||
|
self.okt_sub = 0
|
||||||
|
self.okt_year = year
|
||||||
|
elif month == 11:
|
||||||
|
if year == self.nov_year:
|
||||||
|
self.nov += value
|
||||||
|
else:
|
||||||
|
self.nov = value
|
||||||
|
self.nov_sub = 0
|
||||||
|
self.nov_year = year
|
||||||
|
elif month == 12:
|
||||||
|
if year == self.dez_year:
|
||||||
|
self.dez += value
|
||||||
|
else:
|
||||||
|
self.dez = value
|
||||||
|
self.dez_sub = 0
|
||||||
|
self.dez_year = year
|
||||||
|
else:
|
||||||
|
raise IndexError('Mehr monate gibt es nicht')
|
||||||
|
|
||||||
|
|
||||||
|
def storner(self, value, month):
|
||||||
|
|
||||||
|
if month == 1:
|
||||||
|
self.jan = self.jan - value
|
||||||
|
elif month == 2:
|
||||||
|
self.feb = self.feb - value
|
||||||
|
elif month == 3:
|
||||||
|
self.maer = self.maer - value
|
||||||
|
elif month == 4:
|
||||||
|
self.apr = self.apr - value
|
||||||
|
elif month == 5:
|
||||||
|
self.mai = self.mai - value
|
||||||
|
elif month == 6:
|
||||||
|
self.jun = self.jun - value
|
||||||
|
elif month == 7:
|
||||||
|
self.jul = self.jul - value
|
||||||
|
elif month == 8:
|
||||||
|
self.aug = self.aug - value
|
||||||
|
elif month == 9:
|
||||||
|
self.sep = self.sep - value
|
||||||
|
elif month == 10:
|
||||||
|
self.okt = self.okt - value
|
||||||
|
elif month == 11:
|
||||||
|
self.nov = self.nov - value
|
||||||
|
elif month == 12:
|
||||||
|
self.dez = self.dez - value
|
||||||
|
else:
|
||||||
|
raise IndexError('Mehr monate gibt es nicht')
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return f"User('{self.username}', '{self.sum}')"
|
return f"User('{self.username}', '{self.sum}')"
|
||||||
|
|
||||||
|
|
||||||
|
class Finanzer(db.Model, UserMixin):
|
||||||
|
id = db.Column(db.Integer, primary_key=True)
|
||||||
|
username = db.Column(db.String(20), unique=True, nullable=False)
|
||||||
|
password = db.Column(db.String(60), nullable=False)
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return f"Finanzer('{self.username}')"
|
||||||
|
|
||||||
|
|
||||||
class History:
|
class History:
|
||||||
history = []
|
history = []
|
||||||
user = None
|
user = None
|
||||||
|
@ -23,19 +316,22 @@ class History:
|
||||||
self.history = history
|
self.history = history
|
||||||
self.history.append(self)
|
self.history.append(self)
|
||||||
self.user = user
|
self.user = user
|
||||||
|
self.month = date.today().month
|
||||||
self.value = value
|
self.value = value
|
||||||
self.timer = Timer(60, self.kill)
|
self.timer = Timer(60, self.kill)
|
||||||
self.timer.start()
|
self.timer.start()
|
||||||
|
|
||||||
def exec(self):
|
def exec(self):
|
||||||
self.timer.cancel()
|
self.timer.cancel()
|
||||||
User.query.filter_by(username=self.user.username).first().storner(self.value)
|
User.query.filter_by(username=self.user.username).first().storner(self.value, self.month)
|
||||||
self.kill()
|
self.kill()
|
||||||
|
|
||||||
def kill(self):
|
def kill(self):
|
||||||
print("{} deledet from history".format(self.user))
|
print("{} deledet from history".format(self.user))
|
||||||
self.history.remove(self)
|
self.history.remove(self)
|
||||||
print(self.history)
|
print(self.history)
|
||||||
|
|
||||||
|
|
||||||
'''
|
'''
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
print(f'self:{self}, history:{self.history}, user:{self.user}, value:{self.value}')
|
print(f'self:{self}, history:{self.history}, user:{self.user}, value:{self.value}')
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
from flask import render_template, url_for, redirect, flash, jsonify, g
|
from flask import render_template, url_for, redirect, flash, jsonify, g, request
|
||||||
from geruecht import app, db
|
from flask_login import login_user, current_user, logout_user, login_required
|
||||||
from geruecht.forms import RegistrationForm
|
from geruecht import app, db, bcrypt
|
||||||
from geruecht.model import User, History
|
from geruecht.forms import RegistrationForm, FinanzerLogin
|
||||||
|
from geruecht.model import User, History, Finanzer
|
||||||
import flask_sijax
|
import flask_sijax
|
||||||
import os, sys
|
import os, sys
|
||||||
|
|
||||||
|
@ -36,7 +37,7 @@ def home():
|
||||||
print(history)
|
print(history)
|
||||||
obj_response.html('div#flash', f'{user_2.username} wurde {"%.2f"%value} € hinzugefügt')
|
obj_response.html('div#flash', f'{user_2.username} wurde {"%.2f"%value} € hinzugefügt')
|
||||||
obj_response.attr('div#flash', "class", "alert alert-success")
|
obj_response.attr('div#flash', "class", "alert alert-success")
|
||||||
obj_response.html(f'#{user_2.id}-sum', str("%.2f" % user_2.sum + " €"))
|
obj_response.html(f'#{user_2.id}-sum', str("%.2f" % user_2.getsum() + " €"))
|
||||||
|
|
||||||
def storner(obj_response):
|
def storner(obj_response):
|
||||||
try:
|
try:
|
||||||
|
@ -49,7 +50,7 @@ def home():
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
obj_response.html('div#flash', f'{"%.2f"%obj.value} wurden von {user_2.username} storniert')
|
obj_response.html('div#flash', f'{"%.2f"%obj.value} wurden von {user_2.username} storniert')
|
||||||
obj_response.attr('div#flash', "class", "alert alert-success")
|
obj_response.attr('div#flash', "class", "alert alert-success")
|
||||||
obj_response.html(f'#{user_2.id}-sum', str("%.2f" % user_2.sum + " €"))
|
obj_response.html(f'#{user_2.id}-sum', str("%.2f" % user_2.getsum() + " €"))
|
||||||
|
|
||||||
except IndexError:
|
except IndexError:
|
||||||
print("history: {} is empty".format(history))
|
print("history: {} is empty".format(history))
|
||||||
|
@ -70,10 +71,85 @@ def home():
|
||||||
return redirect(url_for('home'))
|
return redirect(url_for('home'))
|
||||||
return render_template('home.html', users=User.query.all(), form=form)
|
return render_template('home.html', users=User.query.all(), form=form)
|
||||||
|
|
||||||
|
|
||||||
@flask_sijax.route(app, "/return")
|
@flask_sijax.route(app, "/return")
|
||||||
def to_home():
|
def to_home():
|
||||||
return home()
|
return home()
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/login", methods=['GET', 'POST'])
|
||||||
|
def login():
|
||||||
|
if current_user.is_authenticated:
|
||||||
|
return redirect(url_for('home'))
|
||||||
|
login_form = FinanzerLogin()
|
||||||
|
if login_form.validate_on_submit():
|
||||||
|
user = Finanzer.query.filter_by(username=login_form.username.data).first()
|
||||||
|
if user:
|
||||||
|
if user and bcrypt.check_password_hash(user.password, login_form.password.data):
|
||||||
|
login_user(user)
|
||||||
|
next_page = request.args.get('next')
|
||||||
|
return redirect(next_page) if next_page else redirect(url_for('home'))
|
||||||
|
else:
|
||||||
|
flash('Passwort ist falsch', 'error')
|
||||||
|
else:
|
||||||
|
flash('nur der finanzer kann sich einloggen !!', 'error')
|
||||||
|
return render_template('login.html', title='Login', form=login_form)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/logout")
|
||||||
|
def logout():
|
||||||
|
logout_user()
|
||||||
|
return redirect(url_for('home'))
|
||||||
|
|
||||||
|
|
||||||
|
@flask_sijax.route(app, "/uebersicht")
|
||||||
|
def finanzen():
|
||||||
|
|
||||||
|
def supply(obj_response, arg1, arg2):
|
||||||
|
|
||||||
|
list = zip(arg1, arg2)
|
||||||
|
try:
|
||||||
|
for value in arg2:
|
||||||
|
if value:
|
||||||
|
float(value)
|
||||||
|
|
||||||
|
for user_id, value in list:
|
||||||
|
if user_id and value:
|
||||||
|
user_ = User.query.get(user_id)
|
||||||
|
user_.add_sub(float(value))
|
||||||
|
db.session.commit()
|
||||||
|
obj_response.attr(f'#{user_id}-input', 'value', '')
|
||||||
|
|
||||||
|
obj_response.html('div#flash', "Alle Werte wurden übernommen")
|
||||||
|
obj_response.attr('div#flash', 'class', "alert alert-success")
|
||||||
|
|
||||||
|
for user_ in User.query.all():
|
||||||
|
obj_response.html(f'p#{user_.id}-jan-sub', "%.2f"%user_.jan_sub + " €")
|
||||||
|
obj_response.html(f'p#{user_.id}-feb-sub', "%.2f"%user_.feb_sub + " €")
|
||||||
|
obj_response.html(f'p#{user_.id}-maer-sub', "%.2f"%user_.maer_sub + " €")
|
||||||
|
obj_response.html(f'p#{user_.id}-apr-sub', "%.2f"%user_.apr_sub + " €")
|
||||||
|
obj_response.html(f'p#{user_.id}-mai-sub', "%.2f"%user_.mai_sub + " €")
|
||||||
|
obj_response.html(f'p#{user_.id}-jun-sub', "%.2f"%user_.jun_sub + " €")
|
||||||
|
obj_response.html(f'p#{user_.id}-jul-sub', "%.2f"%user_.jul_sub + " €")
|
||||||
|
obj_response.html(f'p#{user_.id}-aug-sub', "%.2f"%user_.aug_sub + " €")
|
||||||
|
obj_response.html(f'p#{user_.id}-sep-sub', "%.2f"%user_.sep_sub + " €")
|
||||||
|
obj_response.html(f'p#{user_.id}-okt-sub', "%.2f"%user_.okt_sub + " €")
|
||||||
|
obj_response.html(f'p#{user_.id}-nov-sub', "%.2f"%user_.nov_sub + " €")
|
||||||
|
obj_response.html(f'p#{user_.id}-dez-sub', "%.2f"%user_.dez_sub + " €")
|
||||||
|
obj_response.html(f'p#{user_.id}-sum', "%.2f"%user_.getsum() + " €")
|
||||||
|
|
||||||
|
except ValueError:
|
||||||
|
obj_response.html('div#flash',
|
||||||
|
"Du hast irgendwo keine Zahl eingegeb!!")
|
||||||
|
obj_response.attr('div#flash', "class", "alert alert-error")
|
||||||
|
|
||||||
|
if g.sijax.is_sijax_request:
|
||||||
|
g.sijax.register_callback('supply', supply)
|
||||||
|
return g.sijax.process_request()
|
||||||
|
|
||||||
|
return render_template('finanzer.html', users=User.query.all())
|
||||||
|
|
||||||
|
|
||||||
@flask_sijax.route(app, "/about")
|
@flask_sijax.route(app, "/about")
|
||||||
def about():
|
def about():
|
||||||
return render_template('about.html', title='about')
|
return render_template('about.html', title='about')
|
||||||
|
|
|
@ -13,10 +13,10 @@ body {
|
||||||
background-color: #055288;
|
background-color: #055288;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
padding: 5px 5px;
|
padding: 5px 5px;
|
||||||
margin: 17px 17px;
|
margin: 7px 17px;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
font-size: 17px;
|
font-size: 17px;
|
||||||
border: 0px solid white;
|
border: 5px solid #055288;
|
||||||
border-style: solid;
|
border-style: solid;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
transition-duration: 0.4s;
|
transition-duration: 0.4s;
|
||||||
|
@ -33,6 +33,7 @@ body {
|
||||||
|
|
||||||
.blue-button:hover {
|
.blue-button:hover {
|
||||||
background: white;
|
background: white;
|
||||||
|
border: 5px solid #055288;
|
||||||
color: black;
|
color: black;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,6 +59,17 @@ body {
|
||||||
transform: translateY(4px)
|
transform: translateY(4px)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.logo-nav img {
|
||||||
|
position: absolute;
|
||||||
|
transition-duration: 0.4s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo-nav img.main-logo:hover {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.geruecht {
|
.geruecht {
|
||||||
margin: 5px auto;
|
margin: 5px auto;
|
||||||
display: table;
|
display: table;
|
||||||
|
@ -78,28 +90,44 @@ body {
|
||||||
width: 20%;
|
width: 20%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.auto-width {
|
||||||
|
width:6.66%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.width-auto {
|
||||||
|
width:80%;
|
||||||
|
}
|
||||||
|
|
||||||
.g-item p {
|
.g-item p {
|
||||||
font-size: 15px;
|
font-size: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.button {
|
.button {
|
||||||
width: 70px;
|
width: 70px;
|
||||||
|
heigt: 30px;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
|
border: 5px solid green;
|
||||||
background: green;
|
background: green;
|
||||||
color: white;
|
color: white;
|
||||||
transition-duration: 0.4s;
|
transition-duration: 0.4s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.button:hover {
|
||||||
|
color: green;
|
||||||
|
background: white;
|
||||||
|
}
|
||||||
|
|
||||||
.button:active {
|
.button:active {
|
||||||
transform: translateY(4px);
|
transform: translateY(4px);
|
||||||
}
|
}
|
||||||
|
|
||||||
.bottombar {
|
.bottombar {
|
||||||
background-color: #077BCB;
|
background-color: #077BCB;
|
||||||
overflow: hidden;
|
overflow: scroll;
|
||||||
position: fixed;
|
position: fixed;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
height: 62px;
|
||||||
display: table;
|
display: table;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -152,3 +180,15 @@ body {
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
padding: 6px;
|
padding: 6px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
margin-bottom: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.schulden {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bezahlt {
|
||||||
|
color: green;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,119 @@
|
||||||
|
{% extends 'layout.html' %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="geruecht">
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<b>Username</b>
|
||||||
|
</div>
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<b>Januar</b>
|
||||||
|
</div>
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<b>Februar</b>
|
||||||
|
</div>
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<b>März</b>
|
||||||
|
</div>
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<b>April</b>
|
||||||
|
</div>
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<b>Mai</b>
|
||||||
|
</div>
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<b>Juni</b>
|
||||||
|
</div>
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<b>July</b>
|
||||||
|
</div>
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<b>August</b>
|
||||||
|
</div>
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<b>September</b>
|
||||||
|
</div>
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<b>Oktober</b>
|
||||||
|
</div>
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<b>November</b>
|
||||||
|
</div>
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<b>Dezember</b>
|
||||||
|
</div>
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<b>Schulden</b>
|
||||||
|
</div>
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<b>Ausgleich</b>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% for user in users %}
|
||||||
|
<div class="geruecht">
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<p>{{ user.username }}</p>
|
||||||
|
</div>
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<p id="{{ user.id }}-jan" class="schulden">{{ "%.2f"%user.jan }} €</p>
|
||||||
|
<p id="{{ user.id }}-jan-sub" class="bezahlt">{{ "%.2f"%user.jan_sub }} €</p>
|
||||||
|
</div>
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<p id="{{ user.id }}-feb" class="schulden">{{ "%.2f"%user.feb }} €</p>
|
||||||
|
<p id="{{ user.id }}-feb-sub" class="bezahlt">{{ "%.2f"%user.feb_sub }} €</p>
|
||||||
|
</div>
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<p id="{{ user.id }}-maer" class="schulden">{{ "%.2f"%user.maer }} €</p>
|
||||||
|
<p id="{{ user.id }}-maer-sub" class="bezahlt">{{ "%.2f"%user.maer_sub }} €</p>
|
||||||
|
</div>
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<p id="{{ user.id }}-apr" class="schulden">{{ "%.2f"%user.apr }} €</p>
|
||||||
|
<p id="{{ user.id }}-apr-sub" class="bezahlt">{{ "%.2f"%user.apr_sub }} €</p>
|
||||||
|
</div>
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<p id="{{ user.id }}-mai" class="schulden">{{ "%.2f"%user.mai }} €</p>
|
||||||
|
<p id="{{ user.id }}-mai-sub" class="bezahlt">{{ "%.2f"%user.mai_sub }} €</p>
|
||||||
|
</div>
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<p id="{{ user.id }}-jun" class="schulden">{{ "%.2f"%user.jun }} €</p>
|
||||||
|
<p id="{{ user.id }}-jun-sub" class="bezahlt">{{ "%.2f"%user.jun_sub }} €</p>
|
||||||
|
</div>
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<p id="{{ user.id }}-jul" class="schulden">{{ "%.2f"%user.jul }} €</p>
|
||||||
|
<p id="{{ user.id }}-jul-sub" class="bezahlt">{{ "%.2f"%user.jul_sub }} €</p>
|
||||||
|
</div>
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<p id="{{ user.id }}-aug" class="schulden">{{ "%.2f"%user.aug }} €</p>
|
||||||
|
<p id="{{ user.id }}-aug-sub" class="bezahlt">{{ "%.2f"%user.aug_sub }} €</p>
|
||||||
|
</div>
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<p id="{{ user.id }}-sep" class="schulden">{{ "%.2f"%user.sep }} €</p>
|
||||||
|
<p id="{{ user.id }}-sep-sub" class="bezahlt">{{ "%.2f"%user.sep_sub }} €</p>
|
||||||
|
</div>
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<p id="{{ user.id }}-okt" class="schulden">{{ "%.2f"%user.okt }} €</p>
|
||||||
|
<p id="{{ user.id }}-okt-sub" class="bezahlt">{{ "%.2f"%user.okt_sub }} €</p>
|
||||||
|
</div>
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<p id="{{ user.id }}-nov" class="schulden">{{ "%.2f"%user.nov }} €</p>
|
||||||
|
<p id="{{ user.id }}-nov-sub" class="bezahlt">{{ "%.2f"%user.nov_sub }} €</p>
|
||||||
|
</div>
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<p id="{{ user.id }}-dez" class="schulden">{{ "%.2f"%user.dez }} €</p>
|
||||||
|
<p id="{{ user.id }}-dez-sub" class="bezahlt">{{ "%.2f"%user.dez_sub }} €</p>
|
||||||
|
</div>
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<p id="{{ user.id }}-sum">{{ "%.2f"%user.getsum() }} €</p>
|
||||||
|
</div>
|
||||||
|
<div class="g-item auto-width">
|
||||||
|
<input class="g-item width-auto" type="text" id="{{ user.id }}-input">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
{% endblock %}
|
||||||
|
{% block bottombar %} <!-- , [[{% for user in users %} {{ user.id }}, {% endfor %} None], [{% for user in users %} $('#{{ user.id }}-input').attr('value'), {% endfor %} None]] -->
|
||||||
|
<!-- document.getElementById('1-input').value -->
|
||||||
|
|
||||||
|
<div id="btn" class="right blue-button buttombar-element" textref="javascript://" onclick="Sijax.request('supply', [[{% for user in users %} {{ user.id }}, {% endfor %} null], [{% for user in users %}document.getElementById('{{ user.id }}-input').value, {% endfor %} null]]);">
|
||||||
|
Anwenden
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
|
@ -6,27 +6,48 @@
|
||||||
<p>{{ user.username }}</p>
|
<p>{{ user.username }}</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="g-item button" id="{{ user.id }}-2" href="javascript://" onclick="Sijax.request('add', ['{{ user.username }}', 2]);">
|
<div class="g-item button" id="{{ user.id }}-2" href="javascript://" onclick="Sijax.request('add', ['{{ user.username }}', 2]);">
|
||||||
<p>+2 €</p>
|
+2 €
|
||||||
</div>
|
</div>
|
||||||
<div class="g-item button" id="{{ user.it }}-1" href="javascript://" onclick="Sijax.request('add', ['{{ user.username }}', 1]);">
|
<div class="g-item button" id="{{ user.it }}-1" href="javascript://" onclick="Sijax.request('add', ['{{ user.username }}', 1]);">
|
||||||
<p>+1 €</p>
|
+1 €
|
||||||
</div>
|
</div>
|
||||||
<div class="g-item button" id="{{ user.id }}-050" href="javascript://" onclick="Sijax.request('add', ['{{ user.username }}', 0.5]);">
|
<div class="g-item button" id="{{ user.id }}-050" href="javascript://" onclick="Sijax.request('add', ['{{ user.username }}', 0.5]);">
|
||||||
<p>+0,5 €</p>
|
+0,5 €
|
||||||
</div>
|
</div>
|
||||||
<div class="g-item button" id="{{ user.id }}-040" href="javascript://" onclick="Sijax.request('add', ['{{ user.username }}', 0.4]);">
|
<div class="g-item button" id="{{ user.id }}-040" href="javascript://" onclick="Sijax.request('add', ['{{ user.username }}', 0.4]);">
|
||||||
<p>+0,4 €</p>
|
+0,4 €
|
||||||
</div>
|
</div>
|
||||||
<div class="g-item button" id="{{ user.id }}-020" href="javascript://" onclick="Sijax.request('add', ['{{ user.username }}', 0.2]);">
|
<div class="g-item button" id="{{ user.id }}-020" href="javascript://" onclick="Sijax.request('add', ['{{ user.username }}', 0.2]);">
|
||||||
<p>+0,2 €</p>
|
+0,2 €
|
||||||
</div>
|
</div>
|
||||||
<div class="g-item button" id="{{ user.id }}-010" href="javascript://" onclick="Sijax.request('add', ['{{ user.username }}', 0.1]);">
|
<div class="g-item button" id="{{ user.id }}-010" href="javascript://" onclick="Sijax.request('add', ['{{ user.username }}', 0.1]);">
|
||||||
<p>+0,1 €</p>
|
+0,1 €
|
||||||
</div>
|
</div>
|
||||||
<div class="g-item">
|
<div class="g-item">
|
||||||
<p id="{{ user.id }}-sum">{{ "%.2f"%user.sum }} €</p>
|
<p id="{{ user.id }}-sum">{{ "%.2f"%user.getsum() }} €</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
{% block bottombar %}
|
||||||
|
<div class="bottombar-element">
|
||||||
|
{% if form %}
|
||||||
|
<form method="POST" action="">
|
||||||
|
{{ form.hidden_tag() }}
|
||||||
|
<fieldset class="form-group">
|
||||||
|
<!-- <legend class="reg-label">neue Person hinzufügen</legend> -->
|
||||||
|
<div class="form-group">
|
||||||
|
{{ form.username.label(class="reg-label") }}
|
||||||
|
{{ form.username() }}
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
<div class="form-group m">
|
||||||
|
{{ form.submit(class="blue-button no-mg") }}
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
<div class="right blue-button buttombar-element" href="javascript://" onclick="Sijax.request('storner');">
|
||||||
|
Stornieren
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|
|
@ -19,24 +19,20 @@
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
{{ g.sijax.get_js()|safe }}
|
{{ g.sijax.get_js()|safe }}
|
||||||
</script>
|
</script>
|
||||||
<script type="text/JavaScript">
|
|
||||||
function hover(element) {
|
|
||||||
element.setAttribute('src', "{{ url_for('static', filename='img/logo_selected.png') }}");
|
|
||||||
}
|
|
||||||
|
|
||||||
function unhover(element) {
|
|
||||||
element.setAttribute('src', "{{ url_for('static', filename='img/logo.png') }}");
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="topnav">
|
<div class="topnav">
|
||||||
<a href="{{ url_for('to_home') }}">
|
<a class="logo-nav first" href="{{ url_for('to_home') }}">
|
||||||
<img class="logo-nav first" src="{{ url_for('static', filename='img/logo.png') }}" onmouseover="hover(this);" onmouseout="unhover(this);">
|
<img class="logo-nav background-logo" src="{{ url_for('static', filename='img/logo_selected.png')}}">
|
||||||
|
<img class="logo-nav main-logo" src="{{ url_for('static', filename='img/logo.png') }}">
|
||||||
</a>
|
</a>
|
||||||
<!--<div class="logo-nav first"></div>-->
|
{% if current_user.is_authenticated %}
|
||||||
<a class="last blue-button" href="{{ url_for('to_home') }}">Finanzer</a>
|
<a class="last blue-button" href="{{ url_for('logout') }}">Logout</a>
|
||||||
|
<a class="last blue-button" href="{{ url_for('finanzen') }}">Übersicht</a>
|
||||||
|
{% else %}
|
||||||
|
<a class="last blue-button" href="{{ url_for('login') }}">Finanzer</a>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
@ -44,6 +40,9 @@
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="bottombar">
|
<div class="bottombar">
|
||||||
{% with messages = get_flashed_messages(with_categories=true) %}
|
{% with messages = get_flashed_messages(with_categories=true) %}
|
||||||
{% if messages %}
|
{% if messages %}
|
||||||
|
@ -53,6 +52,7 @@
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% if form %}
|
||||||
{% if form.username.errors %}
|
{% if form.username.errors %}
|
||||||
{% for error in form.username.errors %}
|
{% for error in form.username.errors %}
|
||||||
<div class="alert alert-error">
|
<div class="alert alert-error">
|
||||||
|
@ -60,31 +60,25 @@
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% if form.password %}
|
||||||
|
{% if form.password.errors %}
|
||||||
|
{% for error in form.password.errors %}
|
||||||
|
<div class="alert alert-error">
|
||||||
|
<span>{{ error }}</span>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
{% endwith %}
|
{% endwith %}
|
||||||
<div id="flash"></div>
|
<div id="flash"></div>
|
||||||
<div class="bottombar-element">
|
{% block bottombar %}
|
||||||
{% if form %}
|
|
||||||
<form method="POST" action="">
|
{% endblock %}
|
||||||
{{ form.hidden_tag() }}
|
|
||||||
<fieldset class="form-group">
|
|
||||||
<!-- <legend class="reg-label">neue Person hinzufügen</legend> -->
|
|
||||||
<div class="form-group">
|
|
||||||
{{ form.username.label(class="reg-label") }}
|
|
||||||
{{ form.username() }}
|
|
||||||
</div>
|
|
||||||
</fieldset>
|
|
||||||
<div class="form-group m">
|
|
||||||
{{ form.submit(class="blue-button no-mg") }}
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
<div class="right blue-button buttombar-element no-mg no-pd" href="javascript://" onclick="Sijax.request('storner');">
|
|
||||||
<p>Stornieren</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!-- Optional JavaScript -->
|
<!-- Optional JavaScript -->
|
||||||
<!-- jQuery first, then Popper.js, then Bootstrap JS
|
<!-- jQuery first, then Popper.js, then Bootstrap JS
|
||||||
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
|
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
|
||||||
|
{% extends "layout.html" %}
|
||||||
|
{% block content %}
|
||||||
|
<div class="login-content">
|
||||||
|
<form method="POST" action="">
|
||||||
|
{{ form.hidden_tag() }}
|
||||||
|
<fieldset class="login-group">
|
||||||
|
<legend class="">Log In</legend>
|
||||||
|
<div class="login-group">
|
||||||
|
{{ form.username.label(class="") }}
|
||||||
|
{% if form.username.errors %}
|
||||||
|
{{ form.username(class="") }}
|
||||||
|
<div class="">
|
||||||
|
{% for error in form.username.error %}
|
||||||
|
<span>{{ error }}</span>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
{{ form.username(class="") }}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
<div class="login-group">
|
||||||
|
{{ form.password.label(class="") }}
|
||||||
|
{% if form.password.errors %}
|
||||||
|
{{ form.password(class="") }}
|
||||||
|
<div class="">
|
||||||
|
{% for error in form.password.error %}
|
||||||
|
<span>{{ error }}</span>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
{{ form.password(class="") }}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
<div class="login-group">
|
||||||
|
{{ form.submit(class="") }}
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
Loading…
Reference in New Issue