Example #1
0
def test_subir_archivo():
    import base64
    from sqlalchemy.orm import defer
    from digesto.model import obtener_session
    from digesto.model.Utils import md5sum
    from digesto.model.DigestoModelLocal import DigestoModelLocal
    from digesto.model.entities.Digesto import Archivo

    with obtener_session() as session:
        a = session.query(Archivo).filter(
            Archivo.nombre == 'prueba.pdf').options(
                defer('contenido')).one_or_none()
        if a:
            session.delete(a)
            session.commit()

    longitud_binaria_original = 0
    longitud_b64_original = 0
    b64_contenido_original = ''
    md5_original = ''
    aid = ''
    with open('test/prueba.pdf', 'rb') as f:
        contenido = f.read()
        ''' guardo variables de control '''
        longitud_binaria_original = len(contenido)
        b64_contenido_original = base64.b64encode(contenido).decode('utf8')
        longitud_b64_original = len(b64_contenido_original)
        md5_original = md5sum(contenido)

        with obtener_session() as session:
            aid = DigestoModelLocal.subir_archivo(session, 'prueba.pdf',
                                                  contenido, 'application/pdf')
            session.commit()

            assert session.query(Archivo).filter(Archivo.id == aid).options(
                defer('contenido')).one_or_none() is not None

    with obtener_session() as session:
        archivo = DigestoModelLocal.obtener_archivo(session, aid)
        assert archivo is not None

        assert md5_original == archivo.hash_
        """ decodifico el contenido y lo guardo en un archivo """
        nombre = f"/tmp/{archivo.nombre}"
        with open(nombre, 'wb') as f:
            b64cont = archivo.contenido
            assert b64_contenido_original == b64cont
            assert len(b64cont) == longitud_b64_original

            contenido = base64.b64decode(archivo.contenido.encode())
            assert len(contenido) == longitud_binaria_original

            f.write(contenido)
        """ chequeo que el hash del archivo guardado sea igual que el de la base """
        with open(nombre, 'rb') as f:
            md5s = md5sum(f.read())
            assert md5s == archivo.hash_
        """ chequeo que el hash original sea igual al calculado del archivo escrito """
        assert md5_original == md5s
    """ limpio la base nuevamente """
from digesto.model.Utils import md5sum
from digesto.model import obtener_session
from digesto.model.entities.Digesto import Archivo

if __name__ == '__main__':

    path = sys.argv[1]
    logging.debug(f'subiendo normas desde {path}')

    archivos = []
    for (dirname, dirs, files) in os.walk(path):
        for f in files:
            archivos.append({'nombre': f, 'archivo': '/'.join([dirname, f])})

    with obtener_session() as session:
        logging.info(f'{len(archivos)} archivos a importar en la base')
        count = 0
        for a in archivos:
            count = count + 1
            logging.info(f"importando {count} - {a['nombre']}")
            with open(a['archivo'], 'rb') as f:
                path = a['nombre']
                contenido = f.read()
                md5s = md5sum(contenido)
                b64c = base64.b64encode(contenido).decode('utf8')

                if session.query(Archivo).filter(Archivo.path == path,
                                                 Archivo.hash_
                                                 == md5s).count() <= 0:
                    a = Archivo()