Пример #1
0
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 ...'}
Пример #2
0
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 ...' } 
Пример #3
0
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'
Пример #4
0
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
Пример #5
0
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
Пример #6
0
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' }
Пример #7
0
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'}
Пример #8
0
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
Пример #9
0
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' }
Пример #10
0
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, "", ""))
Пример #12
0
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 ...' }
Пример #13
0
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   )
Пример #14
0
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   )
Пример #15
0
 def test_method_with_user_none(self):
     self.assertIsNone(getUserProfile(None, '', ''))