示例#1
0
    def get_member(self, base, get_base=False):
        self.single_member=True
        member=self.session.query(self.entity)\
            .filter_by(name=base).first()
        if get_base:
            try:
                if member.idx_exp:
                    if not member.idx_exp_url and config.ES_DEF_URL:
                        member.idx_exp_url=config.ES_DEF_URL + "/" + member.\
                                name + "/" + member.name

                        # NOTE: A meu ver esse processo de converter de "json"
                        # para "object" e depois no sentido inverso tá tosco no
                        # que tange performance, mas não ví outra solução uma
                        # vez que "render_to_response" renderiza o conteúdo de
                        # "struct" e não dos atributos que formam o objeto
                        # valorado. Talvez não haja solução viável melhor que
                        # essa! By Questor

                        json_in_base=json2base(member.struct)
                        json_in_base.metadata.idx_exp_url=member.idx_exp_url
                        member.struct=base2json(json_in_base)
            except:
                pass

        return member or None
示例#2
0
    def test_base_json(self):
        """
        Test generated JSON conversion back to base
        :return:
        """

        field = Field(**self.field)

        field2 = Field(**self.field2)

        content_list = Content()
        content_list.append(field)
        content_list.append(field2)

        group_metadata = GroupMetadata(**self.group_metadata)

        group = Group(
            metadata=group_metadata,
            content=content_list,
        )

        field3 = Field(**self.field3)

        content_list = Content()
        content_list.append(group)
        content_list.append(field3)

        base_metadata = BaseMetadata(**self.base_metadata)

        base = Base(metadata=base_metadata, content=content_list)

        j = base.json
        b = json2base(j)
        assert (isinstance(b, Base))
示例#3
0
    def get_member(self, base, get_base=False):
        self.single_member = True
        member=self.session.query(self.entity)\
            .filter_by(name=base).first()
        if get_base:
            try:
                if member.idx_exp:
                    if not member.idx_exp_url and config.ES_DEF_URL:
                        member.idx_exp_url=config.ES_DEF_URL + "/" + member.\
                                name + "/" + member.name

                        # NOTE: A meu ver esse processo de converter de "json"
                        # para "object" e depois no sentido inverso tá tosco no
                        # que tange performance, mas não ví outra solução uma
                        # vez que "render_to_response" renderiza o conteúdo de
                        # "struct" e não dos atributos que formam o objeto
                        # valorado. Talvez não haja solução viável melhor que
                        # essa! By Questor

                        json_in_base = json2base(member.struct)
                        json_in_base.metadata.idx_exp_url = member.idx_exp_url
                        member.struct = base2json(json_in_base)
            except:
                pass

        return member or None
    def test_base_conversion(self):
        """
        Test auto generated base json
        """
        lbbase = conv.pyobject2base(self.school)
        j = lbbase.json
        b = conv.json2base(j)

        self.assertIsInstance(b, Base)
示例#5
0
    def setUp(self):
        """
        Load data from previous tests and setup test data
        :return:
        """
        #lbjson_test.TestJSON.setUp(self)


        self.json_base =  '''{"metadata":{"id_base":5,"dt_base":"10/05/2014 10:21:49","file_ext":false,"idx_exp":false,"idx_exp_url":"","idx_exp_time":"0","file_ext_time":"0","name":"pessoa","description":"qqqqqqq","password":"******","color":""},"content":[{"field":{"name":"nome","alias":"c5","description":"efdewf","datatype":"Text","required":true,"multivalued":false,"indices":["Textual"]}},{"field":{"name":"carros","alias":"","description":"","datatype":"Text","required":true,"multivalued":true,"indices":["Textual"]}},{"group":{"metadata":{"name":"dependente","alias":"c3","description":"yrjt","multivalued":false},"content":[{"group":{"metadata":{"name":"gmulti","alias":"c3","description":"yrjt","multivalued":true},"content":[{"field":{"name":"teste","alias":"c1","description":"gtrgtr","datatype":"Text","required":false,"multivalued":false,"indices":["Textual"]}}]}},{"field":{"name":"nome_dep","alias":"c1","description":"gtrgtr","datatype":"Text","required":true,"multivalued":false,"indices":["Textual"]}},{"field":{"name":"idade_dep","alias":"c2","description":"rgregetg","datatype":"Integer","required":false,"multivalued":false,"indices":["Textual"]}}]}}]}'''

        self.base = json2base(self.json_base)
