mirror of https://github.com/interlegis/sapl.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
2.3 KiB
58 lines
2.3 KiB
2 years ago
|
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<type>[a-z]+);base64,(?P<data>[^"]+)\"')
|
||
|
|
||
|
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)
|