diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index b43fa0637..c2eacf746 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -15,7 +15,7 @@ from django.urls import reverse from django.utils.safestring import mark_safe try: - from pillow_heif import HeifImageFile, HeifImagePlugin + from pi_heif import HeifImageFile, HeifImagePlugin except ImportError: HeifImagePlugin = HeifImageFile = None @@ -29,6 +29,7 @@ from utilities.choices import ColorChoices from utilities.fields import ColorField, NaturalOrderingField from .device_components import * + __all__ = ( 'Device', 'DeviceRole', diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index 1bcc91d62..59869d13d 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -1,11 +1,14 @@ import json +import sys import uuid +from io import BytesIO from django.contrib import admin from django.contrib.auth.models import User from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType from django.core.cache import cache +from django.core.files.uploadedfile import InMemoryUploadedFile from django.core.validators import ValidationError from django.db import models from django.http import HttpResponse @@ -15,6 +18,11 @@ from django.utils.formats import date_format from rest_framework.utils.encoders import JSONEncoder import django_rq +try: + from pi_heif import HeifImageFile, HeifImagePlugin +except ImportError: + HeifImagePlugin = HeifImageFile = None + from extras.choices import * from extras.constants import * from extras.conditions import ConditionSet @@ -386,6 +394,17 @@ class ImageAttachment(WebhooksMixin, ChangeLoggedModel): filename = self.image.name.rsplit('/', 1)[-1] return filename.split('_', 2)[2] + def save(self, *args, **kwargs): + if HeifImagePlugin is not None and self.image: + if isinstance(self.image.file, InMemoryUploadedFile) and isinstance(self.image.file.image, HeifImageFile): + output_stream = BytesIO() + self.image.file.image.save(output_stream, format="JPEG") + output_stream.seek(0) + self.image.name = "%s.jpg" % self.image.file.name.split('.')[0] + self.image.file = InMemoryUploadedFile(output_stream, 'ImageField', self.image.name, + 'image/jpeg', sys.getsizeof(output_stream), None) + super().save(*args, **kwargs) + def delete(self, *args, **kwargs): _name = self.image.name diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index c0999d3d4..02e80b6cd 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -24,6 +24,7 @@ import django from django.utils.encoding import force_str django.utils.encoding.force_text = force_str + # # Environment setup # diff --git a/requirements.txt b/requirements.txt index b9328566d..6e4a5bbb5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -39,4 +39,4 @@ jsonschema==3.2.0 swagger-spec-validator==2.7.6 # Pillow's plugin for HEIF image format -pillow-heif==0.7.0 +pi-heif==0.7.0