Exemple #1
0
class TestProviderTypeSelector:
    def setup(self):
        self.type_selector = ProviderTypeSelector()

    def test_create(self):
        pass

    @raises(ProviderTypeSelectorError)
    def test_no_provider_type(self):
        self.type_selector.get_selector('asdf')

    def test_dummy_provider_type(self):
        self.type_selector.get_selector(DummyEntity)
class TestProviderTypeSelector:
    def setup(self):
        self.type_selector = ProviderTypeSelector()

    def test_create(self):
        pass

    @raises(ProviderTypeSelectorError)
    def test_no_provider_type(self):
        self.type_selector.get_selector('asdf')
    
    def test_dummy_provider_type(self):
        self.type_selector.get_selector(DummyEntity)
    def __init__(self, session, menu_items=None):
        if hasattr(self, 'style'):
            warnings.warn('style attribute is not supported anymore, '
                          'resources attribute replaces it', DeprecationWarning,
                          stacklevel=2)
            self.resources = (crud_script,
                              CSSSource(location='headbottom',
                                        src=self.style))

        if menu_items is None:
            menu_items = {}

        self.menu_items = self._adapt_menu_items(menu_items)
        self.helpers = CrudRestControllerHelpers()
        self.provider = ProviderTypeSelector().get_selector(self.model).get_provider(self.model, hint=session)
        self.session = session

        if self.json_dictify is True:
            self.json_dictify = {}

        #this makes crc declarative
        check_types = ['new_form', 'edit_form', 'table', 'table_filler', 'edit_filler']
        for type_ in check_types:
            if not hasattr(self, type_) and hasattr(self, type_+'_type'):
                setattr(self, type_, getattr(self, type_+'_type')(self.session))

        # Enable pagination only if table_filler has support for request local __count__
        self.pagination_enabled = (self.pagination and isinstance(self.table_filler, RequestLocalTableFiller))

        if hasattr(self, 'new_form'):
            #register the validators since they are none from the parent class
            register_validators(self, 'post', self.new_form)
        if hasattr(self, 'edit_form'):
            register_validators(self, 'put', self.edit_form)
Exemple #4
0
    def __init__(self, session, menu_items=None):
        if menu_items is None:
            menu_items = {}
        self.menu_items = menu_items
        self.provider = ProviderTypeSelector().get_selector(self.model).get_provider(self.model, hint=session)

        self.session = session

        #this makes crc declarative
        check_types = ['new_form', 'edit_form', 'table', 'table_filler', 'edit_filler']
        for type_ in check_types:
            if not hasattr(self, type_) and hasattr(self, type_+'_type'):
                setattr(self, type_, getattr(self, type_+'_type')(self.session))

        if hasattr(self, 'new_form'):
            #register the validators since they are none from the parent class
            register_validators(self, 'post', self.new_form)
        if hasattr(self, 'edit_form'):
            register_validators(self, 'put', self.edit_form)
    def __init__(self, session, menu_items=None):
        if hasattr(self, 'style'):
            warnings.warn(
                'style attribute is not supported anymore, '
                'resources attribute replaces it',
                DeprecationWarning,
                stacklevel=2)
            self.resources = (crud_script,
                              CSSSource(location='headbottom', src=self.style))

        if menu_items is None:
            menu_items = {}

        self.menu_items = self._adapt_menu_items(menu_items)
        self.helpers = CrudRestControllerHelpers()
        self.provider = ProviderTypeSelector().get_selector(
            self.model).get_provider(self.model, hint=session)
        self.session = session

        if self.json_dictify is True:
            self.json_dictify = {}

        #this makes crc declarative
        check_types = [
            'new_form', 'edit_form', 'table', 'table_filler', 'edit_filler'
        ]
        for type_ in check_types:
            if not hasattr(self, type_) and hasattr(self, type_ + '_type'):
                setattr(self, type_,
                        getattr(self, type_ + '_type')(self.session))

        # Enable pagination only if table_filler has support for request local __count__
        self.pagination_enabled = (self.pagination and isinstance(
            self.table_filler, RequestLocalTableFiller))

        if hasattr(self, 'new_form'):
            #register the validators since they are none from the parent class
            register_validators(self, 'post', self.new_form)
        if hasattr(self, 'edit_form'):
            register_validators(self, 'put', self.edit_form)
Exemple #6
0
    def __init__(self, session, menu_items=None):
        if menu_items is None:
            menu_items = {}
        self.menu_items = menu_items
        self.provider = ProviderTypeSelector().get_selector(self.model).get_provider(self.model, hint=session)

        self.session = session

        #this makes crc declarative
        check_types = ['new_form', 'edit_form', 'table', 'table_filler', 'edit_filler']
        for type_ in check_types:
            if not hasattr(self, type_) and hasattr(self, type_+'_type'):
                setattr(self, type_, getattr(self, type_+'_type')(self.session))

        if hasattr(self, 'new_form'):
            #register the validators since they are none from the parent class
            register_validators(self, 'post', self.new_form)
        if hasattr(self, 'edit_form'):
            register_validators(self, 'put', self.edit_form)
Exemple #7
0
class CrudRestController(RestController):
    """
    :variables:

    session
      database session (drives drop-down menus

    menu_items
      Dictionary of links to other models in the form model_items[lower_model_name] = Model

    title
      Title to be used for each page.  default: Turbogears Admin System

    :modifiers:

    model
      Model this class is associated with

    table
      Widget for the table display

    table_filler
      Class instance with get_value() that defines the JSon stream for the table

    edit_form
      Form to be used for editing the model

    edit_filler
      Class instance with a get_value() that defines how we get information for a single
      existing record

    new_form
      Form that defines how we create a form for new data entry.

    :Attributes:

      menu_items
        Dictionary of associated Models (used for menu)
      provider
        sprox provider for data manipulation
      session
        link to the database
    """

    title = "Turbogears Admin System"

    def _before(self, *args, **kw):
        tmpl_context.title = self.title
        tmpl_context.menu_items = self.menu_items

    def __before__(self, *args, **kw):
        # this will be removed in 2.1.*
        tmpl_context.menu_items = self.menu_items
        tmpl_context.title = self.title

    def __init__(self, session, menu_items=None):
        if menu_items is None:
            menu_items = {}
        self.menu_items = menu_items
        self.provider = ProviderTypeSelector().get_selector(
            self.model).get_provider(self.model, hint=session)

        self.session = session

        #this makes crc declarative
        check_types = [
            'new_form', 'edit_form', 'table', 'table_filler', 'edit_filler'
        ]
        for type_ in check_types:
            if not hasattr(self, type_) and hasattr(self, type_ + '_type'):
                setattr(self, type_,
                        getattr(self, type_ + '_type')(self.session))

        if hasattr(self, 'new_form'):
            #register the validators since they are none from the parent class
            register_validators(self, 'post', self.new_form)
        if hasattr(self, 'edit_form'):
            register_validators(self, 'put', self.edit_form)

    @with_trailing_slash
    @expose('tgext.crud.templates.get_all')
    @expose('json')
    @paginate('value_list', items_per_page=7)
    def get_all(self, *args, **kw):
        """Return all records.
           Pagination is done by offset/limit in the filler method.
           Returns an HTML page with the records if not json.
        """
        if pylons.request.response_type == 'application/json':
            return self.table_filler.get_value(**kw)

        if not getattr(self.table.__class__, '__retrieves_own_value__', False):
            values = self.table_filler.get_value(**kw)
        else:
            values = []

        tmpl_context.widget = self.table
        return dict(model=self.model.__name__, value_list=values)

    @expose('tgext.crud.templates.get_one')
    @expose('json')
    def get_one(self, *args, **kw):
        """get one record, returns HTML or json"""
        #this would probably only be realized as a json stream
        tmpl_context.widget = self.edit_form
        pks = self.provider.get_primary_fields(self.model)
        kw = {}
        for i, pk in enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        return dict(value=value, model=self.model.__name__)

    @expose('tgext.crud.templates.edit')
    def edit(self, *args, **kw):
        """Display a page to edit the record."""
        tmpl_context.widget = self.edit_form
        #pks = self.provider.get_primary_fields(self.model)

        log.debug("soyRomperLB= %s" % kw)

        ###########################################
        pks = self.provider.get_primary_fields(self.model)

        ###########################################
        kw = {}
        for i, pk in enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        value['_method'] = 'PUT'
        return dict(value=value, model=self.model.__name__, pk_count=len(pks))

    @without_trailing_slash
    @expose('sap.templates.desarrollar.lineabase.new')
    #@expose('tgext.crud.templates.new')
    def new(self, fid=None, *args, **kw):
        """Display a page to show a new record."""
        tmpl_context.widget = self.new_form
        #return dict(value=kw, model=self.model.__name__)
        """obtiene los id y nombre de los items, de la fase actual """
        #items = [x for x in (DBSession.query(Item.id, Item.nombre).filter_by(idFase=fid))]
        itemfaseactual = [
            x for x in DBSession.query(Item.id, Item.nombre).filter_by(
                idFase=fid,
                idLineaBase=None,
                estado='aprobado',
                ultimaversion=1).all()
        ]
        #return dict(value={'idFase':fid}, model=self.model.__name__, item_options=items)
        longitud = len(itemfaseactual)

        if (longitud == 0):
            flash("No existen items aprobados en la fase actual", "error")
            redirect('../?fid=' + fid)
        else:
            return dict(value={'idFase': fid},
                        model=self.model.__name__,
                        items_options=itemfaseactual)

    @catch_errors(errors, error_handler=new)
    @expose()
    @registered_validate(error_handler=new)
    def post(self, *args, **kw):
        ids = kw['items']
        longitud = len(ids)

        items = DBSession.query(Item).filter_by(idFase=kw['idFase'],
                                                ultimaversion=1).all()

        if (longitud > 0):
            fase = DBSession.query(Fase).filter_by(id=kw['idFase']).first()

            if longitud == len(items):
                fase.estado = 'lineaBaseTotal'
            else:
                fase.estado = 'lineaBaseParcial'

            lineabase = self.provider.create(self.model, params=kw)

            for indice in range(longitud):
                item = DBSession.query(Item).filter_by(id=ids[indice]).first()
                item.idLineaBase = lineabase.id

            raise redirect('./?fid=' + kw['idFase'])
        else:
            flash("No ha seleccionado ningun item", "error")
            raise redirect('./new/?fid=' + kw['idFase'])

    @expose()
    @registered_validate(error_handler=edit)
    @catch_errors(errors, error_handler=edit)
    def put(self, *args, **kw):
        """update"""
        pks = self.provider.get_primary_fields(self.model)
        for i, pk in enumerate(pks):
            if pk not in kw and i < len(args):
                kw[pk] = args[i]

        log.debug('putLineaBase= %s' % kw)
        #lineabase/?fid=21

        self.provider.update(self.model, params=kw)
        redirect('../' + '../lineabase/?fid=' + str(kw['idFase']))

    @expose()
    def post_delete(self, *args, **kw):
        """This is the code that actually deletes the record"""
        pks = self.provider.get_primary_fields(self.model)
        d = {}

        for i, arg in enumerate(args):
            d[pks[i]] = arg
        """extraer el idFase para poder retornar en el estado anterior """
        idfase = DBSession.query(
            LineaBase.idFase).filter_by(id=d['id']).first()

        self.provider.delete(self.model, d)

        redirect('/lineabase/?fid=' + str(idfase[0]))

    @expose('tgext.crud.templates.get_delete')
    def get_delete(self, *args, **kw):
        """This is the code that creates a confirm_delete page"""
        return dict(args=args)
Exemple #8
0
class CrudRestController(RestController):
    """
    :variables:

    session
      database session (drives drop-down menus

    menu_items
      Dictionary of links to other models in the form model_items[lower_model_name] = Model

    title
      Title to be used for each page.  default: Turbogears Admin System

    :modifiers:

    model
      Model this class is associated with

    table
      Widget for the table display

    table_filler
      Class instance with get_value() that defines the JSon stream for the table

    edit_form
      Form to be used for editing the model

    edit_filler
      Class instance with a get_value() that defines how we get information for a single
      existing record

    new_form
      Form that defines how we create a form for new data entry.

    :Attributes:

      menu_items
        Dictionary of associated Models (used for menu)
      provider
        sprox provider for data manipulation
      session
        link to the database
    """

    title = "Turbogears Admin System"

    def _before(self, *args, **kw):
        tmpl_context.title = self.title
        tmpl_context.menu_items = self.menu_items

    def __before__(self, *args, **kw):
        # this will be removed in 2.1.*
        tmpl_context.menu_items = self.menu_items
        tmpl_context.title = self.title

    def __init__(self, session, menu_items=None):
        if menu_items is None:
            menu_items = {}
        self.menu_items = menu_items
        self.provider = ProviderTypeSelector().get_selector(self.model).get_provider(self.model, hint=session)

        self.session = session

        #this makes crc declarative
        check_types = ['new_form', 'edit_form', 'table', 'table_filler', 'edit_filler']
        for type_ in check_types:
            if not hasattr(self, type_) and hasattr(self, type_+'_type'):
                setattr(self, type_, getattr(self, type_+'_type')(self.session))

        if hasattr(self, 'new_form'):
            #register the validators since they are none from the parent class
            register_validators(self, 'post', self.new_form)
        if hasattr(self, 'edit_form'):
            register_validators(self, 'put', self.edit_form)

    @with_trailing_slash
    @expose('tgext.crud.templates.get_all')
    @expose('json')
    @paginate('value_list', items_per_page=7)
    def get_all(self, *args, **kw):
        """Return all records.
           Pagination is done by offset/limit in the filler method.
           Returns an HTML page with the records if not json.
        """
        if pylons.request.response_type == 'application/json':
            return self.table_filler.get_value(**kw)

        if not getattr(self.table.__class__, '__retrieves_own_value__', False):
            values = self.table_filler.get_value(**kw)
        else:
            values = []

        tmpl_context.widget = self.table
        return dict(model=self.model.__name__, value_list=values)

    @expose('tgext.crud.templates.get_one')
    @expose('json')
    def get_one(self, *args, **kw):
        """get one record, returns HTML or json"""
        #this would probably only be realized as a json stream
        tmpl_context.widget = self.edit_form
        pks = self.provider.get_primary_fields(self.model)
        kw = {}
        for i, pk in  enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        return dict(value=value,model=self.model.__name__)

    @expose('tgext.crud.templates.edit')
    def edit(self,*args, **kw):
      
        """Aqui esta el codigo de importacion de tipos de items """
          
          
        log.debug(" kwedit: %s" %kw)
        #log.debug(" fidedit: %s" %fid)        
        pks = self.provider.get_primary_fields(self.model)
        kw = {}
        for i, pk in  enumerate(pks):
            kw[pk] = args[i]
  
        log.debug(" Soy el ID: %s" % kw[pk])
        
        
        
        
        
        redirect('../../importartipodeitem/?fid=22')
        
        
        

    @without_trailing_slash
    @expose("sap.templates.configurar.importartipodeitem.new")
    def new(self,fid=None ,*args, **kw):
        """Display a page to show a new record."""
        tmpl_context.widget = self.new_form
        
        
        log.debug('kwwwwnew: %s' %kw)
        
        
        longitud=len(kw)        
        if longitud==0:
            tiposdeitems=DBSession.query(TipoDeItem.id,TipoDeItem.nombre).filter(TipoDeItem.idFase != fid).all()
            return dict(value={"fid": fid}, model=self.model.__name__ ,importar_options=tiposdeitems)
        else:
           
            ids= kw['TiposDeItemImportar']
            log.debug('ids: %s' %ids)
            longitud= len(ids)
            
                
                
                
            for indice in range(longitud):
                """Hace una copia del tipo de item cambiando el idFase """
                idTipo= ids[indice]
                tipo=DBSession.query(TipoDeItem).filter_by(id=idTipo).first()
                
                log.debug('tiposss: %s' %tipo)
                
                tipocopia=TipoDeItem()
                tipocopia.nombre=tipo.nombre
                tipocopia.descripcion=tipo.descripcion
                log.debug('tipocopia: %s' %tipocopia)
                tipocopia.idFase=fid
                DBSession.add(tipocopia) #NuevoTipoItem es el nuevo objeto guardado
                
                
                NuevoTipoItem=DBSession.query(TipoDeItem.id).filter_by(nombre=tipocopia.nombre, descripcion=tipocopia.descripcion, idFase=fid).first()
                
                
                #Se copia los los atributos especificos del tipo de item
                campos=DBSession.query(Campos).filter_by(idTipoDeItem=idTipo).all()
                log.debug(campos)
                long2=len(campos)
                log.debug("long2: %s" %long2)
                
                for x in range(long2):
                    #se copia los campos pertenecientes al tipo de item pero con "idTipoDeItem" distinto
                    
                    log.debug("forrrr: %s" %x)
                    campocopia=Campos()
                    campocopia.nombre=campos[x].nombre
                    campocopia.tipoDeDato=campos[x].tipoDeDato
                    campocopia.idTipoDeItem=NuevoTipoItem.id
                    DBSession.add(campocopia) 
                    
                
                
            
        pid=DBSession.query(Fase.idproyec).filter_by(id=fid).first()
            
        redirect("../../fase/?pid="+ str(pid[0]))
        
        
        
            
            
            

        """ids= kw['idFase']
        longitud= len(kw['idFase'])
        for indice in range(longitud):
            kw['idFase']= ids[indice]
            
            msj=DBSession.query(ProyFaseUsuario.idProyecto).filter_by(idProyecto=kw['idProyecto'], iduser=kw['iduser'], idFase=kw['idFase']).first()
            if msj == None:
                self.provider.create(self.model, params=kw)
            else:
                flash("El usuario ya fue adherido a la Fase elegida", "error")
                redirect('new/?pid='+ kw['idProyecto'])
        
        raise redirect('./?pid='+ kw['idProyecto'])
        """     









    @catch_errors(errors, error_handler=new)
    @expose()
    @registered_validate(error_handler=new)
    def post(self, *args, **kw):
        self.provider.create(self.model, params=kw)
        


        log.debug("posImportar: %s" %kw)





        """ids= kw['idFase']
        longitud= len(kw['idFase'])
        for indice in range(longitud):
            kw['idFase']= ids[indice]
            
            msj=DBSession.query(ProyFaseUsuario.idProyecto).filter_by(idProyecto=kw['idProyecto'], iduser=kw['iduser'], idFase=kw['idFase']).first()
            if msj == None:
                self.provider.create(self.model, params=kw)
            else:
                flash("El usuario ya fue adherido a la Fase elegida", "error")
                redirect('new/?pid='+ kw['idProyecto'])
        
        raise redirect('./?pid='+ kw['idProyecto'])"""



        raise redirect('./')
    @expose()
    @registered_validate(error_handler=edit)
    @catch_errors(errors, error_handler=edit)
    def put(self, *args, **kw):
        """update"""
        pks = self.provider.get_primary_fields(self.model)
        for i, pk in enumerate(pks):
            if pk not in kw and i < len(args):
                kw[pk] = args[i]

        self.provider.update(self.model, params=kw)
        redirect('../' * len(pks))

    @expose()
    def post_delete(self, *args, **kw):
        """This is the code that actually deletes the record"""
        pks = self.provider.get_primary_fields(self.model)
        d = {}
        for i, arg in enumerate(args):
            d[pks[i]] = arg
        self.provider.delete(self.model, d)
        redirect('./' + '../' * (len(pks) - 1))

    @expose('tgext.crud.templates.get_delete')
    def get_delete(self, *args, **kw):
        """This is the code that creates a confirm_delete page"""
        return dict(args=args)
Exemple #9
0
class CrudRestController(RestController):
    """
    :variables:

    session
      database session (drives drop-down menus

    menu_items
      Dictionary of links to other models in the form model_items[lower_model_name] = Model

    title
      Title to be used for each page.  default: Turbogears Admin System

    :modifiers:

    model
      Model this class is associated with

    table
      Widget for the table display

    table_filler
      Class instance with get_value() that defines the JSon stream for the table

    edit_form
      Form to be used for editing the model

    edit_filler
      Class instance with a get_value() that defines how we get information for a single
      existing record

    new_form
      Form that defines how we create a form for new data entry.

    :Attributes:

      menu_items
        Dictionary of associated Models (used for menu)
      provider
        sprox provider for data manipulation
      session
        link to the database
    """

    title = "Turbogears Admin System"

    def _before(self, *args, **kw):
        tmpl_context.title = self.title
        tmpl_context.menu_items = self.menu_items

    def __before__(self, *args, **kw):
        # this will be removed in 2.1.*
        tmpl_context.menu_items = self.menu_items
        tmpl_context.title = self.title

    def __init__(self, session, menu_items=None):
        if menu_items is None:
            menu_items = {}
        self.menu_items = menu_items
        self.provider = ProviderTypeSelector().get_selector(
            self.model).get_provider(self.model, hint=session)

        self.session = session

        #this makes crc declarative
        check_types = [
            'new_form', 'edit_form', 'table', 'table_filler', 'edit_filler'
        ]
        for type_ in check_types:
            if not hasattr(self, type_) and hasattr(self, type_ + '_type'):
                setattr(self, type_,
                        getattr(self, type_ + '_type')(self.session))

        if hasattr(self, 'new_form'):
            #register the validators since they are none from the parent class
            register_validators(self, 'post', self.new_form)
        if hasattr(self, 'edit_form'):
            register_validators(self, 'put', self.edit_form)

    @with_trailing_slash
    @expose('tgext.crud.templates.get_all')
    @expose('json')
    @paginate('value_list', items_per_page=7)
    def get_all(self, *args, **kw):
        """Return all records.
           Pagination is done by offset/limit in the filler method.
           Returns an HTML page with the records if not json.
        """
        if pylons.request.response_type == 'application/json':
            return self.table_filler.get_value(**kw)

        if not getattr(self.table.__class__, '__retrieves_own_value__', False):
            values = self.table_filler.get_value(**kw)
        else:
            values = []

        tmpl_context.widget = self.table
        return dict(model=self.model.__name__, value_list=values)

    @expose('tgext.crud.templates.get_one')
    @expose('json')
    def get_one(self, *args, **kw):
        """get one record, returns HTML or json"""
        #this would probably only be realized as a json stream
        tmpl_context.widget = self.edit_form
        pks = self.provider.get_primary_fields(self.model)
        kw = {}
        for i, pk in enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        return dict(value=value, model=self.model.__name__)

    @expose('tgext.crud.templates.edit')
    def edit(self, *args, **kw):
        """Display a page to edit the record."""
        tmpl_context.widget = self.edit_form
        #pks = self.provider.get_primary_fields(self.model)

        ###########################################
        pks = self.provider.get_primary_fields(self.model)

        ###########################################
        kw = {}
        for i, pk in enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        value['_method'] = 'PUT'
        return dict(value=value, model=self.model.__name__, pk_count=len(pks))

    @without_trailing_slash
    #@expose('tgext.crud.templates.new')
    @expose("sap.templates.desarrollar.itemlineabase.new")
    def new(self, lid=None, *args, **kw):

        tmpl_context.widget = self.new_form

        if len(kw) < 2:
            """-----obtiene el idFase de la en el que esta la linea base------- """

            fid = DBSession.query(LineaBase.idFase).filter_by(id=lid).first()
            log.debug("fidddd= %s" % fid)
            """-----------------------------------------------------------------"""

            emfaseactual = [
                x for x in DBSession.query(Item.id, Item.nombre).filter_by(
                    idFase=fid, idLineaBase=None).all()
            ]
            return dict(value={'lineabase': lid},
                        model=self.model.__name__,
                        items_options=itemfaseactual)
            """Este else es como el Post.Como,al guardar no se va al Post,vuelve al new, entonces se le creo este "else" """
        else:

            kw2 = dict()
            kw2['id'] = kw['items']
            kw2['idLineaBase'] = kw['lineabase']
            self.provider.update(self.model, params=kw2)

            raise redirect('../' + '../itemlineabase/?lid=' + kw['lineabase'])

    @catch_errors(errors, error_handler=new)
    @expose()
    @registered_validate(error_handler=new)
    def post(self, *args, **kw):
        """ este Post, no es llamado en ningun momento, razon por la cual es reemplazado por el "else" que esta en New"""
        log.debug("postItemLinea: %s" % kw)
        #self.provider.create(self.model, params=kw)

        raise redirect('../' + '../itemlineabase/?fid=21')

    @expose()
    @registered_validate(error_handler=edit)
    @catch_errors(errors, error_handler=edit)
    def put(self, *args, **kw):
        """update"""
        pks = self.provider.get_primary_fields(self.model)
        for i, pk in enumerate(pks):
            if pk not in kw and i < len(args):
                kw[pk] = args[i]

        self.provider.update(self.model, params=kw)
        redirect('../' * len(pks))

    @expose()
    def post_delete(self, *args, **kw):
        """This is the code that actually deletes the record"""
        pks = self.provider.get_primary_fields(self.model)
        d = {}
        for i, arg in enumerate(args):
            d[pks[i]] = arg
        self.provider.delete(self.model, d)
        redirect('./' + '../' * (len(pks) - 1))

    @expose('tgext.crud.templates.get_delete')
    def get_delete(self, *args, **kw):
        """This is the code that creates a confirm_delete page"""
        return dict(args=args)
