{{ post.title }}
+{{ post.content }}
+diff --git a/aula/Login/routes.py b/aula/Login/routes.py new file mode 100644 index 0000000..0abbdf3 --- /dev/null +++ b/aula/Login/routes.py @@ -0,0 +1,53 @@ +from flask import render_template, Blueprint, redirect, url_for, flash, request +from flask_login import current_user, login_user + +from aula import bcrypt +from aula.forms import UserLoginForm +from aula.models import select_users + +Login = Blueprint('Login', __name__) + +posts = [{}] + + +@Login.route("/") +@Login.route("/home") +def home(): + return render_template('home.html', posts=posts) + + +@Login.route("/about") +def about(): + return render_template('about.html', title='About') + + +@Login.route("/login", methods=['GET', 'POST']) +def login(): + if current_user.is_authenticated: + return redirect(url_for('Login.home')) + + form = UserLoginForm() + # Først bekræft, at inputtet fra formen er gyldigt... (f.eks. ikke tomt) + if form.validate_on_submit(): + user = select_users(form.id.data) + # Derefter tjek om hashet af adgangskoden passer med det fra databasen... + if user != None and bcrypt.check_password_hash(user[2], form.password.data): + login_user(user, remember=form.remember.data) + flash('Login successful.','success') + next_page = request.args.get('next') + return redirect(next_page) if next_page else redirect(url_for('Login.home')) + else: + flash('Login Unsuccessful. Please check identifier and password', 'danger') + return render_template('login.html', title='Login', form=form) + + +# @Login.route("/logout") +# def logout(): +# logout_user() +# return redirect(url_for('Login.home')) + + +# @Login.route("/account") +# @login_required +# def account(): +# return render_template('account.html', title='Account') diff --git a/aula/__init__.py b/aula/__init__.py new file mode 100644 index 0000000..3966394 --- /dev/null +++ b/aula/__init__.py @@ -0,0 +1,26 @@ +from flask import Flask +import psycopg2 +from flask_bcrypt import Bcrypt +from flask_login import LoginManager + +app = Flask(__name__) +app.config['SECRET_KEY'] = 'fc089b9218301ad987914c53481bff04' +# set your own database +db = "dbname='aula' user='postgres' host='127.0.0.1' password = 'UIS'" +conn = psycopg2.connect(db) + +bcrypt = Bcrypt(app) +login_manager = LoginManager(app) +login_manager.login_view = 'login' +login_manager.login_message_category = 'info' + +from aula.Login.routes import Login +# from bank.Customer.routes import Customer +# from bank.Employee.routes import Employee +# from bank.Pax.routes import Pax +app.register_blueprint(Login) +# app.register_blueprint(Customer) +# app.register_blueprint(Employee) +# app.register_blueprint(Pax) + +#from bank import routes diff --git a/aula/forms.py b/aula/forms.py new file mode 100644 index 0000000..d00f404 --- /dev/null +++ b/aula/forms.py @@ -0,0 +1,17 @@ +from flask_wtf import FlaskForm +from wtforms import StringField, PasswordField, SubmitField, BooleanField, IntegerField, SelectField +from wtforms.validators import DataRequired, Length + +class AddUserForm(FlaskForm): + username = StringField('Username', + validators=[DataRequired(), Length(min=2, max=20)]) + user_id = IntegerField('user_id', + validators=[DataRequired()]) + password = PasswordField('Password', validators=[DataRequired()]) + submit = SubmitField('Add') + +class UserLoginForm(FlaskForm): + user_id = IntegerField('user_id', validators=[DataRequired()]) + password = PasswordField('Password', validators=[DataRequired()]) + remember = BooleanField('Remember Me') + submit = SubmitField('Login') diff --git a/aula/models.py b/aula/models.py index 1a31d04..34936ac 100644 --- a/aula/models.py +++ b/aula/models.py @@ -1,6 +1,5 @@ # write all your SQL queries in this file. -from datetime import datetime -from bank import conn, login_manager +from aula import conn, login_manager from flask_login import UserMixin from psycopg2 import sql @@ -8,26 +7,17 @@ from psycopg2 import sql def load_user(user_id): cur = conn.cursor() - schema = 'customers' - id = 'cpr_number' - if str(user_id).startswith('60'): - schema = 'employees' - id = 'id' + schema = 'users' + _id = 'user_id' user_sql = sql.SQL(""" SELECT * FROM {} WHERE {} = %s - """).format(sql.Identifier(schema), sql.Identifier(id)) + """).format(sql.Identifier(schema), sql.Identifier(_id)) cur.execute(user_sql, (int(user_id),)) if cur.rowcount > 0: - # return-if svarer til nedenstående: - # if schema == 'employees': - # return Employees(cur.fetchone()) - # else: - # return Customers(cur.fetchone()) - - return Employees(cur.fetchone()) if schema == 'employees' else Customers(cur.fetchone()) + User(cur.fetchone()) else: return None @@ -131,143 +121,24 @@ class Transfers(tuple): self.amount = user_data[1] self.transfer_date = user_data[2] -def insert_Customers(name, CPR_number, password): +def insert_users(user_id, first_name, last_name, password, email, adresse, role): cur = conn.cursor() sql = """ - INSERT INTO Customers(name, CPR_number, password) - VALUES (%s, %s, %s) + INSERT INTO Customers(user_id, first_name, last_name, password, email, adresse, role) + VALUES (%s, %s, %s, %s, %s, %s, %s) """ - cur.execute(sql, (name, CPR_number, password)) + cur.execute(sql, (user_id, first_name, last_name, password, email, adresse, role)) # Husk commit() for INSERT og UPDATE, men ikke til SELECT! conn.commit() cur.close() -def insert_Employees(id, name, password): +def select_users(user_id): cur = conn.cursor() sql = """ - INSERT INTO Employees(id, name, password) - VALUES (%s, %s, %s) + SELECT * FROM users + WHERE user_id = %s """ - cur.execute(sql, (id, name, password)) - # Husk commit() for INSERT og UPDATE, men ikke til SELECT! - conn.commit() - cur.close() - -def select_Customers(CPR_number): - cur = conn.cursor() - sql = """ - SELECT * FROM Customers - WHERE CPR_number = %s - """ - cur.execute(sql, (CPR_number,)) + cur.execute(sql, (user_id,)) user = Customers(cur.fetchone()) if cur.rowcount > 0 else None; cur.close() return user - -def select_Employees(id): - cur = conn.cursor() - sql = """ - SELECT * FROM Employees - WHERE id = %s - """ - cur.execute(sql, (id,)) - user = Employees(cur.fetchone()) if cur.rowcount > 0 else None; - cur.close() - return user - -def select_all_Employees(): - cur = conn.cursor() - sql = """ - SELECT * FROM Employees - """ - cur.execute(sql) - tuple_resultset = cur.fetchall() - cur.close() - return tuple_resultset - -def update_CheckingAccount(amount, CPR_number): - cur = conn.cursor() - sql = """ - UPDATE CheckingAccount - SET amount = %s - WHERE CPR_number = %s - """ - cur.execute(sql, (amount, CPR_number)) - # Husk commit() for INSERT og UPDATE, men ikke til SELECT! - conn.commit() - cur.close() - -def transfer_account(date, amount, from_account, to_account): - cur = conn.cursor() - sql = """ - INSERT INTO Transfers(transfer_date, amount, from_account, to_account) - VALUES (%s, %s, %s, %s) - """ - cur.execute(sql, (date, amount, from_account, to_account)) - # Husk commit() for INSERT og UPDATE, men ikke til SELECT! - conn.commit() - cur.close() - -def select_emp_cus_accounts(emp_cpr_number): - cur = conn.cursor() - sql = """ - SELECT - e.name employee - , c.name customer - , cpr_number - , account_number - FROM manages m - NATURAL JOIN accounts - NATURAL JOIN customers c - JOIN employees e ON m.emp_cpr_number = e.id - WHERE emp_cpr_number = %s - ; - """ - cur.execute(sql, (emp_cpr_number,)) - tuple_resultset = cur.fetchall() - cur.close() - return tuple_resultset - -def select_investments(emp_cpr_number): - cur = conn.cursor() - sql = """ - SELECT i.account_number, a.cpr_number, a.created_date - FROM investmentaccounts i - JOIN accounts a ON i.account_number = a.account_number - JOIN manages m ON m.account_number = a.account_number - JOIN employees e ON e.id = m.emp_cpr_number - WHERE e.id = %s - """ - cur.execute(sql, (emp_cpr_number,)) - tuple_resultset = cur.fetchall() - cur.close() - return tuple_resultset - -def select_investments_with_certificates(emp_cpr_number): - cur = conn.cursor() - sql = """ - SELECT i.account_number, a.cpr_number, a.created_date - , cd.cd_number, start_date, maturity_date, rate, amount - FROM investmentaccounts i - JOIN accounts a ON i.account_number = a.account_number - JOIN certificates_of_deposit cd ON i.account_number = cd.account_number - JOIN manages m ON m.account_number = a.account_number - JOIN employees e ON e.id = m.emp_cpr_number - WHERE e.id = %s - """ - cur.execute(sql, (emp_cpr_number,)) - tuple_resultset = cur.fetchall() - cur.close() - return tuple_resultset - -def select_investments_certificates_sum(emp_cpr_number): - cur = conn.cursor() - sql = """ - SELECT account_number, cpr_number, created_date, sum - FROM vw_cd_sum - WHERE emp_cpr_number = %s - """ - cur.execute(sql, (emp_cpr_number,)) - tuple_resultset = cur.fetchall() - cur.close() - return tuple_resultset diff --git a/aula/static/main.css b/aula/static/main.css new file mode 100644 index 0000000..44e1df8 --- /dev/null +++ b/aula/static/main.css @@ -0,0 +1,84 @@ +body { + background: #fafafa; + color: #333333; + margin-top: 5rem; +} + +h1, h2, h3, h4, h5, h6 { + color: #444444; +} + +.bg-steel { + background-color: #5f788a; +} + +.site-header .navbar-nav .nav-link { + color: #cbd5db; +} + +.site-header li > .nav-item.nav-link { + color: #495057; +} + +.site-header .navbar-nav .nav-link:hover { + color: #ffffff; +} + +.site-header .navbar-nav .nav-link.active { + font-weight: 500; +} + +.content-section { + background: #ffffff; + padding: 10px 20px; + border: 1px solid #dddddd; + border-radius: 3px; + margin-bottom: 20px; +} + +.article-title { + color: #444444; +} + +a.article-title:hover { + color: #428bca; + text-decoration: none; +} + +.article-content { + white-space: pre-line; +} + +.article-img { + height: 65px; + width: 65px; + margin-right: 16px; +} + +.article-metadata { + padding-bottom: 1px; + margin-bottom: 4px; + border-bottom: 1px solid #e3e3e3 +} + +.article-metadata a:hover { + color: #333; + text-decoration: none; +} + +.article-svg { + width: 25px; + height: 25px; + vertical-align: middle; +} + +.account-img { + height: 125px; + width: 125px; + margin-right: 20px; + margin-bottom: 16px; +} + +.account-heading { + font-size: 2.5rem; +} diff --git a/aula/templates/about.html b/aula/templates/about.html new file mode 100644 index 0000000..bc550eb --- /dev/null +++ b/aula/templates/about.html @@ -0,0 +1,30 @@ +{% extends "layout.html" %} +{% block content %} +
Dette er UIS-prototypen bragt til dig af UIS-holdet 2021/2022:
+I kan registrere nye kundekonti, men medarbejderkonti skal indtastes ved at foretage jeres ændringer i DML-scriptet schema_ins.sql. For at logge ind har vi oprettet nogle testkonti. Kunde-login kan tilgås ved hjælp af et kunde-cpr i intervallerne 5001 til 5007 med adgangskoden "UIS" med store bogstaver. Medarbejder-login kan tilgås ved hjælp af medarbejder-id 6001..6007 og samme adgangskode.
+For at tilføje flere eksempeldata skal du foretage dine ændringer i DML-scriptet schema_ins.sql.
+Prototypen er vertikal. Vi har implementeret nogle funktioner, men projektet er ufuldstændigt. Prototypen giver et udgangspunkt for jeres arbejde.
+ +EN:
+ +You can register new customer accounts, but employee accounts must be entered by making your changes to the DML-script schema_ins.sql. To log in we have created some test accounts. The customer login can be accesed using a customer cpr in ranges 5001 to 5007 with the password 'UIS' in uppercase. The employee login can be accessed using employee id 6001..6007 and the same password.
+To add more sample data make your changes to the DML-script schema_ins.sql.
+The prototype is vertical. We have implemented some functions and not completed. The prototype provides a starting point for your work.
+AL/PR 20220504
+{% endblock content %} + diff --git a/aula/templates/account.html b/aula/templates/account.html new file mode 100644 index 0000000..f441fcc --- /dev/null +++ b/aula/templates/account.html @@ -0,0 +1,4 @@ +{% extends "layout.html" %} +{% block content %} +{{ post.content }}
+Investments:
+account_number | +cpr_number | +creation date | +
---|---|---|
{{n[0]}} | +{{n[1]}} | +{{n[2]}} | +
Investment accounts:
+account_number | +cpr_number | +account created | +deposit total (CD) | +
---|---|---|---|
{{n[0]}} | +{{n[1]}} | +{{n[2]}} | +{{n[3]}} | +
Investment certificats of deposit:
+acc | +cd_number | +start_date | +maturity_date | +rate | +amount | +
---|---|---|---|---|---|
{{n[0]}} | +{{n[3]}} | +{{n[4]}} | +{{n[5]}} | +{{n[6]}} | +{{n[7]}} | +
Dette er en testside. Hej med dig. fed tekst, kursiv tekst
+fed tekst, fed og kursiv tekst
+ +Liste af ansatte:
+Dropdown customer account tuples:
+Same list with a filter: {{ drop_cus_acc|join(', ') }}
+