summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
authorMichael Merickel <michael@merickel.org>2016-02-12 00:18:40 -0600
committerMichael Merickel <michael@merickel.org>2016-02-12 00:18:40 -0600
commit81e5989ed5b2bd7ea1a2b843dea9726b253b38ce (patch)
treeab732697a6c8ac79770c46748eda2dd59736c650 /docs
parentcb5a84802171ed22b67958c7733cc0eddc680d34 (diff)
downloadpyramid-81e5989ed5b2bd7ea1a2b843dea9726b253b38ce.tar.gz
pyramid-81e5989ed5b2bd7ea1a2b843dea9726b253b38ce.tar.bz2
pyramid-81e5989ed5b2bd7ea1a2b843dea9726b253b38ce.zip
create an actual user model to prepare for security
Diffstat (limited to 'docs')
-rw-r--r--docs/tutorials/wiki2/src/authorization/tutorial/views/default.py3
-rw-r--r--docs/tutorials/wiki2/src/models/setup.py1
-rw-r--r--docs/tutorials/wiki2/src/models/tutorial/models/__init__.py3
-rw-r--r--docs/tutorials/wiki2/src/models/tutorial/models/mymodel.py15
-rw-r--r--docs/tutorials/wiki2/src/models/tutorial/models/page.py20
-rw-r--r--docs/tutorials/wiki2/src/models/tutorial/models/user.py28
-rw-r--r--docs/tutorials/wiki2/src/models/tutorial/scripts/initializedb.py16
7 files changed, 67 insertions, 19 deletions
diff --git a/docs/tutorials/wiki2/src/authorization/tutorial/views/default.py b/docs/tutorials/wiki2/src/authorization/tutorial/views/default.py
index e152e73e0..f74059be0 100644
--- a/docs/tutorials/wiki2/src/authorization/tutorial/views/default.py
+++ b/docs/tutorials/wiki2/src/authorization/tutorial/views/default.py
@@ -10,6 +10,7 @@ from pyramid.view import view_config
from ..models import Page
+
# regular expression used to find WikiWords
wikiwords = re.compile(r"\b([A-Z]\w+[A-Z]+\w+)")
@@ -42,7 +43,7 @@ def view_page(request):
return dict(page=page, content=content, edit_url=edit_url)
@view_config(route_name='add_page', renderer='../templates/edit.jinja2',
- permission='edit')
+ permission='create')
def add_page(request):
pagename = request.matchdict['pagename']
if 'form.submitted' in request.params:
diff --git a/docs/tutorials/wiki2/src/models/setup.py b/docs/tutorials/wiki2/src/models/setup.py
index eb771010f..df9fec4d4 100644
--- a/docs/tutorials/wiki2/src/models/setup.py
+++ b/docs/tutorials/wiki2/src/models/setup.py
@@ -9,6 +9,7 @@ with open(os.path.join(here, 'CHANGES.txt')) as f:
CHANGES = f.read()
requires = [
+ 'bcrypt',
'pyramid',
'pyramid_jinja2',
'pyramid_debugtoolbar',
diff --git a/docs/tutorials/wiki2/src/models/tutorial/models/__init__.py b/docs/tutorials/wiki2/src/models/tutorial/models/__init__.py
index 3d3efe06f..a8871f6f5 100644
--- a/docs/tutorials/wiki2/src/models/tutorial/models/__init__.py
+++ b/docs/tutorials/wiki2/src/models/tutorial/models/__init__.py
@@ -5,7 +5,8 @@ import zope.sqlalchemy
# import or define all models here to ensure they are attached to the
# Base.metadata prior to any initialization routines
-from .mymodel import Page # flake8: noqa
+from .page import Page # flake8: noqa
+from .user import User # flake8: noqa
# run configure_mappers after defining all of the models to ensure
# all relationships can be setup
diff --git a/docs/tutorials/wiki2/src/models/tutorial/models/mymodel.py b/docs/tutorials/wiki2/src/models/tutorial/models/mymodel.py
deleted file mode 100644
index b23d0c0d2..000000000
--- a/docs/tutorials/wiki2/src/models/tutorial/models/mymodel.py
+++ /dev/null
@@ -1,15 +0,0 @@
-from sqlalchemy import (
- Column,
- Integer,
- Text,
-)
-
-from .meta import Base
-
-
-class Page(Base):
- """ The SQLAlchemy declarative model class for a Page object. """
- __tablename__ = 'pages'
- id = Column(Integer, primary_key=True)
- name = Column(Text, unique=True)
- data = Column(Integer)
diff --git a/docs/tutorials/wiki2/src/models/tutorial/models/page.py b/docs/tutorials/wiki2/src/models/tutorial/models/page.py
new file mode 100644
index 000000000..4dd5b5721
--- /dev/null
+++ b/docs/tutorials/wiki2/src/models/tutorial/models/page.py
@@ -0,0 +1,20 @@
+from sqlalchemy import (
+ Column,
+ ForeignKey,
+ Integer,
+ Text,
+)
+from sqlalchemy.orm import relationship
+
+from .meta import Base
+
+
+class Page(Base):
+ """ The SQLAlchemy declarative model class for a Page object. """
+ __tablename__ = 'pages'
+ id = Column(Integer, primary_key=True)
+ name = Column(Text, nullable=False, unique=True)
+ data = Column(Integer, nullable=False)
+
+ creator_id = Column(ForeignKey('users.id'), nullable=False)
+ creator = relationship('User', backref='created_pages')
diff --git a/docs/tutorials/wiki2/src/models/tutorial/models/user.py b/docs/tutorials/wiki2/src/models/tutorial/models/user.py
new file mode 100644
index 000000000..6123a3aad
--- /dev/null
+++ b/docs/tutorials/wiki2/src/models/tutorial/models/user.py
@@ -0,0 +1,28 @@
+import bcrypt
+from sqlalchemy import (
+ Column,
+ Integer,
+ Text,
+)
+
+from .meta import Base
+
+
+class User(Base):
+ """ The SQLAlchemy declarative model class for a User object. """
+ __tablename__ = 'users'
+ id = Column(Integer, primary_key=True)
+ name = Column(Text, nullable=False, unique=True)
+ role = Column(Text, nullable=False)
+
+ password_hash = Column(Text)
+
+ def set_password(self, pw, pre_hashed=False):
+ if pre_hashed:
+ pwhash = pw
+ else:
+ pwhash = bcrypt.hashpw(pw, bcrypt.gensalt())
+ self.password_hash = pwhash
+
+ def check_password(self, pw):
+ return bcrypt.hashpw(pw, self.password_hash) == self.password_hash
diff --git a/docs/tutorials/wiki2/src/models/tutorial/scripts/initializedb.py b/docs/tutorials/wiki2/src/models/tutorial/scripts/initializedb.py
index 601a6e73f..175b7190f 100644
--- a/docs/tutorials/wiki2/src/models/tutorial/scripts/initializedb.py
+++ b/docs/tutorials/wiki2/src/models/tutorial/scripts/initializedb.py
@@ -15,7 +15,7 @@ from ..models import (
get_session_factory,
get_tm_session,
)
-from ..models import Page
+from ..models import Page, User
def usage(argv):
@@ -41,5 +41,17 @@ def main(argv=sys.argv):
with transaction.manager:
dbsession = get_tm_session(session_factory, transaction.manager)
- page = Page(name='FrontPage', data='This is the front page')
+ editor = User(name='editor', role='editor')
+ editor.set_password('editor')
+ dbsession.add(editor)
+
+ viewer = User(name='viewer', role='viewer')
+ viewer.set_password('viewer')
+ dbsession.add(viewer)
+
+ page = Page(
+ name='FrontPage',
+ creator=editor,
+ data='This is the front page',
+ )
dbsession.add(page)