class CrudRestController(RestController):
    """
    :initialization options:

        **session**
              database session 

        **menu_items**
            Dictionary or mapping type of links to other CRUD sections.
            This is used to generate the links sidebar of the CRUD interface.
            Can be specified in the form ``model_items['lower_model_name'] = ModelClass`` or
            ``model_items['link'] = 'Name'``.

    :class attributes:

        **title**
            Title to be used for each page.  default: ``'Turbogears Admin System'``

        **model**
            Model this class is associated with.

        **remember_values**
            List of model attributes that need to keep previous value when not provided
            on submission instead of replacing the existing value with an empty one.
            It's commonly used with file fields to avoid having to reupload the file
            again when the model is edited.

        **keep_params**
            List of URL parameters that need to be kept around when redirecting between
            the various pages of the CRUD controller. Can be used to keep around filters
            or sorting when editing a subset of the models.

        **search_fields**
            Enables searching on some fields, can be ``True``, ``False`` or a list
            of fields for which searching should be enabled.

        **substring_filters**
            Enable substring filtering for some fields, by default is disabled.
            Pass ``True`` to enable it on all fields or pass a list of field
            names to enable it only on some fields.

        **json_dictify**
            ``True`` or ``False``, enables advanced dictification of retrieved models
            when providing JSON responses. This also enables JSON encoding of related entities
            for the returned model.

        **conditional_update_field**
            Name of the field used to perform conditional updates when ``PUT`` method is
            used as a REST API. ``None`` disables conditional updates (which is the default).

        **pagination**
            Dictionary of options for pagination. ``False`` disables pagination.
            By default ``{'items_per_page': 7}`` is provided.
            Currently the only supported option is ``items_per_page``.

        **response_type**
            Limit response to a single format, can be: 'application/json' or 'text/html'. 
            By default tgext.crud will detect expected response from Accept header and 
            will provide response content according to the expected one. If you want
            to avoid HTML access to a plain JSON API you can use this option to limit
            valid responses to application/json.

        **resources**
            A list of CSSSource / JSSource that have to be injected inside CRUD
            pages when rendering. By default ``tgext.crud.resources.crud_style`` and
            ``tgext.crud.resources.crud_script`` are injected.

        **table**
            The ``sprox.tablebase.TableBase`` Widget instance used to display the table.
            By default ``tgext.crud.utils.SortableTableBase`` is used which permits to sort
            table by columns.

        **table_filler**
            The ``sprox.fillerbase.TableFiller`` instance used to retrieve data for the table.
            If you want to customize how data is retrieved override the 
            ``TableFiller._do_get_provider_count_and_objs`` method to return different entities and count.
            By default ``tgext.crud.utils.RequestLocalTableFiller`` is used which keeps
            track of the numer of entities retrieved during the current request to enable pagination.

        **edit_form**
            Form to be used for editing an existing model. 
            By default ``sprox.formbase.EditForm`` is used.

        **edit_filler**
            ``sprox.fillerbase.RecordFiller`` subclass used to load the values for
            an entity that need to be edited. Override the ``RecordFiller.get_value``
            method to provide custom values.

        **new_form**
            Form that defines how to create a new model.
            By default ``sprox.formbase.AddRecordForm`` is used.
    """

    title = "Turbogears Admin System"
    keep_params = None
    remember_values = []
    substring_filters = []
    search_fields = True  # True for automagic
    json_dictify = False # True is slower but provides relations
    conditional_update_field = None
    response_type = None
    pagination = {'items_per_page': 7}
    resources = ( crud_style,
                  crud_script )

    def _before(self, *args, **kw):
        tmpl_context.title = self.title
        tmpl_context.menu_items = self.menu_items
        tmpl_context.kept_params = self._kept_params()
        tmpl_context.crud_helpers = self.helpers

        for resource in self.resources:
            resource.inject()

        force_response_type(self.response_type)

    __before__ = _before #This can be removed since 2.2

    def _mount_point(self):
        try:
            mount_point = self.mount_point
        except:
            mount_point = None

        if not mount_point:
            #non statically mounted or Old TurboGears, use relative URL
            mount_point = '.'

        return mount_point

    def _kept_params(self):
        if not self.keep_params:
            return {}

        if not request.referer:
            from_referer = {}
        else:
            parsed = url_parse(request.referer)
            from_referer = dict(cgi.parse_qsl(parsed.query))
        from_referer.update(request.params)

        pass_params = {}
        for k in self.keep_params:
            if k in from_referer:
                pass_params[k] = from_referer[k]
        return pass_params

    def _adapt_menu_items(self, menu_items):
        adapted_menu_items = type(menu_items)()

        for link, model in menu_items.items():
            if inspect.isclass(model):
                adapted_menu_items[link + 's'] = model.__name__
            else:
                adapted_menu_items[link] = model
        return adapted_menu_items

    def _get_search_fields(self, kw):
        if self.search_fields is True:
            return [
                (field, self.table.__headers__.get(field, field), kw.get(field, False))
                    for field in self.table.__fields__
                        if field != '__actions__'
                ]
        elif self.search_fields:
            # This allows for customizing the search fields to be shown in the table definition
            # search_fields can be either a list of tuples with (field, name) or just a string field = name
            search_fields = []
            for field in self.search_fields:
                if isinstance(field, string_type):
                    search_fields.append((field, field, kw.get(field, False)))
                else:
                    search_fields.append((field[0], field[1], kw.get(field[0], False)))
            return search_fields
        else:
            # This would be where someone explicitly disabled the search functionality
            return []

    def _get_current_search(self, search_fields):
        if not search_fields:
            return None

        for field, _, value in search_fields:
            if value is not False:
                return (field, value)
        return (search_fields[0][0], '')

    def _dictify(self, value, length=None):
        json_dictify = self.json_dictify
        if json_dictify is False:
            return value

        def _dictify(entity):
            if hasattr(entity, '__json__'):
                return entity.__json__()
            else:
                return self.provider.dictify(entity, **json_dictify)

        if length is not None:
            #return a generator, we don't want to consume the whole query if it is paginated
            return (_dictify(entity) for entity in value)
        else:
            return _dictify(value)

    def __init__(self, session, menu_items=None):
        if hasattr(self, 'style'):
            warnings.warn('style attribute is not supported anymore, '
                          'resources attribute replaces it', DeprecationWarning,
                          stacklevel=2)
            self.resources = (crud_script,
                              CSSSource(location='headbottom',
                                        src=self.style))

        if menu_items is None:
            menu_items = {}

        self.menu_items = self._adapt_menu_items(menu_items)
        self.helpers = CrudRestControllerHelpers()
        self.provider = ProviderTypeSelector().get_selector(self.model).get_provider(self.model, hint=session)
        self.session = session

        if self.json_dictify is True:
            self.json_dictify = {}

        #this makes crc declarative
        check_types = ['new_form', 'edit_form', 'table', 'table_filler', 'edit_filler']
        for type_ in check_types:
            if not hasattr(self, type_) and hasattr(self, type_+'_type'):
                setattr(self, type_, getattr(self, type_+'_type')(self.session))

        # Enable pagination only if table_filler has support for request local __count__
        self.pagination_enabled = (self.pagination and isinstance(self.table_filler, RequestLocalTableFiller))

        if hasattr(self, 'new_form'):
            #register the validators since they are none from the parent class
            register_validators(self, 'post', self.new_form)
        if hasattr(self, 'edit_form'):
            register_validators(self, 'put', self.edit_form)

    @with_trailing_slash
    @expose('genshi:tgext.crud.templates.get_all')
    @expose('mako:tgext.crud.templates.get_all')
    @expose('jinja:tgext.crud.templates.get_all')
    @expose('json:')
    @optional_paginate('value_list')
    def get_all(self, *args, **kw):
        """Return all records.
           Pagination is done by offset/limit in the filler method.
           Returns an HTML page with the records if not json.
        """
        if self.pagination:
            paginator = request.paginators['value_list']
            paginator.paginate_items_per_page = self.pagination['items_per_page']
        else:
            paginator = request.paginators['value_list']
            paginator.paginate_items_per_page = -1
            paginator.paginate_page = 0

        if tg.request.response_type == 'application/json':
            adapt_params_for_pagination(kw, self.pagination_enabled)
            try:
                count, values = self.table_filler._do_get_provider_count_and_objs(**kw)
            except Exception as e:
                abort(400, detail=unicode_text(e))
            values = self._dictify(values, length=count)
            if self.pagination_enabled:
                values = SmartPaginationCollection(values, count)
            return dict(value_list=values)

        if not getattr(self.table.__class__, '__retrieves_own_value__', False):
            kw.pop('substring_filters', None)
            if self.substring_filters is True:
                substring_filters = list(set(kw.keys()) - set(['limit', 'offset', 'order_by', 'desc']))
            else:
                substring_filters = self.substring_filters

            adapt_params_for_pagination(kw, self.pagination_enabled)
            try:
                values = self.table_filler.get_value(substring_filters=substring_filters, **kw)
            except Exception as e:
                flash('Invalid search query "%s": %s' % (request.query_string, e), 'warn')
                # Reset all variables to sane defaults
                kw = {}
                values = []
                self.table_filler.__count__ = 0
            if self.pagination_enabled:
                values = SmartPaginationCollection(values, self.table_filler.__count__)
        else:
            values = []

        tmpl_context.widget = self.table
        search_fields = self._get_search_fields(kw)
        current_search = self._get_current_search(search_fields)
        return dict(model=self.model.__name__, value_list=values,
                    mount_point=self._mount_point(),
                    headers=search_fields,  # Just for backwards compatibility
                    search_fields=search_fields, current_search=current_search)

    @expose('genshi:tgext.crud.templates.get_one')
    @expose('mako:tgext.crud.templates.get_one')
    @expose('jinja:tgext.crud.templates.get_one')
    @expose('json:')
    def get_one(self, *args, **kw):
        """get one record, returns HTML or json"""
        #this would probably only be realized as a json stream
        kw = map_args_to_pks(args, {})

        if tg.request.response_type == 'application/json':
            obj = self.provider.get_obj(self.model, kw)
            if obj is None:
                tg.response.status_code = 404
            elif self.conditional_update_field is not None:
                tg.response.last_modified = getattr(obj, self.conditional_update_field)

            return dict(model=self.model.__name__,
                        value=self._dictify(obj))

        tmpl_context.widget = self.edit_form
        value = self.edit_filler.get_value(kw)
        return dict(value=value, model=self.model.__name__)

    @expose('genshi:tgext.crud.templates.edit')
    @expose('mako:tgext.crud.templates.edit')
    @expose('jinja:tgext.crud.templates.edit')
    def edit(self, *args, **kw):
        """Display a page to edit the record."""
        pks = self.provider.get_primary_fields(self.model)
        kw = map_args_to_pks(args, {})

        tmpl_context.widget = self.edit_form
        value = self.edit_filler.get_value(kw)
        value['_method'] = 'PUT'
        return dict(value=value, model=self.model.__name__, pk_count=len(pks))

    @without_trailing_slash
    @expose('genshi:tgext.crud.templates.new')
    @expose('mako:tgext.crud.templates.new')
    @expose('jinja:tgext.crud.templates.new')
    def new(self, *args, **kw):
        """Display a page to show a new record."""
        tmpl_context.widget = self.new_form
        return dict(value=kw, model=self.model.__name__)

    @expose(content_type='text/html')
    @expose('json:', content_type='application/json')
    @before_validate(allow_json_parameters)
    @catch_errors(errors, error_handler=new)
    @registered_validate(error_handler=new)
    def post(self, *args, **kw):
        obj = self.provider.create(self.model, params=kw)

        if tg.request.response_type == 'application/json':
            if obj is not None and self.conditional_update_field is not None:
                tg.response.last_modified = getattr(obj, self.conditional_update_field)

            return dict(model=self.model.__name__,
                        value=self._dictify(obj))

        return redirect('./', params=self._kept_params())

    @expose(content_type='text/html')
    @expose('json:', content_type='application/json')
    @before_validate(allow_json_parameters)
    @before_validate(map_args_to_pks)
    @registered_validate(error_handler=edit)
    @catch_errors(errors, error_handler=edit)
    def put(self, *args, **kw):
        """update"""
        omit_fields = []
        if getattr(self, 'edit_form', None):
            omit_fields.extend(self.edit_form.__omit_fields__)

        for remembered_value in self.remember_values:
            value = kw.get(remembered_value)
            if value is None or value == '':
                omit_fields.append(remembered_value)

        obj = self.provider.get_obj(self.model, kw)

        #This should actually by done by provider.update to make it atomic
        can_modify = True
        if obj is not None and self.conditional_update_field is not None and \
           tg.request.if_unmodified_since is not None and \
           tg.request.if_unmodified_since < getattr(obj, self.conditional_update_field):
                can_modify = False

        if obj is not None and can_modify:
            obj = self.provider.update(self.model, params=kw, omit_fields=omit_fields)

        if tg.request.response_type == 'application/json':
            if obj is None:
                tg.response.status_code = 404
            elif can_modify is False:
                tg.response.status_code = 412
            elif self.conditional_update_field is not None:
                tg.response.last_modified = getattr(obj, self.conditional_update_field)

            return dict(model=self.model.__name__,
                        value=self._dictify(obj))

        pks = self.provider.get_primary_fields(self.model)
        return redirect('../' * len(pks), params=self._kept_params())

    @expose(content_type='text/html')
    @expose('json:', content_type='application/json')
    def post_delete(self, *args, **kw):
        """This is the code that actually deletes the record"""
        kw = map_args_to_pks(args, {})

        obj = None
        if kw:
            obj = self.provider.get_obj(self.model, kw)

        if obj is not None:
            self.provider.delete(self.model, kw)

        if tg.request.response_type == 'application/json':
            return dict()

        pks = self.provider.get_primary_fields(self.model)
        return redirect('./' + '../' * (len(pks) - 1), params=self._kept_params())

    @expose('genshi:tgext.crud.templates.get_delete')
    @expose('jinja:tgext.crud.templates.get_delete')
    def get_delete(self, *args, **kw):
        """This is the code that creates a confirm_delete page"""
        return dict(args=args)
Exemple #11
0
class CrudRestController(RestController):
    """
    :variables:

    session
      database session (drives drop-down menus

    menu_items
      Dictionary of links to other models in the form model_items[lower_model_name] = Model

    title
      Title to be used for each page.  default: Turbogears Admin System

    :modifiers:

    model
      Model this class is associated with

    table
      Widget for the table display

    table_filler
      Class instance with get_value() that defines the JSon stream for the table

    edit_form
      Form to be used for editing the model

    edit_filler
      Class instance with a get_value() that defines how we get information for a single
      existing record

    new_form
      Form that defines how we create a form for new data entry.

    :Attributes:

      menu_items
        Dictionary of associated Models (used for menu)
      provider
        sprox provider for data manipulation
      session
        link to the database
    """

    title = "Turbogears Admin System"

    def _before(self, *args, **kw):
        tmpl_context.title = self.title
        tmpl_context.menu_items = self.menu_items

    def __before__(self, *args, **kw):
        # this will be removed in 2.1.*
        tmpl_context.menu_items = self.menu_items
        tmpl_context.title = self.title

    def __init__(self, session, menu_items=None):
        if menu_items is None:
            menu_items = {}
        self.menu_items = menu_items
        self.provider = ProviderTypeSelector().get_selector(
            self.model).get_provider(self.model, hint=session)

        self.session = session

        #this makes crc declarative
        check_types = [
            'new_form', 'edit_form', 'table', 'table_filler', 'edit_filler'
        ]
        for type_ in check_types:
            if not hasattr(self, type_) and hasattr(self, type_ + '_type'):
                setattr(self, type_,
                        getattr(self, type_ + '_type')(self.session))

        if hasattr(self, 'new_form'):
            #register the validators since they are none from the parent class
            register_validators(self, 'post', self.new_form)
        if hasattr(self, 'edit_form'):
            register_validators(self, 'put', self.edit_form)

    @with_trailing_slash
    @expose('sap.templates.desarrollar.relacionitem.get_all')
    @expose('json')
    @paginate('value_list', items_per_page=7)
    def get_all(self, *args, **kw):
        """Return all records.
           Pagination is done by offset/limit in the filler method.
           Returns an HTML page with the records if not json.
        """

        if pylons.request.response_type == 'application/json':
            return self.table_filler.get_value(**kw)

        if not getattr(self.table.__class__, '__retrieves_own_value__', False):
            values = self.table_filler.get_value(**kw)
        else:
            values = []

        longitud = len(values)
        for fila in range(longitud):
            values[fila]['idItem1'] = DBSession.query(
                Item.nombre).filter_by(id=values[fila]['idItem1']).one()
            values[fila]['idItem2'] = DBSession.query(
                Item.nombre).filter_by(id=values[fila]['idItem2']).one()

        tmpl_context.widget = self.table
        return dict(model=self.model.__name__, value_list=values)

    @expose('tgext.crud.templates.get_one')
    @expose('json')
    def get_one(self, *args, **kw):
        """get one record, returns HTML or json"""
        #this would probably only be realized as a json stream
        tmpl_context.widget = self.edit_form
        pks = self.provider.get_primary_fields(self.model)
        kw = {}
        for i, pk in enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        return dict(value=value, model=self.model.__name__)

    @expose('tgext.crud.templates.edit')
    def edit(self, *args, **kw):
        """Display a page to edit the record."""
        tmpl_context.widget = self.edit_form
        #pks = self.provider.get_primary_fields(self.model)

        ###########################################
        pks = self.provider.get_primary_fields(self.model)

        ###########################################
        kw = {}
        for i, pk in enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        value['_method'] = 'PUT'
        return dict(value=value, model=self.model.__name__, pk_count=len(pks))

    @without_trailing_slash
    @expose('sap.templates.desarrollar.relacionitem.new')
    def new(self, iid=None, *args, **kw):
        """Display a page to show a new record."""
        tmpl_context.widget = self.new_form
        """Fase a la cual pertenece el item que se quiere relacionar"""
        faseActual = DBSession.query(Item.idFase).filter_by(id=iid).one()
        """Proyecto al cual pertenece la fase que hallamos en la linea anterior"""
        proyecto = DBSession.query(
            Fase.idproyec).filter_by(id=faseActual).one()

        listalineabase = DBSession.query(LineaBase).filter_by(
            idFase=faseActual).all()
        desarrollo = True
        longitud = len(listalineabase)

        for x in range(longitud):
            if str(listalineabase[x].estado).__eq__('cerrada'):
                desarrollo = False

        if desarrollo & longitud > 0:
            fase = DBSession.query(Fase).filter_by(id=Item.idFase).first()
            fase.estado = 'desarrollo'
            allFaseSgte = DBSession.query(Fase).filter(
                (Fase.idproyec == proyecto) & (Fase.id > faseActual)).all()
            longFaseSgte = len(allFaseSgte)

            if (longFaseSgte > 0):
                allFaseSgte[0].estado = 'desarrollo'
                lineabasesgte = DBSession.query(LineaBase).filter_by(
                    idFase=allFaseSgte[0].id).all()

                for x in range(len(lineabasesgte)):
                    if str(lineabasesgte[x].estado).__eq__('cerrada'):
                        lineabasesgte[x].estado = 'comprometida'

                        itemlbsgte = DBSession.query(Item).filter_by(
                            idLineaBase=lineabasesgte[x].id,
                            ultimaversion=1).all()
                        for y in range(len(itemlbsgte)):
                            itemlbsgte[y].estado = 'revision'
        """Proyecto al cual pertenece la fase que hallamos en la linea anterior"""
        proyecto = DBSession.query(
            Fase.idproyec).filter_by(id=faseActual).one()
        """Todas las fases que pertenecen al proyecto en cuestion"""
        allFase = DBSession.query(Fase).filter((Fase.idproyec == proyecto)
                                               & (Fase.id < faseActual)).all()
        longFase = len(allFase)
        """Todos los item de la fase actual"""
        listaActual = DBSession.query(Item.id, Item.nombre).\
                    filter_by(idFase=faseActual, ultimaversion=1).all()
        """Todas las relaciones existentes"""
        relaciones = DBSession.query(RelacionItem.idItem1,
                                     RelacionItem.idItem2).all()
        longRel = len(relaciones)

        #La fase inmediatamente inferior es la fase anterior
        listaAnterior = []
        #Se comprueba que exista una fase anterior
        if (longFase > 0):
            listaAnterior = DBSession.query(Item.id, Item.nombre).\
            filter((Item.idFase==allFase[longFase-1].id) & (Item.ultimaversion==1)\
                   & (Item.idLineaBase != None) & (Item.estado.__eq__('aprobado'))).all()
        log.debug(listaAnterior)

        #Eliminar los item ya relacionados de la lista de fase anterior
        for x in range(longRel):
            #relaciones[x][0] = idItem1
            #relaciones[x][1] = idItem2
            longitud = len(listaAnterior)
            if iid.__eq__("%s" % relaciones[x][0]):
                for y in range(longitud):
                    if listaAnterior[y][0] == relaciones[x][1]:
                        listaAnterior.remove(listaAnterior[y])
                        break
            elif iid.__eq__("%s" % relaciones[x][1]):
                for y in range(longitud):
                    if listaAnterior[y][0] == relaciones[x][0]:
                        listaAnterior.remove(listaAnterior[y])
                        break
        """-----------------------------------------------"""
        """-------------------FASE ACTUAL-------------------"""
        #Eliminar el item que se quiere relacionar de la lista de fase actual
        longitud = len(listaActual)
        for x in range(longitud):
            if iid.__eq__("%s" % listaActual[x][0]):
                listaActual.remove(listaActual[x])
                break

        #Eliminar los item ya relacionados de la lista de fase actual
        for x in range(longRel):
            #relaciones[x][0] = idItem1
            #relaciones[x][1] = idItem2
            longitud = len(listaActual)
            if iid.__eq__("%s" % relaciones[x][0]):
                for y in range(longitud):
                    if listaActual[y][0] == relaciones[x][1]:
                        listaActual.remove(listaActual[y])
                        break

        self.controlCiclo(relaciones, listaActual, iid)
        """------------------------------------------------"""

        #return dict(value=kw, model=self.model.__name__)
        return dict(value={'idItem1': iid},
                    model=self.model.__name__,
                    actual_options=listaActual,
                    anterior_options=listaAnterior)

    def controlCiclo(self, *args):
        relaciones = args[0]
        listaActual = args[1]
        iid = args[2]

        longRel = len(relaciones)

        for x in range(longRel):
            #relaciones[x][0] = idItem1
            #relaciones[x][1] = idItem2
            if int(iid) == int(relaciones[x][1]):
                longitud = len(listaActual)
                for y in range(longitud):
                    if listaActual[y][0] == relaciones[x][0]:
                        aux = listaActual[y]
                        self.controlCiclo(relaciones, listaActual,
                                          relaciones[x][0])
                        listaActual.remove(aux)
                        break

    @catch_errors(errors, error_handler=new)
    @expose()
    @registered_validate(error_handler=new)
    def post(self, *args, **kw):
        """Se crea un nuevo item"""
        itemeditado = DBSession.query(Item).filter_by(id=kw['idItem1']).first()
        itemnuevo = Item()
        itemnuevo.version = itemeditado.version + 1
        itemnuevo.idTipoDeItem = itemeditado.idTipoDeItem
        itemnuevo.idFase = itemeditado.idFase
        itemnuevo.idLineaBase = itemeditado.idLineaBase
        itemnuevo.fechaCreacion = itemeditado.fechaCreacion
        itemnuevo.nrohistorial = itemeditado.nrohistorial
        itemnuevo.ultimaversion = 1
        itemeditado.ultimaversion = 0
        itemnuevo.estado = 'modificado'
        itemnuevo.complejidad = itemeditado.complejidad
        itemnuevo.nombre = itemeditado.nombre
        DBSession.add(itemnuevo)
        DBSession.flush()
        """-------------------------"""
        """ Crea las nuevas relaciones"""

        kw['idItem1'] = itemnuevo.id
        """ Se crea las relaciones"""
        ids = kw['idItem2']
        longitud = len(kw['idItem2'])
        for indice in range(longitud):
            kw['idItem2'] = ids[indice]
            self.provider.create(self.model, params=kw)

        ids = kw['idItem2Anterior']
        longitud = len(kw['idItem2Anterior'])
        for indice in range(longitud):
            kw['idItem2'] = ids[indice]
            self.provider.create(self.model, params=kw)
        """Realiza copia de los valores de los atributos especificos"""

        atributoeditado = DBSession.query(DetalleItem).filter_by(
            iditem=itemeditado.id).all()

        for objeto in atributoeditado:
            nuevoDetalle = DetalleItem()
            nuevoDetalle.tipo = objeto.tipo
            nuevoDetalle.nombrecampo = objeto.nombrecampo
            nuevoDetalle.valor = objeto.valor
            nuevoDetalle.iditem = itemnuevo.id
            DBSession.add(nuevoDetalle)
        """Realiza copia de los adjuntos"""
        adjuntositemeditado = DBSession.query(Adjuntos).filter_by(
            idItem=itemeditado.id).all()

        for adj in adjuntositemeditado:
            itemnuevoadjunto = Adjuntos()
            itemnuevoadjunto.idItem = itemnuevo.id
            itemnuevoadjunto.filename = adj.filename
            itemnuevoadjunto.filecontent = adj.filecontent
            DBSession.add(itemnuevoadjunto)
        """Copia las relaciones """
        #itemnuevo=DBSession.query(Item.id).filter_by(nrohistorial=nuevo['nrohistorial'], ultimaversion=1).first()
        relaciones = DBSession.query(
            RelacionItem.idItem1, RelacionItem.idItem2).filter(
                (RelacionItem.idItem2 == itemeditado.id)
                | (RelacionItem.idItem1 == itemeditado.id)).all()

        longitud = len(relaciones)

        for x in range(longitud):
            newRelation = {}
            if int(itemeditado.id) == int(relaciones[x][0]):
                newRelation['idItem1'] = int(itemnuevo.id)
                newRelation['idItem2'] = relaciones[x][1]
                self.provider.create(RelacionItem, params=newRelation)
            elif int(itemeditado.id) == int(relaciones[x][1]):
                newRelation['idItem1'] = relaciones[x][0]
                newRelation['idItem2'] = int(itemnuevo.id)
                self.provider.create(RelacionItem, params=newRelation)

        raise redirect('./?iid=' + str(kw['idItem1']))

    @expose()
    @registered_validate(error_handler=edit)
    @catch_errors(errors, error_handler=edit)
    def put(self, *args, **kw):
        """update"""
        pks = self.provider.get_primary_fields(self.model)
        for i, pk in enumerate(pks):
            if pk not in kw and i < len(args):
                kw[pk] = args[i]

        self.provider.update(self.model, params=kw)
        redirect('../' * len(pks))

    @expose()
    def post_delete(self, *args, **kw):
        """This is the code that actually deletes the record"""
        pks = self.provider.get_primary_fields(self.model)
        d = {}
        for i, arg in enumerate(args):
            d[pks[i]] = arg
        self.provider.delete(self.model, d)
        redirect('./' + '../' * (len(pks) - 1))

    @expose('tgext.crud.templates.get_delete')
    def get_delete(self, *args, **kw):
        """This is the code that creates a confirm_delete page"""
        return dict(args=args)
