|
| 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