From ed7bad6862f5b495e3c6b55007822813d021248b Mon Sep 17 00:00:00 2001 From: Chris Morales Date: Tue, 23 May 2017 11:57:47 -0700 Subject: pyramid_tm.explicit_manager set in the configuration. --- pyramid/scaffolds/alchemy/+package+/models/__init__.py_tmpl | 1 + pyramid/scaffolds/zodb/+package+/__init__.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/pyramid/scaffolds/alchemy/+package+/models/__init__.py_tmpl b/pyramid/scaffolds/alchemy/+package+/models/__init__.py_tmpl index f626d1ef0..521816ce7 100644 --- a/pyramid/scaffolds/alchemy/+package+/models/__init__.py_tmpl +++ b/pyramid/scaffolds/alchemy/+package+/models/__init__.py_tmpl @@ -57,6 +57,7 @@ def includeme(config): """ settings = config.get_settings() + settings['tm.manager_hook'] = 'pyramid_tm.explicit_manager' # use pyramid_tm to hook the transaction lifecycle to the request config.include('pyramid_tm') diff --git a/pyramid/scaffolds/zodb/+package+/__init__.py b/pyramid/scaffolds/zodb/+package+/__init__.py index f2a86df47..a956d0faf 100644 --- a/pyramid/scaffolds/zodb/+package+/__init__.py +++ b/pyramid/scaffolds/zodb/+package+/__init__.py @@ -12,6 +12,8 @@ def main(global_config, **settings): """ This function returns a Pyramid WSGI application. """ config = Configurator(root_factory=root_factory, settings=settings) + settings = config.get_settings() + settings['tm.manager_hook'] = 'pyramid_tm.explicit_manager' config.include('pyramid_chameleon') config.add_static_view('static', 'static', cache_max_age=3600) config.scan() -- cgit v1.2.3 From d8388838022aa5bafe78c8ba6949bc52c2968799 Mon Sep 17 00:00:00 2001 From: Chris Morales Date: Tue, 23 May 2017 15:01:16 -0700 Subject: updated references for the models that have references for the config.settings --- docs/quick_tour/sqla_demo/sqla_demo/models/__init__.py | 2 +- docs/tutorials/wiki2/src/authentication/tutorial/models/__init__.py | 1 + docs/tutorials/wiki2/src/basiclayout/tutorial/models/__init__.py | 1 + docs/tutorials/wiki2/src/installation/tutorial/models/__init__.py | 1 + docs/tutorials/wiki2/src/models/tutorial/models/__init__.py | 1 + docs/tutorials/wiki2/src/tests/tutorial/models/__init__.py | 1 + docs/tutorials/wiki2/src/views/tutorial/models/__init__.py | 1 + 7 files changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/quick_tour/sqla_demo/sqla_demo/models/__init__.py b/docs/quick_tour/sqla_demo/sqla_demo/models/__init__.py index 339326758..e6eb98fbd 100644 --- a/docs/quick_tour/sqla_demo/sqla_demo/models/__init__.py +++ b/docs/quick_tour/sqla_demo/sqla_demo/models/__init__.py @@ -57,7 +57,7 @@ def includeme(config): """ settings = config.get_settings() - + settings['tm.manager_hook'] = 'pyramid_tm.explicit_manager' # use pyramid_tm to hook the transaction lifecycle to the request config.include('pyramid_tm') diff --git a/docs/tutorials/wiki2/src/authentication/tutorial/models/__init__.py b/docs/tutorials/wiki2/src/authentication/tutorial/models/__init__.py index 8147052ad..cd8347ccd 100644 --- a/docs/tutorials/wiki2/src/authentication/tutorial/models/__init__.py +++ b/docs/tutorials/wiki2/src/authentication/tutorial/models/__init__.py @@ -58,6 +58,7 @@ def includeme(config): """ settings = config.get_settings() + settings['tm.manager_hook'] = 'pyramid_tm.explicit_manager' # use pyramid_tm to hook the transaction lifecycle to the request config.include('pyramid_tm') diff --git a/docs/tutorials/wiki2/src/basiclayout/tutorial/models/__init__.py b/docs/tutorials/wiki2/src/basiclayout/tutorial/models/__init__.py index 5ca037787..ae575691c 100644 --- a/docs/tutorials/wiki2/src/basiclayout/tutorial/models/__init__.py +++ b/docs/tutorials/wiki2/src/basiclayout/tutorial/models/__init__.py @@ -57,6 +57,7 @@ def includeme(config): """ settings = config.get_settings() + settings['tm.manager_hook'] = 'pyramid_tm.explicit_manager' # use pyramid_tm to hook the transaction lifecycle to the request config.include('pyramid_tm') diff --git a/docs/tutorials/wiki2/src/installation/tutorial/models/__init__.py b/docs/tutorials/wiki2/src/installation/tutorial/models/__init__.py index 5ca037787..ae575691c 100644 --- a/docs/tutorials/wiki2/src/installation/tutorial/models/__init__.py +++ b/docs/tutorials/wiki2/src/installation/tutorial/models/__init__.py @@ -57,6 +57,7 @@ def includeme(config): """ settings = config.get_settings() + settings['tm.manager_hook'] = 'pyramid_tm.explicit_manager' # use pyramid_tm to hook the transaction lifecycle to the request config.include('pyramid_tm') diff --git a/docs/tutorials/wiki2/src/models/tutorial/models/__init__.py b/docs/tutorials/wiki2/src/models/tutorial/models/__init__.py index 8147052ad..cd8347ccd 100644 --- a/docs/tutorials/wiki2/src/models/tutorial/models/__init__.py +++ b/docs/tutorials/wiki2/src/models/tutorial/models/__init__.py @@ -58,6 +58,7 @@ def includeme(config): """ settings = config.get_settings() + settings['tm.manager_hook'] = 'pyramid_tm.explicit_manager' # use pyramid_tm to hook the transaction lifecycle to the request config.include('pyramid_tm') diff --git a/docs/tutorials/wiki2/src/tests/tutorial/models/__init__.py b/docs/tutorials/wiki2/src/tests/tutorial/models/__init__.py index 8147052ad..cd8347ccd 100644 --- a/docs/tutorials/wiki2/src/tests/tutorial/models/__init__.py +++ b/docs/tutorials/wiki2/src/tests/tutorial/models/__init__.py @@ -58,6 +58,7 @@ def includeme(config): """ settings = config.get_settings() + settings['tm.manager_hook'] = 'pyramid_tm.explicit_manager' # use pyramid_tm to hook the transaction lifecycle to the request config.include('pyramid_tm') diff --git a/docs/tutorials/wiki2/src/views/tutorial/models/__init__.py b/docs/tutorials/wiki2/src/views/tutorial/models/__init__.py index 8147052ad..cd8347ccd 100644 --- a/docs/tutorials/wiki2/src/views/tutorial/models/__init__.py +++ b/docs/tutorials/wiki2/src/views/tutorial/models/__init__.py @@ -58,6 +58,7 @@ def includeme(config): """ settings = config.get_settings() + settings['tm.manager_hook'] = 'pyramid_tm.explicit_manager' # use pyramid_tm to hook the transaction lifecycle to the request config.include('pyramid_tm') -- cgit v1.2.3 From 81fa04cc4e59ce01bb0abbabfefb8c25cf43eb78 Mon Sep 17 00:00:00 2001 From: Chris Morales Date: Tue, 23 May 2017 17:53:09 -0700 Subject: updated the emphasis in the tutorial docs for the definingmodels.rst --- docs/tutorials/wiki2/definingmodels.rst | 2 +- docs/tutorials/wiki2/src/models/tutorial/__init__.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/tutorials/wiki2/definingmodels.rst b/docs/tutorials/wiki2/definingmodels.rst index 5cebb943c..801b56eb4 100644 --- a/docs/tutorials/wiki2/definingmodels.rst +++ b/docs/tutorials/wiki2/definingmodels.rst @@ -153,7 +153,7 @@ the following: .. literalinclude:: src/models/tutorial/models/__init__.py :linenos: :language: py - :emphasize-lines: 8,9 + :emphasize-lines: 10,11 Here we align our imports with the names of the models, ``Page`` and ``User``. diff --git a/docs/tutorials/wiki2/src/models/tutorial/__init__.py b/docs/tutorials/wiki2/src/models/tutorial/__init__.py index 4dab44823..7654fc808 100644 --- a/docs/tutorials/wiki2/src/models/tutorial/__init__.py +++ b/docs/tutorials/wiki2/src/models/tutorial/__init__.py @@ -5,6 +5,8 @@ def main(global_config, **settings): """ This function returns a Pyramid WSGI application. """ config = Configurator(settings=settings) + settings = config.get_settings() + settings['tm.manager_hook'] = 'pyramid_tm.explicit_manager' config.include('pyramid_jinja2') config.include('.models') config.include('.routes') -- cgit v1.2.3 From 7c20d8ca305c8cdcc72fd721054b9ed2b783f02d Mon Sep 17 00:00:00 2001 From: Chris Morales Date: Wed, 24 May 2017 14:51:25 -0700 Subject: updated documentation showing the pyramid_tm.explicit_manager being set --- docs/tutorials/wiki2/src/authorization/tutorial/models/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/tutorials/wiki2/src/authorization/tutorial/models/__init__.py b/docs/tutorials/wiki2/src/authorization/tutorial/models/__init__.py index 8147052ad..cd8347ccd 100644 --- a/docs/tutorials/wiki2/src/authorization/tutorial/models/__init__.py +++ b/docs/tutorials/wiki2/src/authorization/tutorial/models/__init__.py @@ -58,6 +58,7 @@ def includeme(config): """ settings = config.get_settings() + settings['tm.manager_hook'] = 'pyramid_tm.explicit_manager' # use pyramid_tm to hook the transaction lifecycle to the request config.include('pyramid_tm') -- cgit v1.2.3 From 1814cda1f5ec85c24651bfd29645e4057ae5200e Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Mon, 5 Jun 2017 17:14:32 -0400 Subject: Ensure that instances of 'AllPermissionsList' are iterable. Closes #3073. --- pyramid/security.py | 5 ++++- pyramid/tests/test_security.py | 24 ++++++++++++++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/pyramid/security.py b/pyramid/security.py index 82e6b73a9..035f09f77 100644 --- a/pyramid/security.py +++ b/pyramid/security.py @@ -21,10 +21,13 @@ _marker = object() class AllPermissionsList(object): """ Stand in 'permission list' to represent all permissions """ + def __iter__(self): - return () + return iter(()) + def __contains__(self, other): return True + def __eq__(self, other): return isinstance(other, self.__class__) diff --git a/pyramid/tests/test_security.py b/pyramid/tests/test_security.py index 6d75ac8e3..5561a05d7 100644 --- a/pyramid/tests/test_security.py +++ b/pyramid/tests/test_security.py @@ -16,12 +16,32 @@ class TestAllPermissionsList(unittest.TestCase): def _makeOne(self): return self._getTargetClass()() - def test_it(self): + def test_equality_w_self(self): thing = self._makeOne() self.assertTrue(thing.__eq__(thing)) - self.assertEqual(thing.__iter__(), ()) + + def test_equality_w_other_instances_of_class(self): + thing = self._makeOne() + other = self._makeOne() + self.assertTrue(thing.__eq__(other)) + + def test_equality_miss(self): + thing = self._makeOne() + other = object() + self.assertFalse(thing.__eq__(other)) + + def test_contains_w_string(self): + thing = self._makeOne() self.assertTrue('anything' in thing) + def test_contains_w_object(self): + thing = self._makeOne() + self.assertTrue(object() in thing) + + def test_iterable(self): + thing = self._makeOne() + self.assertEqual(list(thing), []) + def test_singleton(self): from pyramid.security import ALL_PERMISSIONS self.assertEqual(ALL_PERMISSIONS.__class__, self._getTargetClass()) -- cgit v1.2.3 From 57ce7b0c251d34e29a2eb5375c70e751c9b83f4e Mon Sep 17 00:00:00 2001 From: Michael Merickel Date: Wed, 7 Jun 2017 00:02:15 -0500 Subject: explain why we prefer to avoid activate fixes #3064 --- docs/narr/install.rst | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/narr/install.rst b/docs/narr/install.rst index 2a25ad84d..c2bd00bff 100644 --- a/docs/narr/install.rst +++ b/docs/narr/install.rst @@ -206,9 +206,7 @@ After installing Python as described previously in :ref:`for-mac-os-x-users` or ``$VENV/bin/pip`` clearly specifies that ``pip`` is run from within the virtual environment and not at the system level. - ``activate`` drops turds into the user's shell environment, leaving them - vulnerable to executing commands in the wrong context. ``deactivate`` might - not correctly restore previous shell environment variables. + ``activate`` makes changes to the user's shell environment which can often be convenient. However, in the context of long-form documentation, environment configuration can easily be forgotten. By keeping each snippet explicit we can reduce copy / paste errors by users in which commands are executed against the wrong Python environment. Also, ``deactivate`` might not correctly restore previous shell environment variables. Avoiding ``activate`` keeps the environment more reproducible. Although using ``source bin/activate``, then ``pip``, requires fewer key strokes to issue commands once invoked, there are other things to consider. -- cgit v1.2.3 From daf06d8f8dbfa3245ea4de28defc0249219b6b0e Mon Sep 17 00:00:00 2001 From: Michael Merickel Date: Wed, 7 Jun 2017 01:05:32 -0500 Subject: add versionadded directive for invoke_exception_view --- pyramid/view.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pyramid/view.py b/pyramid/view.py index 47b756ad8..14d11825e 100644 --- a/pyramid/view.py +++ b/pyramid/view.py @@ -668,6 +668,8 @@ class ViewMethodsMixin(object): response. Otherwise the previous values for ``request.exception`` and ``request.exc_info`` will be restored. + .. versionadded:: 1.7 + .. versionchanged:: 1.9 The ``request.exception`` and ``request.exc_info`` properties will reflect the exception used to render the response where previously -- cgit v1.2.3 From 7b3249dff86b4359508897c77dea6aa75421b052 Mon Sep 17 00:00:00 2001 From: Michael Merickel Date: Fri, 9 Jun 2017 00:04:35 -0500 Subject: add changelog for #3074 --- CHANGES.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES.txt b/CHANGES.txt index 06bb71c1e..1402045d4 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -17,6 +17,10 @@ unreleased invoked from ``request.invoke_exception_view``. See https://github.com/Pylons/pyramid/pull/3060 +- Fix a bug in which ``pyramid.security.ALL_PERMISSIONS`` failed to return + a valid iterator in its ``__iter__`` implementation. + See https://github.com/Pylons/pyramid/pull/3074 + 1.9a2 (2017-05-09) ================== -- cgit v1.2.3 From 5067ffcf19a8659777406b06485fefc75404f2fa Mon Sep 17 00:00:00 2001 From: Volker Diels-Grabsch Date: Fri, 9 Jun 2017 14:48:54 +0200 Subject: Fix forbidden_view for BasicAuthAuthenticationPolicy (#3066) --- CONTRIBUTORS.txt | 2 ++ pyramid/authentication.py | 10 ++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index cbee08d0d..445536e9e 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -302,3 +302,5 @@ Contributors - Jeremy(Ching-Rui) Chen, 2017/04/19 - Fang-Pen Lin, 2017/05/22 + +- Volker Diels-Grabsch, 2017/06/09 diff --git a/pyramid/authentication.py b/pyramid/authentication.py index 03b204e1a..445d6fcd2 100644 --- a/pyramid/authentication.py +++ b/pyramid/authentication.py @@ -1084,10 +1084,12 @@ class BasicAuthAuthenticationPolicy(CallbackAuthenticationPolicy): from pyramid.view import forbidden_view_config @forbidden_view_config() - def basic_challenge(request): - response = HTTPUnauthorized() - response.headers.update(forget(request)) - return response + def forbidden_view(request): + if request.authenticated_userid is None: + response = HTTPUnauthorized() + response.headers.update(forget(request)) + return response + return HTTPForbidden() """ def __init__(self, check, realm='Realm', debug=False): self.check = check -- cgit v1.2.3