Exemple #12
0
class CrudRestController(RestController):
    """
    :variables:

    session
      database session (drives drop-down menus

    menu_items
      Dictionary of links to other models in the form model_items[lower_model_name] = Model

    title
      Title to be used for each page.  default: Turbogears Admin System

    :modifiers:

    model
      Model this class is associated with

    table
      Widget for the table display

    table_filler
      Class instance with get_value() that defines the JSon stream for the table

    edit_form
      Form to be used for editing the model

    edit_filler
      Class instance with a get_value() that defines how we get information for a single
      existing record

    new_form
      Form that defines how we create a form for new data entry.

    :Attributes:

      menu_items
        Dictionary of associated Models (used for menu)
      provider
        sprox provider for data manipulation
      session
        link to the database
    """

    title = "Turbogears Admin System"

    def _before(self, *args, **kw):
        tmpl_context.title = self.title
        tmpl_context.menu_items = self.menu_items

    def __before__(self, *args, **kw):
        # this will be removed in 2.1.*
        tmpl_context.menu_items = self.menu_items
        tmpl_context.title = self.title

    def __init__(self, session, menu_items=None):
        if menu_items is None:
            menu_items = {}
        self.menu_items = menu_items
        self.provider = ProviderTypeSelector().get_selector(
            self.model).get_provider(self.model, hint=session)

        self.session = session

        #this makes crc declarative
        check_types = [
            'new_form', 'edit_form', 'table', 'table_filler', 'edit_filler'
        ]
        for type_ in check_types:
            if not hasattr(self, type_) and hasattr(self, type_ + '_type'):
                setattr(self, type_,
                        getattr(self, type_ + '_type')(self.session))

        if hasattr(self, 'new_form'):
            #register the validators since they are none from the parent class
            register_validators(self, 'post', self.new_form)
        if hasattr(self, 'edit_form'):
            register_validators(self, 'put', self.edit_form)

    @with_trailing_slash
    @expose('tgext.crud.templates.get_all')
    @expose('json')
    @paginate('value_list', items_per_page=7)
    def get_all(self, *args, **kw):
        """Return all records.
           Pagination is done by offset/limit in the filler method.
           Returns an HTML page with the records if not json.
        """
        if pylons.request.response_type == 'application/json':
            return self.table_filler.get_value(**kw)

        if not getattr(self.table.__class__, '__retrieves_own_value__', False):
            values = self.table_filler.get_value(**kw)
        else:
            values = []

        longitud = len(values)
        for fila in range(longitud):
            complejidad = int(values[fila]['complejidad'])
            values[fila]['idFase'] = DBSession.query(
                Fase.nombre).filter_by(id=values[fila]['idFase']).first()
            lineabase = values[fila]['idLineaBase']

            if lineabase != 'None':
                values[fila]['idLineaBase'] = DBSession.query(LineaBase.nombre)\
                                                .filter_by(id=lineabase).first()
            else:
                values[fila]['idLineaBase'] = 'Sin linea base'

            if (complejidad == 1):
                values[fila]['complejidad'] = 'Muy baja (1)'
            elif (complejidad == 2):
                values[fila]['complejidad'] = 'Baja (2)'
            elif (complejidad == 3):
                values[fila]['complejidad'] = 'Media (3)'
            elif (complejidad == 4):
                values[fila]['complejidad'] = 'Alta (4)'
            else:
                values[fila]['complejidad'] = 'Muy alta (5)'

        tmpl_context.widget = self.table

        return dict(model=self.model.__name__, value_list=values)

    @expose('tgext.crud.templates.get_one')
    @expose('json')
    def get_one(self, *args, **kw):
        """get one record, returns HTML or json"""
        #this would probably only be realized as a json stream
        tmpl_context.widget = self.edit_form
        pks = self.provider.get_primary_fields(self.model)
        kw = {}
        for i, pk in enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        return dict(value=value, model=self.model.__name__)

    @expose('tgext.crud.templates.edit')
    def edit(self, *args, **kw):
        """este codigo es ejecutado cuando se revierte un item """

        pks = self.provider.get_primary_fields(self.model)

        kw = {}
        for i, pk in enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        """-----------Se obtiene el item a revertir -------------"""
        item = DBSession.query(Item).filter_by(id=kw['id']).first()
        """------------------------------------------------------"""
        """------obtine el numero de la mayor version del item---"""
        versionmayor = DBSession.query(Item.version).filter_by(
            nrohistorial=item.nrohistorial, ultimaversion=1).first()
        """------------------------------------------------------"""
        """ ---el item con la version mayor, cambia su ultimaversion a cero --- """
        item3 = DBSession.query(Item).filter_by(nrohistorial=item.nrohistorial,
                                                ultimaversion=1).first()
        log.debug('item3= %s' % item3)
        item3.ultimaversion = 0

        log.debug("versionmayor= %s" % versionmayor[0])

        item2 = Item()
        item2.nombre = item.nombre
        item2.idTipoDeItem = item.idTipoDeItem
        item2.idFase = item.idFase
        item2.idLineaBase = item.idLineaBase
        """el item a revertir aumenta su version a la ultima y el
        el item con la ultima version, "ultima version" pasa a 0 """
        item2.version = versionmayor[0] + 1
        item2.ultimaversion = 1
        item2.estado = item.estado
        item2.complejidad = item.complejidad
        item2.fechaCreacion = item.fechaCreacion
        item2.nrohistorial = item.nrohistorial
        DBSession.add(item2)
        """Realiza copia de los valores de los atributos especificos"""

        atributoeditado = DBSession.query(DetalleItem).filter_by(
            iditem=item.id).all()

        for objeto in atributoeditado:
            nuevoDetalle = DetalleItem()
            nuevoDetalle.tipo = objeto.tipo
            nuevoDetalle.nombrecampo = objeto.nombrecampo
            nuevoDetalle.valor = objeto.valor
            nuevoDetalle.iditem = item2.id  #el ID del nuevo item
            DBSession.add(nuevoDetalle)
        """Realiza copia de los adjuntos"""
        adjuntositemeditado = DBSession.query(Adjuntos).filter_by(
            idItem=item.id).all()

        for adj in adjuntositemeditado:

            log.debug("adj: %s" % adj)
            itemnuevoadjunto = Adjuntos()
            itemnuevoadjunto.idItem = item2.id
            itemnuevoadjunto.filename = adj.filename
            itemnuevoadjunto.filecontent = adj.filecontent
            DBSession.add(itemnuevoadjunto)
        """Copia las relaciones """
        relaciones = DBSession.query(
            RelacionItem.idItem1,
            RelacionItem.idItem2).filter((RelacionItem.idItem2 == item.id) | (
                RelacionItem.idItem1 == item.id)).all()
        longitud = len(relaciones)

        for x in range(longitud):
            newRelation = RelacionItem()

            if int(item.id) == int(relaciones[x][0]):
                newRelation.idItem1 = int(item2.id)
                newRelation.idItem2 = relaciones[x][1]
                DBSession.add(newRelation)
                #self.provider.create(RelacionItem, params=newRelation)
            elif int(item.id) == int(relaciones[x][1]):
                newRelation.idItem1 = relaciones[x][0]
                newRelation.idItem2 = int(item2.id)
                DBSession.add(newRelation)

        redirect('../' + '../item/?fid=' + str(item.idFase))

    @without_trailing_slash
    @expose('tgext.crud.templates.new')
    def new(self, *args, **kw):
        """Display a page to show a new record."""
        tmpl_context.widget = self.new_form
        return dict(value=kw, model=self.model.__name__)

    @catch_errors(errors, error_handler=new)
    @expose()
    @registered_validate(error_handler=new)
    def post(self, *args, **kw):
        self.provider.create(self.model, params=kw)
        #########
        #if len(kw['idproyec']) > 0:
        #   raise redirect('./?pid='+kw['idproyec'])
        #else:
        #    if len(kw['idFase']) > 0:
        #        raise redirect('./?fid='+kw['idFase'])
        #    else:
        #        raise redirect('./')
        #########
        raise redirect('./')

    @expose()
    @registered_validate(error_handler=edit)
    @catch_errors(errors, error_handler=edit)
    def put(self, *args, **kw):
        """update"""
        pks = self.provider.get_primary_fields(self.model)
        for i, pk in enumerate(pks):
            if pk not in kw and i < len(args):
                kw[pk] = args[i]

        self.provider.update(self.model, params=kw)
        redirect('../' * len(pks))

    @expose()
    def post_delete(self, *args, **kw):
        """This is the code that actually deletes the record"""
        pks = self.provider.get_primary_fields(self.model)
        d = {}
        for i, arg in enumerate(args):
            d[pks[i]] = arg
        self.provider.delete(self.model, d)
        redirect('./' + '../' * (len(pks) - 1))

    @expose('tgext.crud.templates.get_delete')
    def get_delete(self, *args, **kw):
        """This is the code that creates a confirm_delete page"""
        return dict(args=args)
Exemple #13
0
class CrudRestController(RestController):
    """
    :variables:

    session
      database session (drives drop-down menus

    menu_items
      Dictionary of links to other models in the form model_items[lower_model_name] = Model

    title
      Title to be used for each page.  default: Turbogears Admin System

    :modifiers:

    model
      Model this class is associated with

    table
      Widget for the table display

    table_filler
      Class instance with get_value() that defines the JSon stream for the table

    edit_form
      Form to be used for editing the model

    edit_filler
      Class instance with a get_value() that defines how we get information for a single
      existing record

    new_form
      Form that defines how we create a form for new data entry.

    :Attributes:

      menu_items
        Dictionary of associated Models (used for menu)
      provider
        sprox provider for data manipulation
      session
        link to the database
    """

    title = "Turbogears Admin System"

    def _before(self, *args, **kw):
        tmpl_context.title = self.title
        tmpl_context.menu_items = self.menu_items

    def __before__(self, *args, **kw):
        # this will be removed in 2.1.*
        tmpl_context.menu_items = self.menu_items
        tmpl_context.title = self.title

    def __init__(self, session, menu_items=None):
        if menu_items is None:
            menu_items = {}
        self.menu_items = menu_items
        self.provider = ProviderTypeSelector().get_selector(self.model).get_provider(self.model, hint=session)

        self.session = session

        #this makes crc declarative
        check_types = ['new_form', 'edit_form', 'table', 'table_filler', 'edit_filler']
        for type_ in check_types:
            if not hasattr(self, type_) and hasattr(self, type_+'_type'):
                setattr(self, type_, getattr(self, type_+'_type')(self.session))

        if hasattr(self, 'new_form'):
            #register the validators since they are none from the parent class
            register_validators(self, 'post', self.new_form)
        if hasattr(self, 'edit_form'):
            register_validators(self, 'put', self.edit_form)

    @with_trailing_slash
    @expose('tgext.crud.templates.get_all')
    @expose('json')
    @paginate('value_list', items_per_page=7)
    def get_all(self, *args, **kw):
        """Return all records.
           Pagination is done by offset/limit in the filler method.
           Returns an HTML page with the records if not json.
        """
        if pylons.request.response_type == 'application/json':
            return self.table_filler.get_value(**kw)

        if not getattr(self.table.__class__, '__retrieves_own_value__', False):
            values = self.table_filler.get_value(**kw)
        else:
            values = []
            
        for value in values:
            value['idFase'] = DBSession.query(Fase.nombre).filter_by(id=value['idFase']).first()

        tmpl_context.widget = self.table
        return dict(model=self.model.__name__, value_list=values)

    @expose('tgext.crud.templates.get_one')
    @expose('json')
    def get_one(self, *args, **kw):
        """get one record, returns HTML or json"""
        #this would probably only be realized as a json stream
        tmpl_context.widget = self.edit_form
        pks = self.provider.get_primary_fields(self.model)
        kw = {}
        for i, pk in  enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        return dict(value=value,model=self.model.__name__)

    @expose('sap.templates.configurar.tipodeitem.edit')
    def edit(self, *args, **kw):
        """Display a page to edit the record."""
        tmpl_context.widget = self.edit_form
        #pks = self.provider.get_primary_fields(self.model)

        ###########################################
        pks = self.provider.get_primary_fields(self.model)
        
        ###########################################
        kw = {}
        for i, pk in  enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        value['_method'] = 'PUT'
        return dict(value=value, model=self.model.__name__, pk_count=len(pks))

    @without_trailing_slash
    @expose('sap.templates.configurar.tipodeitem.new')
    def new(self,fid=None,*args, **kw):
        """Display a page to show a new record."""
        tmpl_context.widget = self.new_form
        
        #return dict(value=kw, model=self.model.__name__)
        return dict(value={'idFase':fid}, model=self.model.__name__)
        

    @catch_errors(errors, error_handler=new)
    @expose()
    @registered_validate(error_handler=new)
    def post(self, *args, **kw):
        
        
        if kw['nombre']==None:
            flash("El tipo de item debe tener un nombre" , "error")
            redirect('/tipodeitem/new/?fid='+ str(kw['idFase']))
        
        
        nombreduplicado=DBSession.query(TipoDeItem.nombre).filter((TipoDeItem.idFase==kw['idFase']) &(TipoDeItem.nombre==kw['nombre'])).first()
        
        if nombreduplicado != None :
            flash("Ya existe \"Tipo de Item\" con el mismo nombre" , "error")
            redirect('/tipodeitem/new/?fid='+ str(kw['idFase']))
        
        idtipo=self.provider.create(self.model, params=kw)
   
        
        raise redirect("/campos/?tid="+str(idtipo.id))
    
    
    @expose()
    @registered_validate(error_handler=edit)
    @catch_errors(errors, error_handler=edit)
    def put(self, *args, **kw):
        """update"""
        pks = self.provider.get_primary_fields(self.model)
        for i, pk in enumerate(pks):
            if pk not in kw and i < len(args):
                kw[pk] = args[i]

        self.provider.update(self.model, params=kw)
        
        
        fasedeltipo= DBSession.query(TipoDeItem.idFase).filter_by(id=kw[pk]).first()
        log.debug('fasedeltipo: %s' %fasedeltipo)
        
        redirect('../?fid='+str(fasedeltipo[0]))

    @expose()
    def post_delete(self, *args, **kw):
        """This is the code that actually deletes the record"""
        pks = self.provider.get_primary_fields(self.model)
        d = {}
        for i, arg in enumerate(args):
            d[pks[i]] = arg
        
        
        #log.debug("ValorD: %s" %d['id'])
        idfase= DBSession.query(TipoDeItem.idFase).filter_by(id=d['id']).first()
        self.provider.delete(self.model, d)
        
        log.debug("ValorIdFase: %s" %idfase[0])
        
        redirect('/tipodeitem/?fid='+ str(idfase[0]))
        
        #raise redirect("/campos/?tid="+str(idtipo[0]))
        #redirect('../' + '../?fid=' + d['idFase'])
        
        #redirect('../' + '../?pid='+ d['idProyecto'])
        

    @expose('tgext.crud.templates.get_delete')
    def get_delete(self, *args, **kw):
        """This is the code that creates a confirm_delete page"""
        return dict(args=args)
Exemple #14
0
 def setup(self):
     self.type_selector = ProviderTypeSelector()
Exemple #15
0
class CrudRestController(RestController):
    """
    :variables:

    session
      database session (drives drop-down menus

    menu_items
      Dictionary of links to other models in the form model_items[lower_model_name] = Model

    title
      Title to be used for each page.  default: Turbogears Admin System

    :modifiers:

    model
      Model this class is associated with

    table
      Widget for the table display

    table_filler
      Class instance with get_value() that defines the JSon stream for the table

    edit_form
      Form to be used for editing the model

    edit_filler
      Class instance with a get_value() that defines how we get information for a single
      existing record

    new_form
      Form that defines how we create a form for new data entry.

    :Attributes:

      menu_items
        Dictionary of associated Models (used for menu)
      provider
        sprox provider for data manipulation
      session
        link to the database
    """

    title = "Turbogears Admin System"

    def _before(self, *args, **kw):
        tmpl_context.title = self.title
        tmpl_context.menu_items = self.menu_items

    def __before__(self, *args, **kw):
        # this will be removed in 2.1.*
        tmpl_context.menu_items = self.menu_items
        tmpl_context.title = self.title

    def __init__(self, session, menu_items=None):
        if menu_items is None:
            menu_items = {}
        self.menu_items = menu_items
        self.provider = ProviderTypeSelector().get_selector(self.model).get_provider(self.model, hint=session)

        self.session = session

        #this makes crc declarative
        check_types = ['new_form', 'edit_form', 'table', 'table_filler', 'edit_filler']
        for type_ in check_types:
            if not hasattr(self, type_) and hasattr(self, type_+'_type'):
                setattr(self, type_, getattr(self, type_+'_type')(self.session))

        if hasattr(self, 'new_form'):
            #register the validators since they are none from the parent class
            register_validators(self, 'post', self.new_form)
        if hasattr(self, 'edit_form'):
            register_validators(self, 'put', self.edit_form)

    @with_trailing_slash
    @expose('sap.templates.desarrollar.relacionitem.get_all')
    @expose('json')
    @paginate('value_list', items_per_page=7)
    def get_all(self, *args, **kw):
        """Return all records.
           Pagination is done by offset/limit in the filler method.
           Returns an HTML page with the records if not json.
        """

        if pylons.request.response_type == 'application/json':
            return self.table_filler.get_value(**kw)

        if not getattr(self.table.__class__, '__retrieves_own_value__', False):
            values = self.table_filler.get_value(**kw)
        else:
            values = []

        longitud=len(values)
        for fila in range(longitud):
            values[fila]['idItem1'] = DBSession.query(Item.nombre).filter_by(id = values[fila]['idItem1']).one()
            values[fila]['idItem2'] = DBSession.query(Item.nombre).filter_by(id = values[fila]['idItem2']).one()

        tmpl_context.widget = self.table
        return dict(model=self.model.__name__, value_list=values)

    @expose('tgext.crud.templates.get_one')
    @expose('json')
    def get_one(self, *args, **kw):
        """get one record, returns HTML or json"""
        #this would probably only be realized as a json stream
        tmpl_context.widget = self.edit_form
        pks = self.provider.get_primary_fields(self.model)
        kw = {}
        for i, pk in  enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        return dict(value=value,model=self.model.__name__)

    @expose('tgext.crud.templates.edit')
    def edit(self, *args, **kw):
        """Display a page to edit the record."""
        tmpl_context.widget = self.edit_form
        #pks = self.provider.get_primary_fields(self.model)

        ###########################################
        pks = self.provider.get_primary_fields(self.model)
        
        ###########################################
        kw = {}
        for i, pk in  enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        value['_method'] = 'PUT'
        return dict(value=value, model=self.model.__name__, pk_count=len(pks))

    @without_trailing_slash
    @expose('sap.templates.desarrollar.relacionitem.new')
    def new(self, iid=None, *args, **kw):
        """Display a page to show a new record."""
        tmpl_context.widget = self.new_form
        
        """Fase a la cual pertenece el item que se quiere relacionar"""
        faseActual = DBSession.query(Item.idFase).filter_by(id = iid).one()
        """Proyecto al cual pertenece la fase que hallamos en la linea anterior"""
        proyecto = DBSession.query(Fase.idproyec).filter_by(id = faseActual).one()
        
        listalineabase = DBSession.query(LineaBase).filter_by(idFase = faseActual).all()
        desarrollo = True
        longitud = len(listalineabase)
        
        for x in range (longitud):
            if str(listalineabase[x].estado).__eq__('cerrada'):
                desarrollo = False
                
        if desarrollo & longitud > 0:
            fase = DBSession.query(Fase).filter_by(id = Item.idFase).first()
            fase.estado = 'desarrollo'
            allFaseSgte = DBSession.query(Fase).filter((Fase.idproyec == proyecto) & (Fase.id > faseActual)).all()
            longFaseSgte = len(allFaseSgte)
            
            if (longFaseSgte > 0):
                allFaseSgte[0].estado = 'desarrollo'
                lineabasesgte = DBSession.query(LineaBase).filter_by(idFase=allFaseSgte[0].id).all()
                
                for x in range (len(lineabasesgte)):
                    if str(lineabasesgte[x].estado).__eq__('cerrada'):
                        lineabasesgte[x].estado = 'comprometida'
                        
                        itemlbsgte = DBSession.query(Item).filter_by(idLineaBase=lineabasesgte[x].id, ultimaversion=1).all()
                        for y in range (len(itemlbsgte)):
                            itemlbsgte[y].estado = 'revision'
                

        """Proyecto al cual pertenece la fase que hallamos en la linea anterior"""
        proyecto = DBSession.query(Fase.idproyec).filter_by(id = faseActual).one()

        """Todas las fases que pertenecen al proyecto en cuestion"""
        allFase = DBSession.query(Fase).filter((Fase.idproyec == proyecto) & (Fase.id < faseActual)).all()
        longFase = len(allFase)
        
        """Todos los item de la fase actual"""
        listaActual = DBSession.query(Item.id, Item.nombre).\
                    filter_by(idFase=faseActual, ultimaversion=1).all()
        
        """Todas las relaciones existentes"""
        relaciones = DBSession.query(RelacionItem.idItem1, RelacionItem.idItem2).all()
        longRel = len(relaciones)
        
        #La fase inmediatamente inferior es la fase anterior
        listaAnterior=[]
        #Se comprueba que exista una fase anterior
        if (longFase > 0):
            listaAnterior = DBSession.query(Item.id, Item.nombre).\
            filter((Item.idFase==allFase[longFase-1].id) & (Item.ultimaversion==1)\
                   & (Item.idLineaBase != None) & (Item.estado.__eq__('aprobado'))).all()
        log.debug(listaAnterior)

        #Eliminar los item ya relacionados de la lista de fase anterior
        for x in range(longRel):
            #relaciones[x][0] = idItem1
            #relaciones[x][1] = idItem2
            longitud = len(listaAnterior)
            if iid.__eq__("%s" %relaciones[x][0]):
                for y in range(longitud):
                    if listaAnterior[y][0] == relaciones[x][1]:
                        listaAnterior.remove(listaAnterior[y])
                        break
            elif iid.__eq__("%s" %relaciones[x][1]):
                for y in range(longitud):
                    if listaAnterior[y][0] == relaciones[x][0]:
                        listaAnterior.remove(listaAnterior[y])
                        break
        """-----------------------------------------------"""
        
        """-------------------FASE ACTUAL-------------------"""
        #Eliminar el item que se quiere relacionar de la lista de fase actual
        longitud = len(listaActual)
        for x in range(longitud):
            if iid.__eq__("%s" %listaActual[x][0]):
                listaActual.remove(listaActual[x])
                break
        
        #Eliminar los item ya relacionados de la lista de fase actual
        for x in range(longRel):
            #relaciones[x][0] = idItem1
            #relaciones[x][1] = idItem2
            longitud = len(listaActual)
            if iid.__eq__("%s" %relaciones[x][0]):
                for y in range(longitud):
                    if listaActual[y][0] == relaciones[x][1]:
                        listaActual.remove(listaActual[y])
                        break

        self.controlCiclo (relaciones, listaActual, iid)

        
        """------------------------------------------------"""
        
        #return dict(value=kw, model=self.model.__name__)
        return dict(value={'idItem1':iid},
                    model=self.model.__name__,
                    actual_options=listaActual,
                    anterior_options=listaAnterior)

    def controlCiclo (self, *args):
        relaciones = args[0]
        listaActual = args[1]
        iid = args[2]
        
        longRel = len(relaciones)
        
        for x in range(longRel):
            #relaciones[x][0] = idItem1
            #relaciones[x][1] = idItem2
            if int(iid) == int(relaciones[x][1]):
                longitud = len(listaActual)
                for y in range(longitud):
                    if listaActual[y][0] == relaciones[x][0]:
                        aux = listaActual[y]
                        self.controlCiclo(relaciones, listaActual, relaciones[x][0])
                        listaActual.remove(aux)
                        break


    @catch_errors(errors, error_handler=new)
    @expose()
    @registered_validate(error_handler=new)
    def post(self, *args, **kw):
        
  
        """Se crea un nuevo item"""
        itemeditado=DBSession.query(Item).filter_by(id=kw['idItem1']).first()
        itemnuevo=Item()
        itemnuevo.version=itemeditado.version + 1
        itemnuevo.idTipoDeItem=itemeditado.idTipoDeItem
        itemnuevo.idFase=itemeditado.idFase
        itemnuevo.idLineaBase=itemeditado.idLineaBase
        itemnuevo.fechaCreacion=itemeditado.fechaCreacion
        itemnuevo.nrohistorial=itemeditado.nrohistorial
        itemnuevo.ultimaversion=1
        itemeditado.ultimaversion=0
        itemnuevo.estado='modificado'
        itemnuevo.complejidad=itemeditado.complejidad
        itemnuevo.nombre=itemeditado.nombre
        DBSession.add(itemnuevo)
        DBSession.flush()
        
        """-------------------------"""
        
        
        """ Crea las nuevas relaciones"""
        
        kw['idItem1']=itemnuevo.id
        """ Se crea las relaciones"""
        ids=kw['idItem2']
        longitud=len(kw['idItem2'])
        for indice in range(longitud):
            kw['idItem2']=ids[indice] 
            self.provider.create(self.model, params=kw)
            
        ids=kw['idItem2Anterior']
        longitud=len(kw['idItem2Anterior'])
        for indice in range(longitud):
            kw['idItem2']=ids[indice] 
            self.provider.create(self.model, params=kw)
    
        
        """Realiza copia de los valores de los atributos especificos"""
            
        atributoeditado=DBSession.query(DetalleItem).filter_by(iditem=itemeditado.id).all()
            
        for objeto in atributoeditado:
            nuevoDetalle=DetalleItem()
            nuevoDetalle.tipo=objeto.tipo
            nuevoDetalle.nombrecampo=objeto.nombrecampo
            nuevoDetalle.valor=objeto.valor
            nuevoDetalle.iditem=itemnuevo.id
            DBSession.add(nuevoDetalle)
                
        """Realiza copia de los adjuntos"""
        adjuntositemeditado=DBSession.query(Adjuntos).filter_by(idItem=itemeditado.id).all()
        
        for adj in adjuntositemeditado:
            itemnuevoadjunto=Adjuntos()
            itemnuevoadjunto.idItem=itemnuevo.id
            itemnuevoadjunto.filename=adj.filename
            itemnuevoadjunto.filecontent=adj.filecontent
            DBSession.add(itemnuevoadjunto)
        
        
        """Copia las relaciones """
        #itemnuevo=DBSession.query(Item.id).filter_by(nrohistorial=nuevo['nrohistorial'], ultimaversion=1).first()
        relaciones = DBSession.query(RelacionItem.idItem1,RelacionItem.idItem2).filter((RelacionItem.idItem2==itemeditado.id) | (RelacionItem.idItem1==itemeditado.id)).all()
        
        longitud = len(relaciones)
        
        
        for x in range(longitud):
            newRelation = {}
            if int(itemeditado.id) == int(relaciones[x][0]):
                newRelation['idItem1']=int(itemnuevo.id)
                newRelation['idItem2']=relaciones[x][1]
                self.provider.create(RelacionItem, params=newRelation)
            elif int(itemeditado.id) == int(relaciones[x][1]):
                newRelation['idItem1']=relaciones[x][0]
                newRelation['idItem2']=int(itemnuevo.id)
                self.provider.create(RelacionItem, params=newRelation)
        
        
        raise redirect('./?iid='+str(kw['idItem1']))
    @expose()
    @registered_validate(error_handler=edit)
    @catch_errors(errors, error_handler=edit)
    
    def put(self, *args, **kw):
        """update"""
        pks = self.provider.get_primary_fields(self.model)
        for i, pk in enumerate(pks):
            if pk not in kw and i < len(args):
                kw[pk] = args[i]

        self.provider.update(self.model, params=kw)
        redirect('../' * len(pks))

    @expose()
    def post_delete(self, *args, **kw):
        """This is the code that actually deletes the record"""
        pks = self.provider.get_primary_fields(self.model)
        d = {}
        for i, arg in enumerate(args):
            d[pks[i]] = arg
        self.provider.delete(self.model, d)
        redirect('./' + '../' * (len(pks) - 1))

    @expose('tgext.crud.templates.get_delete')
    def get_delete(self, *args, **kw):
        """This is the code that creates a confirm_delete page"""
        return dict(args=args)
