Проблема с SQLAlchemy "set" event.listen - PullRequest
0 голосов
/ 25 апреля 2019

У меня проблема с установкой значения атрибута модели в event.listen(Model.attribute, 'set').Когда я проверяю свое значение в модульном тесте, иногда (~ 5/10 случаев) оно устанавливается и тест проходит, но иногда нет (и утверждение не выполняется).

Версии Libs:

  • marshmallow==2.16.3
  • marshmallow-sqlalchemy==0.15
  • Flask==1.0.2
  • Flask-SQLAlchemy==2.3.1
  • SQLAlchemy==1.2.7
from datetime import datetime
from unittest import TestCase

import pytz
from sqlalchemy import DateTime, Column, event

from base import Model


class UserSchema():

    class Meta:
        model = User

class DAL():

    def create_or_update_user(self, user_data, partial=False):
        session = self._get_session()

        user_id = user_data.pop('id', None)
        if user_id:
            user_obj = self._get_obj(User, user_id)
            session = self._get_session(user_obj)
            user_obj = UserSchema(strict=True, session=session, partial=partial).load(user_data, instance=user_obj).data
        else:
            user_obj = UserSchema(strict=True, session=session).load(user_data).data
            session.add(user_obj)

        session.commit()
        return user_obj


class User(Model):

    status_updated = Column(DateTime)

    @staticmethod
    def set_status_updated(target, value, oldvalue, initiator):
        target.status_updated = datetime.now(pytz.utc)

    def __new__(cls, *args, **kwargs):
        obj = super(User, cls).__new__(cls)

        event.listen(cls.status, 'set', cls.set_status_updated, propagate=True)

        return obj


class USerTestCase(TestCase):

    def test_update_user(self):
        user_data = {
            'id': 1,
            'name': 'John',
            'status': 'New'
        }
        user = self.app.dal.create_or_update_user(user_data=user_data)
        assert user.status_updated is not None


У кого-нибудь была похожая проблема?

...