def doImportOMS(modeladmin, request, queryset, parameters): """ funcion para importar modelos realizados en OMS ( Open Model Spher ) """ from softmachine.settings import MEDIA_ROOT # El QSet viene con la lista de Ids if queryset.count() != 1: return {'success': False, 'message': 'No record selected'} from protoLib.protoAuth import getUserProfile userProfile = getUserProfile(request.user, 'prototype', '') try: import os fileName = os.path.join(MEDIA_ROOT, 'OMS.exp') import importOMS cOMS = importOMS.importOMS(userProfile) cOMS.loadFile(fileName) cOMS.doImport(queryset[0]) cOMS.doFkMatch() # Recorre los registros selccionados except Exception as e: traceback.print_exc() return {'success': False, 'message': 'Load error'} pass return {'success': True, 'message': 'runing ...'}
def doImportOMS( modeladmin, request, queryset, parameters): """ funcion para importar modelos realizados en OMS ( Open Model Spher ) """ from softmachine.settings import MEDIA_ROOT # El QSet viene con la lista de Ids if queryset.count() != 1: return {'success':False, 'message' : 'No record selected' } from protoLib.protoAuth import getUserProfile userProfile = getUserProfile( request.user, 'prototype', '' ) try: import os fileName = os.path.join(MEDIA_ROOT, 'OMS.exp' ) import importOMS cOMS = importOMS.importOMS( userProfile ) cOMS.loadFile( fileName ) cOMS.doImport( queryset[0] ) cOMS.doFkMatch( ) # Recorre los registros selccionados except Exception as e: traceback.print_exc() return {'success':False, 'message' : 'Load error' } pass return {'success':True, 'message' : 'runing ...' }
def importProto4Json(request, pModel): # To set permissions userProfile = getUserProfile( request.user, 'prototype', '' ) # Get filename fileName = request.POST.get( 'actionFiles', {}).get('file') # # Get file data try: json_data = open( fileName ) jModel = json.load(json_data) json_data.close() except: return 'load file error' # entity ============================== for jEntity in jModel[ 'entities' ]: defAux = reduceDict ( jEntity , [ "code", "dbName", "description" ] ) pEntity = Entity.objects.get_or_create( model = pModel, code = defAux['code'], defaults= defAux )[0] pModel.entity_set.add( pEntity ) setSecurityLocal ( pEntity, userProfile ) # property ============================== for jAux in jEntity.get( 'property_set' ): jAux["isForeign"] = False pProp = Property.objects.get_or_create( entity = pEntity, code = jAux['code'], defaults= jAux )[0] pEntity.property_set.add( pProp ) setSecurityLocal ( pProp, userProfile ) # Prototype ============================== for jAux in jEntity.get( 'prototype_set' ): jAux['metaDefinition'] = json.dumps( jAux['metaDefinition'] ) pProp = Prototype.objects.get_or_create( entity = pEntity, code = jAux['code'], defaults= jAux )[0] pEntity.prototype_set.add( pProp ) setSecurityLocal ( pProp, userProfile ) # entity ============================== for jAux in jModel[ 'relations' ]: pEntity = Entity.objects.get( model = pModel, code = jAux['entity'] ) pRefEntity = Entity.objects.get( model = pModel, code = jAux['refEntity'] ) del jAux['entity'] del jAux['refEntity'] Relationship.objects.get_or_create( entity = pEntity, refEntity = pRefEntity, defaults = jAux )[0] setSecurityLocal ( Relationship, userProfile ) return 'Ok'
def getEntities( queryset , request, viewTitle ): """ Recorre las entidades para generar las vistas en bache por modelo """ userProfile = getUserProfile( request.user, 'prototype', '' ) returnMsg = '' # Recorre los registros selccionados for pEntity in queryset: returnMsg += pEntity.code + ',' createView( pEntity , getViewCode( pEntity, viewTitle ) , userProfile ) return returnMsg
def getEntities(queryset, request, viewTitle): """ Recorre las entidades para generar las vistas en bache por modelo """ userProfile = getUserProfile(request.user, 'prototype', '') returnMsg = '' # Recorre los registros selccionados for pEntity in queryset: returnMsg += pEntity.code + ',' createView(pEntity, getViewCode(pEntity, viewTitle), userProfile) return returnMsg
def doEttyChangeModel( request, queryset , parameters ): """ Permite cambiar una entidad de modelo, inicialmente se hace al momento de hacer instrospeccion de una Db, luego cada modelo se relocaliza para poder analizarlo DGT : esto no es necesario, pues se podran crear diagramas particulares sin importar el modelo """ newModelName = parameters[0]['value'] dProject = None # Obtiene el proyecto y se asegura q sean todas de un mismo proyecto for dEntity in queryset: if dProject is None : dProject = dEntity.model.project if dProject.pk <> dEntity.model.project.pk: return {'success':False, 'message' : 'Must be in the same project' } userProfile = getUserProfile( request.user, 'prototype', '' ) defValues = { 'smOwningTeam' : userProfile.userTeam, 'smOwningUser' : userProfile.user, 'smCreatedBy' : userProfile.user } # crea u obtiene el modelo dModel = Model.objects.get_or_create( project = dProject, code = newModelName, smOwningTeam = userProfile.userTeam, defaults = defValues )[0] # for dEntity in queryset: dEntity.model = dModel dEntity.save() return {'success':True , 'message' : 'Ok' }
def doEttyChangeModel(request, queryset, parameters): """ Permite cambiar una entidad de modelo, inicialmente se hace al momento de hacer instrospeccion de una Db, luego cada modelo se relocaliza para poder analizarlo DGT : esto no es necesario, pues se podran crear diagramas particulares sin importar el modelo """ newModelName = parameters[0]['value'] dProject = None # Obtiene el proyecto y se asegura q sean todas de un mismo proyecto for dEntity in queryset: if dProject is None: dProject = dEntity.model.project if dProject.pk <> dEntity.model.project.pk: return {'success': False, 'message': 'Must be in the same project'} userProfile = getUserProfile(request.user, 'prototype', '') defValues = { 'smOwningTeam': userProfile.userTeam, 'smOwningUser': userProfile.user, 'smCreatedBy': userProfile.user } # crea u obtiene el modelo dModel = Model.objects.get_or_create(project=dProject, code=newModelName, smOwningTeam=userProfile.userTeam, defaults=defValues)[0] # for dEntity in queryset: dEntity.model = dModel dEntity.save() return {'success': True, 'message': 'Ok'}
def extractModel(request, queryset, parameters): """ Copiar entidades seleccionadas en una lista sobre un modelo existente - Si la entidad existe, toma la siguiente - Si la entidad viene del mismo project, crea el modelos de raccordement - Si no, solo la crea - Se copiaran todos los elementos de datos de la entidad parameters : entite_mod, entite_mod_id queryset : entite """ if queryset.count() == 0: return 'No record selected' ixEntite = ['description_entite', 'historique', 'physical_name'] ixElto = [ 'cle_etrangere', 'cle_primaire', 'consignes_saisie', 'contexte_particulier', 'date_creation', 'date_derniere_modification', 'date_entree_vigueur', 'date_trans_bdm', 'definition', 'domaine_valeurs', 'element_provenance', 'element_transforme', 'element_transmis', 'elements_de_source', 'exceptions', 'gabarit', 'historique', 'longueur', 'methode_transfert', 'methode_transformation', 'mode_attribution', 'nom_element_donnee', 'notes', 'numero_elem_cn', 'obligation', 'pratiques_acceptees', 'provenance_reference', 'reference_foire_questions', 'requis_par', 'si_provenance', 'statut_element', 'type_de_base', 'type_mode_attribution', 'validation_sur_element', 'validations_inter_elements', 'validations_inter_enregistrement', 'volumetrie', ] ixRelation = [ 'baseMax', 'baseMin', 'dependance', 'description', 'nom_relation', 'refMax', 'refMin', ] from protoLib.protoAuth import getUserProfile userProfile = getUserProfile(request.user, 'prototype', '') # get destination model and project from rai.models import Modele, Entite, ElementDonnee, Relation from rai.models import ModeleRaccordement, Raccordement lModele = Modele.objects.get(id=parameters[1]['value']) # get source Entities for sEntite in queryset: dEntite = Entite.objects.get_or_create( entite_mod=lModele, nom_entite=sEntite.nom_entite)[0] dEntite = copyModelProps(sEntite, dEntite, ixEntite) setSecurityInfo(dEntite, {}, userProfile, True) dEntite.save() # Modele de racc ( same DomAff ) dMRacc = None if sEntite.entite_mod.domaff_modele == lModele.domaff_modele: dMRacc = ModeleRaccordement.objects.get_or_create( mod_modrac1=sEntite.entite_mod, mod_modrac2=lModele)[0] setSecurityInfo(dMRacc, {}, userProfile, True) dMRacc.save() for sElto in sEntite.element_donnee_entite_elem.all(): dElto = ElementDonnee.objects.get_or_create( entite_elem=dEntite, nom_element_donnee=sElto.nom_element_donnee)[0] dElto = copyModelProps(sElto, dElto, ixElto) setSecurityInfo(dElto, {}, userProfile, True) dElto.save() if dMRacc: dRacc = Raccordement.objects.get_or_create( modrac_rac=dMRacc, eledon_rac1=sElto, eledon_rac2=dElto, )[0] setSecurityInfo(dRacc, {}, userProfile, True) dRacc.save() # new loop because relation need all entities for sEntite in queryset: dEntite = Entite.objects.get_or_create( entite_mod=lModele, nom_entite=sEntite.nom_entite)[0] for sRel in sEntite.relation_entite_rela1.all(): # get refEntity try: rEntite = Entite.objects.get( entite_mod=lModele, nom_entite=sRel.entite_rela2.nom_entite) except Exception: continue # get or Create relation dRel = Relation.objects.get_or_create(entite_rela1=dEntite, entite_rela2=rEntite)[0] dRel = copyModelProps(sRel, dRel, ixRelation) setSecurityInfo(dRel, {}, userProfile, True) dRel.save() return
def doBuildRaiMenu( request, queryset ): """ Genera el menu de rai """ currentUser = request.user userProfile = getUserProfile(currentUser, 'getMenu', '') viewIcon = 'icon-1' #-- Generacion de menu lMenu = {} Ix = 0 for document in DOCUMENTS: lMenu[ document ] = { 'text': document.lower() , 'expanded': True , 'index': Ix, 'iconCls': 'rai_{}'.format( document[:3].lower()) , 'leaf': False, 'children': [], } Ix +=1 for pDoc in queryset: viewCode = 'rai01ref.{0}.{1}'.format( pDoc.document , str( pDoc.pk ) ).lower() model_dict = { 'viewCode': viewCode, 'text': pDoc.dtype , 'index': Ix , 'iconCls': viewIcon , 'leaf': True, } Ix +=1 lMenu[ pDoc.document ]['children'].append( model_dict ) # Borra la anterior definicion ProtoDefinition.objects.filter( code=viewCode ).delete() #-- Lectura de la Db ------------------------------------------------------------- viewCode = '__menu' protoDef = CustomDefinition.objects.get_or_create( code=viewCode, smOwningTeam=userProfile.userTeam, defaults={'active': False, 'code' : viewCode, 'smOwningTeam' : userProfile.userTeam } )[0] # El default solo parece funcionar al insertar en la Db if not protoDef.active : return {'success':False, 'message' : 'Menu not found' } menuData = json.loads( protoDef.metaDefinition ) #-- Update de la Db ------------------------------------------------------------- try: raiMenu = menuData[0] if unicode( raiMenu['text'] ) == unicode( 'RAI MENU' ): raiMenu = menuData.pop(0) except : pass raiMenu = { 'text': 'RAI MENU' , 'expanded': False , 'index': 0, 'leaf': False, 'children': [], } for raiDoc in lMenu.itervalues(): raiMenu['children'].append( raiDoc ) menuData.insert( 0, raiMenu) protoDef.metaDefinition = json.dumps( menuData ) protoDef.save() return {'success':False, 'message' : 'Menu not found' }
def extractModel(request, queryset, parameters): """ Copiar entidades seleccionadas en una lista sobre un modelo existente - Si la entidad existe, toma la siguiente - Si la entidad viene del mismo project, crea el modelos de raccordement - Si no, solo la crea - Se copiaran todos los elementos de datos de la entidad parameters : entite_mod, entite_mod_id queryset : entite """ if queryset.count() == 0: return 'No record selected' ixEntite = [ 'description_entite', 'historique', 'physical_name' ] ixElto = [ 'cle_etrangere', 'cle_primaire', 'consignes_saisie', 'contexte_particulier', 'date_creation', 'date_derniere_modification', 'date_entree_vigueur', 'date_trans_bdm', 'definition', 'domaine_valeurs', 'element_provenance', 'element_transforme', 'element_transmis', 'elements_de_source', 'exceptions', 'gabarit', 'historique', 'longueur', 'methode_transfert', 'methode_transformation', 'mode_attribution', 'nom_element_donnee', 'notes', 'numero_elem_cn', 'obligation', 'pratiques_acceptees', 'provenance_reference', 'reference_foire_questions', 'requis_par', 'si_provenance', 'statut_element', 'type_de_base', 'type_mode_attribution', 'validation_sur_element', 'validations_inter_elements', 'validations_inter_enregistrement', 'volumetrie', ] ixRelation = [ 'baseMax', 'baseMin', 'dependance', 'description', 'nom_relation', 'refMax', 'refMin', ] from protoLib.protoAuth import getUserProfile userProfile = getUserProfile( request.user, 'prototype', '' ) # get destination model and project from rai.models import Modele, Entite, ElementDonnee, Relation from rai.models import ModeleRaccordement, Raccordement lModele = Modele.objects.get( id = parameters[1]['value'] ) # get source Entities for sEntite in queryset: dEntite = Entite.objects.get_or_create( entite_mod = lModele, nom_entite = sEntite.nom_entite )[0] dEntite = copyModelProps ( sEntite, dEntite, ixEntite) setSecurityInfo(dEntite, {}, userProfile, True) dEntite.save() # Modele de racc ( same DomAff ) dMRacc = None if sEntite.entite_mod.domaff_modele == lModele.domaff_modele : dMRacc = ModeleRaccordement.objects.get_or_create( mod_modrac1 = sEntite.entite_mod, mod_modrac2 = lModele )[0] setSecurityInfo(dMRacc, {}, userProfile, True) dMRacc.save() for sElto in sEntite.element_donnee_entite_elem.all(): dElto = ElementDonnee.objects.get_or_create( entite_elem = dEntite, nom_element_donnee = sElto.nom_element_donnee )[0] dElto = copyModelProps( sElto, dElto, ixElto ) setSecurityInfo(dElto, {}, userProfile, True) dElto.save() if dMRacc: dRacc = Raccordement.objects.get_or_create( modrac_rac = dMRacc, eledon_rac1 = sElto, eledon_rac2 = dElto, )[0] setSecurityInfo(dRacc, {}, userProfile, True) dRacc.save() # new loop because relation need all entities for sEntite in queryset: dEntite = Entite.objects.get_or_create( entite_mod = lModele, nom_entite = sEntite.nom_entite )[0] for sRel in sEntite.relation_entite_rela1.all(): # get refEntity try: rEntite = Entite.objects.get( entite_mod = lModele, nom_entite = sRel.entite_rela2.nom_entite ) except Exception: continue # get or Create relation dRel = Relation.objects.get_or_create( entite_rela1 = dEntite, entite_rela2 = rEntite )[0] dRel = copyModelProps( sRel, dRel, ixRelation ) setSecurityInfo(dRel, {}, userProfile, True) dRel.save() return
def test_method_with_user_none(self): self.assertIsNone(getUserProfile(None, "", ""))
def doRaiActions( modeladmin, request, queryset, parameters, action ): """ funcion para importar modelos realizados en OMS ( Open Model Spher ) """ # Background function def doBaseImport( cOMS ): try: cOMS.doImport() cOMS.doFkMatch( ) except Exception as e: traceback.print_exc() # El QSet viene con la lista de Ids if queryset.count() != 1: return {'success':False, 'message' : 'No record selected' } from protoLib.protoAuth import getUserProfile userProfile = getUserProfile( request.user, 'prototype', '' ) from rai.actions.domAffimportOMS import importOMS_RAI cOMS = importOMS_RAI( userProfile, queryset[0] ) if action == 'IMPORT': actionFiles = request.POST.get( "actionFiles", {} ) # load and validate xml file try: import os fileName = actionFiles[ 'file'] cOMS.loadFile( fileName ) except Exception as e: traceback.print_exc() return {'success':False, 'message' : 'Load error' } # Return and continue from threading import Thread t = Thread(target= doBaseImport, args=( cOMS,)) t.daemon = True t.start() return {'success':True, 'message' : 'runing ...' } elif action == 'MATCH': try: cOMS.doRacMatch() # Recorre los registros selccionados except Exception as e: traceback.print_exc() return {'success':False, 'message' : 'Load error' } return {'success':True, 'message' : 'runing ...' }
def getDbSchemaDef( dProject , request ): if dProject.dbEngine == 'sqlite3': dProject.dbEngine = 'django.db.backends.sqlite3' elif dProject.dbEngine == 'mysql': dProject.dbEngine = 'django.db.backends.mysql' elif dProject.dbEngine == 'postgres': dProject.dbEngine = 'django.db.backends.postgresql_psycopg2' elif dProject.dbEngine == 'oracle': dProject.dbEngine = 'django.db.backends.oracle' # Add connection information dynamically.. connections.databases[ dProject.code ] = { 'ENGINE': dProject.dbEngine , 'NAME': dProject.dbName , 'USER': dProject.dbUser , 'PASSWORD': dProject.dbPassword , 'HOST': dProject.dbHost , 'PORT':dProject.dbPort, } # Prepara el nombre de la tabla table2model = lambda table_name: table_name.title().replace('_', '').replace(' ', '').replace('-', '') # Ensure the remaining default connection information is defined. # connections.databases.ensure_defaults('new-alias') connection = connections[ dProject.code ] cursor = connection.cursor() for table_name in connection.introspection.get_table_list(cursor): pEntity = { 'code' : table2model( table_name ) } pEntities[ pEntity['code'] ] = pEntity pProperties = [] pEntity['properties'] = pProperties pEntity['dbName'] = table_name try: relations = connection.introspection.get_relations(cursor, table_name) except NotImplementedError: relations = {} try: indexes = connection.introspection.get_indexes(cursor, table_name) except NotImplementedError: indexes = {} for i, row in enumerate(connection.introspection.get_table_description(cursor, table_name)): column_name = row[0] att_name = column_name.lower() pProperty = { 'code' : att_name , 'notes' : ''} pProperties.append( pProperty ) if i in relations: rel_to = relations[i][1] == table_name and "'self'" or table2model(relations[i][1]) pProperty['refEntity'] = rel_to if att_name.endswith('_id'): att_name = att_name[:-3] pProperty['code'] = att_name pProperty['notes'] += 'id removed from colName;' else: field_type, field_params, field_notes = get_field_type(connection, table_name, row ) pProperty.update(field_params) pProperty['notes'] += field_notes # Add primary_key and unique, if necessary. if column_name in indexes: if indexes[column_name]['primary_key']: pProperty['isPrimary'] = True elif indexes[column_name]['unique']: pProperty['isRequired'] = True if keyword.iskeyword(att_name): att_name += '_field' pProperty['code'] = att_name pProperty['notes'] += 'field renamed because it was a reserved word;' if unicode( column_name ) != unicode( att_name ) : pProperty['dbName'] = column_name # Don't output 'id = meta.AutoField(isPrimary=True)', because # that's assumed if it doesn't exist. if att_name == 'id' and field_type == 'AutoField' and pProperty['primary_key']: continue # Add 'null' and 'blank', if the 'null_ok' flag was present in the # table description. if row[6]: # If it's NULL... if not field_type in ('TextField', 'CharField'): pProperty['isNullable'] = False else: pProperty['isRequired'] = True pProperty['baseType'] = field_type if len( pProperty['notes'] ) == 0: del pProperty['notes'] # =================================================================================================================== # ----------------------------- Aqui arranca la escritura en la Db userProfile = getUserProfile( request.user, 'prototype', '' ) defValues = { 'smOwningTeam' : userProfile.userTeam, 'smOwningUser' : userProfile.user, 'smCreatedBy' : userProfile.user } # Borra y crea el modelo Model.objects.filter( project = dProject, code = 'inspectDb', smOwningTeam = userProfile.userTeam).delete() dModel = Model.objects.get_or_create( project = dProject, code = 'inspectDb', smOwningTeam = userProfile.userTeam, defaults = defValues )[0] # Guarda todas las entidades for entityName in pEntities: pEntity = pEntities[ entityName ] pEntity.update( defValues ) defValuesEnt = pEntity.copy() defValuesEnt['model'] = dModel if 'properties' in defValuesEnt: del defValuesEnt['properties'] pEntity['dataEntity'] = Entity.objects.get_or_create( model = dModel, code = entityName, defaults = defValuesEnt )[0] transaction.commit() # Guarda las relaciones for entityName in pEntities: pEntity = pEntities[ entityName ] dEntity = pEntity['dataEntity'] for pProperty in pEntity[ 'properties' ]: prpName = pProperty['code'] if 'refEntity' in pProperty: saveRelation( dProject, dEntity, dModel, pProperty, defValues, userProfile, prpName, 1 ) else: saveProperty( dEntity, pProperty, defValues, userProfile, prpName, 1 )
def test_method_with_user_none(self): self.assertIsNone(getUserProfile(None, '', ''))