示例#6
0
 def get(self, base):
     """
     @param name: base's name
     """
     if isinstance(base, Base):
         basename = base.metadata.name
     else:
         msg = 'Base must be Base object or string.'
         assert isinstance(base, PYSTR), msg
         basename = base
     response = self.send_request(self.httpget, url_path=[basename])
     return json2base(response)
示例#7
0
 def get(self, base):
     """
     @param name: base's name
     """
     if isinstance(base, Base):
         basename = base.metadata.name
     else:
         msg = 'Base must be Base object or string.'
         assert isinstance(base, PYSTR), msg
         basename = base
     response = self.send_request(self.httpget,
         url_path=[basename])
     return json2base(response)
示例#8
0
    def test_generate_base(self):
        """
        Test creating LB Base from object
        :return:
        """
        status_base = lbstatus.StatusBase()

        lbbase = status_base.lbbase
        fd = open('/tmp/status_base.json', 'w+')
        fd.write(lbbase.json)
        fd.close()
        self.assertIsInstance(lbbase, Base)
        j = lbbase.json
        b = conv.json2base(j)
        self.assertIsInstance(b, Base)
示例#9
0
    def test_generate_base(self):
        """
        Test creating LB Base from object
        :return:
        """
        status_base = lbstatus.StatusBase()

        lbbase = status_base.lbbase
        fd = open('/tmp/status_base.json', 'w+')
        fd.write(lbbase.json)
        fd.close()
        self.assertIsInstance(lbbase, Base)
        j = lbbase.json
        b = conv.json2base(j)
        self.assertIsInstance(b, Base)
示例#10
0
    def test_base(self):
        """
        Testa criação do objeto base no LB
        """
        orgao_base = orgao.OrgaoBase(self.rest_url)
        lbbase = orgao_base.lbbase
        self.assertIsInstance(lbbase, Base)

        fd = open('/tmp/orgao_base.json', 'w+')
        fd.write(lbbase.json)
        fd.close()
        self.assertIsInstance(lbbase, Base)
        j = lbbase.json
        b = conv.json2base(j)
        self.assertIsInstance(b, Base)
示例#11
0
    def test_base_json(self):
        """
        Test generated JSON conversion back to base
        :return:
        """

        field = Field(**self.field)

        field2 = Field(**self.field2)

        content_list = Content()
        content_list.append(field)
        content_list.append(field2)

        group_metadata = GroupMetadata(**self.group_metadata)

        group = Group(
            metadata=group_metadata,
            content=content_list,
        )

        field3 = Field(**self.field3)

        content_list = Content()
        content_list.append(group)
        content_list.append(field3)

        base_metadata = BaseMetadata(**self.base_metadata)

        base = Base(
            metadata=base_metadata,
            content=content_list
        )

        j = base.json
        b = json2base(j)
        assert(isinstance(b, Base))
示例#12
0
 def set_base(self, base_json):
     base = json2base(base_json)
     self.bases[base.metadata.name] = base
     return base
import liblightbase
from liblightbase import lbutils
from liblightbase.lbutils.conv import json2base
from liblightbase.lbutils.conv import document2json
from liblightbase.lbutils.conv import document2dict
from liblightbase.lbutils.conv import json2document
from liblightbase.lbutils.conv import dict2document

import unittest


