def filter_stream(self, req, method, filename, stream, data): # Add Stylesheet here, so that the ticket page gets it too :) add_stylesheet(req, "clients/clients.css") newticket = req.path_info.startswith('/newticket') if req.path_info.startswith('/ticket/') or newticket: setdefaultrate = '' if newticket: setdefaultrate = "$('#field-client').trigger('change');" script = StringIO() script.write(""" $(document).ready(function() { $('#field-client').change(function() { """) script.write('var clientrates = new Array();') for client in Client.select(self.env): script.write('clientrates["%s"] = %s;' % (client.name, client.default_rate or '""')) script.write(""" try { $('#field-clientrate').attr('value', clientrates[this.options[this.selectedIndex].value]); } catch (er) { } }); %s });""" % setdefaultrate) stream |= Transformer('.//head').append( tag.script(script.getvalue(), type_='text/javascript')) return stream
def render_macro(self, req, name, content): content = content.strip() if not content.isdigit(): return system_message('Invalid Ohloh project ID', '%s is not a number' % content) return tag.script('', src=self.SCRIPT_LOCATION % content, type='text/javascript')
def expand_macro(self, formatter, name, content): if name == 'ViewTopic': self.log.debug("Rendering ViewTopic macro...") # Determine topic subject page_name = formatter.req.path_info[6:] or 'WikiStart' subject = content or page_name # Create request context. context = Context.from_request(formatter.req) context.realm = 'discussion-wiki' # Get database access. db = self.env.get_db_cnx() context.cursor = db.cursor() # Get API object. api = self.env[DiscussionApi] # Get topic by subject topic = api.get_topic_by_subject(context, subject) self.log.debug('subject: %s' % (subject,)) self.log.debug('topic: %s' % (topic,)) # Prepare request and resource object. if topic: context.req.args['topic'] = topic['id'] context.resource = Resource('discussion', 'topic/%s' % ( topic['id'],)) # Process discussion request. template, data = api.process_discussion(context) # Return rendered template. data['discussion']['mode'] = 'message-list' data['discussion']['page_name'] = page_name if context.redirect_url: # Generate HTML elements for redirection. href = context.req.href(context.redirect_url[0]) + \ context.redirect_url[1] self.log.debug("Redirecting to %s" % (href)) return html.div(html.strong('Redirect: '), ' This page redirects to ', html.a(href, href = href), html.script("window.location = '" + context.req.href( 'discussion', 'redirect', redirect_url = href) + "'", language = "JavaScript"), class_ = "system-message") else: # Render template. return to_unicode(Chrome(self.env).render_template( formatter.req, template, data, 'text/html', True)) else: raise TracError('Not implemented macro %s' % (name))
def filter_stream(self, req, method, filename, stream, data): if req.path_info.startswith('/register') and ( req.method == 'GET' or 'registration_error' in data or 'captcha_error' in req.session): if not (self.private_key or self.private_key): return stream captcha_opts = tag.script("""\ var RecaptchaOptions = { theme: "%s", lang: "%s" }""" % (self.theme, self.lang), type='text/javascript') captcha_js = captcha.displayhtml( self.public_key, use_ssl=req.scheme == 'https', error='reCAPTCHA incorrect. Please try again.', version=2 ) + captcha.load_script(version=2) # First Fieldset of the registration form XPath match xpath_match = '//form[@id="acctmgr_registerform"]/fieldset[1]' return stream | Transformer(xpath_match). \ append(captcha_opts + tag(Markup(captcha_js))) # Admin Configuration elif req.path_info.startswith('/admin/accounts/config'): api_html = tag.div( tag.label("Public Key:", for_="recaptcha_public_key") + tag.input(class_="textwidget", name="recaptcha_public_key", value=self.public_key, size=40) ) + tag.div( tag.label("Private Key:", for_="recaptcha_private_key") + tag.input(class_="textwidget", name="recaptcha_private_key", value=self.private_key, size=40) ) if not (self.private_key or self.public_key): api_html = tag.div( tag.a("Generate a reCAPTCHA API key for this Trac " "instance domain.", target="_blank", href="http://recaptcha.net/api/getkey?domain=%s&" "app=TracRecaptchaRegister" % req.environ.get('SERVER_NAME') ) ) + tag.br() + api_html theme_html = tag.div( tag.label("reCPATCHA theme:", for_='recaptcha_theme') + tag.select( tag.option("Black Glass", value="blackglass", selected=self.theme == 'blackglass' or None) + tag.option("Clean", value="clean", selected=self.theme == 'clean' or None) + tag.option("Red", value="red", selected=self.theme == 'red' or None) + tag.option("White", value="white", selected=self.theme == 'white' or None), name='recaptcha_theme' ) ) language_html = tag.div( tag.label("reCAPTCHA language:", for_='recaptcha_lang') + tag.select( tag.option("Dutch", value="nl", selected=self.lang == 'nl' or None) + tag.option("English", value="en", selected=self.lang == 'en' or None) + tag.option("French", selected=self.lang == 'fr' or None) + tag.option("German", value="de", selected=self.lang == 'de' or None) + tag.option("Portuguese", value="pt", selected=self.lang == 'pt' or None) + tag.option("Russian", value="ru", selected=self.lang == 'ru' or None) + tag.option("Spanish", value="es", selected=self.lang == 'es' or None) + tag.option("Turkish", value="tr", selected=self.lang == 'tr' or None), name='recaptcha_lang')) # First fieldset of the Account Manager config form xpath_match = '//form[@id="cfg_wiz"]/fieldset[1]' return stream | Transformer(xpath_match). \ before(tag.fieldset(tag.legend("reCAPTCHA") + api_html + tag.br() + theme_html + language_html)) return stream
def filter_stream(self, req, method, filename, stream, data): if not (filename == 'ticket.html' or (self.tags_enabled and filename == 'wiki_edit.html')): return stream keywords = self._get_keywords_string(req) if not keywords: self.log.debug( "No keywords found. TagInputAutoComplete is disabled.") return stream matchfromstart = '"^" +' if self.matchcontains_opt: matchfromstart = '' js = """ jQuery(document).ready(function($) { var keywords = [ %(keywords)s ] var sep = '%(separator)s'.trim() + ' ' function split( val ) { return val.split( /%(separator)s\s*|\s+/ ); } function extractLast( term ) { return split( term ).pop(); } $('%(field)s') // don't navigate away from field on tab when selecting // an item .bind( "keydown", function( event ) { if ( event.keyCode === $.ui.keyCode.TAB && $( this ).data( "autocomplete" ).menu.active ) { event.preventDefault(); } }) .autocomplete({ delay: 0, minLength: 0, source: function( request, response ) { // delegate back to autocomplete, but extract // the last term response( $.ui.autocomplete.filter( keywords, extractLast( request.term ) ) ); }, focus: function() { // prevent value inserted on focus return false; }, select: function( event, ui ) { var terms = split( this.value ); // remove the current input terms.pop(); // add the selected item terms.push( ui.item.value ); // add placeholder to get the comma-and-space at // the end terms.push( "" ); this.value = terms.join( sep ); return false; } }); });""" # Inject transient part of JavaScript into ticket.html template. if req.path_info.startswith('/ticket/') or \ req.path_info.startswith('/newticket'): js_ticket = js % { 'field': '#field-' + self.field_opt, 'keywords': keywords, 'matchfromstart': matchfromstart, 'separator': self.separator } stream = stream | Transformer('.//head')\ .append(builder.script(Markup(js_ticket), type='text/javascript')) # Turn keywords field label into link to an arbitrary resource. if self.help_opt: link = self._get_help_link(req) if self.helpnewwindow_opt: link = builder.a(href=link, target='blank') else: link = builder.a(href=link) xpath = '//label[@for="field-keywords"]/text()' stream = stream | Transformer(xpath).wrap(link) # Inject transient part of JavaScript into wiki.html template. elif self.tags_enabled and req.path_info.startswith('/wiki/'): js_wiki = js % { 'field': '#tags', 'keywords': keywords, 'matchfromstart': matchfromstart, 'separator': self.separator } stream = stream | Transformer('.//head')\ .append(builder.script(Markup(js_wiki), type='text/javascript')) return stream
def render_macro(self, req, name, content): content = content.strip() if not content.isdigit(): return system_message('Invalid Ohloh project ID', '%s is not a number'%content) return tag.script('', src=self.SCRIPT_LOCATION%content, type='text/javascript')