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_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))
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)
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)
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)
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)
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)
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)
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)
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))
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):
def set_base(self, base_json): base = json2base(base_json) self.bases[base.metadata.name] = base return base
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
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)
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):
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