Skip to content

Commit eb20eb6

Browse files
joaohortsenadojoao
and
joao
authored
feat: Script to find and extract codified images pasted into text fields using the tinyMCE editor (#3643)
Co-authored-by: joao <[email protected]>
1 parent 28941ca commit eb20eb6

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import os
2+
import base64
3+
import re
4+
from django.apps import apps
5+
from django.core.files.base import ContentFile
6+
from django.core.files.storage import default_storage
7+
8+
9+
def extract_images(app_name, model_name, field_name, object_id=None):
10+
# Expressão regular para identificar a propriedade 'src' da imagem em base64
11+
image_data_re = re.compile(r'src=\"data:image/(?P<type>[a-z]+);base64,(?P<data>[^"]+)\"')
12+
13+
try:
14+
Model = apps.get_model(app_name, model_name)
15+
except LookupError:
16+
print(f'O modelo "{model_name}" no aplicativo "{app_name}" não existe.')
17+
return
18+
19+
# Obter todos os objetos ou um objeto específico
20+
if object_id is None:
21+
objects = Model.objects.all()
22+
else:
23+
objects = [Model.objects.get(id=object_id)]
24+
25+
for obj in objects:
26+
new_text = getattr(obj, field_name) # cópia do texto original
27+
for match in image_data_re.finditer(new_text):
28+
image_data = match.group('data')
29+
image_type = match.group('type')
30+
31+
# Decodifica os dados da imagem em base64
32+
decoded_image = base64.b64decode(image_data)
33+
# Cria um objeto Django ContentFile para a imagem decodificada
34+
image_file = ContentFile(decoded_image)
35+
# Constroi um nome de arquivo
36+
filename = f'{obj.id}_{match.start()}.{image_type}'
37+
38+
# Caminho personalizado para salvar o arquivo
39+
# Exemplo: sapl/public/dispositivo/123
40+
# todo: verificar se isso pode causar problemas com o armazenamento padrão
41+
folder_path = os.path.join('sapl', 'public', model_name.lower(), str(obj.id))
42+
43+
# Salva o arquivo de imagem no armazenamento
44+
path = default_storage.save(os.path.join(folder_path, filename), image_file)
45+
46+
# Substitui a propriedade 'src' da imagem pelos dados da imagem pela URL da imagem salva
47+
new_text = new_text.replace(match.group(), f'src="{default_storage.url(path)}"')
48+
print(f'Imagem salva em {path}')
49+
50+
# Atualiza o campo com o novo texto
51+
print(f'Novo texto: {new_text}')
52+
setattr(obj, field_name, new_text)
53+
obj.save()
54+
55+
# Exemplo de uso:
56+
# extract_images('compilacao', 'Dispositivo', 'texto')
57+
# extract_images('compilacao', 'Dispositivo', 'texto', object_id=123)

0 commit comments

Comments
 (0)