Exemple #16
0
class CrudRestController(RestController):
    """
    :variables:

    session
      database session (drives drop-down menus

    menu_items
      Dictionary of links to other models in the form model_items[lower_model_name] = Model

    title
      Title to be used for each page.  default: Turbogears Admin System

    :modifiers:

    model
      Model this class is associated with

    table
      Widget for the table display

    table_filler
      Class instance with get_value() that defines the JSon stream for the table

    edit_form
      Form to be used for editing the model

    edit_filler
      Class instance with a get_value() that defines how we get information for a single
      existing record

    new_form
      Form that defines how we create a form for new data entry.

    :Attributes:

      menu_items
        Dictionary of associated Models (used for menu)
      provider
        sprox provider for data manipulation
      session
        link to the database
    """

    title = "Turbogears Admin System"

    def _before(self, *args, **kw):
        tmpl_context.title = self.title
        tmpl_context.menu_items = self.menu_items

    def __before__(self, *args, **kw):
        # this will be removed in 2.1.*
        tmpl_context.menu_items = self.menu_items
        tmpl_context.title = self.title

    def __init__(self, session, menu_items=None):
        if menu_items is None:
            menu_items = {}
        self.menu_items = menu_items
        self.provider = ProviderTypeSelector().get_selector(self.model).get_provider(self.model, hint=session)

        self.session = session

        #this makes crc declarative
        check_types = ['new_form', 'edit_form', 'table', 'table_filler', 'edit_filler']
        for type_ in check_types:
            if not hasattr(self, type_) and hasattr(self, type_+'_type'):
                setattr(self, type_, getattr(self, type_+'_type')(self.session))

        if hasattr(self, 'new_form'):
            #register the validators since they are none from the parent class
            register_validators(self, 'post', self.new_form)
        if hasattr(self, 'edit_form'):
            register_validators(self, 'put', self.edit_form)

    @with_trailing_slash
    @expose('tgext.crud.templates.get_all')
    @expose('json')
    @paginate('value_list', items_per_page=7)
    def get_all(self, *args, **kw):
        """Return all records.
           Pagination is done by offset/limit in the filler method.
           Returns an HTML page with the records if not json.
        """
        if pylons.request.response_type == 'application/json':
            return self.table_filler.get_value(**kw)

        if not getattr(self.table.__class__, '__retrieves_own_value__', False):
            values = self.table_filler.get_value(**kw)
        else:
            values = []

        tmpl_context.widget = self.table
        return dict(model=self.model.__name__, value_list=values)

    @expose('tgext.crud.templates.get_one')
    @expose('json')
    def get_one(self, *args, **kw):
        """get one record, returns HTML or json"""
        #this would probably only be realized as a json stream
        tmpl_context.widget = self.edit_form
        pks = self.provider.get_primary_fields(self.model)
        kw = {}
        for i, pk in  enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        return dict(value=value,model=self.model.__name__)

    @expose('tgext.crud.templates.edit')
    def edit(self, *args, **kw):
        """Display a page to edit the record."""
        tmpl_context.widget = self.edit_form
        #pks = self.provider.get_primary_fields(self.model)
        
        log.debug("soyRomperLB= %s" %kw)

        ###########################################
        pks = self.provider.get_primary_fields(self.model)
        
        ###########################################
        kw = {}
        for i, pk in  enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        value['_method'] = 'PUT'
        return dict(value=value, model=self.model.__name__, pk_count=len(pks))
    
    
    

    @without_trailing_slash
    @expose('sap.templates.desarrollar.lineabase.new')
    #@expose('tgext.crud.templates.new')
    def new(self,fid=None, *args, **kw):
        """Display a page to show a new record."""
        tmpl_context.widget = self.new_form
        #return dict(value=kw, model=self.model.__name__)
        """obtiene los id y nombre de los items, de la fase actual """
        #items = [x for x in (DBSession.query(Item.id, Item.nombre).filter_by(idFase=fid))]
        itemfaseactual= [x for x in DBSession.query(Item.id, Item.nombre).filter_by(idFase=fid, idLineaBase=None, estado='aprobado', ultimaversion=1).all()]
        #return dict(value={'idFase':fid}, model=self.model.__name__, item_options=items)
        longitud=len(itemfaseactual)
        
        if (longitud == 0):
            flash("No existen items aprobados en la fase actual", "error")
            redirect('../?fid='+fid)
        else:
            return dict(value={'idFase':fid}, model=self.model.__name__, items_options=itemfaseactual)
        
        
    

    @catch_errors(errors, error_handler=new)
    @expose()
    @registered_validate(error_handler=new)
    def post(self, *args, **kw):
        ids=kw['items']
        longitud = len(ids)
        
        items = DBSession.query(Item).filter_by(idFase=kw['idFase'], ultimaversion=1).all()
        
        if (longitud > 0):
            fase = DBSession.query(Fase).filter_by(id=kw['idFase']).first()
 
            if longitud == len(items):
                fase.estado = 'lineaBaseTotal'
            else:
                fase.estado = 'lineaBaseParcial'
                
            lineabase = self.provider.create(self.model, params=kw)
            
            for indice in range(longitud):
                item = DBSession.query(Item).filter_by(id=ids[indice]).first()
                item.idLineaBase = lineabase.id

            raise redirect('./?fid='+kw['idFase'])
        else:
            flash("No ha seleccionado ningun item", "error")
            raise redirect('./new/?fid='+kw['idFase'])  
            
        
    @expose()
    @registered_validate(error_handler=edit)
    @catch_errors(errors, error_handler=edit)
    def put(self, *args, **kw):
        """update"""
        pks = self.provider.get_primary_fields(self.model)
        for i, pk in enumerate(pks):
            if pk not in kw and i < len(args):
                kw[pk] = args[i]
        
        log.debug('putLineaBase= %s' %kw)
        #lineabase/?fid=21
        
        self.provider.update(self.model, params=kw)
        redirect('../' + '../lineabase/?fid=' + str(kw['idFase']))

    @expose()
    def post_delete(self, *args, **kw):
        """This is the code that actually deletes the record"""
        pks = self.provider.get_primary_fields(self.model)
        d = {}
        
        for i, arg in enumerate(args):
            d[pks[i]] = arg
            
            
        """extraer el idFase para poder retornar en el estado anterior """
        idfase= DBSession.query(LineaBase.idFase).filter_by(id=d['id']).first()
        
        self.provider.delete(self.model, d)
        
        
        
        redirect('/lineabase/?fid='+str(idfase[0]))

    @expose('tgext.crud.templates.get_delete')
    def get_delete(self, *args, **kw):
        """This is the code that creates a confirm_delete page"""
        return dict(args=args)
 def setup(self):
     self.type_selector = ProviderTypeSelector()
Exemple #18
0
class CrudRestController(RestController):
    """
    :variables:

    session
      database session (drives drop-down menus

    menu_items
      Dictionary of links to other models in the form model_items[lower_model_name] = Model

    title
      Title to be used for each page.  default: Turbogears Admin System

    :modifiers:

    model
      Model this class is associated with

    table
      Widget for the table display

    table_filler
      Class instance with get_value() that defines the JSon stream for the table

    edit_form
      Form to be used for editing the model

    edit_filler
      Class instance with a get_value() that defines how we get information for a single
      existing record

    new_form
      Form that defines how we create a form for new data entry.

    :Attributes:

      menu_items
        Dictionary of associated Models (used for menu)
      provider
        sprox provider for data manipulation
      session
        link to the database
    """

    title = "Turbogears Admin System"

    def _before(self, *args, **kw):
        tmpl_context.title = self.title
        tmpl_context.menu_items = self.menu_items

    def __before__(self, *args, **kw):
        # this will be removed in 2.1.*
        tmpl_context.menu_items = self.menu_items
        tmpl_context.title = self.title

    def __init__(self, session, menu_items=None):
        if menu_items is None:
            menu_items = {}
        self.menu_items = menu_items
        self.provider = ProviderTypeSelector().get_selector(self.model).get_provider(self.model, hint=session)

        self.session = session

        #this makes crc declarative
        check_types = ['new_form', 'edit_form', 'table', 'table_filler', 'edit_filler']
        for type_ in check_types:
            if not hasattr(self, type_) and hasattr(self, type_+'_type'):
                setattr(self, type_, getattr(self, type_+'_type')(self.session))

        if hasattr(self, 'new_form'):
            #register the validators since they are none from the parent class
            register_validators(self, 'post', self.new_form)
        if hasattr(self, 'edit_form'):
            register_validators(self, 'put', self.edit_form)

    @with_trailing_slash
    @expose('tgext.crud.templates.get_all')
    @expose('json')
    @paginate('value_list', items_per_page=7)
    def get_all(self, *args, **kw):
        """Return all records.
           Pagination is done by offset/limit in the filler method.
           Returns an HTML page with the records if not json.
        """
        if pylons.request.response_type == 'application/json':
            return self.table_filler.get_value(**kw)

        if not getattr(self.table.__class__, '__retrieves_own_value__', False):
            values = self.table_filler.get_value(**kw)
        else:
            values = []

        tmpl_context.widget = self.table
        return dict(model=self.model.__name__, value_list=values)

    @expose('tgext.crud.templates.get_one')
    @expose('json')
    def get_one(self, *args, **kw):
        """get one record, returns HTML or json"""
        #this would probably only be realized as a json stream
        tmpl_context.widget = self.edit_form
        pks = self.provider.get_primary_fields(self.model)
        kw = {}
        for i, pk in  enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        return dict(value=value,model=self.model.__name__)

    @expose('tgext.crud.templates.edit')
    def edit(self, *args, **kw):
        """Display a page to edit the record."""
        tmpl_context.widget = self.edit_form
        #pks = self.provider.get_primary_fields(self.model)

        ###########################################
        pks = self.provider.get_primary_fields(self.model)
        
        ###########################################
        kw = {}
        for i, pk in  enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        value['_method'] = 'PUT'
        return dict(value=value, model=self.model.__name__, pk_count=len(pks))

    @without_trailing_slash
    @expose('sap.templates.desarrollar.adjuntos.new')
    def new(self,iid=None ,*args, **kw):
        
        """Aqui entra solo para mostrar la vista y para guardar, el descargar
        borrar esta implementado en root"""
        
        
        log.debug('iid: %s' %iid)
        log.debug('adjuntos: %s' %kw)
        longitud=len(kw)
        log.debug('longitud: %s' %longitud)
        if longitud==0:
            #current_files = DBSession.query(Adjuntos).all()
            current_files = DBSession.query(Adjuntos).filter_by(idItem=iid).all()
            
            return dict(current_files=current_files, model=self.model.__name__,iid=iid)
        else:
            if iid=="save":
                iid=kw['idItem']
                
            
            
            idItem=kw['idItem']
            userfile=kw['userfile']
            log.debug('idItem: %s' %idItem)
            if userfile=='':
                flash("No ha selecionado ningun archivo", "error")
                redirect("../new/?iid="+str(iid))
            """
            forbidden_files = [".js", ".htm", ".html"]
            for forbidden_file in forbidden_files:
                if userfile.filename.find(forbidden_file) != -1:
                    return redirect("../adjuntos/new")
            filecontent = userfile.file.read()
            new_file = Adjuntos(filename=userfile.filename, filecontent=filecontent,idItem=idItem )
            DBSession.add(new_file)
            DBSession.flush()
            """
            """Realiza una copia del item cuando se adjunta un archivo y aumenta su version"""
            itemeditado= DBSession.query(Item).filter_by(id=idItem).first()
            itemnuevo=Item()
            itemnuevo.version=itemeditado.version + 1
            itemnuevo.idTipoDeItem=itemeditado.idTipoDeItem
            itemnuevo.idFase=itemeditado.idFase
            itemnuevo.idLineaBase=itemeditado.idLineaBase
            itemnuevo.fechaCreacion=itemeditado.fechaCreacion
            itemnuevo.nrohistorial=itemeditado.nrohistorial
            itemnuevo.ultimaversion=1
            itemeditado.ultimaversion=0
            itemnuevo.estado='modificado'
            itemnuevo.complejidad=itemeditado.complejidad
            itemnuevo.nombre=itemeditado.nombre
            DBSession.add(itemnuevo)
            
            """Realiza copia de los valores de los atributos especificos"""
            
            atributoeditado=DBSession.query(DetalleItem).filter_by(iditem=itemeditado.id).all()
            
            
            for objeto in atributoeditado:
                nuevoDetalle=DetalleItem()
                nuevoDetalle.tipo=objeto.tipo
                nuevoDetalle.nombrecampo=objeto.nombrecampo
                nuevoDetalle.valor=objeto.valor
                nuevoDetalle.iditem=itemnuevo.id
                DBSession.add(nuevoDetalle)
                
                
            """Copia las relaciones """
            relaciones = DBSession.query(RelacionItem.idItem1,RelacionItem.idItem2).filter((RelacionItem.idItem2==itemeditado.id) | (RelacionItem.idItem1==itemeditado.id)).all()
            longitud = len(relaciones)
            
            for x in range(longitud):
                newRelation=RelacionItem()
                log.debug('Creando relaciones')
                if int(itemeditado.id) == int(relaciones[x][0]):
                    newRelation.idItem1=int(itemnuevo.id)
                    newRelation.idItem2=relaciones[x][1]
                    DBSession.add(newRelation)
                    #self.provider.create(RelacionItem, params=newRelation)
                elif int(itemeditado.id) == int(relaciones[x][1]):
                    newRelation.idItem1=relaciones[x][0]
                    newRelation.idItem2=int(itemnuevo.id)
                    DBSession.add(newRelation)
                
        
                
            """Realiza copia de los adjuntos"""
            adjuntositemeditado=DBSession.query(Adjuntos).filter_by(idItem=itemeditado.id).all()

            for adj in adjuntositemeditado:
                itemnuevoadjunto=Adjuntos()
                
                log.debug("adj: %s" %adj)
                itemnuevoadjunto=Adjuntos()
                itemnuevoadjunto.idItem=itemnuevo.id
                itemnuevoadjunto.filename=adj.filename
                itemnuevoadjunto.filecontent=adj.filecontent
                DBSession.add(itemnuevoadjunto)
            
            
            
            forbidden_files = [".js", ".htm", ".html"]
            for forbidden_file in forbidden_files:
                if userfile.filename.find(forbidden_file) != -1:
                    return redirect("../adjuntos/new")
            filecontent = userfile.file.read()
            
            log.debug('itemnuevo: %s' %itemnuevo.id)
            
            new_file = Adjuntos(filename=userfile.filename, filecontent=filecontent,idItem=itemnuevo.id )
            DBSession.add(new_file)
            #DBSession.flush()
            
            
            
                
            #self.provider.create(self.model, params=nuevo)
            
            log.debug('adjuntositemeditado: %s' %adjuntositemeditado)
                
           
                
            
            
            
            
            redirect("../new/?iid="+str(itemnuevo.id))
            #return dict(current_files=current_files ,model=self.model.__name__,iid=iid)
            
        
        
        
        
        
        
        #tmpl_context.widget = self.new_form
        #return dict(value=kw, model=self.model.__name__)

    @catch_errors(errors, error_handler=new)
    @expose()
    @registered_validate(error_handler=new)
    def post(self, *args, **kw):
        
        userfile=kw['userfile']
        log.debug("kwwww: %s" %kw)
        
        forbidden_files = [".js", ".htm", ".html"]
        for forbidden_file in forbidden_files:
            if userfile.filename.find(forbidden_file) != -1:
                return redirect("/adjuntos/new")
        filecontent = userfile.file.read()
        new_file = Adjuntos(filename=userfile.filename, filecontent=filecontent)
        DBSession.add(new_file)
        DBSession.flush()
        redirect("/adjuntos/new")
        
        
        #self.provider.create(self.model, params=kw)
        
        
        raise redirect('/adjuntos/new')
    @expose()
    @registered_validate(error_handler=edit)
    @catch_errors(errors, error_handler=edit)
    def put(self, *args, **kw):
        """update"""
        pks = self.provider.get_primary_fields(self.model)
        for i, pk in enumerate(pks):
            if pk not in kw and i < len(args):
                kw[pk] = args[i]

        self.provider.update(self.model, params=kw)
        redirect('../' * len(pks))

    @expose()
    def post_delete(self, *args, **kw):
        """
        pks = self.provider.get_primary_fields(self.model)
        d = {}
        for i, arg in enumerate(args):
            d[pks[i]] = arg
        self.provider.delete(self.model, d)
        redirect('./' + '../' * (len(pks) - 1))
        """
        log.debug("Estoy en el PostDelete")
        
        """
        def delete(self, fileid):
            try:
                userfile = DBSession.query(Adjuntos).filter_by(id=fileid).one()
            except:
                    return redirect("/adjuntos/new")
            DBSession.delete(userfile)
            return redirect("/adjuntos/new")
        """
        return redirect("/adjuntos/new")
        
        
        

    @expose('tgext.crud.templates.get_delete')
    def get_delete(self, *args, **kw):
        """This is the code that creates a confirm_delete page"""
        return dict(args=args)
Exemple #19
0
class CrudRestController(RestController):
    """
    :variables:

    session
      database session (drives drop-down menus

    menu_items
      Dictionary of links to other models in the form model_items[lower_model_name] = Model

    title
      Title to be used for each page.  default: Turbogears Admin System

    :modifiers:

    model
      Model this class is associated with

    table
      Widget for the table display

    table_filler
      Class instance with get_value() that defines the JSon stream for the table

    edit_form
      Form to be used for editing the model

    edit_filler
      Class instance with a get_value() that defines how we get information for a single
      existing record

    new_form
      Form that defines how we create a form for new data entry.

    :Attributes:

      menu_items
        Dictionary of associated Models (used for menu)
      provider
        sprox provider for data manipulation
      session
        link to the database
    """

    title = "Turbogears Admin System"

    def _before(self, *args, **kw):
        tmpl_context.title = self.title
        tmpl_context.menu_items = self.menu_items

    def __before__(self, *args, **kw):
        # this will be removed in 2.1.*
        tmpl_context.menu_items = self.menu_items
        tmpl_context.title = self.title

    def __init__(self, session, menu_items=None):
        if menu_items is None:
            menu_items = {}
        self.menu_items = menu_items
        self.provider = ProviderTypeSelector().get_selector(self.model).get_provider(self.model, hint=session)

        self.session = session

        #this makes crc declarative
        check_types = ['new_form', 'edit_form', 'table', 'table_filler', 'edit_filler']
        for type_ in check_types:
            if not hasattr(self, type_) and hasattr(self, type_+'_type'):
                setattr(self, type_, getattr(self, type_+'_type')(self.session))

        if hasattr(self, 'new_form'):
            #register the validators since they are none from the parent class
            register_validators(self, 'post', self.new_form)
        if hasattr(self, 'edit_form'):
            register_validators(self, 'put', self.edit_form)

    @with_trailing_slash
    @expose('tgext.crud.templates.get_all')
    @expose('json')
    @paginate('value_list', items_per_page=7)
    def get_all(self, *args, **kw):
        """Return all records.
           Pagination is done by offset/limit in the filler method.
           Returns an HTML page with the records if not json.
        """
        if pylons.request.response_type == 'application/json':
            return self.table_filler.get_value(**kw)

        if not getattr(self.table.__class__, '__retrieves_own_value__', False):
            values = self.table_filler.get_value(**kw)
        else:
            values = []
       
        
        longitud=len(values)
        for fila in range(longitud):
            values[fila]['idProyecto'] = DBSession.query(Proyecto.nombre).filter_by(id = values[fila]['idProyecto']).one()
            values[fila]['idFase'] = DBSession.query(Fase.nombre).filter_by(id = values[fila]['idFase']).one()    
            values[fila]['iduser'] = DBSession.query(User.user_name).filter_by(user_id = values[fila]['iduser']).one()
            values[fila]['idPermiso'] = DBSession.query(Permission.permission_name).filter_by(permission_id = values[fila]['idPermiso']).one()
        

        tmpl_context.widget = self.table
        return dict(model=self.model.__name__, value_list=values)

    @expose('tgext.crud.templates.get_one')
    @expose('json')
    def get_one(self, *args, **kw):
        """get one record, returns HTML or json"""
        #this would probably only be realized as a json stream
        tmpl_context.widget = self.edit_form
        pks = self.provider.get_primary_fields(self.model)
        kw = {}
        for i, pk in  enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        return dict(value=value,model=self.model.__name__)

    @expose('tgext.crud.templates.edit')
    def edit(self, *args, **kw):
        """Display a page to edit the record."""
        tmpl_context.widget = self.edit_form
        pks = self.provider.get_primary_fields(self.model)
        kw = {}
        for i, pk in  enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        value['_method'] = 'PUT'
        return dict(value=value, model=self.model.__name__, pk_count=len(pks))

    @without_trailing_slash
    @expose('sap.templates.configurar.proyfaseusuario.new')
    def new(self,pid=None ,*args, **kw):
        """Display a page to show a new record."""
        tmpl_context.widget = self.new_form
        
        fases = [x for x in DBSession.query(Fase.id, Fase.nombre).filter_by(idproyec=pid)]
        usuarios = [x for x in (DBSession.query(User.user_id, User.user_name))]
        usuarios.remove(usuarios[0])
        #permisos= [x for x in (DBSession.query(Permission. permission_id ,Permission. permission_name))]

        return dict(value={'idProyecto':pid}, model=self.model.__name__, fases_options=fases, usuarios_options=usuarios)






    @catch_errors(errors, error_handler=new)
    @expose()
    @registered_validate(error_handler=new)
    def post(self, *args, **kw):
    	ids= kw['idPermiso']
    	longitud= len(kw['idPermiso'])
        
    	for indice in range(longitud):
            kw['idPermiso']= ids[indice]
            msj=DBSession.query(ProyFaseUsuario).filter_by(idProyecto=kw['idProyecto'], iduser=kw['iduser'], idFase=kw['idFase'],idPermiso=kw['idPermiso']).first()
            log.debug('msg: %s' %msj)
            if msj == None:
                
                self.provider.create(self.model, params=kw)
            else:
                flash("El usuario ya fue adherido a la Fase elegida", "error")
                redirect('new/?pid='+ kw['idProyecto'])
        raise redirect('./?pid='+ kw['idProyecto'])




    @expose()
    @registered_validate(error_handler=edit)
    @catch_errors(errors, error_handler=edit)
    def put(self, *args, **kw):
        """update"""
        pks = self.provider.get_primary_fields(self.model)
        for i, pk in enumerate(pks):
            if pk not in kw and i < len(args):
                kw[pk] = args[i]

        self.provider.update(self.model, params=kw)
        redirect('../' * len(pks))

    @expose()
    def post_delete(self, *args, **kw):
        """This is the code that actually deletes the record"""
        pks = self.provider.get_primary_fields(self.model)
        d = {}
        for i, arg in enumerate(args):
            d[pks[i]] = arg
        self.provider.delete(self.model, d)
        
        #redirect('./' + '../' * (len(pks) - 1))
        redirect('../../../?pid='+ d['idProyecto'])

    @expose('tgext.crud.templates.get_delete')
    def get_delete(self, *args, **kw):
        """This is the code that creates a confirm_delete page"""
        return dict(args=args)