JSON = '''{"metadata":{"file_ext":false,"idx_exp":false,"idx_exp_url":"","idx_exp_time":"0","file_ext_time":"0","name":"base_santos","description":"sasasasasa","password":"******","color":""},"content":[{"field":{"name":"campo","alias":"campo","description":"efewfewfewfew","datatype":"Text","required":false,"multivalued":false,"indices":["Textual"]}},{"group":{"metadata":{"name":"g1","alias":"g1","description":"efewf","multivalued":true},"content":[{"field":{"name":"campo2","alias":"g1_c1","description":"efewvwevew","datatype":"Text","required":false,"multivalued":false,"indices":["Textual"]}},{"group":{"metadata":{"name":"g2","alias":"g2","description":"efewfew","multivalued":true},"content":[{"field":{"name":"campo3","alias":"campo3","description":"efewfewv","datatype":"Text","required":false,"multivalued":false,"indices":["Textual"]}}]}}]}}]}'''


baseteste = json2base(JSON)
BaseTeste = baseteste.metaclass()
G1 = baseteste.metaclass('g1')
G2 = baseteste.metaclass('g2')

class BaseMaluca(BaseTeste):

    def __init__(self, **args):
        super(BaseMaluca, self).__init__(**args)

    @property
    def campo(self):
        return BaseTeste.campo.__get__(self)

    @campo.setter
    def campo(self, v):
示例#14
0
 def set_base(self, base_json):
     base = json2base(base_json)
     self.bases[base.metadata.name] = base
     return base
示例#15
0
    def update_member(self, id, data):
        member=self.get_member(id)
        if member is None:
            return None

        # NOTE: BaseContext's init method sets its base to the base
        # struct contained in the request, so we need to reset it here
        # to the base struct that is actually in the database - DCarv

        # NOTE: Remove base struct from cache! By John Doe
        model.BASES.bases.pop(member.name)

        # NOTE: Set old base struct as active! By John Doe
        self.set_base(member.struct)

        # NOTE: Check for base content changes! By John Doe
        old_base=json2base(member.struct)

        new_base=json2base(data['struct'])

        # NOTE: List all fields that should be deleted! By John Doe
        del_cols=[]
        for old_col_name, old_col in old_base.content.__allstructs__.items():
            if old_col_name not in new_base.content.__allsnames__:
                del_cols.append(old_col)

        # NOTE: If any field will be deleted, delete it from all documents in
        # the base! By John Doe
        if len(del_cols) > 0:
            # NOTE: Create a fake request for DocumentCustomView and
            # DocumentContext! By John Doe

            url="/%s/doc&$$={\"limit\":null}" % new_base.metadata.name
            for col in del_cols:
                params={
                    'path': "[{\"path\":\"%s\",\"fn\":null,\"mode\":" +\
                            "\"delete\",\"args\":[]}]" % ("/".join(col.path))
                }
                request=DummyRequest(path=url, params=params)
                request.method='PUT'
                request.matchdict={"base": new_base.metadata.name}
                doc_view=DocumentCustomView(
                    DocumentContextFactory(request), 
                    request
                )
                doc_view.update_collection()

        # NOTE: Check for relation field changes (to ALTER table if needed)!
        # By John Doe
        old_doc_table=get_doc_table(old_base.metadata.name, config.METADATA,
            **old_base.relational_fields)

        new_doc_table=get_doc_table(new_base.metadata.name, config.METADATA,
            **new_base.relational_fields)

        # NOTE: List relational fields that should be deleted! By John Doe
        del_cols=[]
        for old_col in old_doc_table.columns:
            if old_col.name not in new_doc_table.columns:
                del_cols.append(old_col)

        # NOTE: List relational fields that should be added! By John Doe
        new_cols=[]
        for new_col in new_doc_table.columns:
            if new_col.name not in old_doc_table.columns:
                # NOTE: Get liblightbase.lbbase.fields object! By John Doe

                field=new_base.relational_fields[new_col.name]
                custom_col=get_custom_column(field)
                new_cols.append(custom_col)

        # NOTE: Create alembic connection and operation object! By John Doe
        db_conn=config.ENGINE.connect()

        alembic_ctx=MigrationContext.configure(db_conn)
        alembic_op=Operations(alembic_ctx)

        # NOTE: Drop columns! By John Doe
        for col in del_cols:
            alembic_op.drop_column(new_doc_table.name, col.name)

        # TODO: New_col cannot be required! By John Doe

        # NOTE: Add columns! By John Doe
        for col in new_cols:
            alembic_op.add_column(new_doc_table.name, col)

        # TODO: Alter columns? By John Doe

        db_conn.close()

        # NOTE: Check for base name change! By John Doe
        if member.name != data['name']:
            old_name='lb_doc_%s' %(member.name)
            new_name='lb_doc_%s' %(data['name'])
            self.session.execute('ALTER TABLE %s RENAME TO %s' %(
                    old_name, 
                    new_name
                )
            )
            old_name='lb_file_%s' %(member.name)
            new_name='lb_file_%s' %(data['name'])
            self.session.execute('ALTER TABLE %s RENAME TO %s' %(
                    old_name, 
                    new_name
                )
            )
            old_name='lb_doc_%s_id_doc_seq' %(member.name)
            new_name='lb_doc_%s_id_doc_seq' %(data['name'])
            self.session.execute('ALTER SEQUENCE %s RENAME TO %s' %(
                    old_name, 
                    new_name
                )
            )

        # NOTE: This will add any new fields to the base struct! By John Doe
        for name in data:
            setattr(member, name, data[name])

        # NOTE: Now commits and closes session in the view instead of here
        # flush() pushes operations to DB's buffer - DCarv
        self.session.flush()

        # NOTE: Por alguma razão o objeto "session" estando com
        # "autocommit=True" não "commita" no "close" e por isso executamos um
        # "commit" aqui! "autocommit=True" não comita mais de uma operação em
        # sequência? By Questor
        # session_factory: sessionmaker(
            # class_='Session', 
            # autoflush=True, 
            # bind=Engine(postgresql://lbu:***@127.0.0.1/lb), 
            # autocommit=True, 
            # expire_on_commit=True
        # )
        # registry: <sqlalchemy.\
                # util.\
                # _collections.\
                # ThreadLocalRegistry object at 0x4143f90>
        # ! By Questor
        self.session.commit()

        model.HISTORY.create_member(**{
            'id_base': member.id_base, 
            'author': 'Author', 
            'date': datetime.datetime.now().strftime('%d/%m/%Y %H:%M:%S'), 
            'name': member.name, 
            'structure': utils.json2object(member.struct), 
            'status': 'UPDATED'
        })

        self.lbirestart()

        # NOTE: Remove base struct from cache! By John Doe
        model.BASES.bases.pop(member.name)

        return member
