kopia lustrzana https://github.com/wagtail/wagtail
rodzic
9889bddcb8
commit
5402010d16
|
@ -15,6 +15,7 @@ Changelog
|
||||||
* Only allow selection of valid new parents within the copy Page view (Mauro Soche)
|
* Only allow selection of valid new parents within the copy Page view (Mauro Soche)
|
||||||
* Add `on_serve_page` hook to modify the serving chain of pages (Krystian Magdziarz, Dawid Bugajewski)
|
* Add `on_serve_page` hook to modify the serving chain of pages (Krystian Magdziarz, Dawid Bugajewski)
|
||||||
* Add support for `WAGTAIL_GRAVATAR_PROVIDER_URL` URLs with query string parameters (Ayaan Qadri, Guilhem Saurel)
|
* Add support for `WAGTAIL_GRAVATAR_PROVIDER_URL` URLs with query string parameters (Ayaan Qadri, Guilhem Saurel)
|
||||||
|
* Add `get_avatar_url` hook to customise user avatars (jhrr)
|
||||||
* Fix: Improve handling of translations for bulk page action confirmation messages (Matt Westcott)
|
* Fix: Improve handling of translations for bulk page action confirmation messages (Matt Westcott)
|
||||||
* Fix: Ensure custom rich text feature icons are correctly handled when provided as a list of SVG paths (Temidayo Azeez, Joel William, LB (Ben) Johnston)
|
* Fix: Ensure custom rich text feature icons are correctly handled when provided as a list of SVG paths (Temidayo Azeez, Joel William, LB (Ben) Johnston)
|
||||||
* Fix: Ensure manual edits to `StreamField` values do not throw an error (Stefan Hammer)
|
* Fix: Ensure manual edits to `StreamField` values do not throw an error (Stefan Hammer)
|
||||||
|
|
|
@ -862,6 +862,7 @@
|
||||||
* Mauro Soche
|
* Mauro Soche
|
||||||
* Krystian Magdziarz
|
* Krystian Magdziarz
|
||||||
* Guilhem Saurel
|
* Guilhem Saurel
|
||||||
|
* jhrr
|
||||||
|
|
||||||
## Translators
|
## Translators
|
||||||
|
|
||||||
|
|
|
@ -85,6 +85,22 @@ To replace the welcome message on the dashboard, create a template file `dashboa
|
||||||
{% block branding_welcome %}Welcome to Frank's Site{% endblock %}
|
{% block branding_welcome %}Welcome to Frank's Site{% endblock %}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
(custom_user_profile_avatar)=
|
||||||
|
|
||||||
|
## Custom user profile avatar
|
||||||
|
|
||||||
|
To render a user avatar other than the one sourced from the `UserProfile` model or from [gravatar](https://gravatar.com/), you can use the [`get_avatar_url`](#get_avatar_url) hook and resolve the avatar's image url as you see fit.
|
||||||
|
|
||||||
|
For example, you might have an avatar on a `Profile` model in your own application that is keyed to the `auth.User` model in the familiar pattern. In that case, you could register your hook as the in following example, and the Wagtail admin avatar will be replaced with your own `Profile` avatar accordingly.
|
||||||
|
|
||||||
|
```python
|
||||||
|
@hooks.register('get_avatar_url')
|
||||||
|
def get_profile_avatar(user, size):
|
||||||
|
return user.profile.avatar
|
||||||
|
```
|
||||||
|
|
||||||
|
Additionally, you can use the default `size` parameter that is passed in to the hook if you need to attach it to a request or do any further processing on your image.
|
||||||
|
|
||||||
(custom_user_interface_fonts)=
|
(custom_user_interface_fonts)=
|
||||||
|
|
||||||
## Custom user interface fonts
|
## Custom user interface fonts
|
||||||
|
|
|
@ -102,6 +102,30 @@ depth: 1
|
||||||
---
|
---
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Appearance
|
||||||
|
|
||||||
|
Hooks for modifying the display and appearance of basic CMS features and furniture.
|
||||||
|
|
||||||
|
(get_avatar_url)=
|
||||||
|
|
||||||
|
### `get_avatar_url`
|
||||||
|
|
||||||
|
Specify a custom user avatar to be displayed in the Wagtail admin. The callable passed to this hook should accept a `user` object and a `size` parameter that can be used in any resize or thumbnail processing you might need to do.
|
||||||
|
|
||||||
|
```python
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
@hooks.register('get_avatar_url')
|
||||||
|
def get_profile_avatar(user, size):
|
||||||
|
today = datetime.now()
|
||||||
|
is_christmas_day = today.month == 12 and today.day == 25
|
||||||
|
|
||||||
|
if is_christmas_day:
|
||||||
|
return '/static/images/santa.png'
|
||||||
|
|
||||||
|
return None
|
||||||
|
```
|
||||||
|
|
||||||
## Admin modules
|
## Admin modules
|
||||||
|
|
||||||
Hooks for building new areas of the admin interface (alongside pages, images, documents, and so on).
|
Hooks for building new areas of the admin interface (alongside pages, images, documents, and so on).
|
||||||
|
|
|
@ -24,6 +24,7 @@ depth: 1
|
||||||
* Only allow selection of valid new parents within the copy Page view (Mauro Soche)
|
* Only allow selection of valid new parents within the copy Page view (Mauro Soche)
|
||||||
* Add [`on_serve_page`](on_serve_page) hook to modify the serving chain of pages (Krystian Magdziarz, Dawid Bugajewski)
|
* Add [`on_serve_page`](on_serve_page) hook to modify the serving chain of pages (Krystian Magdziarz, Dawid Bugajewski)
|
||||||
* Add support for [`WAGTAIL_GRAVATAR_PROVIDER_URL`](wagtail_gravatar_provider_url) URLs with query string parameters (Ayaan Qadri, Guilhem Saurel)
|
* Add support for [`WAGTAIL_GRAVATAR_PROVIDER_URL`](wagtail_gravatar_provider_url) URLs with query string parameters (Ayaan Qadri, Guilhem Saurel)
|
||||||
|
* Add [`get_avatar_url`](get_avatar_url) hook to customise user avatars (jhrr)
|
||||||
|
|
||||||
### Bug fixes
|
### Bug fixes
|
||||||
|
|
||||||
|
|
|
@ -654,8 +654,19 @@ def avatar_url(user, size=50, gravatar_only=False):
|
||||||
"""
|
"""
|
||||||
A template tag that receives a user and size and return
|
A template tag that receives a user and size and return
|
||||||
the appropriate avatar url for that user.
|
the appropriate avatar url for that user.
|
||||||
|
|
||||||
|
If the 'get_avatar_url' hook is defined, then that will intercept this
|
||||||
|
logic and point to whatever resource that function returns. In this way,
|
||||||
|
users can swap out the Wagtail UserProfile avatar for some other image or
|
||||||
|
field of their own choosing without needing to alter anything on the
|
||||||
|
existing models.
|
||||||
|
|
||||||
Example usage: {% avatar_url request.user 50 %}
|
Example usage: {% avatar_url request.user 50 %}
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
for hook_fn in hooks.get_hooks("get_avatar_url"):
|
||||||
|
if url := hook_fn(user, size):
|
||||||
|
return url
|
||||||
|
|
||||||
if (
|
if (
|
||||||
not gravatar_only
|
not gravatar_only
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import json
|
import json
|
||||||
|
import os
|
||||||
import unittest
|
import unittest
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from datetime import timezone as dt_timezone
|
from datetime import timezone as dt_timezone
|
||||||
|
@ -31,6 +32,24 @@ from wagtail.users.models import UserProfile
|
||||||
from wagtail.utils.deprecation import RemovedInWagtail70Warning
|
from wagtail.utils.deprecation import RemovedInWagtail70Warning
|
||||||
|
|
||||||
|
|
||||||
|
class TestAvatarUrlInterceptTemplateTag(WagtailTestUtils, TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.test_user = self.create_user(
|
||||||
|
username="testuser",
|
||||||
|
email="testuser@email.com",
|
||||||
|
password="password",
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_get_avatar_url_undefined(self):
|
||||||
|
url = avatar_url(self.test_user)
|
||||||
|
self.assertIn("www.gravatar.com", url)
|
||||||
|
|
||||||
|
@mock.patch.dict(os.environ, {"AVATAR_INTERCEPT": "True"}, clear=True)
|
||||||
|
def test_get_avatar_url_registered(self):
|
||||||
|
url = avatar_url(self.test_user)
|
||||||
|
self.assertEqual(url, "/some/avatar/fred.png")
|
||||||
|
|
||||||
|
|
||||||
class TestAvatarTemplateTag(WagtailTestUtils, TestCase):
|
class TestAvatarTemplateTag(WagtailTestUtils, TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
# Create a user
|
# Create a user
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
import os
|
||||||
|
|
||||||
from django import forms
|
from django import forms
|
||||||
from django.http import HttpResponse
|
from django.http import HttpResponse
|
||||||
from django.utils.safestring import mark_safe
|
from django.utils.safestring import mark_safe
|
||||||
|
@ -432,3 +434,10 @@ def register_animated_advert_chooser_viewset():
|
||||||
@hooks.register("register_admin_viewset")
|
@hooks.register("register_admin_viewset")
|
||||||
def register_event_page_listing_viewset():
|
def register_event_page_listing_viewset():
|
||||||
return event_page_listing_viewset
|
return event_page_listing_viewset
|
||||||
|
|
||||||
|
|
||||||
|
@hooks.register("get_avatar_url")
|
||||||
|
def register_avatar_intercept_url(user, size):
|
||||||
|
if os.environ.get("AVATAR_INTERCEPT"):
|
||||||
|
return "/some/avatar/fred.png"
|
||||||
|
return None
|
||||||
|
|
Ładowanie…
Reference in New Issue