class CrudRestController(RestController):
    """
    :initialization options:

        **session**
              database session 

        **menu_items**
            Dictionary or mapping type of links to other CRUD sections.
            This is used to generate the links sidebar of the CRUD interface.
            Can be specified in the form ``model_items['lower_model_name'] = ModelClass`` or
            ``model_items['link'] = 'Name'``.

    :class attributes:

        **title**
            Title to be used for each page.  default: ``'Turbogears Admin System'``

        **model**
            Model this class is associated with.

        **remember_values**
            List of model attributes that need to keep previous value when not provided
            on submission instead of replacing the existing value with an empty one.
            It's commonly used with file fields to avoid having to reupload the file
            again when the model is edited.

        **keep_params**
            List of URL parameters that need to be kept around when redirecting between
            the various pages of the CRUD controller. Can be used to keep around filters
            or sorting when editing a subset of the models.

        **search_fields**
            Enables searching on some fields, can be ``True``, ``False`` or a list
            of fields for which searching should be enabled.

        **substring_filters**
            Enable substring filtering for some fields, by default is disabled.
            Pass ``True`` to enable it on all fields or pass a list of field
            names to enable it only on some fields.

        **json_dictify**
            ``True`` or ``False``, enables advanced dictification of retrieved models
            when providing JSON responses. This also enables JSON encoding of related entities
            for the returned model.

        **conditional_update_field**
            Name of the field used to perform conditional updates when ``PUT`` method is
            used as a REST API. ``None`` disables conditional updates (which is the default).

        **pagination**
            Dictionary of options for pagination. ``False`` disables pagination.
            By default ``{'items_per_page': 7}`` is provided.
            Currently the only supported option is ``items_per_page``.

        **response_type**
            Limit response to a single format, can be: 'application/json' or 'text/html'. 
            By default tgext.crud will detect expected response from Accept header and 
            will provide response content according to the expected one. If you want
            to avoid HTML access to a plain JSON API you can use this option to limit
            valid responses to application/json.

        **resources**
            A list of CSSSource / JSSource that have to be injected inside CRUD
            pages when rendering. By default ``tgext.crud.resources.crud_style`` and
            ``tgext.crud.resources.crud_script`` are injected.

        **table**
            The ``sprox.tablebase.TableBase`` Widget instance used to display the table.
            By default ``tgext.crud.utils.SortableTableBase`` is used which permits to sort
            table by columns.

        **table_filler**
            The ``sprox.fillerbase.TableFiller`` instance used to retrieve data for the table.
            If you want to customize how data is retrieved override the 
            ``TableFiller._do_get_provider_count_and_objs`` method to return different entities and count.
            By default ``tgext.crud.utils.RequestLocalTableFiller`` is used which keeps
            track of the numer of entities retrieved during the current request to enable pagination.

        **edit_form**
            Form to be used for editing an existing model. 
            By default ``sprox.formbase.EditForm`` is used.

        **edit_filler**
            ``sprox.fillerbase.RecordFiller`` subclass used to load the values for
            an entity that need to be edited. Override the ``RecordFiller.get_value``
            method to provide custom values.

        **new_form**
            Form that defines how to create a new model.
            By default ``sprox.formbase.AddRecordForm`` is used.
    """

    title = "Turbogears Admin System"
    keep_params = None
    remember_values = []
    substring_filters = []
    search_fields = True  # True for automagic
    json_dictify = False  # True is slower but provides relations
    conditional_update_field = None
    response_type = None
    pagination = {'items_per_page': 7}
    resources = (crud_style, crud_script)

    def _before(self, *args, **kw):
        tmpl_context.title = self.title
        tmpl_context.menu_items = self.menu_items
        tmpl_context.kept_params = self._kept_params()
        tmpl_context.crud_helpers = self.helpers

        for resource in self.resources:
            resource.inject()

        force_response_type(self.response_type)

    __before__ = _before  #This can be removed since 2.2

    def _mount_point(self):
        try:
            mount_point = self.mount_point
        except:
            mount_point = None

        if not mount_point:
            #non statically mounted or Old TurboGears, use relative URL
            mount_point = '.'

        return mount_point

    def _kept_params(self):
        if not self.keep_params:
            return {}

        if not request.referer:
            from_referer = {}
        else:
            parsed = url_parse(request.referer)
            from_referer = dict(cgi.parse_qsl(parsed.query))
        from_referer.update(request.params)

        pass_params = {}
        for k in self.keep_params:
            if k in from_referer:
                pass_params[k] = from_referer[k]
        return pass_params

    def _adapt_menu_items(self, menu_items):
        adapted_menu_items = type(menu_items)()

        for link, model in menu_items.items():
            if inspect.isclass(model):
                adapted_menu_items[link + 's'] = model.__name__
            else:
                adapted_menu_items[link] = model
        return adapted_menu_items

    def _get_search_fields(self, kw):
        if self.search_fields is True:
            return [(field, self.table.__headers__.get(field, field),
                     kw.get(field, False)) for field in self.table.__fields__
                    if field != '__actions__']
        elif self.search_fields:
            # This allows for customizing the search fields to be shown in the table definition
            # search_fields can be either a list of tuples with (field, name) or just a string field = name
            search_fields = []
            for field in self.search_fields:
                if isinstance(field, string_type):
                    search_fields.append((field, field, kw.get(field, False)))
                else:
                    search_fields.append(
                        (field[0], field[1], kw.get(field[0], False)))
            return search_fields
        else:
            # This would be where someone explicitly disabled the search functionality
            return []

    def _get_current_search(self, search_fields):
        if not search_fields:
            return None

        for field, _, value in search_fields:
            if value is not False:
                return (field, value)
        return (search_fields[0][0], '')

    def _dictify(self, value, length=None):
        json_dictify = self.json_dictify
        if json_dictify is False:
            return value

        def _dictify(entity):
            if hasattr(entity, '__json__'):
                return entity.__json__()
            else:
                return self.provider.dictify(entity, **json_dictify)

        if length is not None:
            #return a generator, we don't want to consume the whole query if it is paginated
            return (_dictify(entity) for entity in value)
        else:
            return _dictify(value)

    def __init__(self, session, menu_items=None):
        if hasattr(self, 'style'):
            warnings.warn(
                'style attribute is not supported anymore, '
                'resources attribute replaces it',
                DeprecationWarning,
                stacklevel=2)
            self.resources = (crud_script,
                              CSSSource(location='headbottom', src=self.style))

        if menu_items is None:
            menu_items = {}

        self.menu_items = self._adapt_menu_items(menu_items)
        self.helpers = CrudRestControllerHelpers()
        self.provider = ProviderTypeSelector().get_selector(
            self.model).get_provider(self.model, hint=session)
        self.session = session

        if self.json_dictify is True:
            self.json_dictify = {}

        #this makes crc declarative
        check_types = [
            'new_form', 'edit_form', 'table', 'table_filler', 'edit_filler'
        ]
        for type_ in check_types:
            if not hasattr(self, type_) and hasattr(self, type_ + '_type'):
                setattr(self, type_,
                        getattr(self, type_ + '_type')(self.session))

        # Enable pagination only if table_filler has support for request local __count__
        self.pagination_enabled = (self.pagination and isinstance(
            self.table_filler, RequestLocalTableFiller))

        if hasattr(self, 'new_form'):
            #register the validators since they are none from the parent class
            register_validators(self, 'post', self.new_form)
        if hasattr(self, 'edit_form'):
            register_validators(self, 'put', self.edit_form)

    @with_trailing_slash
    @expose('genshi:tgext.crud.templates.get_all')
    @expose('mako:tgext.crud.templates.get_all')
    @expose('jinja:tgext.crud.templates.get_all')
    @expose('json:')
    @optional_paginate('value_list')
    def get_all(self, *args, **kw):
        """Return all records.
           Pagination is done by offset/limit in the filler method.
           Returns an HTML page with the records if not json.
        """
        if self.pagination:
            paginator = request.paginators['value_list']
            paginator.paginate_items_per_page = self.pagination[
                'items_per_page']
        else:
            paginator = request.paginators['value_list']
            paginator.paginate_items_per_page = -1
            paginator.paginate_page = 0

        if tg.request.response_type == 'application/json':
            adapt_params_for_pagination(kw, self.pagination_enabled)
            try:
                count, values = self.table_filler._do_get_provider_count_and_objs(
                    **kw)
            except Exception as e:
                abort(400, detail=unicode_text(e))
            values = self._dictify(values, length=count)
            if self.pagination_enabled:
                values = SmartPaginationCollection(values, count)
            return dict(value_list=values)

        if not getattr(self.table.__class__, '__retrieves_own_value__', False):
            kw.pop('substring_filters', None)
            if self.substring_filters is True:
                substring_filters = list(
                    set(kw.keys()) -
                    set(['limit', 'offset', 'order_by', 'desc']))
            else:
                substring_filters = self.substring_filters

            adapt_params_for_pagination(kw, self.pagination_enabled)
            try:
                values = self.table_filler.get_value(
                    substring_filters=substring_filters, **kw)
            except Exception as e:
                flash(
                    'Invalid search query "%s": %s' %
                    (request.query_string, e), 'warn')
                # Reset all variables to sane defaults
                kw = {}
                values = []
                self.table_filler.__count__ = 0
            if self.pagination_enabled:
                values = SmartPaginationCollection(values,
                                                   self.table_filler.__count__)
        else:
            values = []

        tmpl_context.widget = self.table
        search_fields = self._get_search_fields(kw)
        current_search = self._get_current_search(search_fields)
        return dict(
            model=self.model.__name__,
            value_list=values,
            mount_point=self._mount_point(),
            headers=search_fields,  # Just for backwards compatibility
            search_fields=search_fields,
            current_search=current_search)

    @expose('genshi:tgext.crud.templates.get_one')
    @expose('mako:tgext.crud.templates.get_one')
    @expose('jinja:tgext.crud.templates.get_one')
    @expose('json:')
    def get_one(self, *args, **kw):
        """get one record, returns HTML or json"""
        #this would probably only be realized as a json stream
        kw = map_args_to_pks(args, {})

        if tg.request.response_type == 'application/json':
            obj = self.provider.get_obj(self.model, kw)
            if obj is None:
                tg.response.status_code = 404
            elif self.conditional_update_field is not None:
                tg.response.last_modified = getattr(
                    obj, self.conditional_update_field)

            return dict(model=self.model.__name__, value=self._dictify(obj))

        tmpl_context.widget = self.edit_form
        value = self.edit_filler.get_value(kw)
        return dict(value=value, model=self.model.__name__)

    @expose('genshi:tgext.crud.templates.edit')
    @expose('mako:tgext.crud.templates.edit')
    @expose('jinja:tgext.crud.templates.edit')
    def edit(self, *args, **kw):
        """Display a page to edit the record."""
        pks = self.provider.get_primary_fields(self.model)
        kw = map_args_to_pks(args, {})

        tmpl_context.widget = self.edit_form
        value = self.edit_filler.get_value(kw)
        value['_method'] = 'PUT'
        return dict(value=value, model=self.model.__name__, pk_count=len(pks))

    @without_trailing_slash
    @expose('genshi:tgext.crud.templates.new')
    @expose('mako:tgext.crud.templates.new')
    @expose('jinja:tgext.crud.templates.new')
    def new(self, *args, **kw):
        """Display a page to show a new record."""
        tmpl_context.widget = self.new_form
        return dict(value=kw, model=self.model.__name__)

    @expose(content_type='text/html')
    @expose('json:', content_type='application/json')
    @before_validate(allow_json_parameters)
    @catch_errors(errors, error_handler=new)
    @registered_validate(error_handler=new)
    def post(self, *args, **kw):
        obj = self.provider.create(self.model, params=kw)

        if tg.request.response_type == 'application/json':
            if obj is not None and self.conditional_update_field is not None:
                tg.response.last_modified = getattr(
                    obj, self.conditional_update_field)

            return dict(model=self.model.__name__, value=self._dictify(obj))

        return redirect('./', params=self._kept_params())

    @expose(content_type='text/html')
    @expose('json:', content_type='application/json')
    @before_validate(allow_json_parameters)
    @before_validate(map_args_to_pks)
    @registered_validate(error_handler=edit)
    @catch_errors(errors, error_handler=edit)
    def put(self, *args, **kw):
        """update"""
        omit_fields = []
        if getattr(self, 'edit_form', None):
            omit_fields.extend(self.edit_form.__omit_fields__)

        for remembered_value in self.remember_values:
            value = kw.get(remembered_value)
            if value is None or value == '':
                omit_fields.append(remembered_value)

        obj = self.provider.get_obj(self.model, kw)

        #This should actually by done by provider.update to make it atomic
        can_modify = True
        if obj is not None and self.conditional_update_field is not None and \
           tg.request.if_unmodified_since is not None and \
           tg.request.if_unmodified_since < getattr(obj, self.conditional_update_field):
            can_modify = False

        if obj is not None and can_modify:
            obj = self.provider.update(self.model,
                                       params=kw,
                                       omit_fields=omit_fields)

        if tg.request.response_type == 'application/json':
            if obj is None:
                tg.response.status_code = 404
            elif can_modify is False:
                tg.response.status_code = 412
            elif self.conditional_update_field is not None:
                tg.response.last_modified = getattr(
                    obj, self.conditional_update_field)

            return dict(model=self.model.__name__, value=self._dictify(obj))

        pks = self.provider.get_primary_fields(self.model)
        return redirect('../' * len(pks), params=self._kept_params())

    @expose(content_type='text/html')
    @expose('json:', content_type='application/json')
    def post_delete(self, *args, **kw):
        """This is the code that actually deletes the record"""
        kw = map_args_to_pks(args, {})

        obj = None
        if kw:
            obj = self.provider.get_obj(self.model, kw)

        if obj is not None:
            self.provider.delete(self.model, kw)

        if tg.request.response_type == 'application/json':
            return dict()

        pks = self.provider.get_primary_fields(self.model)
        return redirect('./' + '../' * (len(pks) - 1),
                        params=self._kept_params())

    @expose('genshi:tgext.crud.templates.get_delete')
    @expose('jinja:tgext.crud.templates.get_delete')
    def get_delete(self, *args, **kw):
        """This is the code that creates a confirm_delete page"""
        return dict(args=args)
Exemple #21
0
class CrudRestController(RestController):
    """
    :variables:

    session
      database session (drives drop-down menus

    menu_items
      Dictionary of links to other models in the form model_items[lower_model_name] = Model

    title
      Title to be used for each page.  default: Turbogears Admin System

    :modifiers:

    model
      Model this class is associated with

    table
      Widget for the table display

    table_filler
      Class instance with get_value() that defines the JSon stream for the table

    edit_form
      Form to be used for editing the model

    edit_filler
      Class instance with a get_value() that defines how we get information for a single
      existing record

    new_form
      Form that defines how we create a form for new data entry.

    :Attributes:

      menu_items
        Dictionary of associated Models (used for menu)
      provider
        sprox provider for data manipulation
      session
        link to the database
    """

    title = "Turbogears Admin System"

    def _before(self, *args, **kw):
        tmpl_context.title = self.title
        tmpl_context.menu_items = self.menu_items

    def __before__(self, *args, **kw):
        # this will be removed in 2.1.*
        tmpl_context.menu_items = self.menu_items
        tmpl_context.title = self.title

    def __init__(self, session, menu_items=None):
        if menu_items is None:
            menu_items = {}
        self.menu_items = menu_items
        self.provider = ProviderTypeSelector().get_selector(
            self.model).get_provider(self.model, hint=session)

        self.session = session

        #this makes crc declarative
        check_types = [
            'new_form', 'edit_form', 'table', 'table_filler', 'edit_filler'
        ]
        for type_ in check_types:
            if not hasattr(self, type_) and hasattr(self, type_ + '_type'):
                setattr(self, type_,
                        getattr(self, type_ + '_type')(self.session))

        if hasattr(self, 'new_form'):
            #register the validators since they are none from the parent class
            register_validators(self, 'post', self.new_form)
        if hasattr(self, 'edit_form'):
            register_validators(self, 'put', self.edit_form)

    @with_trailing_slash
    @expose('tgext.crud.templates.get_all')
    @expose('json')
    @paginate('value_list', items_per_page=7)
    def get_all(self, *args, **kw):
        """Return all records.
           Pagination is done by offset/limit in the filler method.
           Returns an HTML page with the records if not json.
        """
        if pylons.request.response_type == 'application/json':
            return self.table_filler.get_value(**kw)

        if not getattr(self.table.__class__, '__retrieves_own_value__', False):
            values = self.table_filler.get_value(**kw)
        else:
            values = []

        tmpl_context.widget = self.table
        return dict(model=self.model.__name__, value_list=values)

    @expose('tgext.crud.templates.get_one')
    @expose('json')
    def get_one(self, *args, **kw):
        """get one record, returns HTML or json"""
        #this would probably only be realized as a json stream
        tmpl_context.widget = self.edit_form
        pks = self.provider.get_primary_fields(self.model)
        kw = {}
        for i, pk in enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        return dict(value=value, model=self.model.__name__)

    @expose('tgext.crud.templates.edit')
    def edit(self, *args, **kw):
        """Display a page to edit the record."""
        tmpl_context.widget = self.edit_form
        #pks = self.provider.get_primary_fields(self.model)

        ###########################################
        pks = self.provider.get_primary_fields(self.model)

        ###########################################
        kw = {}
        for i, pk in enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        value['_method'] = 'PUT'
        return dict(value=value, model=self.model.__name__, pk_count=len(pks))

    @without_trailing_slash
    @expose('sap.templates.desarrollar.adjuntos.new')
    def new(self, iid=None, *args, **kw):
        """Aqui entra solo para mostrar la vista y para guardar, el descargar
        borrar esta implementado en root"""

        log.debug('iid: %s' % iid)
        log.debug('adjuntos: %s' % kw)
        longitud = len(kw)
        log.debug('longitud: %s' % longitud)
        if longitud == 0:
            #current_files = DBSession.query(Adjuntos).all()
            current_files = DBSession.query(Adjuntos).filter_by(
                idItem=iid).all()

            return dict(current_files=current_files,
                        model=self.model.__name__,
                        iid=iid)
        else:
            if iid == "save":
                iid = kw['idItem']

            idItem = kw['idItem']
            userfile = kw['userfile']
            log.debug('idItem: %s' % idItem)
            if userfile == '':
                flash("No ha selecionado ningun archivo", "error")
                redirect("../new/?iid=" + str(iid))
            """
            forbidden_files = [".js", ".htm", ".html"]
            for forbidden_file in forbidden_files:
                if userfile.filename.find(forbidden_file) != -1:
                    return redirect("../adjuntos/new")
            filecontent = userfile.file.read()
            new_file = Adjuntos(filename=userfile.filename, filecontent=filecontent,idItem=idItem )
            DBSession.add(new_file)
            DBSession.flush()
            """
            """Realiza una copia del item cuando se adjunta un archivo y aumenta su version"""
            itemeditado = DBSession.query(Item).filter_by(id=idItem).first()
            itemnuevo = Item()
            itemnuevo.version = itemeditado.version + 1
            itemnuevo.idTipoDeItem = itemeditado.idTipoDeItem
            itemnuevo.idFase = itemeditado.idFase
            itemnuevo.idLineaBase = itemeditado.idLineaBase
            itemnuevo.fechaCreacion = itemeditado.fechaCreacion
            itemnuevo.nrohistorial = itemeditado.nrohistorial
            itemnuevo.ultimaversion = 1
            itemeditado.ultimaversion = 0
            itemnuevo.estado = 'modificado'
            itemnuevo.complejidad = itemeditado.complejidad
            itemnuevo.nombre = itemeditado.nombre
            DBSession.add(itemnuevo)
            """Realiza copia de los valores de los atributos especificos"""

            atributoeditado = DBSession.query(DetalleItem).filter_by(
                iditem=itemeditado.id).all()

            for objeto in atributoeditado:
                nuevoDetalle = DetalleItem()
                nuevoDetalle.tipo = objeto.tipo
                nuevoDetalle.nombrecampo = objeto.nombrecampo
                nuevoDetalle.valor = objeto.valor
                nuevoDetalle.iditem = itemnuevo.id
                DBSession.add(nuevoDetalle)
            """Copia las relaciones """
            relaciones = DBSession.query(
                RelacionItem.idItem1, RelacionItem.idItem2).filter(
                    (RelacionItem.idItem2 == itemeditado.id)
                    | (RelacionItem.idItem1 == itemeditado.id)).all()
            longitud = len(relaciones)

            for x in range(longitud):
                newRelation = RelacionItem()
                log.debug('Creando relaciones')
                if int(itemeditado.id) == int(relaciones[x][0]):
                    newRelation.idItem1 = int(itemnuevo.id)
                    newRelation.idItem2 = relaciones[x][1]
                    DBSession.add(newRelation)
                    #self.provider.create(RelacionItem, params=newRelation)
                elif int(itemeditado.id) == int(relaciones[x][1]):
                    newRelation.idItem1 = relaciones[x][0]
                    newRelation.idItem2 = int(itemnuevo.id)
                    DBSession.add(newRelation)
            """Realiza copia de los adjuntos"""
            adjuntositemeditado = DBSession.query(Adjuntos).filter_by(
                idItem=itemeditado.id).all()

            for adj in adjuntositemeditado:
                itemnuevoadjunto = Adjuntos()

                log.debug("adj: %s" % adj)
                itemnuevoadjunto = Adjuntos()
                itemnuevoadjunto.idItem = itemnuevo.id
                itemnuevoadjunto.filename = adj.filename
                itemnuevoadjunto.filecontent = adj.filecontent
                DBSession.add(itemnuevoadjunto)

            forbidden_files = [".js", ".htm", ".html"]
            for forbidden_file in forbidden_files:
                if userfile.filename.find(forbidden_file) != -1:
                    return redirect("../adjuntos/new")
            filecontent = userfile.file.read()

            log.debug('itemnuevo: %s' % itemnuevo.id)

            new_file = Adjuntos(filename=userfile.filename,
                                filecontent=filecontent,
                                idItem=itemnuevo.id)
            DBSession.add(new_file)
            #DBSession.flush()

            #self.provider.create(self.model, params=nuevo)

            log.debug('adjuntositemeditado: %s' % adjuntositemeditado)

            redirect("../new/?iid=" + str(itemnuevo.id))
            #return dict(current_files=current_files ,model=self.model.__name__,iid=iid)

        #tmpl_context.widget = self.new_form
        #return dict(value=kw, model=self.model.__name__)

    @catch_errors(errors, error_handler=new)
    @expose()
    @registered_validate(error_handler=new)
    def post(self, *args, **kw):

        userfile = kw['userfile']
        log.debug("kwwww: %s" % kw)

        forbidden_files = [".js", ".htm", ".html"]
        for forbidden_file in forbidden_files:
            if userfile.filename.find(forbidden_file) != -1:
                return redirect("/adjuntos/new")
        filecontent = userfile.file.read()
        new_file = Adjuntos(filename=userfile.filename,
                            filecontent=filecontent)
        DBSession.add(new_file)
        DBSession.flush()
        redirect("/adjuntos/new")

        #self.provider.create(self.model, params=kw)

        raise redirect('/adjuntos/new')

    @expose()
    @registered_validate(error_handler=edit)
    @catch_errors(errors, error_handler=edit)
    def put(self, *args, **kw):
        """update"""
        pks = self.provider.get_primary_fields(self.model)
        for i, pk in enumerate(pks):
            if pk not in kw and i < len(args):
                kw[pk] = args[i]

        self.provider.update(self.model, params=kw)
        redirect('../' * len(pks))

    @expose()
    def post_delete(self, *args, **kw):
        """
        pks = self.provider.get_primary_fields(self.model)
        d = {}
        for i, arg in enumerate(args):
            d[pks[i]] = arg
        self.provider.delete(self.model, d)
        redirect('./' + '../' * (len(pks) - 1))
        """
        log.debug("Estoy en el PostDelete")
        """
        def delete(self, fileid):
            try:
                userfile = DBSession.query(Adjuntos).filter_by(id=fileid).one()
            except:
                    return redirect("/adjuntos/new")
            DBSession.delete(userfile)
            return redirect("/adjuntos/new")
        """
        return redirect("/adjuntos/new")

    @expose('tgext.crud.templates.get_delete')
    def get_delete(self, *args, **kw):
        """This is the code that creates a confirm_delete page"""
        return dict(args=args)
