Skip to content
Snippets Groups Projects
Verified Commit bbc4e336 authored by Jonathan Weth's avatar Jonathan Weth :keyboard:
Browse files

Merge branch 'master' into feature/connection_pooling

parents 8c768bf6 ad80080e
Branches 381-introduce-cleave-js-for-formatted-input-fields
Tags 2.8.2.dev2
1 merge request!345Enable PostgreSQL connection pooling
Pipeline #3342 failed
...@@ -19,11 +19,13 @@ def send_notification(notification: int, resend: bool = False) -> None: ...@@ -19,11 +19,13 @@ def send_notification(notification: int, resend: bool = False) -> None:
def backup_data() -> None: def backup_data() -> None:
"""Backup database and media using django-dbbackup.""" """Backup database and media using django-dbbackup."""
# Assemble command-line options for dbbackup management command # Assemble command-line options for dbbackup management command
db_options = "-z " * settings.DBBACKUP_COMPRESS_DB + "-e" * settings.DBBACKUP_ENCRYPT_DB db_options = (["-z"] if settings.DBBACKUP_COMPRESS_DB else []) + (
media_options = ( ["-e"] if settings.DBBACKUP_ENCRYPT_DB else []
"-z " * settings.DBBACKUP_COMPRESS_MEDIA + "-e" * settings.DBBACKUP_ENCRYPT_MEDIA )
media_options = (["-z"] if settings.DBBACKUP_COMPRESS_MEDIA else []) + (
["-e"] if settings.DBBACKUP_ENCRYPT_MEDIA else []
) )
# Hand off to dbbackup's management commands # Hand off to dbbackup's management commands
management.call_command("dbbackup", db_options) management.call_command("dbbackup", *db_options)
management.call_command("mediabackup", media_options) management.call_command("mediabackup", *media_options)
...@@ -9,7 +9,7 @@ from typing import Any, Callable, Optional, Sequence, Union ...@@ -9,7 +9,7 @@ from typing import Any, Callable, Optional, Sequence, Union
from uuid import uuid4 from uuid import uuid4
from django.conf import settings from django.conf import settings
from django.db.models import Model from django.db.models import Model, QuerySet
from django.http import HttpRequest from django.http import HttpRequest
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.utils import timezone from django.utils import timezone
...@@ -17,6 +17,8 @@ from django.utils.functional import lazy ...@@ -17,6 +17,8 @@ from django.utils.functional import lazy
from django_global_request.middleware import get_request from django_global_request.middleware import get_request
from cache_memoize import cache_memoize
from aleksis.core.util import messages from aleksis.core.util import messages
...@@ -357,3 +359,20 @@ def handle_uploaded_file(f, filename: str): ...@@ -357,3 +359,20 @@ def handle_uploaded_file(f, filename: str):
with open(filename, "wb+") as destination: with open(filename, "wb+") as destination:
for chunk in f.chunks(): for chunk in f.chunks():
destination.write(chunk) destination.write(chunk)
@cache_memoize(3600)
def queryset_rules_filter(
obj: Union[HttpRequest, Model], queryset: QuerySet, perm: str
) -> QuerySet:
"""Filter queryset by user and permission."""
wanted_objects = set()
if isinstance(obj, HttpRequest) and hasattr(obj, "user"):
obj = obj.user
for item in queryset:
if obj.has_perm(perm, item):
wanted_objects.add(item.pk)
return queryset.filter(pk__in=wanted_objects)
from django.contrib.auth.backends import ModelBackend from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
from django.db.models import Model from django.db.models import Model
from django.http import HttpRequest from django.http import HttpRequest
...@@ -8,7 +9,7 @@ from guardian.shortcuts import get_objects_for_user ...@@ -8,7 +9,7 @@ from guardian.shortcuts import get_objects_for_user
from rules import predicate from rules import predicate
from ..models import Group from ..models import Group
from .core_helpers import get_site_preferences from .core_helpers import get_site_preferences, queryset_rules_filter
from .core_helpers import has_person as has_person_helper from .core_helpers import has_person as has_person_helper
...@@ -57,15 +58,20 @@ def has_any_object(perm: str, klass): ...@@ -57,15 +58,20 @@ def has_any_object(perm: str, klass):
"""Check if has any object. """Check if has any object.
Build predicate which checks whether a user has access Build predicate which checks whether a user has access
to objects with the provided permission. to objects with the provided permission or rule.
""" """
name = f"has_any_object:{perm}" name = f"has_any_object:{perm}"
@predicate(name) @predicate(name)
def fn(user: User) -> bool: def fn(user: User) -> bool:
objs = get_objects_for_user(user, perm, klass) try:
return len(objs) > 0 ct_perm = ContentType.objects.get(app_label=perm.split('.', 1)[0], permission__codename=perm.split('.', 1)[1])
except ContentType.DoesNotExist:
ct_perm = None
if ct_perm and ct_perm.model_class() == klass:
return get_objects_for_user(user, perm, klass).exists()
else:
return queryset_rules_filter(user, klass.objects.all(), perm).exists()
return fn return fn
......
...@@ -368,6 +368,7 @@ class SystemStatus(MainView, PermissionRequiredMixin): ...@@ -368,6 +368,7 @@ class SystemStatus(MainView, PermissionRequiredMixin):
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
status_code = 500 if self.errors else 200 status_code = 500 if self.errors else 200
task_results = []
if "django_celery_results" in settings.INSTALLED_APPS: if "django_celery_results" in settings.INSTALLED_APPS:
from django_celery_results.models import TaskResult # noqa from django_celery_results.models import TaskResult # noqa
...@@ -375,11 +376,10 @@ class SystemStatus(MainView, PermissionRequiredMixin): ...@@ -375,11 +376,10 @@ class SystemStatus(MainView, PermissionRequiredMixin):
if inspect().registered_tasks(): if inspect().registered_tasks():
job_list = list(inspect().registered_tasks().values())[0] job_list = list(inspect().registered_tasks().values())[0]
results = []
for job in job_list: for job in job_list:
results.append(TaskResult.objects.filter(task_name=job).last()) task_results.append(TaskResult.objects.filter(task_name=job).order_by("date_done").last())
context = {"plugins": self.plugins, "status_code": status_code} context = {"plugins": self.plugins, "status_code": status_code, "tasks": task_results}
return self.render_to_response(context, status=status_code) return self.render_to_response(context, status=status_code)
......
...@@ -690,7 +690,7 @@ description = "A pluggable framework for adding two-factor authentication to Dja ...@@ -690,7 +690,7 @@ description = "A pluggable framework for adding two-factor authentication to Dja
name = "django-otp" name = "django-otp"
optional = false optional = false
python-versions = "*" python-versions = "*"
version = "0.9.3" version = "0.9.4"
[package.dependencies] [package.dependencies]
django = ">=1.11" django = ">=1.11"
...@@ -2154,7 +2154,7 @@ celery = ["Celery", "django-celery-results", "django-celery-beat", "django-celer ...@@ -2154,7 +2154,7 @@ celery = ["Celery", "django-celery-results", "django-celery-beat", "django-celer
ldap = ["django-auth-ldap"] ldap = ["django-auth-ldap"]
[metadata] [metadata]
content-hash = "a3a9d462489de57ed0d52f922959a885c5502329f81283fd5e29eecfef0c8545" content-hash = "c8c6c8720cf5493adfea9b718feb249d200e295d42071f7f2663a37811e707e5"
python-versions = "^3.7" python-versions = "^3.7"
[metadata.files] [metadata.files]
...@@ -2413,8 +2413,8 @@ django-middleware-global-request = [ ...@@ -2413,8 +2413,8 @@ django-middleware-global-request = [
{file = "django-middleware-global-request-0.1.2.tar.gz", hash = "sha256:f6490759bc9f7dbde4001709554e29ca715daf847f2222914b4e47117dca9313"}, {file = "django-middleware-global-request-0.1.2.tar.gz", hash = "sha256:f6490759bc9f7dbde4001709554e29ca715daf847f2222914b4e47117dca9313"},
] ]
django-otp = [ django-otp = [
{file = "django-otp-0.9.3.tar.gz", hash = "sha256:d2390e61794bc10dea2fd949cbcfb7946e9ae4fb248df5494ccc4ef9ac50427e"}, {file = "django-otp-0.9.4.tar.gz", hash = "sha256:50e54bc09bc435e2ad88f0aa7008718079c3529c422b469b3991a97d28b147bb"},
{file = "django_otp-0.9.3-py3-none-any.whl", hash = "sha256:97849f7bf1b50c4c36a5845ab4d2e11dd472fa8e6bcc34fe18b6d3af6e4aa449"}, {file = "django_otp-0.9.4-py3-none-any.whl", hash = "sha256:6b92c69021558765e80411479a01788977106d5696c391d2e5342074c1dd74d1"},
] ]
django-otp-yubikey = [ django-otp-yubikey = [
{file = "django-otp-yubikey-0.5.2.tar.gz", hash = "sha256:f0b1881562fb42ee9f12c28d284cbdb90d1f0383f2d53a595373b080a19bc261"}, {file = "django-otp-yubikey-0.5.2.tar.gz", hash = "sha256:f0b1881562fb42ee9f12c28d284cbdb90d1f0383f2d53a595373b080a19bc261"},
......
...@@ -72,7 +72,7 @@ django-celery-beat = {version="^2.0.0", optional=true} ...@@ -72,7 +72,7 @@ django-celery-beat = {version="^2.0.0", optional=true}
django-celery-email = {version="^3.0.0", optional=true} django-celery-email = {version="^3.0.0", optional=true}
django-jsonstore = "^0.4.1" django-jsonstore = "^0.4.1"
django-polymorphic = "^2.1.2" django-polymorphic = "^2.1.2"
django-otp = "0.9.3" django-otp = "0.9.4"
django-colorfield = "^0.3.0" django-colorfield = "^0.3.0"
django-bleach = "^0.6.1" django-bleach = "^0.6.1"
django-guardian = "^2.2.0" django-guardian = "^2.2.0"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment