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