dpgaspar / Flask-AppBuilder

Simple and rapid application development framework, built on top of Flask. includes detailed security, auto CRUD generation for your models, google charts and much more. Demo (login with guest/welcome) - http://flaskappbuilder.pythonanywhere.com/
BSD 3-Clause "New" or "Revised" License
4.63k stars 1.35k forks source link

When redefining created and changed by fks to change the custom view, they get nullified #2176

Closed balmasea closed 9 months ago

balmasea commented 9 months ago

Environment

Flask-Appbuilder version: 4.3.5

3.8.0

Describe the expected results

It should keep the changed_by_fk field populated in the database.

app=# select * from feature;
         created_on         |         changed_on         | id | name | created_by_fk | changed_by_fk
----------------------------+----------------------------+----+------+---------------+---------------
 2023-11-28 12:50:27.172487 | 2023-11-28 12:50:27.172504 |  1 | dns  |   1           |    1
(1 row)

Describe the actual results

The fields in the database created_by_fk and changed_by_fk are null.

Tell us what happens instead.

Steps to reproduce

  1. Define a model inheriting from AuditMixin and redefine foreign keys:

    class Feature(AuditMixin, Model):
    __versioned__ = {}
    
    id = Column(Integer, primary_key=True)
    name = Column(String, unique=True, nullable=False)
    created_by_fk = Column(Integer, ForeignKey("ab_user.id"))
    changed_by_fk = Column(Integer, ForeignKey("ab_user.id"))
    created_by_user = relationship("User", foreign_keys=[created_by_fk])
    changed_by_user = relationship("User", foreign_keys=[changed_by_fk])
  2. Create a new entry for the Model.
  3. Check the Database
    app=# select * from feature;
         created_on         |         changed_on         | id | name | created_by_fk | changed_by_fk
    ----------------------------+----------------------------+----+------+---------------+---------------
    2023-11-28 12:50:27.172487 | 2023-11-28 12:50:27.172504 |  1 | dns  |               |
    (1 row)
ThomasP0815 commented 9 months ago

Solution:

class Feature(AuditMixin, Model):
      __versioned__ = {}

      id = Column(Integer, primary_key=True)
      name = Column(String, unique=True, nullable=False)
      created_by_fk = Column(Integer, ForeignKey("ab_user.id"), default=AuditMixin.get_user_id, nullable=False)
      changed_by_fk = Column(Integer, ForeignKey("ab_user.id"), default=AuditMixin.get_user_id, nullable=False)
      created_by_user = relationship("User", foreign_keys=[created_by_fk])
      changed_by_user = relationship("User", foreign_keys=[changed_by_fk])
balmasea commented 9 months ago

Thanks, it works like a charm!