Compare commits
7 commits
Author | SHA1 | Date | |
---|---|---|---|
Jan Dittberner | 11c04df074 | ||
Jan Dittberner | 7c57b4cc94 | ||
Jan Dittberner | 78e06dd2b9 | ||
Jan Dittberner | 90795375e7 | ||
Jan Dittberner | c1b226e5a1 | ||
Jan Dittberner | 5e527ef10d | ||
Jan Dittberner | 3b6d50a62a |
|
@ -1,8 +1,8 @@
|
|||
ARG DEBIAN_RELEASE=buster
|
||||
ARG DEBIAN_RELEASE=bookworm
|
||||
FROM debian:$DEBIAN_RELEASE AS builder
|
||||
|
||||
ARG GVAAPP=gva
|
||||
ARG POETRY_VERSION=1.3.1
|
||||
ARG POETRY_VERSION=1.7.1
|
||||
|
||||
ENV LC_ALL=C.UTF-8
|
||||
ENV LANG=C.UTF-8
|
||||
|
@ -26,7 +26,7 @@ WORKDIR /srv/$GVAAPP
|
|||
|
||||
COPY poetry.lock pyproject.toml /srv/$GVAAPP/
|
||||
|
||||
RUN /root/.local/bin/poetry install --only=main
|
||||
RUN /root/.local/bin/poetry install --only=main --no-root
|
||||
|
||||
FROM debian:$DEBIAN_RELEASE
|
||||
LABEL maintainer="Jan Dittberner <jan@dittberner.info>"
|
||||
|
|
|
@ -19,7 +19,7 @@ services:
|
|||
volumes:
|
||||
- "redis_data:/var/lib/redis"
|
||||
gva:
|
||||
image: gnuviech/gva:buster
|
||||
image: gnuviech/gva:bookworm
|
||||
build:
|
||||
context: .
|
||||
args:
|
||||
|
@ -67,7 +67,7 @@ services:
|
|||
volumes:
|
||||
- "../gvaldap/gvaldap:/srv/gvaldap/gvaldap"
|
||||
file:
|
||||
image: gnuviech/gvafile:buster
|
||||
image: gnuviech/gvafile:bookworm
|
||||
build:
|
||||
context: ../gvafile
|
||||
args:
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
Changelog
|
||||
=========
|
||||
|
||||
* :release:`0.15.1 <2023-07-23>
|
||||
* :bug:`-` remove stale disk usage stats older than 30 minutes
|
||||
|
||||
* :release:`0.15.0 <2023-07-23>
|
||||
* :feature:`10` add disk usage details for mail and web
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# import celery_app to initialize it
|
||||
from gnuviechadmin.celery import app as celery_app # NOQA
|
||||
|
||||
__version__ = "0.15.0"
|
||||
__version__ = "0.15.1"
|
||||
|
|
|
@ -161,6 +161,7 @@ MIDDLEWARE = [
|
|||
"django.contrib.sessions.middleware.SessionMiddleware",
|
||||
"django.middleware.csrf.CsrfViewMiddleware",
|
||||
"django.contrib.auth.middleware.AuthenticationMiddleware",
|
||||
"allauth.account.middleware.AccountMiddleware",
|
||||
"django.middleware.locale.LocaleMiddleware",
|
||||
"django.contrib.messages.middleware.MessageMiddleware",
|
||||
# uncomment next line to enable translation to browser locale
|
||||
|
|
|
@ -38,6 +38,7 @@ urlpatterns = [
|
|||
path("contact/", include("contact_form.urls")),
|
||||
path("impressum/", views.flatpage, {"url": "/impressum/"}, name="imprint"),
|
||||
path("datenschutz/", views.flatpage, {"url": "/datenschutz/"}, name="privacy"),
|
||||
path("issues/", views.flatpage, {"url": "/issues/"}, name="support"),
|
||||
]
|
||||
|
||||
# Uncomment the next line to serve media files in dev.
|
||||
|
|
|
@ -6,6 +6,7 @@ from __future__ import absolute_import
|
|||
|
||||
import http
|
||||
import logging
|
||||
from datetime import timedelta
|
||||
|
||||
from django.conf import settings
|
||||
from django.contrib import messages
|
||||
|
@ -13,6 +14,7 @@ from django.contrib.auth import get_user_model
|
|||
from django.contrib.auth.mixins import PermissionRequiredMixin, UserPassesTestMixin
|
||||
from django.http import Http404
|
||||
from django.shortcuts import get_object_or_404, redirect
|
||||
from django.utils import timezone
|
||||
from django.utils.translation import gettext as _
|
||||
from django.views.generic import DetailView, ListView
|
||||
from django.views.generic.edit import CreateView, FormView
|
||||
|
@ -278,8 +280,8 @@ class AddHostingOption(StaffUserRequiredMixin, FormView):
|
|||
class HasDiskUsageUploadPermission(BasePermission):
|
||||
def has_permission(self, request, view):
|
||||
return (
|
||||
request.user.has_perm("hostingpackages.add_customerpackagediskusage")
|
||||
and request.method == "POST"
|
||||
request.user.has_perm("hostingpackages.add_customerpackagediskusage")
|
||||
and request.method == "POST"
|
||||
)
|
||||
|
||||
|
||||
|
@ -292,12 +294,15 @@ class UploadCustomerPackageDiskUsage(APIView):
|
|||
if request.content_type != "application/json":
|
||||
return Response("Unacceptable", status=http.HTTPStatus.BAD_REQUEST)
|
||||
|
||||
submitted_sources = set()
|
||||
|
||||
for row in request.data:
|
||||
user = row["user"]
|
||||
for key in row:
|
||||
if key == "user":
|
||||
continue
|
||||
else:
|
||||
submitted_sources.add(key)
|
||||
for item, size in row[key].items():
|
||||
try:
|
||||
package = CustomerHostingPackage.objects.get(
|
||||
|
@ -315,7 +320,9 @@ class UploadCustomerPackageDiskUsage(APIView):
|
|||
|
||||
if key == "mail":
|
||||
try:
|
||||
ma_mb = package.mailboxes.get(username=item).mailaddressmailbox_set.first()
|
||||
ma_mb = package.mailboxes.get(
|
||||
username=item
|
||||
).mailaddressmailbox_set.first()
|
||||
if ma_mb:
|
||||
metric.email_address_id = ma_mb.mailaddress_id
|
||||
except Mailbox.DoesNotExist:
|
||||
|
@ -327,6 +334,12 @@ class UploadCustomerPackageDiskUsage(APIView):
|
|||
"hosting package for user %s does not exist", user
|
||||
)
|
||||
|
||||
if submitted_sources:
|
||||
CustomerPackageDiskUsage.objects.filter(
|
||||
source__in=submitted_sources,
|
||||
modified__lt=timezone.now() - timedelta(minutes=30),
|
||||
).delete()
|
||||
|
||||
logger.info("usage data submitted by %s", request.user)
|
||||
|
||||
return Response("Accepted", status=http.HTTPStatus.ACCEPTED)
|
||||
|
@ -356,7 +369,7 @@ class CustomerHostingPackageDiskUsageDetails(StaffOrSelfLoginRequiredMixin, Deta
|
|||
mail_usage, web_usage, mysql_usage, pgsql_usage = [], [], [], []
|
||||
|
||||
for usage in self.get_object().customerpackagediskusage_set.order_by(
|
||||
"-used_kb"
|
||||
"-used_kb"
|
||||
):
|
||||
if usage.used_kb <= 0:
|
||||
continue
|
||||
|
|
1572
poetry.lock
generated
1572
poetry.lock
generated
File diff suppressed because it is too large
Load diff
|
@ -1,29 +1,29 @@
|
|||
[tool.poetry]
|
||||
name = "gva"
|
||||
version = "0.15.0"
|
||||
version = "0.15.1"
|
||||
description = "gnuviechadmin web interface"
|
||||
authors = ["Jan Dittberner <jan@dittberner.info>"]
|
||||
license = "AGPL-3+"
|
||||
readme = "README.md"
|
||||
readme = "README.rst"
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = "^3.8"
|
||||
django = "^4.2"
|
||||
psycopg2-binary = "^2.9"
|
||||
celery = "^5.2.7"
|
||||
django-allauth = "^0.52.0"
|
||||
django-allauth = "^0.60.0"
|
||||
django-crispy-forms = "^2.0"
|
||||
django-debug-toolbar = "^3.8"
|
||||
django-debug-toolbar = "^4.2"
|
||||
django-model-utils = "^4.1"
|
||||
gvacommon = {version = "^0.7.0", source = "gnuviech"}
|
||||
passlib = "^1.7.4"
|
||||
redis = "^4.5.1"
|
||||
redis = "^5.0.1"
|
||||
requests-oauthlib = "^1.3.1"
|
||||
django-impersonate = "^1.9.1"
|
||||
djangorestframework = "^3.14.0"
|
||||
markdown = "^3.4.3"
|
||||
django-filter = "^23.1"
|
||||
crispy-bootstrap5 = "^0.7"
|
||||
crispy-bootstrap5 = "^2023.10"
|
||||
python-magic = "^0.4.27"
|
||||
isort = "^5.12.0"
|
||||
|
||||
|
|
Loading…
Reference in a new issue