Skip to content

Commit

Permalink
Add register form
Browse files Browse the repository at this point in the history
  • Loading branch information
davismr committed Jan 3, 2025
1 parent 3ca291f commit cf0ba2c
Show file tree
Hide file tree
Showing 6 changed files with 94 additions and 9 deletions.
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ markers = [
"factories",
"models",
"package",
"register",
"views",
]
testpaths = "tests"
Expand Down
3 changes: 2 additions & 1 deletion src/wfrp/character/routes.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
def includeme(config):
config.add_route("homepage", "/")
config.add_route("login", "/login")
config.add_route("logout", "/logout")
config.add_route("homepage", "/")
config.add_route("register", "/register")
config.add_route("links", "/links")
config.add_route("new_character", "/character/new")
config.add_route("species", "/character/{uuid}/species")
Expand Down
7 changes: 5 additions & 2 deletions src/wfrp/character/templates/layout.pt
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,12 @@
<div><a href="/links">Links</a></div>
<div>
<a tal:condition="view.logged_in is None"
href="${request.application_url}/login">Log In</a>
href="${request.application_url}/login">Log In</a>
<br tal:condition="view.logged_in is None" />
<a tal:condition="view.logged_in is None"
href="${request.route_url('register')}">Register here</a>
<a tal:condition="view.logged_in is not None"
href="${request.application_url}/logout">Logout</a>
href="${request.application_url}/logout">Logout</a>
</div>
</div>
<div metal:define-slot="content">No content</div>
Expand Down
25 changes: 25 additions & 0 deletions src/wfrp/character/templates/register.pt
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<div metal:use-macro="load: layout.pt">
<div metal:fill-slot="content">

<h1>Register</h1>
<span tal:replace="message"/>

<form action="${request.route_url('register')}" method="post">
<label for="name">Full Name</label>
<input type="text" id="name"
name="name"
value="${name}"/><br/>
<label for="email">Email address</label>
<input type="text" id="email"
name="email"
value="${email}"/><br/>
<label for="password">Password</label>
<input type="password" id="password"
name="password"
value="${password}"/><br/>
<input type="submit" name="form.submitted"
value="Register"/>
</form>

</div>
</div>
34 changes: 28 additions & 6 deletions src/wfrp/character/views/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@
from pyramid.view import view_config
from pyramid.view import view_defaults

from wfrp.character.security import USERS
from wfrp.character.application import DBSession
from wfrp.character.models.user import User
from wfrp.character.security import check_password
from wfrp.character.security import hash_password


@view_defaults(renderer="wfrp.character:templates/homepage.pt")
Expand All @@ -25,15 +27,14 @@ def login(self):
message = ""
login = ""
password = ""
if "form.submitted" in request.params:
login = request.params["login"]
password = request.params["password"]
hashed_pw = USERS.get(login)
if "form.submitted" in request.POST:
login = request.POST["login"]
password = request.POST["password"]
hashed_pw = DBSession.query(User).filter(User.email == login).one().password
if hashed_pw and check_password(password, hashed_pw):
headers = remember(request, login)
return HTTPFound(location=came_from, headers=headers)
message = "Failed login"

return dict(
name="Login",
message=message,
Expand All @@ -49,3 +50,24 @@ def logout(self):
headers = forget(request)
url = request.route_url("homepage")
return HTTPFound(location=url, headers=headers)

@view_config(route_name="register", renderer="wfrp.character:templates/register.pt")
def register(self):
request = self.request
message = ""
name = ""
email = ""
password = ""
if "form.submitted" in request.POST:
name = request.POST["name"]
email = request.POST["email"]
password = request.POST["password"]
new_user = User(email=email, name=name, password=hash_password(password))
DBSession.add(new_user)
return HTTPFound(location=self.request.route_url("homepage"))
return dict(
message=message,
name=name,
email=email,
password=password,
)
33 changes: 33 additions & 0 deletions tests/test_register.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import pytest
from pyramid import testing
from pyramid.httpexceptions import HTTPFound

from wfrp.character.application import DBSession
from wfrp.character.models.user import User
from wfrp.character.views.auth import AuthViews


@pytest.mark.register
def test_register(testapp):
payload = {
"name": "User Name",
"email": "[email protected]",
"password": "a_password",
"form.submitted": "Register",
}
request = testing.DummyRequest(post=payload)
response = AuthViews(request).register()
assert isinstance(response, HTTPFound)
users = DBSession.query(User).all()
assert len(users) == 1
user = users[0]
assert user.name == "User Name"
assert user.email == "[email protected]"
payload = {
"login": "[email protected]",
"password": "a_password",
"form.submitted": "Log In",
}
request = testing.DummyRequest(post=payload)
response = AuthViews(request).login()
assert isinstance(response, HTTPFound)

0 comments on commit cf0ba2c

Please sign in to comment.