Many fixes and improvenments

This commit is contained in:
Antonio de la Rosa 2016-05-10 17:02:04 +02:00
parent 5474134f74
commit 87177ccdb5
7 changed files with 180 additions and 66 deletions

View file

@ -73,10 +73,16 @@ def generate_session():
def get_session():
if config.cookie_name in request.environ:
try:
if config.cookie_name in request.environ:
return ParamecioSession()
else:
return None
except:
return ParamecioSession()
else:
return None
"""

View file

@ -1,27 +1,39 @@
#!/usr/bin/python3
import sys
import pymysql.cursors
import pymysql
pymysql.install_as_MySQLdb()
class SqlClass:
error_connection=""
connection={}
def __init__(self):
self.error_connection=""
self.connection={}
self.connected=False
self.connection_method=self.connect_to_db_sql
def dummy_connect(self, connection, name_connection="default"):
pass
def connect_to_db(self, connection, name_connection="default"):
self.connection_method(connection, name_connection)
self.connection_method=self.dummy_connect
def connect_to_db_sql(self, connection, name_connection="default"):
try:
self.connection[name_connection] = pymysql.connect(connection['host'],
user=connection['user'],
password=connection['password'],
passwd=connection['password'],
db=connection['db'],
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
self.connected=True
except:
e = sys.exc_info()[0]
@ -65,10 +77,20 @@ class SqlClass:
#def fetch(self, cursor):
#return cursor.fetchone()
"""
def __del__(self):
for key in self.connection:
self.close(self.connection)
"""
def close(self, name_connection="default"):
self.connection[name_connection].close()
if self.connection[name_connection]:
self.connection[name_connection].close()
self.connection[name_connection]=False
pass

View file

@ -5,7 +5,7 @@ import re
import uuid
from importlib import import_module, reload
from collections import OrderedDict
from paramecio.cromosoma.databases.mysql import SqlClass
from paramecio.cromosoma.databases.mysqldb import SqlClass
from paramecio.cromosoma.coreforms import BaseForm, HiddenForm
# The most important class for the framework
@ -14,6 +14,7 @@ from paramecio.cromosoma.coreforms import BaseForm, HiddenForm
#
#
class WebModel:
#Globals class variables for internal tasks
@ -23,8 +24,7 @@ class WebModel:
arr_sql_unique={}
arr_sql_set_unique={}
last_query=""
make_connection=SqlClass.connect_to_db
connection_pool=[]
#A dictionary for add models here
@ -36,9 +36,18 @@ class WebModel:
webmodel=True
#sqlclass=SqlClass()
#make_connection=sqlclass.connect_to_db
@staticmethod
def connection():
return SqlClass()
# Init the class
def __init__(self, name_field_id="id"):
def __init__(self, sqlclass, name_field_id="id"):
#The name of the table
@ -109,6 +118,8 @@ class WebModel:
self.files_delete={}
self.sqlclass=sqlclass
# A method where create the new fields of this model
def create_fields(self):
@ -134,23 +145,34 @@ class WebModel:
def create_id_field(self, field_name="id"):
pass
# A method for select rows from a database.
# A method for connect to database
def connect_to_db(self):
if WebModel.make_connection(SqlClass, self.connections[self.connection_id])==False:
raise NameError(SqlClass.error_connection)
#if WebModel.make_connection(self.connections[self.connection_id])==False:
#raise NameError(sqlclass.error_connection)
WebModel.make_connection=SqlClass.dummy_connect
#self.connection_pool.append(True)
"""
if not sqlclass.connected:
if WebModel.make_connection(self.connections[self.connection_id])==False:
raise NameError(sqlclass.error_connection)
"""
if self.sqlclass.connect_to_db(self.connections[self.connection_id])==False:
raise NameError(sqlclass.error_connection)
#WebModel.make_connection=sqlclass.dummy_connect
def dummy_connect(self, connection):
return True
# Static method for make queries
@staticmethod
def query(WebModel, str_query, args=[], connection_id='default'):
WebModel.connect_to_db(WebModel)
return SqlClass.query(SqlClass, str_query, args, connection_id)
def query(self, str_query, args=[], connection_id='default'):
self.connect_to_db()
return self.sqlclass.query(str_query, args, connection_id)
# Insert method, for insert a row in database.using a dictionary
# External agent define if the update is in code or from external source, how a form.
@ -178,7 +200,7 @@ class WebModel:
sql="insert into `"+self.name+"` (`"+"`, `".join(fields)+"`) VALUES ("+", ".join(values)+")"
cursor=SqlClass.query(SqlClass, sql, self.conditions[1], self.connection_id)
cursor=self.sqlclass.query(sql, self.conditions[1], self.connection_id)
if cursor.rowcount>0:
@ -223,7 +245,7 @@ class WebModel:
sql="update `"+self.name+"` SET "+", ".join(update_values)+" "+self.conditions[0]
cursor=SqlClass.query(SqlClass, sql, self.conditions[1], self.connection_id)
cursor=self.sqlclass.query(sql, self.conditions[1], self.connection_id)
if self.yes_reset_conditions:
self.reset_conditions()
@ -249,7 +271,7 @@ class WebModel:
"""
except:
#self.query_error=SqlClass.error_connection
#self.query_error=sqlclass.error_connection
e = sys.exc_info()[0]
v = sys.exc_info()[1]
@ -342,10 +364,10 @@ class WebModel:
if self.yes_reset_conditions:
self.reset_conditions()
cursor=SqlClass.query(SqlClass, sql, conditions[1], self.connection_id)
cursor=self.sqlclass.query(sql, conditions[1], self.connection_id)
if cursor==False:
self.query_error=SqlClass.error_connection
self.query_error=self.sqlclass.error_connection
cursor.close()
return False
else:
@ -474,7 +496,7 @@ class WebModel:
sql= "select count(`"+field_to_count+"`) from "+", ".join(tables_to_select)+conditions[0]
cursor=SqlClass.query(SqlClass, sql, conditions[1], self.connection_id)
cursor=self.sqlclass.query(sql, conditions[1], self.connection_id)
count=list(cursor.fetchone().values())[0]
@ -497,7 +519,7 @@ class WebModel:
sql="delete from `"+self.name+"` "+self.conditions[0]
result=SqlClass.query(SqlClass, sql, self.conditions[1], self.connection_id)
result=self.sqlclass.query(sql, self.conditions[1], self.connection_id)
if self.yes_reset_conditions:
self.reset_conditions()
@ -591,40 +613,40 @@ class WebModel:
print("---Deleting index from "+field+" in "+self.name)
WebModel.query(WebModel, 'DROP INDEX `index_'+self.name+'_'+field+'` ON '+self.name, [], self.connection_id)
self.query('DROP INDEX `index_'+self.name+'_'+field+'` ON '+self.name, [], self.connection_id)
for field in fields_to_delete_unique:
print("---Deleting unique from "+field+" in "+self.name)
WebModel.query(WebModel, 'DROP INDEX `'+field+'` ON '+self.name, [], self.connection_id)
self.query('DROP INDEX `'+field+'` ON '+self.name, [], self.connection_id)
for field in fields_to_delete_constraint:
print("---Deleting foreignkey from "+field+" in "+self.name)
WebModel.query(WebModel, 'ALTER TABLE `'+self.name+'` DROP FOREIGN KEY '+field+'_'+self.name+'IDX', [], self.connection_id)
self.query('ALTER TABLE `'+self.name+'` DROP FOREIGN KEY '+field+'_'+self.name+'IDX', [], self.connection_id)
for field in fields_to_delete:
print("---Deleting "+field+" from "+self.name)
WebModel.query(WebModel, 'ALTER TABLE `'+self.name+'` DROP `'+field+'`', [], self.connection_id)
self.query('ALTER TABLE `'+self.name+'` DROP `'+field+'`', [], self.connection_id)
#Deleting indexes and constraints.
#Obtain new fields
for field in fields_to_modify:
print("---Updating "+field+" in "+self.name)
WebModel.query(WebModel, 'ALTER TABLE `'+self.name+'` MODIFY `'+field+'` '+self.fields[field].get_type_sql(), [], self.connection_id)
self.query('ALTER TABLE `'+self.name+'` MODIFY `'+field+'` '+self.fields[field].get_type_sql(), [], self.connection_id)
for field in fields_to_add:
print("---Adding "+field+" in "+self.name)
WebModel.query(WebModel, 'ALTER TABLE `'+self.name+'` ADD `'+field+'` '+self.fields[field].get_type_sql(), [], self.connection_id)
self.query('ALTER TABLE `'+self.name+'` ADD `'+field+'` '+self.fields[field].get_type_sql(), [], self.connection_id)
for field in fields_to_add_index:
print("---Adding index to "+field+" in "+self.name)
WebModel.query(WebModel, 'CREATE INDEX `index_'+self.name+'_'+field+'` ON '+self.name+' (`'+field+'`);', [], self.connection_id)
self.query('CREATE INDEX `index_'+self.name+'_'+field+'` ON '+self.name+' (`'+field+'`);', [], self.connection_id)
for field in fields_to_add_constraint:
@ -634,20 +656,20 @@ class WebModel:
id_table_related=self.fields[field].table_id
WebModel.query(WebModel, 'ALTER TABLE `'+self.name+'` ADD CONSTRAINT `'+field+'_'+self.name+'IDX` FOREIGN KEY ( `'+field+'` ) REFERENCES `'+table_related+'` (`'+id_table_related+'`) ON DELETE RESTRICT ON UPDATE RESTRICT;', [], self.connection_id)
self.query('ALTER TABLE `'+self.name+'` ADD CONSTRAINT `'+field+'_'+self.name+'IDX` FOREIGN KEY ( `'+field+'` ) REFERENCES `'+table_related+'` (`'+id_table_related+'`) ON DELETE RESTRICT ON UPDATE RESTRICT;', [], self.connection_id)
for field in fields_to_add_unique:
print("---Adding unique to "+field+" in "+self.name)
WebModel.query(WebModel, 'ALTER TABLE `'+self.name+'` ADD UNIQUE (`'+field+'`)', [], self.connection_id)
self.query('ALTER TABLE `'+self.name+'` ADD UNIQUE (`'+field+'`)', [], self.connection_id)
# Method for drop sql tables and related
def drop(self):
return WebModel.query(WebModel, 'DROP TABLE '+self.name, [], self.connection_id)
return self.query('DROP TABLE '+self.name, [], self.connection_id)
#Return an array with all fields
@ -839,29 +861,33 @@ class WebModel:
return error_txt
@staticmethod
def close():
def close(self):
connection_to_delete=[]
self.sqlclass.close()
WebModel.make_connection=SqlClass.connect_to_db
#connection_to_delete=[]
for key in SqlClass.connection:
SqlClass.close(SqlClass, key)
#WebModel.make_connection=self.sqlclass.connect_to_db
#for key in self.sqlclass.connection:
#self.sqlclass.close(key)
#connection_to_delete.append(key)
SqlClass.connection={}
#self.sqlclass.connection={}
#for key in connection_to_delete:
#del SqlClass.connection[key]
#del sqlclass.connection[key]
@staticmethod
def escape_sql(value):
value=str(value)
return value.replace("'","\\'").strip()
"""
def __del__(self):
self.close()
"""
class PhangoField:

View file

@ -7,9 +7,13 @@ from paramecio.citoplasma.i18n import I18n
from paramecio.cromosoma.coreforms import SelectForm
from settings import config
def admin(t):
def admin(**args):
user_admin=UserAdmin()
t=args['t']
connection=args['connection']
user_admin=UserAdmin(connection)
user_admin.fields['privileges'].name_form=SelectForm

View file

@ -14,6 +14,7 @@ from paramecio.citoplasma.generate_admin_class import GenerateAdminClass
from paramecio.citoplasma.httputils import GetPostFiles
from paramecio.cromosoma.formsutils import show_form, pass_values_to_form, set_extra_forms_user
from paramecio.cromosoma.coreforms import PasswordForm
from paramecio.cromosoma.webmodel import WebModel
from importlib import import_module, reload
from bottle import redirect
from collections import OrderedDict
@ -40,7 +41,7 @@ t=ptemplate(__file__)
def home(module='', submodule=''):
# A simple boolean used for show or not the code of admin module in standard template
connection=WebModel.connection()
ptemplate.show_basic_template=True
if submodule!='':
@ -50,7 +51,7 @@ def home(module='', submodule=''):
#check if login
user_admin=UserAdmin()
user_admin=UserAdmin(connection)
s=get_session()
@ -114,7 +115,9 @@ def home(module='', submodule=''):
return "No exists admin module"
content_index=new_module.admin(t)
#args={'t': t, 'connection': connection}
content_index=new_module.admin(t=t, connection=connection)
if ptemplate.show_basic_template==True:
@ -161,6 +164,7 @@ def home(module='', submodule=''):
redirect('/'+config.admin_folder)
else:
post={}
user_admin.yes_repeat_password=False
@ -171,6 +175,8 @@ def home(module='', submodule=''):
forms=show_form(post, user_admin.forms, t, yes_error=False)
#connection.close()
return t.load_template('admin/login.phtml', forms=forms)
else:
@ -186,7 +192,9 @@ def home(module='', submodule=''):
@post('/'+config.admin_folder+'/login')
def login():
user_admin=UserAdmin()
connection=WebModel.connection()
user_admin=UserAdmin(connection)
GetPostFiles.obtain_post()
@ -253,7 +261,9 @@ def login():
@post('/'+config.admin_folder+'/register')
def register():
user_admin=UserAdmin()
connection=WebModel.connection()
user_admin=UserAdmin(connection)
user_admin.conditions=['WHERE privileges=%s', 2]