Exemple #22
0
class CrudRestController(RestController):
    """
    :variables:

    session
      database session (drives drop-down menus

    menu_items
      Dictionary of links to other models in the form model_items[lower_model_name] = Model

    title
      Title to be used for each page.  default: Turbogears Admin System

    :modifiers:

    model
      Model this class is associated with

    table
      Widget for the table display

    table_filler
      Class instance with get_value() that defines the JSon stream for the table

    edit_form
      Form to be used for editing the model

    edit_filler
      Class instance with a get_value() that defines how we get information for a single
      existing record

    new_form
      Form that defines how we create a form for new data entry.

    :Attributes:

      menu_items
        Dictionary of associated Models (used for menu)
      provider
        sprox provider for data manipulation
      session
        link to the database
    """

    title = "Turbogears Admin System"

    def _before(self, *args, **kw):
        tmpl_context.title = self.title
        tmpl_context.menu_items = self.menu_items

    def __before__(self, *args, **kw):
        # this will be removed in 2.1.*
        tmpl_context.menu_items = self.menu_items
        tmpl_context.title = self.title

    def __init__(self, session, menu_items=None):
        if menu_items is None:
            menu_items = {}
        self.menu_items = menu_items
        self.provider = ProviderTypeSelector().get_selector(self.model).get_provider(self.model, hint=session)

        self.session = session

        #this makes crc declarative
        check_types = ['new_form', 'edit_form', 'table', 'table_filler', 'edit_filler']
        for type_ in check_types:
            if not hasattr(self, type_) and hasattr(self, type_+'_type'):
                setattr(self, type_, getattr(self, type_+'_type')(self.session))

        if hasattr(self, 'new_form'):
            #register the validators since they are none from the parent class
            register_validators(self, 'post', self.new_form)
        if hasattr(self, 'edit_form'):
            register_validators(self, 'put', self.edit_form)

    @with_trailing_slash
    @expose('tgext.crud.templates.get_all')
    @expose('json')
    @paginate('value_list', items_per_page=7)
    def get_all(self, *args, **kw):
        """Return all records.
           Pagination is done by offset/limit in the filler method.
           Returns an HTML page with the records if not json.
        """
        if pylons.request.response_type == 'application/json':
            return self.table_filler.get_value(**kw)

        if not getattr(self.table.__class__, '__retrieves_own_value__', False):
            values = self.table_filler.get_value(**kw)
        else:
            values = []

        tmpl_context.widget = self.table
        return dict(model=self.model.__name__, value_list=values)

    @expose('tgext.crud.templates.get_one')
    @expose('json')
    def get_one(self, *args, **kw):
        """get one record, returns HTML or json"""
        #this would probably only be realized as a json stream
        tmpl_context.widget = self.edit_form
        pks = self.provider.get_primary_fields(self.model)
        kw = {}
        for i, pk in  enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        return dict(value=value,model=self.model.__name__)

    @expose('tgext.crud.templates.edit')
    def edit(self, *args, **kw):
        """Display a page to edit the record."""
        tmpl_context.widget = self.edit_form
        #pks = self.provider.get_primary_fields(self.model)

        ###########################################
        pks = self.provider.get_primary_fields(self.model)
        
        ###########################################
        kw = {}
        for i, pk in  enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        value['_method'] = 'PUT'
        return dict(value=value, model=self.model.__name__, pk_count=len(pks))

    @without_trailing_slash
    #@expose('tgext.crud.templates.new')
    @expose("sap.templates.desarrollar.itemlineabase.new")
    def new(self,lid=None ,*args, **kw):

        tmpl_context.widget = self.new_form
   
        
        if len(kw)<2:
            """-----obtiene el idFase de la en el que esta la linea base------- """

            fid=DBSession.query(LineaBase.idFase).filter_by(id=lid).first()
            log.debug("fidddd= %s" %fid)   
            """-----------------------------------------------------------------"""
             
            emfaseactual= [x for x in DBSession.query(Item.id, Item.nombre).filter_by(idFase=fid,idLineaBase=None).all()]
            return dict(value={'lineabase':lid}, model=self.model.__name__,items_options=itemfaseactual)
            
            
            """Este else es como el Post.Como,al guardar no se va al Post,vuelve al new, entonces se le creo este "else" """
        else:
            
            kw2=dict()
            kw2['id']=kw['items']
            kw2['idLineaBase']=kw['lineabase']
            self.provider.update(self.model, params=kw2)
            
            raise redirect('../' +'../itemlineabase/?lid='+ kw['lineabase'])
            



    @catch_errors(errors, error_handler=new)
    @expose()
    @registered_validate(error_handler=new)
    def post(self, *args, **kw):
        
        
        """ este Post, no es llamado en ningun momento, razon por la cual es reemplazado por el "else" que esta en New"""
        log.debug("postItemLinea: %s" %kw)
        #self.provider.create(self.model, params=kw)
        
        
        
        raise redirect('../' +'../itemlineabase/?fid=21')
    
    
    @expose()
    @registered_validate(error_handler=edit)
    @catch_errors(errors, error_handler=edit)
    def put(self, *args, **kw):
        """update"""
        pks = self.provider.get_primary_fields(self.model)
        for i, pk in enumerate(pks):
            if pk not in kw and i < len(args):
                kw[pk] = args[i]

        self.provider.update(self.model, params=kw)
        redirect('../' * len(pks))

    @expose()
    def post_delete(self, *args, **kw):
        """This is the code that actually deletes the record"""
        pks = self.provider.get_primary_fields(self.model)
        d = {}
        for i, arg in enumerate(args):
            d[pks[i]] = arg
        self.provider.delete(self.model, d)
        redirect('./' + '../' * (len(pks) - 1))

    @expose('tgext.crud.templates.get_delete')
    def get_delete(self, *args, **kw):
        """This is the code that creates a confirm_delete page"""
        return dict(args=args)
Exemple #23
0
class CrudRestController(RestController):
    """
    :variables:

    session
      database session (drives drop-down menus

    menu_items
      Dictionary of links to other models in the form model_items[lower_model_name] = Model

    title
      Title to be used for each page.  default: Turbogears Admin System

    :modifiers:

    model
      Model this class is associated with

    table
      Widget for the table display

    table_filler
      Class instance with get_value() that defines the JSon stream for the table

    edit_form
      Form to be used for editing the model

    edit_filler
      Class instance with a get_value() that defines how we get information for a single
      existing record

    new_form
      Form that defines how we create a form for new data entry.

    :Attributes:

      menu_items
        Dictionary of associated Models (used for menu)
      provider
        sprox provider for data manipulation
      session
        link to the database
    """

    title = "Turbogears Admin System"

    def _before(self, *args, **kw):
        tmpl_context.title = self.title
        tmpl_context.menu_items = self.menu_items

    def __before__(self, *args, **kw):
        # this will be removed in 2.1.*
        tmpl_context.menu_items = self.menu_items
        tmpl_context.title = self.title

    def __init__(self, session, menu_items=None):
        if menu_items is None:
            menu_items = {}
        self.menu_items = menu_items
        self.provider = ProviderTypeSelector().get_selector(self.model).get_provider(self.model, hint=session)

        self.session = session

        #this makes crc declarative
        check_types = ['new_form', 'edit_form', 'table', 'table_filler', 'edit_filler']
        for type_ in check_types:
            if not hasattr(self, type_) and hasattr(self, type_+'_type'):
                setattr(self, type_, getattr(self, type_+'_type')(self.session))

        if hasattr(self, 'new_form'):
            #register the validators since they are none from the parent class
            register_validators(self, 'post', self.new_form)
        if hasattr(self, 'edit_form'):
            register_validators(self, 'put', self.edit_form)

    @with_trailing_slash
    @expose('tgext.crud.templates.get_all')
    @expose('json')
    @paginate('value_list', items_per_page=7)
    def get_all(self, *args, **kw):
        """Return all records.
           Pagination is done by offset/limit in the filler method.
           Returns an HTML page with the records if not json.
        """
        if pylons.request.response_type == 'application/json':
            return self.table_filler.get_value(**kw)

        if not getattr(self.table.__class__, '__retrieves_own_value__', False):
            values = self.table_filler.get_value(**kw)
        else:
            values = []
        
        longitud=len(values)
        for fila in range(longitud):
            complejidad = int(values[fila]['complejidad'])
            values[fila]['idFase'] = DBSession.query(Fase.nombre).filter_by(id = values[fila]['idFase']).first()
            lineabase = values[fila]['idLineaBase']
            
            if lineabase != 'None':
                values[fila]['idLineaBase'] = DBSession.query(LineaBase.nombre)\
                                                .filter_by(id=lineabase).first()
            else:
                values[fila]['idLineaBase'] = 'Sin linea base'
            
            if (complejidad == 1):
                values[fila]['complejidad'] = 'Muy baja (1)'
            elif (complejidad == 2):
                values[fila]['complejidad'] = 'Baja (2)'
            elif (complejidad == 3):
                values[fila]['complejidad'] = 'Media (3)'
            elif (complejidad == 4):
                values[fila]['complejidad'] = 'Alta (4)'
            else:
                values[fila]['complejidad'] = 'Muy alta (5)'

        tmpl_context.widget = self.table
        
        
        
        
        return dict(model=self.model.__name__, value_list=values)

    @expose('tgext.crud.templates.get_one')
    @expose('json')
    def get_one(self, *args, **kw):
        """get one record, returns HTML or json"""
        #this would probably only be realized as a json stream
        tmpl_context.widget = self.edit_form
        pks = self.provider.get_primary_fields(self.model)
        kw = {}
        for i, pk in  enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        return dict(value=value,model=self.model.__name__)

    @expose('tgext.crud.templates.edit')
    def edit(self, *args, **kw):
        
        """este codigo es ejecutado cuando se revierte un item """
       
        pks = self.provider.get_primary_fields(self.model)
        
        kw = {}
        for i, pk in  enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        
        """-----------Se obtiene el item a revertir -------------"""
        item=DBSession.query(Item).filter_by(id=kw['id']).first()
        """------------------------------------------------------"""
        
        
        """------obtine el numero de la mayor version del item---"""
        versionmayor= DBSession.query(Item.version).filter_by(nrohistorial=item.nrohistorial ,ultimaversion=1).first()
        """------------------------------------------------------"""
        
        """ ---el item con la version mayor, cambia su ultimaversion a cero --- """
        item3=DBSession.query(Item).filter_by(nrohistorial=item.nrohistorial,ultimaversion=1).first()
        log.debug('item3= %s'%item3 )
        item3.ultimaversion=0
        
        
        
        
        log.debug("versionmayor= %s" %versionmayor[0])
        
        item2=Item()
        item2.nombre=item.nombre
        item2.idTipoDeItem=item.idTipoDeItem
        item2.idFase=item.idFase
        item2.idLineaBase=item.idLineaBase
        
        """el item a revertir aumenta su version a la ultima y el
        el item con la ultima version, "ultima version" pasa a 0 """
        item2.version= versionmayor[0]+1
        item2.ultimaversion=1
        item2.estado=item.estado
        item2.complejidad=item.complejidad
        item2.fechaCreacion=item.fechaCreacion
        item2.nrohistorial=item.nrohistorial
        DBSession.add(item2)
        
        """Realiza copia de los valores de los atributos especificos"""
            
        atributoeditado=DBSession.query(DetalleItem).filter_by(iditem=item.id).all()
            
            
        for objeto in atributoeditado:
            nuevoDetalle=DetalleItem()
            nuevoDetalle.tipo=objeto.tipo
            nuevoDetalle.nombrecampo=objeto.nombrecampo
            nuevoDetalle.valor=objeto.valor
            nuevoDetalle.iditem=item2.id #el ID del nuevo item
            DBSession.add(nuevoDetalle)
                
        """Realiza copia de los adjuntos"""
        adjuntositemeditado=DBSession.query(Adjuntos).filter_by(idItem=item.id).all()
            
        for adj in adjuntositemeditado:
                
            log.debug("adj: %s" %adj)
            itemnuevoadjunto=Adjuntos()
            itemnuevoadjunto.idItem=item2.id
            itemnuevoadjunto.filename=adj.filename
            itemnuevoadjunto.filecontent=adj.filecontent
            DBSession.add(itemnuevoadjunto)
            
            
        
        """Copia las relaciones """
        relaciones = DBSession.query(RelacionItem.idItem1,RelacionItem.idItem2).filter((RelacionItem.idItem2==item.id) | (RelacionItem.idItem1==item.id)).all()
        longitud = len(relaciones)
        
        for x in range(longitud):
            newRelation=RelacionItem()
            
            if int(item.id) == int(relaciones[x][0]):
                newRelation.idItem1=int(item2.id)
                newRelation.idItem2=relaciones[x][1]
                DBSession.add(newRelation)
                #self.provider.create(RelacionItem, params=newRelation)
            elif int(item.id) == int(relaciones[x][1]):
                newRelation.idItem1=relaciones[x][0]
                newRelation.idItem2=int(item2.id)
                DBSession.add(newRelation)
        
        redirect('../'+'../item/?fid=' + str(item.idFase))

    @without_trailing_slash
    @expose('tgext.crud.templates.new')
    def new(self, *args, **kw):
        """Display a page to show a new record."""
        tmpl_context.widget = self.new_form
        return dict(value=kw, model=self.model.__name__)

    @catch_errors(errors, error_handler=new)
    @expose()
    @registered_validate(error_handler=new)
    def post(self, *args, **kw):
        self.provider.create(self.model, params=kw)
        #########
        #if len(kw['idproyec']) > 0:
        #   raise redirect('./?pid='+kw['idproyec'])
        #else:
        #    if len(kw['idFase']) > 0:
        #        raise redirect('./?fid='+kw['idFase'])
        #    else:
        #        raise redirect('./')
        #########
        raise redirect('./')
    @expose()
    @registered_validate(error_handler=edit)
    @catch_errors(errors, error_handler=edit)
    def put(self, *args, **kw):
        """update"""
        pks = self.provider.get_primary_fields(self.model)
        for i, pk in enumerate(pks):
            if pk not in kw and i < len(args):
                kw[pk] = args[i]

        self.provider.update(self.model, params=kw)
        redirect('../' * len(pks))

    @expose()
    def post_delete(self, *args, **kw):
        """This is the code that actually deletes the record"""
        pks = self.provider.get_primary_fields(self.model)
        d = {}
        for i, arg in enumerate(args):
            d[pks[i]] = arg
        self.provider.delete(self.model, d)
        redirect('./' + '../' * (len(pks) - 1))

    @expose('tgext.crud.templates.get_delete')
    def get_delete(self, *args, **kw):
        """This is the code that creates a confirm_delete page"""
        return dict(args=args)
Exemple #24
0
class ApiCrudRestController(BaseController, RestController):
    allow_only = predicates.not_anonymous()
    omit_fields = ['user', '_user_id']
    model = None

    def __init__(self):
        super().__init__()
        self.provider = ProviderTypeSelector().get_selector(self.model).get_provider(self.model, hint=db)

        # if not hasattr(self, 'new_form'):
        # class EditForm(EditableForm):
        #         __entity__ = self.model
        #         __omit_fields__ = self.omit_fields
        #
        #     self.edit_form = EditForm(session)
        #
        # register_validators(self, 'post', self.new_form)
        #
        # if not hasattr(self, 'edit_form'):
        #     class NewForm(AddRecordForm):
        #         __entity__ = self.model
        #         __omit_fields__ = self.omit_fields
        #
        #     self.new_form = NewForm(session)
        #
        # register_validators(self, 'put', self.edit_form)

    def _dictify(self, value):
        if self.omit_fields is False:
            return value

        def _dictify(entity):
            if hasattr(entity, '__json__'):
                return entity.__json__()
            else:
                return self.provider.dictify(entity, omit_fields=self.omit_fields)

        if isinstance(value, list):
            # return a generator, we don't want to consume the whole query
            return (_dictify(entity) for entity in value)
        else:
            return _dictify(value)

    def _before(self, *args, **kw):
        pass
        # if request.response_type != 'application/json':
        # abort(406, 'Only JSON requests are supported')

    def _prepare_query(self):
        return db.query(self.model).with_parent(request.identity["user"])

    def _filter_query(self, query, limit=0, offset=0, order_by="", pagesize=10, page=0, filter="", **kw):
        if limit:
            query = query.limit(limit)

        if limit and offset:
            query = query.offset(offset)

        if order_by:
            for col in [col.split("|") for col in order_by.split(";")]:
                field_name = col[0]
                if not hasattr(self.model, field_name):
                    continue
                field = getattr(self.model, field_name)
                if len(col) == 2:
                    strategy = col[1].lower()
                    if strategy == "asc":
                        field = field.asc()
                    if strategy == "desc":
                        field = field.desc()
                query = query.order_by(field)

        # TODO: pagesize=10&page=1
        # TODO: filter={ field: { $gt: value1, $lt: value2 } }

        return query

    @expose('json')
    def get_all(self, **kw):
        """
            model?limit=5
            model?limit=5&offset=2
            model?order_by=amount
            model?order_by=date|desc;amount|desc
            model?pagesize=10&page=1

        :param kw:
        :return:
        """
        query = self._prepare_query(**kw)
        filtered_query = self._filter_query(query, **kw)

        entities = filtered_query.all()

        if entities is None:
            abort(404, 'Not found')

        return {'value_list': self._dictify(entities), 'total_entries': query.count(), 'entries': filtered_query.count()}

    @expose('json')
    def get_one(self, id, **kw):
        entity = self._prepare_query(**kw).filter(self.model.id == id).first()

        if entity is None:
            abort(404, 'Not found')

        return {'value': self._dictify(entity)}

    @expose('json')
    # @registered_validate()
    def post(self, **kw):
        # if request.response_type != 'application/json':
        # abort(406, 'Only JSON requests are supported')

        if request.validation['errors']:
            return "There was an error"

        entity = self.model(**request.json_body)
        entity._user_id = request.identity["user"].id
        db.add(entity)
        db.flush()

        return self.get_one(entity.id, **kw)

    @expose('json')
    # @registered_validate()
    def put(self, id, **kw):
        # if request.response_type != 'application/json':
        # abort(406, 'Only JSON requests are supported')

        entity = self._prepare_query(**kw).filter(self.model.id == id).first()

        if not entity:
            response.status_code = 404
            return {'error': 'no exists'}

        for key, value in request.json_body.items():
            setattr(entity, key, value)

        db.flush()

        return self.get_one(id, **kw)

    @expose('json')
    def post_delete(self, id, **kw):
        self._prepare_query(**kw).filter(self.model.id == id).delete()
Exemple #25
0
 def __init__(self):
     super().__init__()
     self.provider = ProviderTypeSelector().get_selector(self.model).get_provider(self.model, hint=db)
Exemple #26
0
                __entity__ = self.model

            self.new_filler_type = NewFiller

    def __init__(self, model, translations=None, **kw):
        super(CrudRestControllerConfig, self).__init__()

        self.model = model
        self._do_init_with_translations(translations)
        self._post_init()

    def _do_init_with_translations(self, translations):
        pass


provider_type_selector = ProviderTypeSelector()


