You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
286 lines
8.0 KiB
286 lines
8.0 KiB
""" static and login pages """ |
|
|
|
|
|
import deform |
|
from pyramid.view import view_config |
|
from pyramid.security import forget, remember |
|
from pyramid.httpexceptions import HTTPFound |
|
|
|
from .. import models, security, services |
|
from ..repo import RepoItemNotFound |
|
from ..events import FlashMessage, PasswordResetEmail |
|
from ..schemas import account |
|
|
|
|
|
@view_config( |
|
context="ordr3:resources.Root", |
|
name="login", |
|
permission="login", |
|
request_method="GET", |
|
renderer="ordr3:templates/account/login.jinja2", |
|
) |
|
def login(context, request): |
|
return {"error": False} |
|
|
|
|
|
@view_config( |
|
context="ordr3:resources.Root", |
|
name="login", |
|
permission="login", |
|
request_method="POST", |
|
require_csrf=False, |
|
renderer="ordr3:templates/account/login.jinja2", |
|
) |
|
def check_credentials(context, request): |
|
username = request.POST.get("username", "") |
|
password = request.POST.get("password", "") |
|
|
|
crypt_context = security.get_passlib_context() |
|
user = services.verify_credentials( |
|
request.repo, crypt_context, username, password |
|
) |
|
if user is not None and user.is_active: |
|
headers = remember(request, user.id) |
|
return HTTPFound( |
|
request.resource_path(request.root, "orders"), headers=headers |
|
) |
|
return {"error": True} |
|
|
|
|
|
@view_config( |
|
context="ordr3:resources.Root", name="logout", permission="logout" |
|
) |
|
def logout(context, request): |
|
""" logout of a user """ |
|
return HTTPFound( |
|
request.resource_path(request.root, "login"), headers=forget(request) |
|
) |
|
|
|
|
|
@view_config( |
|
context="ordr3:resources.Root", |
|
name="registration", |
|
permission="registration", |
|
request_method="GET", |
|
renderer="ordr3:templates/account/registration.jinja2", |
|
) |
|
def registration(context, request): |
|
form = account.RegistrationSchema.as_form(request) |
|
return {"form": form} |
|
|
|
|
|
@view_config( |
|
context="ordr3:resources.Root", |
|
name="registration", |
|
permission="registration", |
|
request_method="POST", |
|
renderer="ordr3:templates/account/registration.jinja2", |
|
) |
|
def register_new_user(context, request): |
|
if "Create_Account" not in request.POST: |
|
return HTTPFound(request.resource_path(request.root)) |
|
|
|
form = account.RegistrationSchema.as_form(request) |
|
data = request.POST.items() |
|
try: |
|
appstruct = form.validate(data) |
|
except deform.ValidationFailure: |
|
return {"form": form} |
|
|
|
new_user = models.User( |
|
id=None, |
|
password=None, |
|
username=appstruct["user_name"], |
|
first_name=appstruct["first_name"], |
|
last_name=appstruct["last_name"], |
|
email=appstruct["email"], |
|
role=models.UserRole.NEW, |
|
) |
|
services.set_new_password(new_user, appstruct["password"], request) |
|
request.repo.add_user(new_user) |
|
|
|
return HTTPFound(request.resource_path(request.root, "registered")) |
|
|
|
|
|
@view_config( |
|
context="ordr3:resources.Root", |
|
name="registered", |
|
permission="view", |
|
renderer="ordr3:templates/account/registration_complete.jinja2", |
|
) |
|
def registration_complete(context, request): |
|
return {} |
|
|
|
|
|
@view_config( |
|
context="ordr3:resources.Root", |
|
name="breached", |
|
permission="view", |
|
renderer="ordr3:templates/account/breached_password.jinja2", |
|
) |
|
def breached_password(context, request): |
|
return {} |
|
|
|
|
|
@view_config( |
|
context="ordr3:resources.Root", |
|
name="forgot", |
|
permission="registration", |
|
request_method="GET", |
|
renderer="ordr3:templates/account/forgotten_password.jinja2", |
|
) |
|
def forgotten_password(context, request): |
|
form = account.ForgottenPasswordSchema.as_form(request) |
|
return {"form": form} |
|
|
|
|
|
@view_config( |
|
context="ordr3:resources.Root", |
|
name="forgot", |
|
permission="registration", |
|
request_method="POST", |
|
renderer="ordr3:templates/account/forgotten_password.jinja2", |
|
) |
|
def send_reset_link(context, request): |
|
if "Send_Reset_Link" not in request.POST: |
|
return HTTPFound(request.resource_path(request.root)) |
|
|
|
provided_identifier = request.POST.get("email_or_username") |
|
try: |
|
user = request.repo.get_user_by_username(provided_identifier) |
|
except RepoItemNotFound: |
|
try: |
|
user = request.repo.get_user_by_email(provided_identifier) |
|
except RepoItemNotFound: |
|
user = None |
|
|
|
if user is not None and user.is_active: |
|
token = services.create_token_for_user(request.repo, user) |
|
request.emit(PasswordResetEmail(user, token.token)) |
|
|
|
return HTTPFound(request.resource_path(request.root, "sent")) |
|
|
|
|
|
@view_config( |
|
context="ordr3:resources.Root", |
|
name="sent", |
|
permission="view", |
|
renderer="ordr3:templates/account/reset_link_sent.jinja2", |
|
) |
|
def reset_link_sent(context, request): |
|
return {} |
|
|
|
|
|
@view_config( |
|
context="ordr3:resources.Root", |
|
name="reset", |
|
permission="view", |
|
request_method="GET", |
|
renderer="ordr3:templates/account/reset_password_form.jinja2", |
|
) |
|
def reset_password_form(context, request): |
|
token = request.GET.get("t") |
|
user = services.get_user_from_reset_token(request.repo, token) |
|
if user is None: |
|
return HTTPFound(request.resource_path(request.root)) |
|
|
|
form = account.ResetPasswordSchema.as_form(request, token) |
|
return {"form": form} |
|
|
|
|
|
@view_config( |
|
context="ordr3:resources.Root", |
|
name="reset", |
|
permission="view", |
|
request_method="POST", |
|
renderer="ordr3:templates/account/reset_password_form.jinja2", |
|
) |
|
def reset_password(context, request): |
|
if "Reset_Password" not in request.POST: |
|
return HTTPFound(request.resource_path(request.root)) |
|
|
|
token = request.GET.get("t") |
|
user = services.get_user_from_reset_token(request.repo, token) |
|
if user is None: |
|
return HTTPFound(request.resource_path(request.root)) |
|
|
|
form = account.ResetPasswordSchema.as_form(request, token) |
|
data = request.POST.items() |
|
try: |
|
appstruct = form.validate(data) |
|
except deform.ValidationFailure: |
|
return {"form": form} |
|
|
|
services.set_new_password(user, appstruct["new_password"], request) |
|
request.repo.delete_reset_token(request.repo.get_reset_token(token)) |
|
request.repo.clear_stale_reset_tokens() |
|
return HTTPFound(request.resource_path(request.root, "reseted")) |
|
|
|
|
|
@view_config( |
|
context="ordr3:resources.Root", |
|
name="reseted", |
|
permission="view", |
|
renderer="ordr3:templates/account/password_reseted.jinja2", |
|
) |
|
def password_reseted(context, request): |
|
return {} |
|
|
|
|
|
@view_config( |
|
context="ordr3:resources.Root", |
|
name="myaccount", |
|
permission="account", |
|
request_method="GET", |
|
renderer="ordr3:templates/account/myaccount.jinja2", |
|
) |
|
def myaccount(context, request): |
|
form = account.MyAccountSchema.as_form(request) |
|
form_data = { |
|
"user_name": request.user.username, |
|
"first_name": request.user.first_name, |
|
"last_name": request.user.last_name, |
|
"email": request.user.email, |
|
} |
|
form.set_appstruct(form_data) |
|
return {"form": form} |
|
|
|
|
|
@view_config( |
|
context="ordr3:resources.Root", |
|
name="myaccount", |
|
permission="account", |
|
request_method="POST", |
|
renderer="ordr3:templates/account/myaccount.jinja2", |
|
) |
|
def edit_myaccount(context, request): |
|
if "Save_Changes" not in request.POST: |
|
return HTTPFound(request.resource_path(request.root)) |
|
|
|
form = account.MyAccountSchema.as_form(request) |
|
data = request.POST.items() |
|
try: |
|
appstruct = form.validate(data) |
|
except deform.ValidationFailure: |
|
return {"form": form} |
|
|
|
request.user.first_name = appstruct["first_name"] |
|
request.user.last_name = appstruct["last_name"] |
|
request.user.email = appstruct["email"] |
|
|
|
return HTTPFound(request.resource_path(request.root)) |
|
|
|
|
|
@view_config( |
|
context="ordr3:resources.Root", name="mypassword", permission="account" |
|
) |
|
def myaccount_reset_link(context, request): |
|
token = services.create_token_for_user(request.repo, request.user) |
|
request.emit(PasswordResetEmail(request.user, token.token)) |
|
request.emit( |
|
FlashMessage.info( |
|
f"A password reset link has been sent to {request.user.email}." |
|
) |
|
) |
|
|
|
return HTTPFound(request.resource_path(request.root))
|
|
|