示例#16
0
    def setUp(self):
        """
        Load data from previous tests and setup test data
        :return:
        """
        #lbjson_test.TestJSON.setUp(self)

        self.json_base = '''{
            "metadata":
                {
                    "id_base": 5,
                    "dt_base": "10/05/2014 10:21:49",
                    "file_ext": false,
                    "idx_exp": false,
                    "admin_users": [],
                    "idx_exp_url": "",
                    "owner": "",
                    "idx_exp_time": "0",
                    "file_ext_time": "0",
                    "name": "pessoa",
                    "description": "qqqqqqq",
                    "password": "******",
                    "color": ""
                },
            "content": [
                {
                    "field": {
                        "name": "nome",
                        "alias": "c5",
                        "description": "efdewf",
                        "datatype": "Text",
                        "required": true,
                        "multivalued": false,
                        "indices": [
                            "Textual"
                        ]
                    }
                },
                {
                    "field": {
                        "name": "carros",
                        "alias": "",
                        "description": "",
                        "datatype": "Text",
                        "required":true,
                        "multivalued": true,
                        "indices": [
                            "Textual"
                        ]
                    }
                },
                {
                    "group": {
                        "metadata": {
                            "name": "dependente",
                            "alias": "c3",
                            "description": "yrjt",
                            "multivalued": true
                        },
                        "content": [
                            {
                                "group": {
                                    "metadata": {
                                        "name": "gmulti",
                                        "alias": "c3",
                                        "description": "yrjt",
                                        "multivalued": true
                                    },
                                    "content": [
                                        {
                                            "field": {
                                                "name": "teste",
                                                "alias": "c1",
                                                "description": "gtrgtr",
                                                "datatype": "Text",
                                                "required": false,
                                                "multivalued": false,
                                                "indices": [
                                                    "Textual"
                                                ]
                                            }
                                        },
                                        {
                                            "field": {
                                                "name": "teste2",
                                                "alias": "t2",
                                                "description": "gtrgtr",
                                                "datatype": "Text",
                                                "required": false,
                                                "multivalued": true,
                                                "indices": [
                                                    "Textual"
                                                ]
                                            }
                                        }
                                    ]
                                }
                            },
                            {
                                "field": {
                                    "name": "nome_dep",
                                    "alias": "c1",
                                    "description": "gtrgtr",
                                    "datatype": "Text",
                                    "required": true,
                                    "multivalued":false,
                                    "indices": [
                                        "Textual"
                                    ]
                                }
                            },
                            {
                                "field": {
                                    "name": "idade_dep",
                                    "alias": "c2",
                                    "description": "rgregetg",
                                    "datatype": "Integer",
                                    "required": false,
                                    "multivalued": false,
                                    "indices": [
                                        "Textual"
                                    ]
                                }
                            }
                        ]
                    }
                }
            ]
        }'''

        self.base = json2base(self.json_base)