class AdminConfig(object):
    """
    :class attributes:

        **layout**
            The look and feel of the admin.
            Three builtin layouts are available: ``tgext.admin.layouts.BasicAdminLayout``,
            ``tgext.admin.layouts.BootstrapAdminLayout`` and
            ``tgext.admin.layouts.GroupedBootstrapAdminLayout``.

            .. note::
                ``GroupedBootstrapAdminLayout`` only works with the Genshi and Kajiki
                template languages, so it cannot be used when quickstarting with Jinja or Mako.
Exemple #27
0
class CrudRestController(RestController):
    """
    :variables:

    session
      database session (drives drop-down menus

    menu_items
      Dictionary of links to other models in the form model_items[lower_model_name] = Model

    title
      Title to be used for each page.  default: Turbogears Admin System

    :modifiers:

    model
      Model this class is associated with

    table
      Widget for the table display

    table_filler
      Class instance with get_value() that defines the JSon stream for the table

    edit_form
      Form to be used for editing the model

    edit_filler
      Class instance with a get_value() that defines how we get information for a single
      existing record

    new_form
      Form that defines how we create a form for new data entry.

    :Attributes:

      menu_items
        Dictionary of associated Models (used for menu)
      provider
        sprox provider for data manipulation
      session
        link to the database
    """

    title = "Turbogears Admin System"
    keep_params = None
    remember_values = []
    style = literal('''
#menu_items {
  padding:0px 12px 0px 2px;
  list-style-type:None;
  padding-left:0px;
}

#crud_leftbar {
    float:left;
    padding-left:0px;
}

#crud_content {
    float:left;
    width:80%;
}

#crud_content > h1,
.crud_edit > h2,
.crud_add > h2 {
    margin-top: 1px;
}

#crud_btn_new {
    margin:1ex 0;
}

#crud_btn_new > span {
    margin-left:2em;
}

#crud_search {
    float: right;
}

#crud_search input {
    border: 1px solid #CCC;
    background-color: white;
}

#crud_search input:hover {
    background-color: #EFEFEF;
}
''')

    def _before(self, *args, **kw):
        tmpl_context.title = self.title
        tmpl_context.menu_items = self.menu_items
        tmpl_context.kept_params = self._kept_params()
        tmpl_context.crud_helpers = self.helpers
        tmpl_context.crud_style = self.style

    def __before__(self, *args, **kw):
        # this will be removed in 2.2.*
        tmpl_context.menu_items = self.menu_items
        tmpl_context.title = self.title
        tmpl_context.kept_params = self._kept_params()
        tmpl_context.crud_helpers = self.helpers
        tmpl_context.crud_style = self.style

    def _mount_point(self):
        try:
            mount_point = self.mount_point
        except:
            mount_point = None

        if not mount_point:
            #non statically mounted or Old TurboGears, use relative URL
            mount_point = '.'

        return mount_point

    def _kept_params(self):
        if not self.keep_params:
            return {}

        if not request.referer:
            from_referer = {}
        else:
            parsed = urlparse.urlparse(request.referer)
            from_referer = dict(cgi.parse_qsl(parsed.query))
        from_referer.update(request.params)

        pass_params = {}
        for k in self.keep_params:
            if k in from_referer:
                pass_params[k] = from_referer[k]
        return pass_params

    def _adapt_menu_items(self, menu_items):
        adapted_menu_items = {}

        for link, model in menu_items.iteritems():
            if inspect.isclass(model):
                adapted_menu_items[link + 's'] = model.__name__
            else:
                adapted_menu_items[link] = model
        return adapted_menu_items

    def __init__(self, session, menu_items=None):
        if menu_items is None:
            menu_items = {}
        self.menu_items = self._adapt_menu_items(menu_items)
        self.helpers = CrudRestControllerHelpers()
        self.provider = ProviderTypeSelector().get_selector(self.model).get_provider(self.model, hint=session)
        
        self.session = session

        #this makes crc declarative
        check_types = ['new_form', 'edit_form', 'table', 'table_filler', 'edit_filler']
        for type_ in check_types:
            if not hasattr(self, type_) and hasattr(self, type_+'_type'):
                setattr(self, type_, getattr(self, type_+'_type')(self.session))

        if hasattr(self, 'new_form'):
            #register the validators since they are none from the parent class
            register_validators(self, 'post', self.new_form)
        if hasattr(self, 'edit_form'):
            register_validators(self, 'put', self.edit_form)

    @with_trailing_slash
    @expose('genshi:tgext.crud.templates.get_all')
    @expose('mako:tgext.crud.templates.get_all')
    @expose('jinja:tgext.crud.templates.get_all')
    @expose('json')
    @paginate('value_list', items_per_page=7)
    def get_all(self, *args, **kw):
        """Return all records.
           Pagination is done by offset/limit in the filler method.
           Returns an HTML page with the records if not json.
        """
        if tg.request.response_type == 'application/json':
            return self.table_filler.get_value(**kw)

        if not getattr(self.table.__class__, '__retrieves_own_value__', False):
            kw.pop('limit', None)
            kw.pop('offset', None)

            if isinstance(self.table_filler, RequestLocalTableFiller):
                paginator = request.paginators['value_list']
                page = paginator.paginate_page - 1
                values = self.table_filler.get_value(offset=page*paginator.paginate_items_per_page,
                                                     limit=paginator.paginate_items_per_page,
                                                     **kw)
                values = SmartPaginationCollection(values, self.table_filler.__count__)
            else:
                values = self.table_filler.get_value(**kw)
        else:
            values = []

        tmpl_context.widget = self.table
        headers = get_table_headers(self.table)
        return dict(model=self.model.__name__, value_list=values,
                    mount_point=self._mount_point(),
                    headers=headers)

    @expose('genshi:tgext.crud.templates.get_one')
    @expose('mako:tgext.crud.templates.get_one')
    @expose('jinja:tgext.crud.templates.get_one')
    @expose('json')
    def get_one(self, *args, **kw):
        """get one record, returns HTML or json"""
        #this would probably only be realized as a json stream
        tmpl_context.widget = self.edit_form
        pks = self.provider.get_primary_fields(self.model)
        kw = {}
        for i, pk in  enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        return dict(value=value,model=self.model.__name__)

    @expose('genshi:tgext.crud.templates.edit')
    @expose('mako:tgext.crud.templates.edit')
    @expose('jinja:tgext.crud.templates.edit')
    def edit(self, *args, **kw):
        """Display a page to edit the record."""
        tmpl_context.widget = self.edit_form
        pks = self.provider.get_primary_fields(self.model)
        kw = {}
        for i, pk in  enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        value['_method'] = 'PUT'
        return dict(value=value, model=self.model.__name__, pk_count=len(pks))

    @without_trailing_slash
    @expose('genshi:tgext.crud.templates.new')
    @expose('mako:tgext.crud.templates.new')
    @expose('jinja:tgext.crud.templates.new')
    def new(self, *args, **kw):
        """Display a page to show a new record."""
        tmpl_context.widget = self.new_form
        return dict(value=kw, model=self.model.__name__)

    @catch_errors(errors, error_handler=new)
    @expose()
    @registered_validate(error_handler=new)
    def post(self, *args, **kw):
        self.provider.create(self.model, params=kw)
        raise redirect('./', params=self._kept_params())

    @expose()
    @registered_validate(error_handler=edit)
    @catch_errors(errors, error_handler=edit)
    def put(self, *args, **kw):
        """update"""
        pks = self.provider.get_primary_fields(self.model)
        for i, pk in enumerate(pks):
            if pk not in kw and i < len(args):
                kw[pk] = args[i]

        omit_fields = []
        if getattr(self, 'edit_form', None):
            omit_fields.extend(self.edit_form.__omit_fields__)

        for remembered_value in self.remember_values:
            value = kw.get(remembered_value)
            if value is None or value == '':
                omit_fields.append(remembered_value)

        self.provider.update(self.model, params=kw, omit_fields=omit_fields)
        redirect('../' * len(pks), params=self._kept_params())

    @expose()
    def post_delete(self, *args, **kw):
        """This is the code that actually deletes the record"""
        pks = self.provider.get_primary_fields(self.model)
        d = {}
        for i, arg in enumerate(args):
            d[pks[i]] = arg
        self.provider.delete(self.model, d)
        redirect('./' + '../' * (len(pks) - 1), params=self._kept_params())

    @expose('genshi:tgext.crud.templates.get_delete')
    @expose('jinja:tgext.crud.templates.get_delete')
    def get_delete(self, *args, **kw):
        """This is the code that creates a confirm_delete page"""
        return dict(args=args)
Exemple #28
0
class CrudRestController(RestController):
    """
    :variables:

    session
      database session (drives drop-down menus

    menu_items
      Dictionary of links to other models in the form model_items[lower_model_name] = Model

    title
      Title to be used for each page.  default: Turbogears Admin System

    :modifiers:

    model
      Model this class is associated with

    table
      Widget for the table display

    table_filler
      Class instance with get_value() that defines the JSon stream for the table

    edit_form
      Form to be used for editing the model

    edit_filler
      Class instance with a get_value() that defines how we get information for a single
      existing record

    new_form
      Form that defines how we create a form for new data entry.

    :Attributes:

      menu_items
        Dictionary of associated Models (used for menu)
      provider
        sprox provider for data manipulation
      session
        link to the database
    """

    title = "Turbogears Admin System"

    def _before(self, *args, **kw):
        tmpl_context.title = self.title
        tmpl_context.menu_items = self.menu_items

    def __before__(self, *args, **kw):
        # this will be removed in 2.1.*
        tmpl_context.menu_items = self.menu_items
        tmpl_context.title = self.title

    def __init__(self, session, menu_items=None):
        if menu_items is None:
            menu_items = {}
        self.menu_items = menu_items
        self.provider = ProviderTypeSelector().get_selector(self.model).get_provider(self.model, hint=session)

        self.session = session

        #this makes crc declarative
        check_types = ['new_form', 'edit_form', 'table', 'table_filler', 'edit_filler']
        for type_ in check_types:
            if not hasattr(self, type_) and hasattr(self, type_+'_type'):
                setattr(self, type_, getattr(self, type_+'_type')(self.session))

        if hasattr(self, 'new_form'):
            #register the validators since they are none from the parent class
            register_validators(self, 'post', self.new_form)
            
        if hasattr(self, 'edit_form'):
            register_validators(self, 'put', self.edit_form)

    @with_trailing_slash
    @expose('tgext.crud.templates.get_all')
    @expose('json')
    @paginate('value_list', items_per_page=7)
    def get_all(self, *args, **kw):
        
        
        """Return all records.
           Pagination is done by offset/limit in the filler method.
           Returns an HTML page with the records if not json.
        """
        
        if pylons.request.response_type == 'application/json':
            return self.table_filler.get_value(**kw)

        if not getattr(self.table.__class__, '__retrieves_own_value__', False):
            values = self.table_filler.get_value(**kw)
        else:
            values = []
            
        longitud=len(values)
        for fila in range(longitud):
            complejidad = int(values[fila]['complejidad'])
            values[fila]['idFase'] = DBSession.query(Fase.nombre).filter_by(id = values[fila]['idFase']).first()
            lineabase = values[fila]['idLineaBase']
            
            if lineabase != 'None':
                values[fila]['idLineaBase'] = DBSession.query(LineaBase.nombre)\
                                                .filter_by(id=lineabase).first()
            else:
                values[fila]['idLineaBase'] = 'Sin linea base'
            
            if (complejidad == 1):
                values[fila]['complejidad'] = 'Muy baja (1)'
            elif (complejidad == 2):
                values[fila]['complejidad'] = 'Baja (2)'
            elif (complejidad == 3):
                values[fila]['complejidad'] = 'Media (3)'
            elif (complejidad == 4):
                values[fila]['complejidad'] = 'Alta (4)'
            else:
                values[fila]['complejidad'] = 'Muy alta (5)'
                

        tmpl_context.widget = self.table
        return dict(model=self.model.__name__, value_list=values)

    @expose('tgext.crud.templates.get_one')
    @expose('json')
    def get_one(self, *args, **kw):
        """get one record, returns HTML or json"""
        #this would probably only be realized as a json stream
        
        tmpl_context.widget = self.edit_form
        pks = self.provider.get_primary_fields(self.model)
        kw = {}
        for i, pk in  enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        return dict(value=value,model=self.model.__name__)

    @expose('sap.templates.desarrollar.item.edit')
    #@expose("sap.templates.desarrollar.item.get_all")
    def edit(self, *args, **kw):
        """Display a page to edit the record."""
        tmpl_context.widget = self.edit_form
        pks = self.provider.get_primary_fields(self.model)
        kw = {}
        for i, pk in  enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        
        value['_method'] = 'PUT'
        return dict(value=value, model=self.model.__name__, pk_count=len(pks))
    
    
    @without_trailing_slash
    #@expose('tgext.crud.templates.new')
    @expose('sap.templates.desarrollar.item.new')
    def new(self,tid=None ,*args, **kw):
        """Display a page to show a new record."""
        
        
        fid= DBSession.query(TipoDeItem.idFase).filter_by(id=tid).first()
        """Extra los campos del tipo de Item elegido """
        
        
        """fields=[]
        campotipo= DBSession.query(Campos.tipoDeDato, Campos.nombre).filter_by(idTipoDeItem=13).all()
        for ct in campotipo:
            #log.debug(ct[1])
            campo1 = TextField(ct[1], label_text= ct[1])
            fields.append(campo1)
        
        item_add_form = ItemForm('create_item_form', fields)
        
        tmpl_context.widget = item_add_form
        """
        tmpl_context.widget = self.new_form
        #return dict(value=kw, model=self.model.__name__)
        
        #child_args=dict(child_args=form_fields_dict)
        
        
        
        return dict(value={'idTipoDeItem':tid, 'idFase':fid,  },model=self.model.__name__)

    @catch_errors(errors, error_handler=new)
    @expose()
    @registered_validate(error_handler=new)
    def post(self, *args, **kw):
        """extrae el numhistorial ordenado sin repetir, para luego tomar el mayor valor y asi 
        poder asignarle un numhistorial mayor
        """
        num=[x for x in (DBSession.query(Item.nrohistorial).order_by(Item.nrohistorial.desc()).distinct())]
        
        """Por cada Item creado, aumenta el nrohistorial en una unidad """
        
        if num != None  and len(num)>0:
            kw['nrohistorial']=int(num[0][0]) + 1
        else:
            kw['nrohistorial']=1
            
        fase = DBSession.query(Fase).filter_by(id=kw['idFase']).first()
        
        if str(fase.estado).__eq__('inicial'):
            fase.estado = 'desarrollo'
        elif str(fase.estado).__eq__('lineaBaseTotal'):
            fase.estado = 'lineaBaseParcial'
        
        #self.provider.create(self.model, params=kw)
        
        raise redirect('./?fid='+kw['idFase'])
        

    @expose()
    @registered_validate(error_handler=edit)
    @catch_errors(errors, error_handler=edit)
    def put(self, *args, **kw):
        """update"""
        
        pks = self.provider.get_primary_fields(self.model)
        for i, pk in enumerate(pks):
            if pk not in kw and i < len(args):
                kw[pk] = args[i]
        
        
        """Extrae todos los valores del item a modificar, para luego crear un nuevo item"""
        
        valoresItem=DBSession.query(Item.version ,Item.idTipoDeItem ,Item.idFase ,Item.idLineaBase ,Item.fechaCreacion ,Item.nrohistorial,Item.ultimaversion).filter_by(id=kw['id']).first()
        
        """Se crea una lista, y se le agrega los valores que tendra el item. """
        nuevo={}
        nuevo['version']=valoresItem[0]+1
        nuevo['idTipoDeItem']=valoresItem[1]
        nuevo['idFase']=valoresItem[2]
        nuevo['idLineaBase']=valoresItem[3]
        nuevo['fechaCreacion']=str(valoresItem[4])
        nuevo['nrohistorial']=valoresItem[5]
        nuevo['ultimaversion']=valoresItem[6]
        nuevo['estado']='modificado'
        nuevo['complejidad']=kw['complejidad']
        nuevo['nombre']=kw['nombre']
        itemnuevo=self.provider.create(self.model, params=nuevo)
        
        """Realiza copia de los valores de los atributos especificos"""
        itemeditado=DBSession.query(Item).filter_by(id=kw['id']).first()    
        atributoeditado=DBSession.query(DetalleItem).filter_by(iditem=itemeditado.id).all()
            
        for objeto in atributoeditado:
            nuevoDetalle=DetalleItem()
            nuevoDetalle.tipo=objeto.tipo
            nuevoDetalle.nombrecampo=objeto.nombrecampo
            nuevoDetalle.valor=objeto.valor
            nuevoDetalle.iditem=itemnuevo.id
            DBSession.add(nuevoDetalle)
                
        """Realiza copia de los adjuntos"""
        adjuntositemeditado=DBSession.query(Adjuntos).filter_by(idItem=itemeditado.id).all()
        
        for adj in adjuntositemeditado:
            itemnuevoadjunto=Adjuntos()
            itemnuevoadjunto.idItem=itemnuevo.id
            itemnuevoadjunto.filename=adj.filename
            itemnuevoadjunto.filecontent=adj.filecontent
            DBSession.add(itemnuevoadjunto)
        """-----------------------------"""
        
        itemeditado=DBSession.query(Item).filter_by(id=kw['id']).first()
        itemeditado.ultimaversion=0
        itemnuevo=DBSession.query(Item.id).filter_by(nrohistorial=nuevo['nrohistorial'], ultimaversion=1).first()
        relaciones = DBSession.query(RelacionItem.idItem1,RelacionItem.idItem2).filter((RelacionItem.idItem2==itemeditado.id) | (RelacionItem.idItem1==itemeditado.id)).all()
        
        longitud = len(relaciones)
        newRelation = {}
        
        for x in range(longitud):
            if int(itemeditado.id) == int(relaciones[x][0]):
                newRelation['idItem1']=int(itemnuevo[0])
                newRelation['idItem2']=relaciones[x][1]
                self.provider.create(RelacionItem, params=newRelation)
            elif int(itemeditado.id) == int(relaciones[x][1]):
                newRelation['idItem1']=relaciones[x][0]
                newRelation['idItem2']=int(itemnuevo[0])
                self.provider.create(RelacionItem, params=newRelation)

        ids=[]
        ids.append(int(itemnuevo[0]))
        self.recorrerArbolAtras(ids, int(itemnuevo[0]))
        self.recorrerArbolAdelante(ids, int(itemnuevo[0]))
        ids.remove(int(itemnuevo[0]))
        longitudids = len(ids)

        for x in range(longitudids):
            itemrevision = DBSession.query(Item).filter_by(id=ids[x], ultimaversion=1).first()
            
            if itemrevision != None:
                if itemrevision.estado != 'modificado':
                    itemrevision.estado = 'revision'
                    if itemrevision.idLineaBase != None:
                        lineabase = DBSession.query(LineaBase).filter_by(id=itemrevision.idLineaBase).first()
                        if lineabase.estado == 'cerrada':
                            lineabase.estado = 'comprometida'
                            listalineabase = DBSession.query(LineaBase).filter_by(idFase = lineabase.idFase).all()
                            desarrollo = True
                            longitud = len(listalineabase)
                            
                            for y in range (longitud):
                                if str(listalineabase[y].estado).__eq__('cerrada'):
                                    desarrollo = False
                                    
                            if desarrollo:
                                fase = DBSession.query(Fase).filter_by(id = lineabase.idFase).first()
                                fase.estado = 'desarrollo'

        flash("El item \"" +kw['nombre'] +"\" ha sido modificado correctamente")
            
        redirect('../' +'../item/?fid=' + str(nuevo['idFase']))
    
    """---------------------- Recorrer Arbol Atras -------------------------------------
    Uso:
        self.recorrerArbol (ids, iid)
        ids: un vector que contiene primeramente al nodo inicial
        iid: nodo inicial
        Todos los nodos del arbol quedaran guardados en ids---------------------------"""
    def recorrerArbolAtras (self, *args):
        ids = args[0]
        itemraiz = args[1]

        """-------------Obtiene de la BD las relaciones actuales del nodo en cuestion---"""
        relaciones = DBSession.query(RelacionItem.idItem1,RelacionItem.idItem2).\
                        filter((RelacionItem.idItem1==itemraiz)).all()
        """------------------------------------------------------------------------"""
        
        for relacion in relaciones:
            itemrelacion = DBSession.query(Item).filter_by(id=relacion.idItem2).first()
            
            if itemrelacion.ultimaversion == 1:
                if (ids.count(itemrelacion.id) < 1):
                        ids.append(itemrelacion.id)
                self.recorrerArbolAtras(ids, itemrelacion.id)

    """------------------- Fin Recorrer Arbol Atras -----------------------------------"""
    
    """-------------------- Recorrer Arbol Adelante -------------------------------------
    Uso:
        self.recorrerArbol (ids, iid)
        ids: un vector que contiene primeramente al nodo inicial
        iid: nodo inicial
        Todos los nodos del arbol quedaran guardados en ids---------------------------"""
    def recorrerArbolAdelante (self, *args):
        ids = args[0]
        itemraiz = args[1]

        """-------------Obtiene de la BD las relaciones actuales del nodo en cuestion---"""
        relaciones = DBSession.query(RelacionItem.idItem1,RelacionItem.idItem2).\
                        filter((RelacionItem.idItem2==itemraiz)).all()
        """------------------------------------------------------------------------"""
        
        for relacion in relaciones:
            itemrelacion = DBSession.query(Item).filter_by(id=relacion.idItem1).first()
            
            if itemrelacion.ultimaversion == 1:
                if (ids.count(itemrelacion.id) < 1):
                        ids.append(itemrelacion.id)

                self.recorrerArbolAdelante(ids, itemrelacion.id)
        
    """---------------------- Fin Recorrer Arbol Adelante -----------------------------"""

    @expose()
    def post_delete(self, *args, **kw):
        """This is the code that actually deletes the record"""
        pks = self.provider.get_primary_fields(self.model)
        d = {}
        for i, arg in enumerate(args):
            d[pks[i]] = arg
            
        """extraer el idFase para poder retornar en el estado anterior """
        idfase= DBSession.query(Item.idFase).filter_by(id=d['id']).first()
        """------------------------------------------------------------"""
        
        """Se crea objeto y cambia de estado """
        itemeDelete=DBSession.query(Item).filter_by(id=d['id']).first()
        itemeDelete.estado="borrado"
        itemeDelete.ultimaversion=0
        
        DBSession.add(itemeDelete)
        
        """---------Se borra las relaciones del Item Borrado--------------"""
        
        relaciones= DBSession.query(RelacionItem).filter((RelacionItem.idItem1==d['id']) | (RelacionItem.idItem2==d['id'])).all()
        
        longitud=len(relaciones)
        
        for x in range(longitud):
            DBSession.delete(relaciones[x])
        
        """---------------------------------------------------------------"""
        
        #self.provider.delete(self.model, d)
        
        #self.provider.delete(self.model, d)
        
        #redirect('./' + '../' * (len(pks) - 1))
        raise redirect('/item/?fid='+str(idfase[0]))

    @expose('tgext.crud.templates.get_delete')
    def get_delete(self, *args, **kw):
        """This is the code that creates a confirm_delete page"""
        return dict(args=args)
Exemple #29
0
class CrudRestController(RestController):
    """
    :variables:

    session
      database session (drives drop-down menus

    menu_items
      Dictionary of links to other models in the form model_items[lower_model_name] = Model

    title
      Title to be used for each page.  default: Turbogears Admin System

    :modifiers:

    model
      Model this class is associated with

    table
      Widget for the table display

    table_filler
      Class instance with get_value() that defines the JSon stream for the table

    edit_form
      Form to be used for editing the model

    edit_filler
      Class instance with a get_value() that defines how we get information for a single
      existing record

    new_form
      Form that defines how we create a form for new data entry.

    :Attributes:

      menu_items
        Dictionary of associated Models (used for menu)
      provider
        sprox provider for data manipulation
      session
        link to the database
    """

    title = "Turbogears Admin System"

    def _before(self, *args, **kw):
        tmpl_context.title = self.title
        tmpl_context.menu_items = self.menu_items

    def __before__(self, *args, **kw):
        # this will be removed in 2.1.*
        tmpl_context.menu_items = self.menu_items
        tmpl_context.title = self.title

    def __init__(self, session, menu_items=None):
        if menu_items is None:
            menu_items = {}
        self.menu_items = menu_items
        self.provider = ProviderTypeSelector().get_selector(
            self.model).get_provider(self.model, hint=session)

        self.session = session

        #this makes crc declarative
        check_types = [
            'new_form', 'edit_form', 'table', 'table_filler', 'edit_filler'
        ]
        for type_ in check_types:
            if not hasattr(self, type_) and hasattr(self, type_ + '_type'):
                setattr(self, type_,
                        getattr(self, type_ + '_type')(self.session))

        if hasattr(self, 'new_form'):
            #register the validators since they are none from the parent class
            register_validators(self, 'post', self.new_form)

        if hasattr(self, 'edit_form'):
            register_validators(self, 'put', self.edit_form)

    @with_trailing_slash
    @expose('tgext.crud.templates.get_all')
    @expose('json')
    @paginate('value_list', items_per_page=7)
    def get_all(self, *args, **kw):
        """Return all records.
           Pagination is done by offset/limit in the filler method.
           Returns an HTML page with the records if not json.
        """

        if pylons.request.response_type == 'application/json':
            return self.table_filler.get_value(**kw)

        if not getattr(self.table.__class__, '__retrieves_own_value__', False):
            values = self.table_filler.get_value(**kw)
        else:
            values = []

        longitud = len(values)
        for fila in range(longitud):
            complejidad = int(values[fila]['complejidad'])
            values[fila]['idFase'] = DBSession.query(
                Fase.nombre).filter_by(id=values[fila]['idFase']).first()
            lineabase = values[fila]['idLineaBase']

            if lineabase != 'None':
                values[fila]['idLineaBase'] = DBSession.query(LineaBase.nombre)\
                                                .filter_by(id=lineabase).first()
            else:
                values[fila]['idLineaBase'] = 'Sin linea base'

            if (complejidad == 1):
                values[fila]['complejidad'] = 'Muy baja (1)'
            elif (complejidad == 2):
                values[fila]['complejidad'] = 'Baja (2)'
            elif (complejidad == 3):
                values[fila]['complejidad'] = 'Media (3)'
            elif (complejidad == 4):
                values[fila]['complejidad'] = 'Alta (4)'
            else:
                values[fila]['complejidad'] = 'Muy alta (5)'

        tmpl_context.widget = self.table
        return dict(model=self.model.__name__, value_list=values)

    @expose('tgext.crud.templates.get_one')
    @expose('json')
    def get_one(self, *args, **kw):
        """get one record, returns HTML or json"""
        #this would probably only be realized as a json stream

        tmpl_context.widget = self.edit_form
        pks = self.provider.get_primary_fields(self.model)
        kw = {}
        for i, pk in enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        return dict(value=value, model=self.model.__name__)

    @expose('sap.templates.desarrollar.item.edit')
    #@expose("sap.templates.desarrollar.item.get_all")
    def edit(self, *args, **kw):
        """Display a page to edit the record."""
        tmpl_context.widget = self.edit_form
        pks = self.provider.get_primary_fields(self.model)
        kw = {}
        for i, pk in enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)

        value['_method'] = 'PUT'
        return dict(value=value, model=self.model.__name__, pk_count=len(pks))

    @without_trailing_slash
    #@expose('tgext.crud.templates.new')
    @expose('sap.templates.desarrollar.item.new')
    def new(self, tid=None, *args, **kw):
        """Display a page to show a new record."""

        fid = DBSession.query(TipoDeItem.idFase).filter_by(id=tid).first()
        """Extra los campos del tipo de Item elegido """
        """fields=[]
        campotipo= DBSession.query(Campos.tipoDeDato, Campos.nombre).filter_by(idTipoDeItem=13).all()
        for ct in campotipo:
            #log.debug(ct[1])
            campo1 = TextField(ct[1], label_text= ct[1])
            fields.append(campo1)
        
        item_add_form = ItemForm('create_item_form', fields)
        
        tmpl_context.widget = item_add_form
        """
        tmpl_context.widget = self.new_form
        #return dict(value=kw, model=self.model.__name__)

        #child_args=dict(child_args=form_fields_dict)

        return dict(value={
            'idTipoDeItem': tid,
            'idFase': fid,
        },
                    model=self.model.__name__)

    @catch_errors(errors, error_handler=new)
    @expose()
    @registered_validate(error_handler=new)
    def post(self, *args, **kw):
        """extrae el numhistorial ordenado sin repetir, para luego tomar el mayor valor y asi 
        poder asignarle un numhistorial mayor
        """
        num = [
            x for x in (DBSession.query(Item.nrohistorial).order_by(
                Item.nrohistorial.desc()).distinct())
        ]
        """Por cada Item creado, aumenta el nrohistorial en una unidad """

        if num != None and len(num) > 0:
            kw['nrohistorial'] = int(num[0][0]) + 1
        else:
            kw['nrohistorial'] = 1

        fase = DBSession.query(Fase).filter_by(id=kw['idFase']).first()

        if str(fase.estado).__eq__('inicial'):
            fase.estado = 'desarrollo'
        elif str(fase.estado).__eq__('lineaBaseTotal'):
            fase.estado = 'lineaBaseParcial'

        #self.provider.create(self.model, params=kw)

        raise redirect('./?fid=' + kw['idFase'])

    @expose()
    @registered_validate(error_handler=edit)
    @catch_errors(errors, error_handler=edit)
    def put(self, *args, **kw):
        """update"""

        pks = self.provider.get_primary_fields(self.model)
        for i, pk in enumerate(pks):
            if pk not in kw and i < len(args):
                kw[pk] = args[i]
        """Extrae todos los valores del item a modificar, para luego crear un nuevo item"""

        valoresItem = DBSession.query(
            Item.version, Item.idTipoDeItem, Item.idFase, Item.idLineaBase,
            Item.fechaCreacion, Item.nrohistorial,
            Item.ultimaversion).filter_by(id=kw['id']).first()
        """Se crea una lista, y se le agrega los valores que tendra el item. """
        nuevo = {}
        nuevo['version'] = valoresItem[0] + 1
        nuevo['idTipoDeItem'] = valoresItem[1]
        nuevo['idFase'] = valoresItem[2]
        nuevo['idLineaBase'] = valoresItem[3]
        nuevo['fechaCreacion'] = str(valoresItem[4])
        nuevo['nrohistorial'] = valoresItem[5]
        nuevo['ultimaversion'] = valoresItem[6]
        nuevo['estado'] = 'modificado'
        nuevo['complejidad'] = kw['complejidad']
        nuevo['nombre'] = kw['nombre']
        itemnuevo = self.provider.create(self.model, params=nuevo)
        """Realiza copia de los valores de los atributos especificos"""
        itemeditado = DBSession.query(Item).filter_by(id=kw['id']).first()
        atributoeditado = DBSession.query(DetalleItem).filter_by(
            iditem=itemeditado.id).all()

        for objeto in atributoeditado:
            nuevoDetalle = DetalleItem()
            nuevoDetalle.tipo = objeto.tipo
            nuevoDetalle.nombrecampo = objeto.nombrecampo
            nuevoDetalle.valor = objeto.valor
            nuevoDetalle.iditem = itemnuevo.id
            DBSession.add(nuevoDetalle)
        """Realiza copia de los adjuntos"""
        adjuntositemeditado = DBSession.query(Adjuntos).filter_by(
            idItem=itemeditado.id).all()

        for adj in adjuntositemeditado:
            itemnuevoadjunto = Adjuntos()
            itemnuevoadjunto.idItem = itemnuevo.id
            itemnuevoadjunto.filename = adj.filename
            itemnuevoadjunto.filecontent = adj.filecontent
            DBSession.add(itemnuevoadjunto)
        """-----------------------------"""

        itemeditado = DBSession.query(Item).filter_by(id=kw['id']).first()
        itemeditado.ultimaversion = 0
        itemnuevo = DBSession.query(Item.id).filter_by(
            nrohistorial=nuevo['nrohistorial'], ultimaversion=1).first()
        relaciones = DBSession.query(
            RelacionItem.idItem1, RelacionItem.idItem2).filter(
                (RelacionItem.idItem2 == itemeditado.id)
                | (RelacionItem.idItem1 == itemeditado.id)).all()

        longitud = len(relaciones)
        newRelation = {}

        for x in range(longitud):
            if int(itemeditado.id) == int(relaciones[x][0]):
                newRelation['idItem1'] = int(itemnuevo[0])
                newRelation['idItem2'] = relaciones[x][1]
                self.provider.create(RelacionItem, params=newRelation)
            elif int(itemeditado.id) == int(relaciones[x][1]):
                newRelation['idItem1'] = relaciones[x][0]
                newRelation['idItem2'] = int(itemnuevo[0])
                self.provider.create(RelacionItem, params=newRelation)

        ids = []
        ids.append(int(itemnuevo[0]))
        self.recorrerArbolAtras(ids, int(itemnuevo[0]))
        self.recorrerArbolAdelante(ids, int(itemnuevo[0]))
        ids.remove(int(itemnuevo[0]))
        longitudids = len(ids)

        for x in range(longitudids):
            itemrevision = DBSession.query(Item).filter_by(
                id=ids[x], ultimaversion=1).first()

            if itemrevision != None:
                if itemrevision.estado != 'modificado':
                    itemrevision.estado = 'revision'
                    if itemrevision.idLineaBase != None:
                        lineabase = DBSession.query(LineaBase).filter_by(
                            id=itemrevision.idLineaBase).first()
                        if lineabase.estado == 'cerrada':
                            lineabase.estado = 'comprometida'
                            listalineabase = DBSession.query(
                                LineaBase).filter_by(
                                    idFase=lineabase.idFase).all()
                            desarrollo = True
                            longitud = len(listalineabase)

                            for y in range(longitud):
                                if str(listalineabase[y].estado).__eq__(
                                        'cerrada'):
                                    desarrollo = False

                            if desarrollo:
                                fase = DBSession.query(Fase).filter_by(
                                    id=lineabase.idFase).first()
                                fase.estado = 'desarrollo'

        flash("El item \"" + kw['nombre'] +
              "\" ha sido modificado correctamente")

        redirect('../' + '../item/?fid=' + str(nuevo['idFase']))

    """---------------------- Recorrer Arbol Atras -------------------------------------
    Uso:
        self.recorrerArbol (ids, iid)
        ids: un vector que contiene primeramente al nodo inicial
        iid: nodo inicial
        Todos los nodos del arbol quedaran guardados en ids---------------------------"""

    def recorrerArbolAtras(self, *args):
        ids = args[0]
        itemraiz = args[1]
        """-------------Obtiene de la BD las relaciones actuales del nodo en cuestion---"""
        relaciones = DBSession.query(RelacionItem.idItem1,RelacionItem.idItem2).\
                        filter((RelacionItem.idItem1==itemraiz)).all()
        """------------------------------------------------------------------------"""

        for relacion in relaciones:
            itemrelacion = DBSession.query(Item).filter_by(
                id=relacion.idItem2).first()

            if itemrelacion.ultimaversion == 1:
                if (ids.count(itemrelacion.id) < 1):
                    ids.append(itemrelacion.id)
                self.recorrerArbolAtras(ids, itemrelacion.id)

    """------------------- Fin Recorrer Arbol Atras -----------------------------------"""
    """-------------------- Recorrer Arbol Adelante -------------------------------------
    Uso:
        self.recorrerArbol (ids, iid)
        ids: un vector que contiene primeramente al nodo inicial
        iid: nodo inicial
        Todos los nodos del arbol quedaran guardados en ids---------------------------"""

    def recorrerArbolAdelante(self, *args):
        ids = args[0]
        itemraiz = args[1]
        """-------------Obtiene de la BD las relaciones actuales del nodo en cuestion---"""
        relaciones = DBSession.query(RelacionItem.idItem1,RelacionItem.idItem2).\
                        filter((RelacionItem.idItem2==itemraiz)).all()
        """------------------------------------------------------------------------"""

        for relacion in relaciones:
            itemrelacion = DBSession.query(Item).filter_by(
                id=relacion.idItem1).first()

            if itemrelacion.ultimaversion == 1:
                if (ids.count(itemrelacion.id) < 1):
                    ids.append(itemrelacion.id)

                self.recorrerArbolAdelante(ids, itemrelacion.id)

    """---------------------- Fin Recorrer Arbol Adelante -----------------------------"""

    @expose()
    def post_delete(self, *args, **kw):
        """This is the code that actually deletes the record"""
        pks = self.provider.get_primary_fields(self.model)
        d = {}
        for i, arg in enumerate(args):
            d[pks[i]] = arg
        """extraer el idFase para poder retornar en el estado anterior """
        idfase = DBSession.query(Item.idFase).filter_by(id=d['id']).first()
        """------------------------------------------------------------"""
        """Se crea objeto y cambia de estado """
        itemeDelete = DBSession.query(Item).filter_by(id=d['id']).first()
        itemeDelete.estado = "borrado"
        itemeDelete.ultimaversion = 0

        DBSession.add(itemeDelete)
        """---------Se borra las relaciones del Item Borrado--------------"""

        relaciones = DBSession.query(
            RelacionItem).filter((RelacionItem.idItem1 == d['id'])
                                 | (RelacionItem.idItem2 == d['id'])).all()

        longitud = len(relaciones)

        for x in range(longitud):
            DBSession.delete(relaciones[x])
        """---------------------------------------------------------------"""

        #self.provider.delete(self.model, d)

        #self.provider.delete(self.model, d)

        #redirect('./' + '../' * (len(pks) - 1))
        raise redirect('/item/?fid=' + str(idfase[0]))

    @expose('tgext.crud.templates.get_delete')
    def get_delete(self, *args, **kw):
        """This is the code that creates a confirm_delete page"""
        return dict(args=args)
Exemple #30
0
class CrudRestController(RestController):
    """
    :variables:

    session
      database session (drives drop-down menus

    menu_items
      Dictionary of links to other models in the form model_items[lower_model_name] = Model

    title
      Title to be used for each page.  default: Turbogears Admin System

    :modifiers:

    model
      Model this class is associated with

    table
      Widget for the table display

    table_filler
      Class instance with get_value() that defines the JSon stream for the table

    edit_form
      Form to be used for editing the model

    edit_filler
      Class instance with a get_value() that defines how we get information for a single
      existing record

    new_form
      Form that defines how we create a form for new data entry.

    :Attributes:

      menu_items
        Dictionary of associated Models (used for menu)
      provider
        sprox provider for data manipulation
      session
        link to the database
    """

    title = "Turbogears Admin System"

    def _before(self, *args, **kw):
        tmpl_context.title = self.title
        tmpl_context.menu_items = self.menu_items

    def __before__(self, *args, **kw):
        # this will be removed in 2.1.*
        tmpl_context.menu_items = self.menu_items
        tmpl_context.title = self.title

    def __init__(self, session, menu_items=None):
        if menu_items is None:
            menu_items = {}
        self.menu_items = menu_items
        self.provider = ProviderTypeSelector().get_selector(self.model).get_provider(self.model, hint=session)

        self.session = session

        #this makes crc declarative
        check_types = ['new_form', 'edit_form', 'table', 'table_filler', 'edit_filler']
        for type_ in check_types:
            if not hasattr(self, type_) and hasattr(self, type_+'_type'):
                setattr(self, type_, getattr(self, type_+'_type')(self.session))

        if hasattr(self, 'new_form'):
            #register the validators since they are none from the parent class
            register_validators(self, 'post', self.new_form)
        if hasattr(self, 'edit_form'):
            register_validators(self, 'put', self.edit_form)

    @with_trailing_slash
    @expose('tgext.crud.templates.get_all')
    @expose('json')
    @paginate('value_list', items_per_page=7)
    def get_all(self, *args, **kw):
        """Return all records.
           Pagination is done by offset/limit in the filler method.
           Returns an HTML page with the records if not json.
        """
        if pylons.request.response_type == 'application/json':
            
            
            return self.table_filler.get_value(**kw)

        if not getattr(self.table.__class__, '__retrieves_own_value__', False):
            values = self.table_filler.get_value(**kw)
            
        else:
            
            values = []
        
       
    
        tmpl_context.widget = self.table
        return dict(model=self.model.__name__, value_list=values)

    @expose('tgext.crud.templates.get_one')
    @expose('json')
    def get_one(self, *args, **kw):
        """get one record, returns HTML or json"""
        #this would probably only be realized as a json stream
        tmpl_context.widget = self.edit_form
        pks = self.provider.get_primary_fields(self.model)
        kw = {}
        for i, pk in  enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        return dict(value=value,model=self.model.__name__)

    @expose('tgext.crud.templates.edit')
    def edit(self, *args, **kw):
        
        log.debug('editFase: %s' %kw)
        
        
        """Display a page to edit the record."""
        tmpl_context.widget = self.edit_form
        pks = self.provider.get_primary_fields(self.model)
        kw = {}
        for i, pk in  enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        value['_method'] = 'PUT'
        return dict(value=value, model=self.model.__name__, pk_count=len(pks))

    @without_trailing_slash
    @expose('sap.templates.desarrollar.fase.new')
    def new(self,pid=None,value2=None, *args, **kw):
        """Display a page to show a new record."""
        tmpl_context.widget = self.new_form
        kw['idproyec']=pid
        log.debug('KWNew=%s' %tmpl_context.widget)
        #return dict(value=kw, model=self.model.__name__)
        return dict(value={'idproyec':pid},value2=kw, model=self.model.__name__)

    @catch_errors(errors, error_handler=new)
    @expose()
    @registered_validate(error_handler=new)
    def post(self, *args, **kw):
        ###imprimir
        log.debug('kwww= %s' %kw['idproyec'])
        ####
        
        self.provider.create(self.model, params=kw)
        #raise redirect('./')
        raise redirect('./?pid='+kw['idproyec'])

    @expose()
    @registered_validate(error_handler=edit)
    @catch_errors(errors, error_handler=edit)
    def put(self, *args, **kw):
        """update"""
        pks = self.provider.get_primary_fields(self.model)
        for i, pk in enumerate(pks):
            if pk not in kw and i < len(args):
                kw[pk] = args[i]

        self.provider.update(self.model, params=kw)
        redirect('../' * len(pks))
        

    @expose()
    def post_delete(self, *args, **kw):
        """This is the code that actually deletes the record"""
        pks = self.provider.get_primary_fields(self.model)
        d = {}
        for i, arg in enumerate(args):
            d[pks[i]] = arg
        self.provider.delete(self.model, d)
        redirect('./' + '../' * (len(pks) - 1))

    @expose('tgext.crud.templates.get_delete')
    def get_delete(self, *args, **kw):
        """This is the code that creates a confirm_delete page"""
        return dict(args=args)
Exemple #31
0
class CrudRestController(RestController):
    """
    :variables:

    session
      database session (drives drop-down menus

    menu_items
      Dictionary of links to other models in the form model_items[lower_model_name] = Model

    title
      Title to be used for each page.  default: Turbogears Admin System

    :modifiers:

    model
      Model this class is associated with

    table
      Widget for the table display

    table_filler
      Class instance with get_value() that defines the JSon stream for the table

    edit_form
      Form to be used for editing the model

    edit_filler
      Class instance with a get_value() that defines how we get information for a single
      existing record

    new_form
      Form that defines how we create a form for new data entry.

    :Attributes:

      menu_items
        Dictionary of associated Models (used for menu)
      provider
        sprox provider for data manipulation
      session
        link to the database
    """

    title = "Turbogears Admin System"

    def _before(self, *args, **kw):
        tmpl_context.title = self.title
        tmpl_context.menu_items = self.menu_items

    def __before__(self, *args, **kw):
        # this will be removed in 2.1.*
        tmpl_context.menu_items = self.menu_items
        tmpl_context.title = self.title

    def __init__(self, session, menu_items=None):
        if menu_items is None:
            menu_items = {}
        self.menu_items = menu_items
        self.provider = ProviderTypeSelector().get_selector(
            self.model).get_provider(self.model, hint=session)

        self.session = session

        #this makes crc declarative
        check_types = [
            'new_form', 'edit_form', 'table', 'table_filler', 'edit_filler'
        ]
        for type_ in check_types:
            if not hasattr(self, type_) and hasattr(self, type_ + '_type'):
                setattr(self, type_,
                        getattr(self, type_ + '_type')(self.session))

        if hasattr(self, 'new_form'):
            #register the validators since they are none from the parent class
            register_validators(self, 'post', self.new_form)
        if hasattr(self, 'edit_form'):
            register_validators(self, 'put', self.edit_form)

    @with_trailing_slash
    @expose('tgext.crud.templates.get_all')
    @expose('json')
    @paginate('value_list', items_per_page=7)
    def get_all(self, *args, **kw):
        """Return all records.
           Pagination is done by offset/limit in the filler method.
           Returns an HTML page with the records if not json.
        """
        if pylons.request.response_type == 'application/json':
            return self.table_filler.get_value(**kw)

        if not getattr(self.table.__class__, '__retrieves_own_value__', False):
            values = self.table_filler.get_value(**kw)
        else:
            values = []

        tmpl_context.widget = self.table
        return dict(model=self.model.__name__, value_list=values)

    @expose('tgext.crud.templates.get_one')
    @expose('json')
    def get_one(self, *args, **kw):
        """get one record, returns HTML or json"""
        #this would probably only be realized as a json stream
        tmpl_context.widget = self.edit_form
        pks = self.provider.get_primary_fields(self.model)
        kw = {}
        for i, pk in enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        return dict(value=value, model=self.model.__name__)

    @expose('tgext.crud.templates.edit')
    def edit(self, *args, **kw):
        """Display a page to edit the record."""
        tmpl_context.widget = self.edit_form
        pks = self.provider.get_primary_fields(self.model)
        kw = {}
        for i, pk in enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        value['_method'] = 'PUT'
        return dict(value=value, model=self.model.__name__, pk_count=len(pks))

    @without_trailing_slash
    @expose('tgext.crud.templates.new')
    def new(self, *args, **kw):
        """Display a page to show a new record."""
        tmpl_context.widget = self.new_form
        return dict(value=kw, model=self.model.__name__)

    @catch_errors(errors, error_handler=new)
    @expose()
    @registered_validate(error_handler=new)
    def post(self, *args, **kw):
        self.provider.create(self.model, params=kw)
        raise redirect('./')

    @expose()
    @registered_validate(error_handler=edit)
    @catch_errors(errors, error_handler=edit)
    def put(self, *args, **kw):
        """update"""
        pks = self.provider.get_primary_fields(self.model)
        for i, pk in enumerate(pks):
            if pk not in kw and i < len(args):
                kw[pk] = args[i]

        self.provider.update(self.model, params=kw)
        redirect('../' * len(pks))

    @expose()
    def post_delete(self, *args, **kw):
        """This is the code that actually deletes the record"""
        pks = self.provider.get_primary_fields(self.model)
        d = {}
        for i, arg in enumerate(args):
            d[pks[i]] = arg
        self.provider.delete(self.model, d)
        redirect('./' + '../' * (len(pks) - 1))

    @expose('tgext.crud.templates.get_delete')
    def get_delete(self, *args, **kw):
        """This is the code that creates a confirm_delete page"""
        return dict(args=args)
Exemple #32
0
class CrudRestController(RestController):
    """
    :variables:

    session
      database session (drives drop-down menus

    menu_items
      Dictionary of links to other models in the form model_items[lower_model_name] = Model

    title
      Title to be used for each page.  default: Turbogears Admin System

    :modifiers:

    model
      Model this class is associated with

    table
      Widget for the table display

    table_filler
      Class instance with get_value() that defines the JSon stream for the table

    edit_form
      Form to be used for editing the model

    edit_filler
      Class instance with a get_value() that defines how we get information for a single
      existing record

    new_form
      Form that defines how we create a form for new data entry.

    :Attributes:

      menu_items
        Dictionary of associated Models (used for menu)
      provider
        sprox provider for data manipulation
      session
        link to the database
    """

    title = "Turbogears Admin System"

    def _before(self, *args, **kw):
        tmpl_context.title = self.title
        tmpl_context.menu_items = self.menu_items

    def __before__(self, *args, **kw):
        # this will be removed in 2.1.*
        tmpl_context.menu_items = self.menu_items
        tmpl_context.title = self.title

    def __init__(self, session, menu_items=None):
        if menu_items is None:
            menu_items = {}
        self.menu_items = menu_items
        self.provider = ProviderTypeSelector().get_selector(self.model).get_provider(self.model, hint=session)

        self.session = session

        #this makes crc declarative
        check_types = ['new_form', 'edit_form', 'table', 'table_filler', 'edit_filler']
        for type_ in check_types:
            if not hasattr(self, type_) and hasattr(self, type_+'_type'):
                setattr(self, type_, getattr(self, type_+'_type')(self.session))

        if hasattr(self, 'new_form'):
            #register the validators since they are none from the parent class
            register_validators(self, 'post', self.new_form)
        if hasattr(self, 'edit_form'):
            register_validators(self, 'put', self.edit_form)

    @with_trailing_slash
    @expose('tgext.crud.templates.get_all')
    @expose('json')
    @paginate('value_list', items_per_page=7)
    def get_all(self, *args, **kw):
        """Return all records.
           Pagination is done by offset/limit in the filler method.
           Returns an HTML page with the records if not json.
        """
        if pylons.request.response_type == 'application/json':
            return self.table_filler.get_value(**kw)

        if not getattr(self.table.__class__, '__retrieves_own_value__', False):
            values = self.table_filler.get_value(**kw)
        else:
            values = []

        tmpl_context.widget = self.table
        return dict(model=self.model.__name__, value_list=values)

    @expose('tgext.crud.templates.get_one')
    @expose('json')
    def get_one(self, *args, **kw):
        """get one record, returns HTML or json"""
        #this would probably only be realized as a json stream
        tmpl_context.widget = self.edit_form
        pks = self.provider.get_primary_fields(self.model)
        kw = {}
        for i, pk in  enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        return dict(value=value,model=self.model.__name__)

    @expose('sap.templates.desarrollar.detalleitem.edit')
    def edit(self, *args, **kw):
        """Display a page to edit the record."""
        tmpl_context.widget = self.edit_form
        #pks = self.provider.get_primary_fields(self.model)

        ###########################################
        pks = self.provider.get_primary_fields(self.model)
        
        ###########################################
        kw = {}
        for i, pk in  enumerate(pks):
            kw[pk] = args[i]
        value = self.edit_filler.get_value(kw)
        value['_method'] = 'PUT'
        return dict(value=value, model=self.model.__name__, pk_count=len(pks))

    @without_trailing_slash
    @expose('sap.templates.desarrollar.detalleitem.new')
    def new(self,iid=None ,*args, **kw):
        
        """Se obtiene el id del tipo de item elegido para el item"""
        idtipo=DBSession.query(Item.idTipoDeItem).filter_by(id=iid).first()
        
        atributos= [x for x in (DBSession.query(Campos.nombre, Campos.nombre).filter_by(idTipoDeItem=idtipo))]
        
        
        
        tmpl_context.widget = self.new_form
        return dict(value={'iditem':iid}, model=self.model.__name__, atributos_options=atributos)

    @catch_errors(errors, error_handler=new)
    @expose()
    @registered_validate(error_handler=new)
    def post(self, *args, **kw):
        
        
        
        yaExiste= DBSession.query(DetalleItem.nombrecampo).filter_by(nombrecampo=kw['nombrecampo'],iditem=kw['iditem']).first()
        
        #log.debug("yaExite: %s" %yaExite)
        #longitud= len(yaExite)
        #log.debug("longitud= %s" %longitud)
        
        if yaExiste == None:
            self.provider.create(self.model, params=kw)
        else:
            flash("Atributo cargado", 'error')
            redirect('/detalleitem/new/?iid='+ kw['iditem'])
       
       
               
        raise redirect('/detalleitem/?iid='+ kw['iditem'])
    @expose()
    @registered_validate(error_handler=edit)
    @catch_errors(errors, error_handler=edit)
    def put(self, *args, **kw):
        """update"""
        pks = self.provider.get_primary_fields(self.model)
        for i, pk in enumerate(pks):
            if pk not in kw and i < len(args):
                kw[pk] = args[i]

        #self.provider.update(self.model, params=kw)
        
        log.debug('detalleEditado: %s' %kw)
        detalleitem = DBSession.query(DetalleItem).filter_by(id=kw['id']).first()
        
        if str(detalleitem.tipo).__eq__('integer'):
            try:
                int(kw['valor'])
            except:
                flash('\"' + str(detalleitem.nombrecampo) + '\". Debe ingresar un entero', 'error')
                redirect('../'+kw['id']+'/edit')
        elif str(detalleitem.tipo).__eq__('date'):
            """False = fecha no valida
                True = fecha valida"""
            if not (self.fechaValida(kw['valor'])):
                flash('\"' + str(detalleitem.nombrecampo) + '\" Fecha no valida. Formato: dd/mm/aaaa', 'error')
                redirect('../'+kw['id']+'/edit')
        else:
            if kw['valor'].__eq__(''):
                flash('\"' + str(detalleitem.nombrecampo) + '\" no puede ser vacio', 'error')
                redirect('../'+kw['id']+'/edit')
                
        """-----------Se obtiene el ID item a editado-------------"""
        iid=DBSession.query(DetalleItem.iditem).filter_by(id=kw[pk]).first()
        
        """Se crea un nuevo item"""
        itemeditado=DBSession.query(Item).filter_by(id=iid).first()
        itemnuevo=Item()
        itemnuevo.version=itemeditado.version + 1
        itemnuevo.idTipoDeItem=itemeditado.idTipoDeItem
        itemnuevo.idFase=itemeditado.idFase
        itemnuevo.idLineaBase=itemeditado.idLineaBase
        itemnuevo.fechaCreacion=itemeditado.fechaCreacion
        itemnuevo.nrohistorial=itemeditado.nrohistorial
        itemnuevo.ultimaversion=1
        itemeditado.ultimaversion=0
        itemnuevo.estado='modificado'
        itemnuevo.complejidad=itemeditado.complejidad
        itemnuevo.nombre=itemeditado.nombre
        DBSession.add(itemnuevo)

        """Realiza copia de los valores de los atributos especificos"""
            
        atributoeditado=DBSession.query(DetalleItem).filter_by(iditem=itemeditado.id).all()
            
        for objeto in atributoeditado:
            
            
            nuevoDetalle=DetalleItem()
            nuevoDetalle.tipo=objeto.tipo
            nuevoDetalle.nombrecampo=objeto.nombrecampo
            
            if str(objeto.id)==str(kw[pk]):
                nuevoDetalle.valor=kw['valor']
            else:
                nuevoDetalle.valor=objeto.valor

            nuevoDetalle.iditem=itemnuevo.id
            DBSession.add(nuevoDetalle)
                
        """Realiza copia de los adjuntos"""
        adjuntositemeditado=DBSession.query(Adjuntos).filter_by(idItem=itemeditado.id).all()
        
        for adj in adjuntositemeditado:
            itemnuevoadjunto=Adjuntos()
            itemnuevoadjunto.idItem=itemnuevo.id
            itemnuevoadjunto.filename=adj.filename
            itemnuevoadjunto.filecontent=adj.filecontent
            DBSession.add(itemnuevoadjunto)
        
        
        """Copia las relaciones """
        relaciones = DBSession.query(RelacionItem.idItem1,RelacionItem.idItem2).filter((RelacionItem.idItem2==itemeditado.id) | (RelacionItem.idItem1==itemeditado.id)).all()
        longitud = len(relaciones)
        newRelation=RelacionItem()
        for x in range(longitud):
            if int(itemeditado.id) == int(relaciones[x][0]):
                newRelation.idItem1=int(itemnuevo.id)
                newRelation.idItem2=relaciones[x][1]
                DBSession.add(newRelation)
                #self.provider.create(RelacionItem, params=newRelation)
            elif int(itemeditado.id) == int(relaciones[x][1]):
                newRelation.idItem1=relaciones[x][0]
                newRelation.idItem2=int(itemnuevo.id)
                DBSession.add(newRelation)
        
        
        #detalleitem/?iid=113
        
        redirect('../?iid=' + str(itemnuevo.id) )

    @expose()
    def post_delete(self, *args, **kw):
        """This is the code that actually deletes the record"""
        pks = self.provider.get_primary_fields(self.model)
        d = {}
        for i, arg in enumerate(args):
            d[pks[i]] = arg
        self.provider.delete(self.model, d)
        redirect('./' + '../' * (len(pks) - 1))

    @expose('tgext.crud.templates.get_delete')
    def get_delete(self, *args, **kw):
        """This is the code that creates a confirm_delete page"""
        return dict(args=args)

    def fechaValida (self, fecha):
        if fecha.__eq__(''):
            return False
        
        longfecha = len(fecha)
        
        if longfecha != 10:
            return False
        
        if str(fecha[2]) != '/':
            return False
        
        if str(fecha[5]) != '/':
            return False
        
        dia = fecha[0] + fecha[1]
        mes = fecha [3] + fecha [4]
        anho = fecha [6] + fecha [7] + fecha [8] + fecha [9]
        
        try:
            dia = int(dia)
            mes = int(mes)
            anho = int(anho)
        except:
            return False

        meses = {'1':31, '2':28, '3':31, '4':30, '5':31, '6':30, 
                 '7':31, '8':31, '9':30, '10':31, '11':30, '12':31}
        
        if 1900 < anho < 9999:
            if (anho % 4) == 0:
                meses['2'] = 29
            
            if 0 < mes < 13:
                if 0 < dia <= meses[str(mes)]:
                    return True
                else:
                    return False
            else:
                return False
        else:
            return False