Tareas #6373

Estudiar la migración del sistema a python 3

Added by Andrés Pías 4 months ago. Updated about 2 months ago.

Status:En cursoStart date:11/11/2019
Priority:NormalDue date:
Assignee:Andrés Pías% Done:

30%

Category:-Spent time:-
Target version:-

Description

Actualmente el sistema de RRMM funciona sobre Python 2.7 el cual en breve dejará de tener soporte, por lo cual hay que estudiar la migración hacia Python 3, identificar y resolver problemáticas durante su migración.

History

#1 Updated by Andrés Pías about 2 months ago

  • Status changed from Nueva to En curso

Estoy trabajando en Coati. Creé un entorno virtual con Python3 y seguí prácticamente el procedimiento Puesta en funcionamiento del entorno de desarrollo que se usó para Python2.7. Algunas cosas cambian, luego redactaré estas modificaciones. A la vez Marcelo esta trabajando en la automatización de la instalación y configuración de un Tryton y un Postgres en dos máquinas KVM de la nueva plataforma.

#2 Updated by Andrés Pías about 2 months ago

  • Project changed from Sistema de gestión de solicitudes de compras to Desarrollo de Módulo Tryton para gestión de CENUR

#3 Updated by Andrés Pías about 2 months ago

  • % Done changed from 0 to 30

Para hacer esta actualización se siguió el procedimiento Puesta en funcionamiento del entorno de desarrollo con algunos cambios. A continuación el nuevo procedimiento.

Entorno de Python

Encontramos una mejor forma de crear los entornos virtuales para Python3. Con la salida de Python3, la forma recomendaba para instalar un entorno de desarrollo es mediante el comando venv.

Primero se instala el paquete:

apt-get install python3-venv

Se crea el entorno:

cd /opt/
mkdir py37venv
chown desarrollo:desarrollo py37venv
su - desarrollo
cd /opt/
python3 -m venv py37venv

Activamos el entorno:

cd py37venv
source bin/activate

Asegurarse de tener actualizado el pip:

pip install -U pip

Instalar el Tryton y Paquetes

pip install "trytond>=4.6,<4.7" 

Instalación de paquetes:

pip install bcrypt
pip install psycopg2-binary

Instalación de Modulos de Tryton:

pip install "trytond_company>=4.6,<4.7" 
pip install "trytond_currency>=4.6,<4.7" 
pip install "trytond_party>=4.6,<4.7" 
pip install "trytond_stock>=4.6,<4.7" 
pip install "trytond_product>=4.6,<4.7" 
pip install "trytond_ldap_authentication>=4.6,<4.7" 
pip install py-xlsx
pip install pytz
pip install fuzzywuzzy
pip install xlsxwriter

Configuración de Base de datos.

Creamos una base de datos específica para probar lo del entorno en Python3:

su - postgres
createdb --encoding=UNICODE --owner=tryton gestionpy37venv -p 5433

postgres@coati:~$ psql -p 5433 gestionpy37venv < /home/apias/gestion_8_11_2019.sql

Se ubica el archivo de configuración trytond.conf en la raíz del entorno. O sea, copié dicho archivo de configuración desde /opt/python27 a /opt/py37venv:

/opt/py37venv$ cp ../python27/trytond.conf .

Se cambia la password / cadena de conexión dentro del archivo de configuración trytond.conf

Ademas, al principio fallaba la conexión al puerto PGbouncer en 6432, por eso cambié también el puerto de la cadena de conexión en el tryton.cond al 5433:

uri = postgresql://tryton:****PASSWD****@localhost:5433/

En el archivo de trytond.conf hay errores por corregir. Hay una sección repetida:

configparser.DuplicateSectionError: While reading from 'trytond.conf' [line 161]: section 'cache' already exists

Entonces lo que se hace es borrar una vez la sección Cache, para tener una única vez esta sección en el archivo.

Configuración del módulo Request

Me logueo con el usuario desarollo

Activo el entorno virtual.

Me posicioné dentro del directorio raíz de mi entorno Pyhton y cloné el repositorio:


(python3) desarrollo@coati:/opt/python3$ git clone git@git.interior.edu.uy:apias/solcompras-litoralnorte.git

Posicionado dentro del directorio modules del Tryton que instalé dentro del entorno pongo el enlace simbólico desde al módulo:

(python3) desarrollo@coati:/opt/python3$ cd lib/python3.5/site-packages/trytond/modules/

(python3) desarrollo@coati:/opt/python3/lib/python3.5/site-packages/trytond/modules$ ln -s /opt/python3/solcompras-litoralnorte/request/ request

Nuevamente fue necesario hacer volver a resetear la base. Se iniciliza la base de datos desde el entorno con el usuario desarrollo

trytond-admin -c trytond.conf -d gestionpy37venv --all

