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)