View file

@ -24,9 +24,9 @@ class PrivilegesField(corefields.IntegerField):
class UserAdmin(UserModel):
#def create_fields(self):
def __init__(self):
def __init__(self, connection):
super().__init__()
super().__init__(connection)
# I can change other fields here, how the name.

View file

@ -2,30 +2,44 @@ from settings import config
from paramecio.cromosoma.webmodel import WebModel
from paramecio.cromosoma import corefields
import unittest
# Create TestWebModelMethods
class ExampleModel(WebModel):
def create_fields(self):
def __init__(self, connection):
super().__init__(connection)
# I can change other fields here, how the name.
self.register(corefields.CharField('title'))
self.register(corefields.CharField('content'))
model=ExampleModel()
class ExampleModel2(WebModel):
def __init__(self, connection):
super().__init__(connection)
# I can change other fields here, how the name.
self.register(corefields.CharField('title'))
self.register(corefields.CharField('content'))
class TestWebModelMethods(unittest.TestCase):
def test_test_table(self):
connection=WebModel.connection()
model=ExampleModel(connection)
sql=model.create_table()
print('Creating table')
self.assertTrue(WebModel.query(WebModel, sql))
self.assertTrue(model.query(sql))
post={'title': 'Example title', 'content': 'New content'}
@ -99,13 +113,20 @@ class TestWebModelMethods(unittest.TestCase):
self.assertTrue(model.drop())
connection.close()
def test_update_table(self):
connection=WebModel.connection()
model=ExampleModel(connection)
print('Check modifications in table')
sql=model.create_table()
self.assertTrue(WebModel.query(WebModel, sql))
self.assertTrue(model.query(sql))
fields_to_modify=[]
fields_to_add_index=[]
@ -128,6 +149,31 @@ class TestWebModelMethods(unittest.TestCase):
self.assertTrue(model.drop())
connection.close()
def test_zcheck_connections(self):
print('Check connection of models...')
connection=WebModel.connection()
model=ExampleModel(connection)
model2=ExampleModel2(connection)
sql=model.create_table()
sql2=model2.create_table()
#print(sql)
self.assertTrue(model.query(sql))
self.assertTrue(model2.query(sql2))
self.assertTrue(model.drop())
self.assertTrue(model2.drop())
connection.close()
pass
if __name__ == '__main__':
unittest.main()