Oleg Komarov
b4aac8b791
This PR adds new features described in #106: - new `Assign Team` field in extension edit form that can be set only by extension maintainers (original author) - it is now possible to leave a team - all team members can edit/upload new versions for team extensions (except for changing the team assignment) - team extensions are listed in My Extensions for all team members Co-authored-by: Márton Lente <marton@blender.org> Reviewed-on: #147 Reviewed-by: Anna Sirota <railla@noreply.localhost>
63 lines
2.1 KiB
Python
63 lines
2.1 KiB
Python
from django.contrib.auth.mixins import UserPassesTestMixin
|
|
from django.shortcuts import get_object_or_404
|
|
|
|
from extensions.models import Extension
|
|
from files.models import File
|
|
|
|
|
|
class OwnsFileMixin(UserPassesTestMixin):
|
|
def dispatch(self, *args, **kwargs):
|
|
self.file = get_object_or_404(File, pk=self.kwargs['pk'])
|
|
self.extension = self._get_extension()
|
|
return super().dispatch(*args, **kwargs)
|
|
|
|
def test_func(self) -> bool:
|
|
return self.file.user == self.request.user
|
|
|
|
|
|
class ExtensionQuerysetMixin:
|
|
"""Add reusable methods to class-based views handling Extensions."""
|
|
|
|
def get_extension_queryset(self):
|
|
"""Return queryset with unlisted add-ons for logged in users under certain conditions."""
|
|
if self.request.user.is_staff:
|
|
return Extension.objects.all()
|
|
if self.request.user.is_authenticated:
|
|
return Extension.objects.listed_or_authored_by(self.request.user)
|
|
return Extension.objects.listed
|
|
|
|
|
|
class MaintainedExtensionMixin:
|
|
"""Fetch an extension by slug if current user is a maintainer."""
|
|
|
|
def dispatch(self, *args, **kwargs):
|
|
self.extension = get_object_or_404(
|
|
Extension.objects.authored_by(self.request.user),
|
|
slug=self.kwargs['slug'],
|
|
)
|
|
return super().dispatch(*args, **kwargs)
|
|
|
|
|
|
class ListedExtensionMixin:
|
|
"""Fetch a publicly listed extension by slug in the URL before dispatching the view."""
|
|
|
|
def dispatch(self, *args, **kwargs):
|
|
self.extension = get_object_or_404(Extension.objects.listed, slug=self.kwargs['slug'])
|
|
return super().dispatch(*args, **kwargs)
|
|
|
|
|
|
class ExtensionMixin:
|
|
"""Fetch an extension by slug in the URL before dispatching the view."""
|
|
|
|
def dispatch(self, *args, **kwargs):
|
|
self.extension = get_object_or_404(Extension, slug=self.kwargs['slug'])
|
|
return super().dispatch(*args, **kwargs)
|
|
|
|
|
|
class DraftVersionMixin:
|
|
"""Fetch the version object which is being edited as a draft."""
|
|
|
|
def dispatch(self, *args, **kwargs):
|
|
self.version = self.extension.versions.first()
|
|
return super().dispatch(*args, **kwargs)
|