Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion config/settings/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@
# This can be omitted to allow all files, but note that this may present a security risk
# if untrusted users are allowed to upload files -
# see https://docs.wagtail.org/en/stable/advanced_topics/deploying.html#user-uploaded-files
WAGTAILDOCS_EXTENSIONS = ['csv', 'docx', 'key', 'odt', 'pdf', 'pptx', 'rtf', 'txt', 'xlsx', 'zip']
WAGTAILDOCS_EXTENSIONS = ['csv', 'docx', 'json', 'key', 'odt', 'pdf', 'pptx', 'rtf', 'txt', 'xlsx', 'zip']

# https://docs.djangoproject.com/en/dev/ref/settings/#auth-user-model
AUTH_USER_MODEL = 'users.CustomUser'
Expand Down
30 changes: 30 additions & 0 deletions config/settings/test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import tempfile

from .base import *

DEBUG = False
TEMPLATE_DEBUG = False
SECRET_KEY = "test-secret-key-not-for-production"
ALLOWED_HOSTS = ["localhost", "127.0.0.1", "testserver"]
WAGTAILADMIN_BASE_URL = "http://testserver"

PASSWORD_HASHERS = [
"django.contrib.auth.hashers.MD5PasswordHasher",
]

EMAIL_BACKEND = "django.core.mail.backends.locmem.EmailBackend"

CACHES = {
"default": {
"BACKEND": "django.core.cache.backends.locmem.LocMemCache",
}
}

CELERY_TASK_ALWAYS_EAGER = True
CELERY_TASK_EAGER_PROPAGATES = True

COMPRESS_ENABLED = False

MEDIA_ROOT = tempfile.mkdtemp(prefix="markapi_test_media_")

LLAMA_ENABLED = False
7 changes: 5 additions & 2 deletions xml_manager/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,8 @@


class XmlManagerConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'xml_manager'
default_auto_field = "django.db.models.BigAutoField"
name = "xml_manager"

def ready(self):
import xml_manager.signals # noqa: F401
59 changes: 59 additions & 0 deletions xml_manager/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import os

from django import forms
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
from wagtail.admin.forms import WagtailAdminModelForm

from xml_manager.models import SPSPackageValidation


class SPSPackageValidationForm(WagtailAdminModelForm):
zip_upload = forms.FileField(
label=_("SPS package (.zip)"),
required=False,
help_text=_(
"On edit, leave empty to revalidate the current package without "
"replacing the file."
),
)

class Meta:
model = SPSPackageValidation
fields = []

def clean_zip_upload(self):
zip_upload = self.cleaned_data.get("zip_upload")
if not zip_upload:
return zip_upload
if not zip_upload.name.lower().endswith(".zip"):
raise ValidationError(_("Only .zip files are allowed."))
if zip_upload.size == 0:
raise ValidationError(_("The file is empty."))
return zip_upload

def clean(self):
cleaned = super().clean()
if not self.instance.pk and not cleaned.get("zip_upload"):
raise ValidationError(_("A .zip file is required."))
return cleaned

@staticmethod
def save_wagtail_document(zip_upload):
from wagtail.documents.models import Document

document = Document(title=os.path.basename(zip_upload.name))
document.file.save(zip_upload.name, zip_upload, save=True)
return document

@staticmethod
def save_wagtail_document_from_path(file_path, title=None):
from django.core.files import File
from wagtail.documents.models import Document

basename = os.path.basename(file_path)
document_title = title or basename
with open(file_path, "rb") as fp:
document = Document(title=document_title)
document.file.save(basename, File(fp), save=True)
return document
105 changes: 105 additions & 0 deletions xml_manager/migrations/0004_spspackagevalidation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("wagtaildocs", "0014_alter_document_file_size"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("xml_manager", "0003_xmldocumentpdf_docx_file"),
]

operations = [
migrations.CreateModel(
name="SPSPackageValidation",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"zip_size_bytes",
models.PositiveBigIntegerField(
default=0, verbose_name="ZIP size (bytes)"
),
),
(
"validated_at",
models.DateTimeField(
blank=True, null=True, verbose_name="Validated at"
),
),
(
"status",
models.CharField(
choices=[
("pending", "Pending"),
("running", "Running"),
("done", "Done"),
("error", "Error"),
],
default="pending",
max_length=16,
verbose_name="Status",
),
),
(
"error_message",
models.TextField(blank=True, verbose_name="Error message"),
),
(
"exceptions_document",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="+",
to="wagtaildocs.document",
verbose_name="Exceptions file",
),
),
(
"package_document",
models.OneToOneField(
on_delete=django.db.models.deletion.CASCADE,
related_name="sps_validation",
to="wagtaildocs.document",
verbose_name="SPS package document",
),
),
(
"validated_by",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="sps_package_validations",
to=settings.AUTH_USER_MODEL,
verbose_name="Validated by",
),
),
(
"validation_document",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="+",
to="wagtaildocs.document",
verbose_name="Validation file",
),
),
],
options={
"verbose_name": "SPS package validation",
"verbose_name_plural": "SPS package validations",
},
),
]
Loading
Loading