Skip to content

Instantly share code, notes, and snippets.

@kaka19ace
Last active August 29, 2015 14:23
Show Gist options
  • Select an option

  • Save kaka19ace/b7d79df4711b8b54fb63 to your computer and use it in GitHub Desktop.

Select an option

Save kaka19ace/b7d79df4711b8b54fb63 to your computer and use it in GitHub Desktop.

Revisions

  1. kaka19ace revised this gist Jun 17, 2015. 1 changed file with 2 additions and 3 deletions.
    5 changes: 2 additions & 3 deletions flask_sqlalchemy_basemodel.py
    Original file line number Diff line number Diff line change
    @@ -27,7 +27,7 @@ class ModelMeta(_BoundDeclarativeMeta):

    class BaseModel(db.Model):
    __abstract__ = True
    _column_name_sets = set()
    _column_name_sets = NotImplemented

    def get_py_dict(self):
    """
    @@ -53,8 +53,7 @@ def modelmeta__new__(cls, name, bases, namespace, **kwds):
    column_name_sets.add(k)

    obj = type.__new__(cls, name, bases, dict(namespace))
    # update set
    obj._column_name_sets.update(column_name_sets)
    obj._column_name_sets = column_name_sets
    return obj

    # modify BaseModel' metatype ModelMeta' __new__ definition
  2. kaka19ace revised this gist Jun 17, 2015. 1 changed file with 3 additions and 3 deletions.
    6 changes: 3 additions & 3 deletions flask_sqlalchemy_basemodel.py
    Original file line number Diff line number Diff line change
    @@ -27,12 +27,12 @@ class ModelMeta(_BoundDeclarativeMeta):

    class BaseModel(db.Model):
    __abstract__ = True
    __column_name_sets = set()
    _column_name_sets = set()

    def get_py_dict(self):
    """
    """
    return dict((column_name, getattr(self, column_name, None)) for column_name in self.__column_name_sets)
    return dict((column_name, getattr(self, column_name, None)) for column_name in self._column_name_sets)

    @classmethod
    def get_column_name_sets(cls):
    @@ -54,7 +54,7 @@ def modelmeta__new__(cls, name, bases, namespace, **kwds):

    obj = type.__new__(cls, name, bases, dict(namespace))
    # update set
    obj.__column_name_sets.update(column_name_sets)
    obj._column_name_sets.update(column_name_sets)
    return obj

    # modify BaseModel' metatype ModelMeta' __new__ definition
  3. kaka19ace revised this gist Jun 17, 2015. 1 changed file with 4 additions and 4 deletions.
    8 changes: 4 additions & 4 deletions flask_sqlalchemy_basemodel.py
    Original file line number Diff line number Diff line change
    @@ -27,18 +27,18 @@ class ModelMeta(_BoundDeclarativeMeta):

    class BaseModel(db.Model):
    __abstract__ = True
    _column_name_sets = set()
    __column_name_sets = set()

    def get_py_dict(self):
    """
    """
    return dict((column_name, getattr(self, column_name, None)) for column_name in self._column_name_sets)
    return dict((column_name, getattr(self, column_name, None)) for column_name in self.__column_name_sets)

    @classmethod
    def get_column_name_sets(cls):
    """
    """
    return cls._column_name_sets
    return cls.__column_name_sets

    __str__ = lambda self: str(self.get_py_dict())
    __repr__ = lambda self: repr(self.get_py_dict())
    @@ -54,7 +54,7 @@ def modelmeta__new__(cls, name, bases, namespace, **kwds):

    obj = type.__new__(cls, name, bases, dict(namespace))
    # update set
    obj._column_name_sets.update(column_name_sets)
    obj.__column_name_sets.update(column_name_sets)
    return obj

    # modify BaseModel' metatype ModelMeta' __new__ definition
  4. kaka19ace created this gist Jun 16, 2015.
    62 changes: 62 additions & 0 deletions flask_sqlalchemy_basemodel.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,62 @@
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    #
    # @file base.py
    # @author kaka_ace <[email protected]>
    # @date Jun 13 2015
    # @breif
    #


    import flask_sqlalchemy
    from flask_sqlalchemy import (
    SQLAlchemy,
    _BoundDeclarativeMeta,
    )


    class ModelMeta(_BoundDeclarativeMeta):
    pass


    flask_sqlalchemy._BoundDeclarativeMeta = ModelMeta


    db = SQLAlchemy()


    class BaseModel(db.Model):
    __abstract__ = True
    _column_name_sets = set()

    def get_py_dict(self):
    """
    """
    return dict((column_name, getattr(self, column_name, None)) for column_name in self._column_name_sets)

    @classmethod
    def get_column_name_sets(cls):
    """
    """
    return cls._column_name_sets

    __str__ = lambda self: str(self.get_py_dict())
    __repr__ = lambda self: repr(self.get_py_dict())


    def modelmeta__new__(cls, name, bases, namespace, **kwds):
    column_name_sets = set()
    for k, v in namespace.items():
    if getattr(v, '__class__', None) is None:
    continue
    if v.__class__.__name__ == 'Column':
    column_name_sets.add(k)

    obj = type.__new__(cls, name, bases, dict(namespace))
    # update set
    obj._column_name_sets.update(column_name_sets)
    return obj

    # modify BaseModel' metatype ModelMeta' __new__ definition
    setattr(ModelMeta, '__new__', modelmeta__new__)