示例#17
0
import liblightbase
from liblightbase import lbutils
from liblightbase.lbutils.conv import json2base
from liblightbase.lbutils.conv import document2json
from liblightbase.lbutils.conv import document2dict
from liblightbase.lbutils.conv import json2document
from liblightbase.lbutils.conv import dict2document

import unittest


JSON = '''{"metadata":{"file_ext":false,"idx_exp":false,"admin_users":[],"idx_exp_url":"","owner":"","idx_exp_time":"0","file_ext_time":"0","name":"base_santos","description":"sasasasasa","password":"******","color":""},"content":[{"field":{"name":"campo","alias":"campo","description":"efewfewfewfew","datatype":"Text","required":false,"multivalued":false,"indices":["Textual"]}},{"group":{"metadata":{"name":"g1","alias":"g1","description":"efewf","multivalued":true},"content":[{"field":{"name":"campo2","alias":"g1_c1","description":"efewvwevew","datatype":"Text","required":false,"multivalued":false,"indices":["Textual"]}},{"group":{"metadata":{"name":"g2","alias":"g2","description":"efewfew","multivalued":true},"content":[{"field":{"name":"campo3","alias":"campo3","description":"efewfewv","datatype":"Text","required":false,"multivalued":false,"indices":["Textual"]}}]}}]}}]}'''


baseteste = json2base(JSON)
BaseTeste = baseteste.metaclass()
G1 = baseteste.metaclass('g1')
G2 = baseteste.metaclass('g2')

class BaseMaluca(BaseTeste):

    def __init__(self, **args):
        super(BaseMaluca, self).__init__(**args)

    @property
    def campo(self):
        return BaseTeste.campo.__get__(self)

    @campo.setter
    def campo(self, v):
