Пример #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
Пример #4
0
    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
Пример #13
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,"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