From eb20eb6d1d33f2ca2ede63229a6ccfbfe424f9a6 Mon Sep 17 00:00:00 2001 From: joaohortsenado <100957576+joaohortsenado@users.noreply.github.com> Date: Mon, 29 May 2023 16:59:32 -0300 Subject: [PATCH] feat: Script to find and extract codified images pasted into text fields using the tinyMCE editor (#3643) Co-authored-by: joao --- ...trai_imagens_codificadas_de_campo_texto.py | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 scripts/extrai_imagens_codificadas_de_campo_texto.py diff --git a/scripts/extrai_imagens_codificadas_de_campo_texto.py b/scripts/extrai_imagens_codificadas_de_campo_texto.py new file mode 100644 index 000000000..762608e34 --- /dev/null +++ b/scripts/extrai_imagens_codificadas_de_campo_texto.py @@ -0,0 +1,57 @@ +import os +import base64 +import re +from django.apps import apps +from django.core.files.base import ContentFile +from django.core.files.storage import default_storage + + +def extract_images(app_name, model_name, field_name, object_id=None): + # Expressão regular para identificar a propriedade 'src' da imagem em base64 + image_data_re = re.compile(r'src=\"data:image/(?P[a-z]+);base64,(?P[^"]+)\"') + + try: + Model = apps.get_model(app_name, model_name) + except LookupError: + print(f'O modelo "{model_name}" no aplicativo "{app_name}" não existe.') + return + + # Obter todos os objetos ou um objeto específico + if object_id is None: + objects = Model.objects.all() + else: + objects = [Model.objects.get(id=object_id)] + + for obj in objects: + new_text = getattr(obj, field_name) # cópia do texto original + for match in image_data_re.finditer(new_text): + image_data = match.group('data') + image_type = match.group('type') + + # Decodifica os dados da imagem em base64 + decoded_image = base64.b64decode(image_data) + # Cria um objeto Django ContentFile para a imagem decodificada + image_file = ContentFile(decoded_image) + # Constroi um nome de arquivo + filename = f'{obj.id}_{match.start()}.{image_type}' + + # Caminho personalizado para salvar o arquivo + # Exemplo: sapl/public/dispositivo/123 + # todo: verificar se isso pode causar problemas com o armazenamento padrão + folder_path = os.path.join('sapl', 'public', model_name.lower(), str(obj.id)) + + # Salva o arquivo de imagem no armazenamento + path = default_storage.save(os.path.join(folder_path, filename), image_file) + + # Substitui a propriedade 'src' da imagem pelos dados da imagem pela URL da imagem salva + new_text = new_text.replace(match.group(), f'src="{default_storage.url(path)}"') + print(f'Imagem salva em {path}') + + # Atualiza o campo com o novo texto + print(f'Novo texto: {new_text}') + setattr(obj, field_name, new_text) + obj.save() + +# Exemplo de uso: +# extract_images('compilacao', 'Dispositivo', 'texto') +# extract_images('compilacao', 'Dispositivo', 'texto', object_id=123)