"Working login, registration and some homepage + Navbar"
This commit is contained in:
parent
2c6fe9a79a
commit
9ff7a4be37
18
FinTech_app/forms.py
Normal file
18
FinTech_app/forms.py
Normal file
@ -0,0 +1,18 @@
|
||||
from django import forms
|
||||
from django.contrib.auth.forms import UserCreationForm
|
||||
from django.contrib.auth.models import User
|
||||
|
||||
|
||||
class NewUserForm(UserCreationForm):
|
||||
email = forms.EmailField(required=True)
|
||||
|
||||
class Meta:
|
||||
model = User
|
||||
fields = ("username", "email", "password1", "password2")
|
||||
|
||||
def save(self, commit=True):
|
||||
user = super(NewUserForm, self).save(commit=False)
|
||||
user.email = self.cleaned_data['email']
|
||||
if commit:
|
||||
user.save()
|
||||
return user
|
@ -37,6 +37,9 @@ INSTALLED_APPS = [
|
||||
'django.contrib.sessions',
|
||||
'django.contrib.messages',
|
||||
'django.contrib.staticfiles',
|
||||
'bootstrap4',
|
||||
'crispy_forms'
|
||||
|
||||
]
|
||||
|
||||
MIDDLEWARE = [
|
||||
@ -49,6 +52,8 @@ MIDDLEWARE = [
|
||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||
]
|
||||
|
||||
CRISPY_TEMPLATE_PACK = 'bootstrap4'
|
||||
|
||||
ROOT_URLCONF = 'FinTech_app.urls'
|
||||
|
||||
TEMPLATES = [
|
||||
@ -116,11 +121,12 @@ USE_TZ = True
|
||||
# Static files (CSS, JavaScript, Images)
|
||||
# https://docs.djangoproject.com/en/4.1/howto/static-files/
|
||||
|
||||
STATIC_URL = 'static/'
|
||||
STATIC_URL = '/static/'
|
||||
|
||||
# Default primary key field type
|
||||
# https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field
|
||||
|
||||
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
||||
|
||||
LOGIN_REDIRECT_URL = "/"
|
||||
LOGIN_REDIRECT_URL = "/"
|
||||
LOGOUT_REDIRECT_URL = "/"
|
||||
|
@ -15,8 +15,14 @@ Including another URLconf
|
||||
"""
|
||||
from django.contrib import admin
|
||||
from django.urls import path, include
|
||||
from django.views.generic.base import TemplateView
|
||||
from . import views
|
||||
|
||||
urlpatterns = [
|
||||
path('admin/', admin.site.urls),
|
||||
path("accounts/", include("django.contrib.auth.urls")),
|
||||
path('', TemplateView.as_view(template_name='main.html'), name='home'),
|
||||
path("register/", views.register_request, name="register"),
|
||||
path("login/", views.login_request, name="login"),
|
||||
path("logout/", views.logout_request, name="logout"),
|
||||
path("main/", views.logout_request, name="main"),
|
||||
]
|
||||
|
50
FinTech_app/views.py
Normal file
50
FinTech_app/views.py
Normal file
@ -0,0 +1,50 @@
|
||||
from django.shortcuts import render, redirect
|
||||
from .forms import NewUserForm
|
||||
from django.contrib.auth import login, authenticate, logout
|
||||
from django.contrib import messages
|
||||
from django.contrib.auth.forms import AuthenticationForm
|
||||
|
||||
|
||||
def register_request(request):
|
||||
if request.method == "POST":
|
||||
form = NewUserForm(request.POST)
|
||||
if form.is_valid():
|
||||
user = form.save()
|
||||
login(request, user)
|
||||
messages.success(request, "Registration successful." )
|
||||
return redirect("/")
|
||||
messages.error(request, "Unsuccessful registration. Invalid information.")
|
||||
form = NewUserForm()
|
||||
return render(request=request, template_name="registration/register.html", context={"register_form":form})
|
||||
|
||||
|
||||
def login_request(request):
|
||||
if request.method == "POST":
|
||||
form = AuthenticationForm(request, data=request.POST)
|
||||
if form.is_valid():
|
||||
username = form.cleaned_data.get('username')
|
||||
password = form.cleaned_data.get('password')
|
||||
user = authenticate(username=username, password=password)
|
||||
if user is not None:
|
||||
login(request, user)
|
||||
messages.info(request, f"You are now logged in as {username}.")
|
||||
return redirect("/")
|
||||
else:
|
||||
messages.error(request, "Invalid username or password.")
|
||||
else:
|
||||
messages.error(request, "Invalid username or password.")
|
||||
form = AuthenticationForm()
|
||||
return render(request=request, template_name="registration/login.html", context={"login_form":form})
|
||||
|
||||
|
||||
def logout_request(request):
|
||||
logout(request)
|
||||
messages.info(request, "You have successfully logged out.")
|
||||
return redirect("/")
|
||||
|
||||
|
||||
def index(request):
|
||||
if request.user.is_authenticated:
|
||||
print("Logged in")
|
||||
else:
|
||||
print("Not logged in")
|
BIN
requirements.txt
BIN
requirements.txt
Binary file not shown.
3
static/main.css
Normal file
3
static/main.css
Normal file
@ -0,0 +1,3 @@
|
||||
.grad {
|
||||
background-image: linear-gradient(to right, orange , white);
|
||||
}
|
90
static/registration/login.css
Normal file
90
static/registration/login.css
Normal file
@ -0,0 +1,90 @@
|
||||
/* 'Open Sans' font from Google Fonts */
|
||||
@import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700);
|
||||
|
||||
body {
|
||||
background: #456;
|
||||
font-family: 'Open Sans', sans-serif;
|
||||
}
|
||||
|
||||
.login {
|
||||
width: 400px;
|
||||
margin: 16px auto;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
/* Reset top and bottom margins from certain elements */
|
||||
.login-header,
|
||||
.login p {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
/* The triangle form is achieved by a CSS hack */
|
||||
.login-triangle {
|
||||
width: 0;
|
||||
margin-right: auto;
|
||||
margin-left: auto;
|
||||
border: 12px solid transparent;
|
||||
border-bottom-color: #28d;
|
||||
}
|
||||
|
||||
.login-header {
|
||||
background: #28d;
|
||||
padding: 20px;
|
||||
font-size: 1.4em;
|
||||
font-weight: normal;
|
||||
text-align: center;
|
||||
text-transform: uppercase;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.login-container {
|
||||
background: #ebebeb;
|
||||
padding: 12px;
|
||||
}
|
||||
|
||||
/* Every row inside .login-container is defined with p tags */
|
||||
.login p {
|
||||
padding: 12px;
|
||||
}
|
||||
|
||||
.login input {
|
||||
box-sizing: border-box;
|
||||
display: block;
|
||||
width: 100%;
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
padding: 16px;
|
||||
outline: 0;
|
||||
font-family: inherit;
|
||||
font-size: 0.95em;
|
||||
}
|
||||
|
||||
.login input[type="email"],
|
||||
.login input[type="password"] {
|
||||
background: #fff;
|
||||
border-color: #bbb;
|
||||
color: #555;
|
||||
}
|
||||
|
||||
/* Text fields' focus effect */
|
||||
.login input[type="email"]:focus,
|
||||
.login input[type="password"]:focus {
|
||||
border-color: #888;
|
||||
}
|
||||
|
||||
.login input[type="submit"] {
|
||||
background: #28d;
|
||||
border-color: transparent;
|
||||
color: #fff;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.login input[type="submit"]:hover {
|
||||
background: #17c;
|
||||
}
|
||||
|
||||
/* Buttons' focus effect */
|
||||
.login input[type="submit"]:focus {
|
||||
border-color: #05a;
|
||||
}
|
70
templates/main.html
Normal file
70
templates/main.html
Normal file
@ -0,0 +1,70 @@
|
||||
{% load static %}
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Required meta tags -->
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
|
||||
<!-- Bootstrap CSS -->
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
|
||||
|
||||
<title>{% block title %}FinTech{% endblock %}</title>
|
||||
<link rel="stylesheet" type="text/css" href={% static "/main.css" %}>
|
||||
{% block css_files %}{% endblock %}
|
||||
</head>
|
||||
<body>
|
||||
<!--Navbar-->
|
||||
<nav class="navbar navbar-expand-lg navbar-light bg-light">
|
||||
<a class="navbar-brand" href="/">FinTech</a>
|
||||
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
|
||||
<div class="collapse navbar-collapse" id="navbarSupportedContent">
|
||||
<ul class="navbar-nav mr-auto">
|
||||
<li class="nav-item">
|
||||
{% if user.is_authenticated %}
|
||||
<a class="nav-link" href="/logout">Wyloguj</a>
|
||||
{% else %}
|
||||
<a class="nav-link" href="/login">Zaloguj</a>
|
||||
{% endif %}
|
||||
</li>
|
||||
<li class="nav-item dropdown">
|
||||
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
Dropdown
|
||||
</a>
|
||||
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
|
||||
<a class="dropdown-item" href="#">Action</a>
|
||||
<a class="dropdown-item" href="#">Another action</a>
|
||||
<div class="dropdown-divider"></div>
|
||||
<a class="dropdown-item" href="#">Something else here</a>
|
||||
</div>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link disabled" href="#">{% if user.is_authenticated %}
|
||||
Witaj, {{ user.get_username }}. Dziękujemy, że jesteś z nami.
|
||||
{% endif %}</a>
|
||||
</li>
|
||||
</ul>
|
||||
<form class="form-inline my-2 my-lg-0">
|
||||
<input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search">
|
||||
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
|
||||
</form>
|
||||
</div>
|
||||
</nav>
|
||||
<main>
|
||||
{% block content %}
|
||||
<div>
|
||||
<h1 style="text-align:center">Witaj na stronie FinTech!</h1>
|
||||
<h4>Tutaj możesz nauczyć się jak inwestować i prognozować kursy z pomocą sztucznej inteligencji.</h4>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
<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://cdn.jsdelivr.net/npm/popper.js@1.12.9/dist/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
|
||||
</main>
|
||||
</body>
|
||||
|
||||
</html>
|
@ -1,7 +1,41 @@
|
||||
<!DOCTYPE html>
|
||||
<h2>Log In</h2>
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
{{ form.as_p }}
|
||||
<button type="submit">Log In</button>
|
||||
</form>
|
||||
{% extends "main.html" %}
|
||||
{% load crispy_forms_filters %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
{% load crispy_forms_tags %}
|
||||
<html lang="EN">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<!--Bootstrap CSS-->
|
||||
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
|
||||
<title>FinTech</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
{% load crispy_forms_tags %}
|
||||
<!-- Required meta tags -->
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<!--Bootstrap CSS-->
|
||||
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
|
||||
|
||||
|
||||
<!--Login-->
|
||||
<div class="container py-5">
|
||||
<h1>Login</h1>
|
||||
<form method="POST">
|
||||
{% csrf_token %}
|
||||
{{ login_form|crispy }}
|
||||
<button class="btn btn-primary" type="submit">Login</button>
|
||||
</form>
|
||||
<p class="text-center">Nie masz konta? <a href="/register">Zarejestruj się</a>.</p>
|
||||
</div>
|
||||
<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
|
||||
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
|
||||
</body>
|
||||
</html>
|
||||
{% endblock %}
|
||||
|
19
templates/registration/register.html
Normal file
19
templates/registration/register.html
Normal file
@ -0,0 +1,19 @@
|
||||
{% extends "main.html" %}
|
||||
{% load crispy_forms_filters %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
{% load crispy_forms_tags %}
|
||||
|
||||
<!--Register-->
|
||||
<div class="container py-5">
|
||||
<h1>Register</h1>
|
||||
<form method="POST">
|
||||
{% csrf_token %}
|
||||
{{ register_form|crispy }}
|
||||
<button class="btn btn-primary" type="submit">Register</button>
|
||||
</form>
|
||||
<p class="text-center">If you already have an account, <a href="/login">login</a> instead.</p>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
23
tests/selenium-test-1.py
Normal file
23
tests/selenium-test-1.py
Normal file
@ -0,0 +1,23 @@
|
||||
import os
|
||||
|
||||
from selenium import webdriver
|
||||
|
||||
class SeleniumTest:
|
||||
def __init__(self, src, drive_path):
|
||||
self.driver = webdriver.Chrome(executable_path=drive_path)
|
||||
|
||||
self.driver.get(src)
|
||||
|
||||
def __del__(self):
|
||||
self.driver.close()
|
||||
|
||||
def assert_title(self, title):
|
||||
assert title in self.driver.title
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
drive_path = "%s/chromedriver" % os.getcwd()
|
||||
|
||||
st = SeleniumTest("https://python.org", drive_path)
|
||||
st.assert_title("Python")
|
||||
|
Loading…
Reference in New Issue
Block a user