def filter_stream(self, req, method, filename, stream, data): if filename == 'browser.html' \ and req.perm.has_permission('REPOSITORY_MODIFY'): self.log.debug('Extending TracBrowser') if self.include_jqueryui: add_stylesheet( req, 'trac_browser_svn_ops/css/smoothness/jquery-ui.css') add_script(req, 'trac_browser_svn_ops/js/jquery-ui.js') add_stylesheet(req, 'trac_browser_svn_ops/css/trac_browser_ops.css') add_script(req, 'trac_browser_svn_ops/js/trac_browser_ops.js') # Insert browser operations elements when directory/file shown if data['dir']: data['max_upload_size'] = self.max_upload_size data['rename_only'] = self.rename_only # Insert upload dialog and move/delete dialog into div#main bsops_stream = Chrome(self.env).render_template( req, 'trac_browser_ops.html', data, fragment=True) bsops_transf = Transformer('//div[@id="main"]') stream |= bsops_transf.append( bsops_stream.select('//div[@class="bsop_dialog"]')) # Insert button bar after file/directory table bsops_stream = Chrome(self.env).render_template( req, 'trac_browser_ops.html', data, fragment=True) bsops_transf = Transformer('//table[@id="dirlist"]') stream |= bsops_transf.after( bsops_stream.select('//div[@id="bsop_buttons"]')) return stream
def filter_stream(self, req, method, filename, stream, data): # Allow setting version for milestone if filename == 'milestone_edit.html': xformer = Transformer('//fieldset[1]') return stream | xformer.before(self._version_edit(data)) # Display version for milestone elif filename == 'milestone_view.html': milestone = data.get('milestone').name xformer = Transformer('//div[@id="content" and ' ' @class="milestone"]' '/div/p[@class="date"]') return stream | xformer.append( self._version_display(req, milestone)) elif filename == 'roadmap.html': return self._milestone_versions(stream, req) elif filename == 'admin_milestones.html': if req.args['path_info']: xformer = Transformer('//fieldset/div[1]') return stream | xformer.after(self._version_edit(data)) else: xformer = Transformer('//form[@id="addmilestone"]' '/fieldset/div[1]') return stream | xformer.after(self._version_edit(data)) return stream
def disable_field(stream, field): def select_helper(stream): s = Stream(stream) name = s.select('@name').textOf() opt = s.select('//option[@selected]') if not opt: s.select('//option[position()=1]') text = opt.select("text()").textOf() value = s.select('@value').textOf() if not value: value = text for kind, data, pos in tag.span(text, id=("field-%s" % field)).generate(): yield kind, data, pos for kind, data, pos in tag.input(value=value, name=name, type="hidden").generate(): yield kind, data, pos def helper(field_stream): s = Stream(field_stream) value = s.select('@value').textOf() name = s.select('@name').textOf() for kind, data, pos in tag.span(value, id=("field-%s" % field)).generate(): yield kind, data, pos for kind, data, pos in tag.input(value=value, name=name, type="hidden").generate(): yield kind, data, pos stream = stream | Transformer( '//select[@id="field-%s"]' % field).filter(select_helper) stream = stream | Transformer( '//input[@id="field-%s"]' % field).filter(helper) return stream
def filter_stream(self, req, method, filename, stream, data): if filename == 'ticket.html': filter = Transformer('//label[@for="field-evaluation"]') stream |= filter.remove() filter = Transformer('//select[@id="field-evaluation"]') stream |= filter.remove() return stream
def filter_stream(self, req, method, filename, stream, data): if req.path_info.startswith('/admin/ticket/components/'): trans = Transformer('//form[@id="edit"]/fieldset/div[1]') stream = stream | trans.after( self._parent_component_select(req, data)) elif req.path_info.startswith('/admin/ticket/components'): # add a "parent component" column to the components table stream = stream | Transformer( '//table[@id="complist"]/thead/tr/th[3]').\ after(html.th('Parent')) all_comp = {} for comp in [ comp.name for comp in model.Component.select(self.env) ]: parent_component = self._ChModel.get_parent_component(comp) if parent_component is None: parent_component = "" all_comp[comp] = parent_component stream = stream | Transformer('//table[@id="complist"]//tr').apply( InsertParentTd("", all_comp)) return stream
def browser(self, req, stream, data): if not data.has_key('path'): # this probably means that there is an upstream error return stream # mark up the title (disabled) # stream |= Transformer('//title/text()').substitute('/', data['svn_base_url'] + '/') # provide a link to the svn repository stream |= Transformer("//div[@id='content']/h1").after( tag.a(self.link_text, href=self.url(data['path']), title=self.link_title)) # if a directory, provide links to the children files if data['dir']: offset = 2 # table header, index of 0 (python) versus 1 (xpath) if data['path'] != '/': offset += 1 # parent directory row xpath_prefix = "//table[@id='dirlist']" # add the table header xpath = xpath_prefix + "//th[contains(@class, '%s')]" % self.element_class stream |= Transformer(xpath).after( tag.th('URL', **{'class': "url"})) if 'up' in data['chrome']['links']: stream |= Transformer(xpath_prefix + "//td[@colspan='5']").attr( 'colspan', None) # add table cells stream = self.dir_entries(req, stream, data, xpath_prefix) return stream
def filter(self, stream): """Conform to IGenshiStreamFilter interface. This example filter renames 'frob' to 'foobar' (this string is found in the custom ``home/index.html`` template provided as part of the package). It also adds the chosen JQuery plugin to the page if viewing the dataset edit page (provides a better UX for working with tags with vocabularies) """ stream = stream | Transformer('//p[@id="examplething"]/text()')\ .substitute(r'frob', r'foobar') routes = request.environ.get('pylons.routes_dict') if routes.get('controller') == 'package' \ and routes.get('action') == 'edit': stream = stream | Transformer('head').append(HTML( '<link rel="stylesheet" href="/css/chosen.css" />' )) stream = stream | Transformer('body').append(HTML( ''' <script src="/scripts/chosen.jquery.min.js" type="text/javascript"></script>' <script type="text/javascript">$(".chzn-select").chosen();</script> ''' )) return stream
def filter_stream(self, req, method, filename, stream, data): if req.path_info.startswith('/ticket'): button = tag.div( tag.input(type="submit", title=_("Translate to %s") % req.locale.get_display_name(), value=_("Translate"), forward=_("Translate"), backward=_("Untranslate"), working=_("Working"), name="translate", class_="translate")) button(class_="inlinebuttons") script = tag.script('') script(src='https://www.google.com/jsapi?key=' + self.googleApiKey) script(type='text/javascript') stream |= Transformer('//head').prepend(script) stream |= Transformer( '//div[@id="content"]/div[@id="ticket"]/div[@class="description"]/h3' ).after(button) stream |= Transformer( '//div[@id="content"]/div/div[@id="changelog"]/div[@class="change"]/h3' ).after(button) add_stylesheet(req, 'translate/translate.css') add_script_data(req, {'googleApiKey': self.googleApiKey}) add_script_data(req, {'sessionLanguage': req.locale.language}) add_script(req, 'translate/translate.js') return stream
def filter_stream(self, req, method, filename, stream, data): if not add_script_data and method == 'xhtml' and filename and \ data and hasattr(req, '_tracdragdrop_data'): def script(): from genshi.builder import tag data = getattr(req, '_tracdragdrop_data') text = '\n'.join([ 'var %s = %s;' % (name, to_json(val)) for name, val in data.iteritems() ]) return tag.script(text, type='text/javascript') stream |= Transformer('//head').append(script) if method == 'xhtml' and \ filename in ('wiki_edit.html', 'milestone_edit.html') and \ data.get('attachments', {}).get('can_create'): def render(): d = {'alist': data['attachments'].copy()} d['compact'] = True d['foldable'] = True d['fragment'] = True return Chrome(self.env).render_template(req, 'tracdragdrop.html', d, fragment=True) stream |= Transformer('//form[@id="edit"]').after(render) return stream
def remove_header(stream, field): """ Removes the display from the ticket properties """ stream = stream | \ Transformer('//th[@id="h_%s"]' % field).replace(tag.th(id="h_%s" % field)) stream = stream | \ Transformer('//td[@headers="h_%s"]' % field).replace(tag.th(id="h_%s" % field)) return stream
def filter_stream(self, req, method, filename, stream, data): transform = None if filename == 'ticket.html' and 'preview' not in req.args: stream |= Transformer( '//input[@value="Create ticket" or @value="Submit changes"]' ).attr('disabled', True) elif filename == 'wiki_edit.html' and 'preview' not in req.args and 'diff' not in req.args and 'merge' not in req.args: stream |= Transformer('//input[@id="save"]').attr('disabled', True) return stream
def filter_stream(self, req, method, filename, stream, formdata): if (filename == 'ticket.html'): add_stylesheet(req, 'multiselectlist/css/jquery-ui.css') add_stylesheet(req, 'multiselectlist/css/jquery.multiselect.css') add_script(req, 'multiselectlist/js/jquery-ui-1.8.16.custom.min.js') add_script(req, 'multiselectlist/js/jquery.multiselect.min.js') for item in self.multilist: values = self.env.config.get('multiselectlist', '%s.values' % item) if values: key = 'field_%s' % unicode(item) # 既存のチケットの場合はDBに格納されている値を取得する inputvalues = [] if key in req.args: # チケット登録時のバリデーションで引っかかった場合 # なお、DBに保管されている値より優先しなければならない inputvalues = req.args.get(key) elif req.path_info.startswith('/ticket'): ticketno = req.path_info[8:] db = self.env.get_db_cnx() cursor = db.cursor() sql = "select value from ticket_custom where ticket=%s and name='%s'" % ( ticketno, item) cursor.execute(sql) row = cursor.fetchone() if row and row[0]: inputvalues = row[0].split(',') self.env.log.info(inputvalues) value = values.split(',') xpath = '//input[@id="field-%s"]' % item # input要素をselect/option要素に置き換える。 # タグの繰り返しを行う場合は、配列で指定すればいいようだ。 script = """ jQuery(function(){ jQuery("#field-%s").multiselect({ selectedList: 3 }); }); """ % item stream |= Transformer(xpath).replace( tag.select([ tag.option(v, selected=(v in inputvalues or None)) for v in value ], id='field-%s' % item, name='field_%s' % item, size='%d' % len(value), multiple='true')) stream |= Transformer('//head').append( tag.script(script, type="text/javascript")) return stream
def filter(self, stream): """Conform to IGenshiStreamFilter interface. This filter renames 'frob' to 'foobar' (this string is found in the custom ``home/index.html`` template provided as part of the package). It also adds the chosen JQuery plugin to the page if viewing the dataset edit page (provides a better UX for working with tags with vocabularies) """ # Add package list to menu self._load_elastic_config() client = DataStoreClient(self.url) headers = dict() headers['Authorization'] = self.user.get('apikey') client._headers = headers # Organize the results per index response_indice = client.mapping() # FIXME: Get this from somewhere else response_map = response_indice.get('lbdf') # Create code to add to menu out = unicode() for package in response_map.keys(): # Retrieve package info pkg_query = model.Session.query(model.PackageRevision)\ .filter(model.PackageRevision.name == package)\ .filter(and_( model.PackageRevision.state == u'active', model.PackageRevision.current == True )) pkg = pkg_query.first() ## if the index has got a package that is not in ckan then ## ignore it. if pkg: out = out + '\n<li><a href="/dataset/' + package + '" title="' + _( 'Pesquisar %s' % pkg.title) + '">' + pkg.title + '</a></li>' else: log.warning('package %s in index but not in database' % package) continue stream = stream | Transformer('//li[@id="package-list"]')\ .append(HTML(out)) routes = request.environ.get('pylons.routes_dict') if routes.get('controller') == 'package' \ and routes.get('action') == 'edit': stream = stream | Transformer('head').append( HTML('<link rel="stylesheet" href="/css/chosen.css" />')) return stream
def filter_stream(self, req, method, filename, stream, data): """ Hack up the query inteface to do what we want. """ print("filtering stream: %s" % filename) if filename in ['ticket.html']: stream |= Transformer('.//td[@headers="h_due_date"]/text()').map( self._convert_date, TEXT) elif filename in ['tasklist.html', 'query.html']: stream |= Transformer('.//td[@class="due_date"]/text()').map( self._convert_date, TEXT) return stream
def filter_stream(self, req, method, filename, stream, data): action = req.args.get('action', 'view') if filename == "version_edit.html": if action == 'new': filter = Transformer('//form[@id="edit"]/div[1]') return stream | filter.before(self.__new_project()) elif action == 'edit': filter = Transformer('//form[@id="edit"]/div[1]') return stream | filter.before(self.__edit_project(data)) return stream
def filter_stream(self, req, method, filename, stream, data): if self.is_wiki_realm(req): navbar_tpl = self.get_loader().load('wiki_navbar.html') navbar = navbar_tpl.generate( node=req.args.get('node'), is_not_edit=(not self.is_wiki_edit(req, filename))) #stream = stream | Transformer('//p[@class="path"]').remove() stream = stream | Transformer( '//p[@class="path noprint"]').remove() stream = stream | Transformer('//div[@id="content"]').prepend( navbar) return stream
def filter_stream(self, req, method, filename, stream, data): if filename == 'ticket.html': ticket = data.get('ticket') if self.keywords and ticket and ticket.exists and \ 'TICKET_CHGPROP' in req.perm(ticket.resource): filter = Transformer('//fieldset[@id="properties"]') stream |= filter.after(self._render_template(req)) elif filename == 'wiki_edit.html' and self.tagsplugin_enabled: filter = Transformer('//fieldset[@id="changeinfo"]') stream |= filter.after(self._render_template(req)) return stream
def filter_stream(self, req, method, filename, stream, data): if not filename == "query.html": self.log.debug('Not a query returning') return stream def make_col_helper(field): def column_helper(column_stream): s = Stream(column_stream) val = s.select('//input/@value').render() if val.lower() != field.lower( ): #if we are the field just skip it #identity stream filter for kind, data, pos in s: yield kind, data, pos return column_helper fields = self.config.getlist(csection, 'fields', []) for field in fields: self.log.debug('found : %s' % field) perms = self.config.getlist(csection, '%s.permission' % field, []) self.log.debug('read permission config: %s has %s' % (field, perms)) for (perm, denial) in [s.split(":") for s in perms]: perm = perm.upper() self.log.debug( 'testing permission: %s:%s should act= %s' % (field, perm, (not req.perm.has_permission(perm) or perm == "ALWAYS"))) if (not req.perm.has_permission(perm) or perm == "ALWAYS") and denial.lower() in ["remove", "hide"]: # remove from the list of addable stream = stream | Transformer( '//select[@id="add_filter"]/option[@value="%s"]' % field).replace(" ") # remove from the list of columns stream = stream | Transformer( '//fieldset[@id="columns"]/div/label').filter( make_col_helper(field)) #remove from the results table stream = stream | Transformer( '//th[@class="%s"]' % field).replace(" ") stream = stream | Transformer( '//td[@class="%s"]' % field).replace(" ") # remove from the filters stream = stream | Transformer( '//tr[@class="%s"]' % field).replace(" ") return stream
def filter_stream(self, req, method, filename, stream, data): """Return a filtered Genshi event stream, or the original unfiltered stream if no match. `req` is the current request object, `method` is the Genshi render method (xml, xhtml or text), `filename` is the filename of the template to be rendered, `stream` is the event stream and `data` is the data for the current template. See the Genshi documentation for more information. """ # only show CAPTCHAs for anonymous users if req.authname != 'anonymous': return stream # only put CAPTCHAs in the realms specified realm = self.realm(req) if realm not in self.realms: return stream # add the CAPTCHA to the stream if filename in self.xpath: # store CAPTCHA in DB and session word = random_word(self.dict_file) insert_update(self.env, 'captcha', 'id', req.session.sid, dict(word=word)) req.session['captcha'] = word req.session.save() # render the template chrome = Chrome(self.env) template = chrome.load_template('captcha.html') _data = {} # CAPTCHA type if self.captcha_type == 'png': captcha = tag.img(None, src=req.href('captcha.png')) else: captcha = Markup(skimpyAPI.Pre(word).data()) _data['captcha'] = captcha _data['email'] = req.session.get('email', '') _data['name'] = req.session.get('name', '') _data['captchaid'] = req.session.sid xpath = self.xpath[filename] stream |= Transformer(xpath).before(template.generate(**_data)) if filename in self.delete: stream |= Transformer(self.delete[filename]).remove() return stream
def filter_stream(self, req, method, filename, stream, formdata): """Adds Batch modify as foldable and defaults filters and columns as collapsed""" if filename == 'query.html': return stream | Transformer('//div[@id="altlinks"]'). \ before(self._generate_form(req, formdata) ) if filename == 'batchmod.html': return stream | Transformer('//form[@id="batchmod-form"]//fieldset'). \ attr('id', 'batchmod') \ | Transformer('//form[@id="batchmod-form"]/fieldset/legend'). \ attr('class', 'foldable') return stream
def filter_stream(self, req, method, filename, stream, data): if filename == "ticket.html": # replace "project" text input (lineedit) for ticket editing with a selection field filter = Transformer('//input[@id="field-project"]') ticket_data = data['ticket'] script_filter = Transformer('//div[@id="banner"]') stream = stream | filter.replace( self._projects_field_ticket_input(req, ticket_data)) stream = stream | script_filter.before( self._update_milestones_script(req)) return stream
def filter_stream(self, req, method, filename, stream, data): found = False for pattern in self.insert_into: if filename == pattern: add_stylesheet(req, 'calendarpopup/css/CalendarPopUp.css') add_script(req, 'calendarpopup/js/CalendarPopUp.js') found = True calendarPopUpArrayOfIDs = "" calendarPopUpArrayOfIDsFormat = "" for element in self.watch_ids: if element.find('=') != -1: (one, two) = element.split('=', 2) if one and two: if calendarPopUpArrayOfIDs == "": calendarPopUpArrayOfIDs = "\"%s\"" % one calendarPopUpArrayOfIDsFormat = "\"%s\"" % two else: calendarPopUpArrayOfIDs = "%s, \"%s\"" % ( calendarPopUpArrayOfIDs, one) calendarPopUpArrayOfIDsFormat = "%s, \"%s\"" % ( calendarPopUpArrayOfIDsFormat, two) else: if element: if calendarPopUpArrayOfIDs == "": calendarPopUpArrayOfIDs = "\"%s\"" % element calendarPopUpArrayOfIDsFormat = "\"yyyy/MM/dd\"" else: calendarPopUpArrayOfIDs = "%s, \"%s\"" % ( calendarPopUpArrayOfIDs, element) calendarPopUpArrayOfIDsFormat = "%s, \"yyyy/MM/dd\"" % calendarPopUpArrayOfIDsFormat insertDIV = Element( 'div', id="CalendarPopUpDiv", style= "position:absolute;visibility:hidden;background-color:white;layer-background-color:white;" ) insertScript = Element( 'script', type="text/javascript" )('var calendarPopUpArrayOfIDs = new Array(%s); var calendarPopUpArrayOfIDsFormat = new Array(%s)' % (calendarPopUpArrayOfIDs, calendarPopUpArrayOfIDsFormat)) if found: return stream | Transformer('//div[@id="footer"]').after( insertDIV) | Transformer('body').before(insertScript) return stream
def filter_stream(self, req, method, filename, stream, data): if filename == "customfieldadmin.html": add_script(req, 'datefield/js/customfield-admin.js') add_stylesheet(req, 'datefield/css/customfield-admin.css') stream = stream | Transformer('.//select[@id="type"]').append( tag.option('Date', value='date', id="date_type_option")) stream = stream | Transformer( './/form[@id="addcf"]/fieldset/div[@class="buttons"]').before( tag.div(tag.input( id="date_empty", type="checkbox", name="date_empty"), tag.label('Allow empty date'), for_="date_empty", class_="field", id="date_empty_option")) return stream
def filter_stream(self, req, method, filename, stream, data): def attr_callback(name, event): attrs = event[1][1] return ' '.join(filter(None, (attrs.get('class'), 'datepick'))) if filename == 'ticket.html': for field in list(self._date_fields()): stream = stream | Transformer( '//input[@name="field_' + field + '"]' ).attr('class', attr_callback) elif self.use_milestone and filename in ('milestone_edit.html', 'admin_milestones.html'): for field in ('duedate', 'completeddate'): stream = stream | Transformer( '//input[@name="' + field + '"]' ).attr('class', attr_callback) return stream
def filter_stream(self, req, method, filename, stream, data): if filename.startswith("roadmap"): stream_roadmap = HTML(to_unicode(stream)) stream_milestones = HTML( to_unicode( stream_roadmap.select( '//div[@class="roadmap"]/div[@class="milestones"]'))) milestones = data.get('milestones') milestones = [milestone.name for milestone in milestones] versions = data.get('versions') if versions: for version in versions: milestones.append(version.name) div_milestones_array = self.__extract_div_milestones_array( '<div class="milestone">', stream_milestones) div_projects_milestones = self.__process_div_projects_milestones( milestones, div_milestones_array, req) return stream_roadmap | Transformer( '//div[@class="roadmap"]/div[@class="milestones"]').replace( div_projects_milestones) return stream
def filter_stream(self, req, method, filename, stream, data): """Return a filtered Genshi event stream, or the original unfiltered stream if no match. `req` is the current request object, `method` is the Genshi render method (xml, xhtml or text), `filename` is the filename of the template to be rendered, `stream` is the event stream and `data` is the data for the current template. See the Genshi documentation for more information. """ # move these someplace sensible? form_id = "acctmgr_registerform" # id of the registration form msg = "Please enter the text below to prove you're not a machine." if filename == "register.html": word = random_word(self.dict_file) req.session['captcha'] = word req.session.save() if self.captcha_type == 'png': captcha = '<img src="%s"/>' % req.href('captcha.png') else: captcha = skimpyAPI.Pre(word).data() content = "<p>%s</p><p>%s</p>" % (msg, captcha) content += '<label>Confirm: <input type="text" name="captcha" class="textwidget" size="20"/></label>' stream |= Transformer('//form[@id="%s"]/fieldset[1]' % form_id).append(tag.div(Markup(content))) return stream
def filter_stream(self, req, method, filename, stream, data): # 実際の置き換えを行います. if 'tracdependency' in data: for field, value in data['tracdependency'][ 'field_values'].iteritems(): stream |= Transformer(self.FIELD_XPATH % field).replace(value) return stream
def filter_stream(self, req, method, filename, stream, data): if filename != 'ticket.html': return stream # if specify disable, not execute. enable = True if 'ticketext' in req.args: enable = req.args['ticketext'] enable = enable.lower() in _TRUE_VALUES enable = bool(enable) if not enable: return stream readyDescription = False if req.path_info == '/newticket' and 'preview' not in req.args: readyDescription = True script = '\n<script type="text/javascript">\n'\ + 'var tikectTemplate = new ticketext.TicketTemplate(\'' + req.base_path + '\');\n'\ + 'tikectTemplate.setElementId(\'field-type\', \'field-description\');\n'\ + 'tikectTemplate.setReadyDescription(' + str(readyDescription).lower() + ');\n'\ + 'tikectTemplate.initialize();\n'\ + '</script>\n' return stream | Transformer('//div[@id="footer"]').before( MarkupTemplate(script).generate())
def filter_stream(self, req, method, filename, stream, data): # Allow setting version for milestone if filename == 'milestone_edit.html': filter = Transformer('//fieldset[1]') return stream | filter.before(self._version_edit(data)) # Display version for milestone elif filename == 'milestone_view.html': milestone = data.get('milestone').name filter = Transformer('//div[@class="info"]/p[@class="date"]') return stream | filter.append(self._version_display( req, milestone)) elif filename == 'roadmap.html': return self._milestone_versions(stream, req) return stream
def filter_stream(self, req, method, filename, stream, data): crumbs = self._get_crumbs(req.session) if not crumbs: return stream add_stylesheet(req, 'breadcrumbs/css/breadcrumbs.css') li = [] href = req.href(req.base_path) for crumb in crumbs: realm, resource = crumb.split('/', 1) name = resource.replace('_', ' ') if realm == "ticket": name = "#" + resource elif realm != "wiki": name = "%s:%s" % (realm, name) link = req.href(realm, resource) li.append(tag.li(tag.a( title=name, href=link, )(name))) insert = tag.ul(class_="nav", id="breadcrumbs")(tag.lh("Breadcrumbs:"), li) return stream | Transformer('//div[@id="metanav"]/ul').after(insert)