示例#18
0
    def update_member(self, id, data):
        member = self.get_member(id)
        if member is None:
            return None

        # NOTE: BaseContext's init method sets its base to the base
        # struct contained in the request, so we need to reset it here
        # to the base struct that is actually in the database - DCarv

        # NOTE: Remove base struct from cache! By John Doe
        model.BASES.bases.pop(member.name)

        # NOTE: Set old base struct as active! By John Doe
        self.set_base(member.struct)

        # NOTE: Check for base content changes! By John Doe
        old_base = json2base(member.struct)

        new_base = json2base(data['struct'])

        # NOTE: List all fields that should be deleted! By John Doe
        del_cols = []
        for old_col_name, old_col in old_base.content.__allstructs__.items():
            if old_col_name not in new_base.content.__allsnames__:
                del_cols.append(old_col)

        # NOTE: If any field will be deleted, delete it from all documents in
        # the base! By John Doe
        if len(del_cols) > 0:
            # NOTE: Create a fake request for DocumentCustomView and
            # DocumentContext! By John Doe

            url = "/%s/doc&$$={\"limit\":null}" % new_base.metadata.name
            for col in del_cols:
                params={
                    'path': "[{\"path\":\"%s\",\"fn\":null,\"mode\":" +\
                            "\"delete\",\"args\":[]}]" % ("/".join(col.path))
                }
                request = DummyRequest(path=url, params=params)
                request.method = 'PUT'
                request.matchdict = {"base": new_base.metadata.name}
                doc_view = DocumentCustomView(DocumentContextFactory(request),
                                              request)
                doc_view.update_collection()

        # NOTE: Check for relation field changes (to ALTER table if needed)!
        # By John Doe
        old_doc_table = get_doc_table(old_base.metadata.name, config.METADATA,
                                      **old_base.relational_fields)

        new_doc_table = get_doc_table(new_base.metadata.name, config.METADATA,
                                      **new_base.relational_fields)

        # NOTE: List relational fields that should be deleted! By John Doe
        del_cols = []
        for old_col in old_doc_table.columns:
            if old_col.name not in new_doc_table.columns:
                del_cols.append(old_col)

        # NOTE: List relational fields that should be added! By John Doe
        new_cols = []
        for new_col in new_doc_table.columns:
            if new_col.name not in old_doc_table.columns:
                # NOTE: Get liblightbase.lbbase.fields object! By John Doe

                field = new_base.relational_fields[new_col.name]
                custom_col = get_custom_column(field)
                new_cols.append(custom_col)

        # NOTE: Create alembic connection and operation object! By John Doe
        db_conn = config.ENGINE.connect()

        alembic_ctx = MigrationContext.configure(db_conn)
        alembic_op = Operations(alembic_ctx)

        # NOTE: Drop columns! By John Doe
        for col in del_cols:
            alembic_op.drop_column(new_doc_table.name, col.name)

        # TODO: New_col cannot be required! By John Doe

        # NOTE: Add columns! By John Doe
        for col in new_cols:
            alembic_op.add_column(new_doc_table.name, col)

        # TODO: Alter columns? By John Doe

        db_conn.close()

        # NOTE: Check for base name change! By John Doe
        if member.name != data['name']:
            old_name = 'lb_doc_%s' % (member.name)
            new_name = 'lb_doc_%s' % (data['name'])
            self.session.execute('ALTER TABLE %s RENAME TO %s' %
                                 (old_name, new_name))
            old_name = 'lb_file_%s' % (member.name)
            new_name = 'lb_file_%s' % (data['name'])
            self.session.execute('ALTER TABLE %s RENAME TO %s' %
                                 (old_name, new_name))
            old_name = 'lb_doc_%s_id_doc_seq' % (member.name)
            new_name = 'lb_doc_%s_id_doc_seq' % (data['name'])
            self.session.execute('ALTER SEQUENCE %s RENAME TO %s' %
                                 (old_name, new_name))

        # NOTE: This will add any new fields to the base struct! By John Doe
        for name in data:
            setattr(member, name, data[name])

        # NOTE: Now commits and closes session in the view instead of here
        # flush() pushes operations to DB's buffer - DCarv
        self.session.flush()

        # NOTE: Por alguma razão o objeto "session" estando com
        # "autocommit=True" não "commita" no "close" e por isso executamos um
        # "commit" aqui! "autocommit=True" não comita mais de uma operação em
        # sequência? By Questor
        # session_factory: sessionmaker(
        # class_='Session',
        # autoflush=True,
        # bind=Engine(postgresql://lbu:***@127.0.0.1/lb),
        # autocommit=True,
        # expire_on_commit=True
        # )
        # registry: <sqlalchemy.\
        # util.\
        # _collections.\
        # ThreadLocalRegistry object at 0x4143f90>
        # ! By Questor
        self.session.commit()

        model.HISTORY.create_member(
            **{
                'id_base': member.id_base,
                'author': 'Author',
                'date': datetime.datetime.now().strftime('%d/%m/%Y %H:%M:%S'),
                'name': member.name,
                'structure': utils.json2object(member.struct),
                'status': 'UPDATED'
            })

        self.lbirestart()

        # NOTE: Remove base struct from cache! By John Doe
        model.BASES.bases.pop(member.name)

        return member