|
15 | 15 | from django.urls import NoReverseMatch, resolve, reverse
|
16 | 16 | from django.utils.translation import gettext as _
|
17 | 17 |
|
| 18 | +from extras.choices import BookmarkOrderingChoices |
18 | 19 | from extras.utils import FeatureQuery
|
19 | 20 | from utilities.forms import BootstrapMixin
|
20 | 21 | from utilities.permissions import get_permission_for_model
|
|
23 | 24 | from .utils import register_widget
|
24 | 25 |
|
25 | 26 | __all__ = (
|
| 27 | + 'BookmarksWidget', |
26 | 28 | 'DashboardWidget',
|
27 | 29 | 'NoteWidget',
|
28 | 30 | 'ObjectCountsWidget',
|
@@ -318,3 +320,42 @@ def get_feed(self):
|
318 | 320 | return {
|
319 | 321 | 'feed': feed,
|
320 | 322 | }
|
| 323 | + |
| 324 | + |
| 325 | +@register_widget |
| 326 | +class BookmarksWidget(DashboardWidget): |
| 327 | + default_title = _('Bookmarks') |
| 328 | + default_config = { |
| 329 | + 'order_by': BookmarkOrderingChoices.ORDERING_NEWEST, |
| 330 | + } |
| 331 | + description = _('Show your personal bookmarks') |
| 332 | + template_name = 'extras/dashboard/widgets/bookmarks.html' |
| 333 | + |
| 334 | + class ConfigForm(WidgetConfigForm): |
| 335 | + object_types = forms.MultipleChoiceField( |
| 336 | + # TODO: Restrict the choices by FeatureQuery('bookmarks') |
| 337 | + choices=get_content_type_labels, |
| 338 | + required=False |
| 339 | + ) |
| 340 | + order_by = forms.ChoiceField( |
| 341 | + choices=BookmarkOrderingChoices |
| 342 | + ) |
| 343 | + max_items = forms.IntegerField( |
| 344 | + min_value=1, |
| 345 | + required=False |
| 346 | + ) |
| 347 | + |
| 348 | + def render(self, request): |
| 349 | + from extras.models import Bookmark |
| 350 | + |
| 351 | + bookmarks = Bookmark.objects.filter(user=request.user).order_by(self.config['order_by']) |
| 352 | + if object_types := self.config.get('object_types'): |
| 353 | + models = get_models_from_content_types(object_types) |
| 354 | + conent_types = ContentType.objects.get_for_models(*models).values() |
| 355 | + bookmarks = bookmarks.filter(object_type__in=conent_types) |
| 356 | + if max_items := self.config.get('max_items'): |
| 357 | + bookmarks = bookmarks[:max_items] |
| 358 | + |
| 359 | + return render_to_string(self.template_name, { |
| 360 | + 'bookmarks': bookmarks, |
| 361 | + }) |
0 commit comments