Navigation and dashboard: Hide useless items (#5995)

* Navigation and dashboard: Hide useless items

If a user has access to *no organizer teams*, hide a number of things
from navigation and dashboard. This happens e.g. if a user only has
permissions in scope of the pretix-resellers or pretix-scheduling
plugins.

* New mechanism
This commit is contained in:
Raphael Michel
2026-03-17 10:26:22 +01:00
committed by GitHub
parent b939b63606
commit bf80dc37c5
3 changed files with 65 additions and 52 deletions

View File

@@ -49,6 +49,7 @@ from django.core.exceptions import BadRequest, PermissionDenied
from django.db import IntegrityError, models, transaction from django.db import IntegrityError, models, transaction
from django.db.models import Q from django.db.models import Q
from django.utils.crypto import get_random_string, salted_hmac from django.utils.crypto import get_random_string, salted_hmac
from django.utils.functional import cached_property
from django.utils.timezone import now from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django_otp.models import Device from django_otp.models import Device
@@ -667,6 +668,11 @@ class User(AbstractBaseUser, PermissionsMixin, LoggingMixin):
self.session_token = generate_session_token() self.session_token = generate_session_token()
self.save(update_fields=['session_token']) self.save(update_fields=['session_token'])
@cached_property
@scopes_disabled()
def is_in_any_teams(self):
return self.teams.exists()
class UserKnownLoginSource(models.Model): class UserKnownLoginSource(models.Model):
user = models.ForeignKey('User', on_delete=models.CASCADE, related_name="known_login_sources") user = models.ForeignKey('User', on_delete=models.CASCADE, related_name="known_login_sources")

View File

@@ -340,6 +340,9 @@ def get_global_navigation(request):
'active': (url.url_name == 'index'), 'active': (url.url_name == 'index'),
'icon': 'dashboard', 'icon': 'dashboard',
}, },
]
if request.user.is_in_any_teams:
nav += [
{ {
'label': _('Events'), 'label': _('Events'),
'url': reverse('control:events'), 'url': reverse('control:events'),
@@ -372,6 +375,8 @@ def get_global_navigation(request):
}, },
] ]
}, },
]
nav += [
{ {
'label': _('User settings'), 'label': _('User settings'),
'url': reverse('control:user.settings'), 'url': reverse('control:user.settings'),

View File

@@ -12,6 +12,7 @@
class="event-dropdown dropdown-menu"> class="event-dropdown dropdown-menu">
</ul> </ul>
</div> </div>
{% if upcoming or can_create_event %}
<h2>{% trans "Your upcoming events" %}</h2> <h2>{% trans "Your upcoming events" %}</h2>
<div class="dashboard"> <div class="dashboard">
{% if can_create_event %} {% if can_create_event %}
@@ -33,6 +34,7 @@
</div> </div>
{% endfor %} {% endfor %}
</div> </div>
{% endif %}
{% if upcoming %} {% if upcoming %}
<p class=""> <p class="">
<a href="{% url "control:events" %}?ordering=date_from&status=date_future" class=""> <a href="{% url "control:events" %}?ordering=date_from&status=date_future" class="">