En este momento surge el error:

(py37venv) desarrollo@coati:/opt/py37venv$ trytond-admin -c trytond.conf -d gestionpy37venv --all
Traceback (most recent call last):
  File "/opt/py37venv/bin/trytond-admin", line 21, in <module>
    admin.run(options)
  File "/opt/py37venv/lib/python3.7/site-packages/trytond/admin.py", line 54, in run
    installdeps=options.installdeps)
  File "/opt/py37venv/lib/python3.7/site-packages/trytond/pool.py", line 142, in init
    self.start()
  File "/opt/py37venv/lib/python3.7/site-packages/trytond/pool.py", line 95, in start
    register_classes()
  File "/opt/py37venv/lib/python3.7/site-packages/trytond/modules/__init__.py", line 373, in register_classes
    mod_file, pathname, description)
  File "/usr/lib/python3.7/imp.py", line 244, in load_module
    return load_package(name, filename)
  File "/usr/lib/python3.7/imp.py", line 216, in load_package
    return _load(spec)
  File "<frozen importlib._bootstrap>", line 696, in _load
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/opt/py37venv/lib/python3.7/site-packages/trytond/modules/request/__init__.py", line 6, in <module>
    from .request import *
  File "/opt/py37venv/lib/python3.7/site-packages/trytond/modules/request/request.py", line 367
    cls._context_fields.insert(0, 'financing')
                                             ^
TabError: inconsistent use of tabs and spaces in indentation

Surge este problema por un tema de espaciado y sangría en el archivo. /opt/py37venv/lib/python3.7/site-packages/trytond/modules/request/request.py. Editando a mano el archivo corrijo el espaciado.

Volvemos a inicializar y surge un nuevo error:

trytond-admin -c trytond.conf -d gestionpy37venv --all

(py37venv) desarrollo@coati:/opt/py37venv$ trytond-admin -c trytond.conf -d gestionpy37venv --all
Traceback (most recent call last):
  File "/opt/py37venv/bin/trytond-admin", line 21, in <module>
    admin.run(options)
  File "/opt/py37venv/lib/python3.7/site-packages/trytond/admin.py", line 54, in run
    installdeps=options.installdeps)
  File "/opt/py37venv/lib/python3.7/site-packages/trytond/pool.py", line 142, in init
    self.start()
  File "/opt/py37venv/lib/python3.7/site-packages/trytond/pool.py", line 95, in start
    register_classes()
  File "/opt/py37venv/lib/python3.7/site-packages/trytond/modules/__init__.py", line 376, in register_classes
    the_module.register()
  File "/opt/py37venv/lib/python3.7/site-packages/trytond/modules/request/__init__.py", line 66, in register
    module='request', type_='model')
  File "/opt/py37venv/lib/python3.7/site-packages/trytond/pool.py", line 84, in register
    assert issubclass(cls.__class__, PoolMeta), cls
AssertionError: <class 'trytond.modules.request.stock.ShipmentInternal'>

Inicialmente yo lo solucioné comentando la siguiente línea:

nano lib/python3.5/site-packages/trytond/pool.py

        for cls in classes:
            mpool = Pool.classes[type_].setdefault(module, [])
            assert cls not in mpool, cls
            #assert issubclass(cls.__class__, PoolMeta), cls
            mpool.append(cls)

El problema está en el método de la class Pool dentro del archivo pool.py

    @staticmethod
    def register(*classes, **kwargs):
        '''
        Register a list of classes
        '''
        module = kwargs['module']
        type_ = kwargs['type_']
        assert type_ in ('model', 'report', 'wizard')
        for cls in classes:
            mpool = Pool.classes[type_].setdefault(module, [])
            assert cls not in mpool, cls
            assert issubclass(cls.__class__, PoolMeta), cls
            mpool.append(cls)

Este sucede al momento de hacer el assert issublcass. O sea, parece que trytond.modules.request.stock.ShipmentInternal deberías ser subclase de PoolMeta y no lo es.

Para solucionarlo entonces concretamente lo que hice fue ir a solcompras-litoralnorte/request/stock.py y hacer que las clases ShipmentIn, ShipmentInternal y Move hereden de (Workflow, ModelSQL, ModelView) de acuerdo a como están definidas en el módulo stock de Tryton.

Volvemos a correr tryton-admin y funciona

trytond-admin -c trytond.conf -d gestionpy37venv --all

Corremos la aplicación

Volvemos a levantar nuevamente el servicio de Tryton estando dentro del entorno:

trytond -v -c trytond.conf

Activamos el módulo Request desde la interfaz web.
Selecciono el módulo Request, Mark for Activation. Action, Perform Pending Activation/Upgrade, Start Upgrade.
Finalmente quedó en marcha mi entorno.

Also available in: Atom PDF