def lazy_init( self , authname):
   self.field = PPConfiguration( self.env ).get('custom_dependency_field')
   self.fieldrev = PPConfiguration( self.env ).get('custom_reverse_dependency_field')
   self.dataaccess = DataAccessDependencies(self.env, authname)
class PPTicketViewTweak(Component):
  '''
    BETA: computes links on ticket dependency entries
    while using ProjectPlanPlugin in the standard configuration this component is NEEDED
  '''
  implements(ITemplateStreamFilter, IRequestFilter)
  
  field = None
  fieldrev = None
  useTable = True
  
  def lazy_init( self , authname):
    self.field = PPConfiguration( self.env ).get('custom_dependency_field')
    self.fieldrev = PPConfiguration( self.env ).get('custom_reverse_dependency_field')
    self.dataaccess = DataAccessDependencies(self.env, authname)
    
    #if self.useTable:
      #self.dataaccess = DataAccessDependenciesInExtraTable(self.env, authname)
    #else:
      #self.dataaccess = DataAccessDependenciesInCustomFields(self.env)

  def cleanUp( self, req ):
    '''
      TODO
    '''
    if self.useTable:
      try:
        req.args.__delitem__('field_%s' % (self.field,))
      except:
        pass
      try:
        req.args.__delitem__('field_%s' % (self.fieldrev,))
      except:
        pass
      self.dataaccess.commit()
  
  # ITemplateStreamFilter methods
  def filter_stream(self, req, method, filename, stream, data):  
    '''
      replace the dependency-field by links
    '''
    
    # stop if this is not a ticket view
    if not req.path_info.startswith('/ticket/') and not req.path_info.startswith('/newticket'):
      return stream
    
    self.lazy_init(req.authname)
    
    current_ticket_id = None
    try:
      current_ticket_id = str(data['ticket'].id)
      dependencies = self.getDependsOn(current_ticket_id)
      #dependencies = '1, 8; 2 y 3, 99,x' # test
    except Exception,e:
      self.env.log.warning('filter_stream fail '+repr(e))
      return stream
    
    deptickets = self.splitStringToTicketList(dependencies)
    blocking_tickets_string = self.createNormalizedTicketString( deptickets ) # normalized
    
    blocked_tickets = self.getBlockedTickets( current_ticket_id ) 
    blocked_tickets_string = self.createNormalizedTicketString(blocked_tickets) # normalized
    
    nodeptickets = [ t for t in deptickets if str(t).strip() != "" and not isNumber(t) ]
    actualdeptickets = [ t for t in deptickets if str(t).strip() != "" and isNumber(t) ]
    
    depwithlinks = self.getTicketLinkList(req, actualdeptickets, nodeptickets)
    
    blocked_tickets_with_links = self.getTicketLinkList(req, blocked_tickets, [])
    
    self.env.log.debug('nodeptickets of '+str(current_ticket_id)+': '+repr(nodeptickets))
    self.env.log.debug('actualdeptickets of '+str(current_ticket_id)+': '+repr(actualdeptickets))
    self.env.log.debug('dependencies of '+str(current_ticket_id)+': '+repr(blocking_tickets_string))
    
    # change summary block
    if str(depwithlinks) != '' or PPConfiguration(self.env).isMasterticketsCompatible(): # change HTML only if there is actually a link to show
      stream |= Transformer('//*[@headers="h_%s"]/text()' % self.field).replace(depwithlinks)
   
    if str(blocked_tickets_with_links) != '' or PPConfiguration(self.env).isMasterticketsCompatible():
      stream |= Transformer('//*[@headers="h_%s"]/text()' % self.fieldrev).replace( blocked_tickets_with_links )
    
    # change fields
    stream |= Transformer('//*[@id="field-%s"]' % (self.field)).attr('value', blocking_tickets_string)
    stream |= Transformer('//*[@id="field-%s"]' % (self.fieldrev)).attr('value', blocked_tickets_string)  
    # create a backup field containing the earlier value
    stream |= Transformer('//*[@id="propertyform"]').prepend( tag.input(name='field_%s_backup' % (self.field), value=blocking_tickets_string, style='display:none') )
    stream |= Transformer('//*[@id="propertyform"]').prepend( tag.input(name='field_%s_backup' % (self.fieldrev), value=blocked_tickets_string, style='display:none') )
    
    
    
    # publish data that should be used by javascript
    stream |= Transformer('body/div[@id="main"]').prepend(
      tag.div( 
        tag.div( req.environ.get( 'ticketclosedf' ), id='ppDateFormat'),
        tag.div( 'field-'+self.field, id='ppDependenciesField'),
        tag.div( 'field-'+self.fieldrev, id='ppDependenciesReverseField'),
        id='ppTicketViewTweakConf'
    ))
    
    return stream