formstemplatespluginstracgenshi

Getting user entries from a Form based on Genshi Template


I'm trying to write a Plugin for Trac. I've succeeded to export variables contents from my request (process_request) to my template ...but I still having problems doing it in the other way : how to catch the information taped by the user ?

<form name="input" action="" method="POST">
    Configuration : <input type="text" name="configuration" value ="$my_var" /> <br /><br />

    <label for="file">URL:</label>
    <input type="text" name="file" id="WillPosted" value="This text will be changed by the user"/>      

    <input type="submit" name="SubmiT" value="Browse" /><br /><br />

So how can I catch the content of the input form with the id="WillPosted" ? Notice : actual problem is in IRequestHandler methods from Trac !

Any Idea ? Thanks


Solution

  • You're asking about the common web-UI interaction

    How to get (changed) new value of input, right? If so, you explained it rather complicated.

    And I'm wondering, if you don't know about trac-hacks.org, probably the most authoritative source of Trac plugin code on the planet - much more working examples to look at than needed here.

    Anyway, the key is reading the return value(s) from reg.args dict like so:

    from pkg_resources  import resource_filename
    from trac.web.chrome  import ITemplateProvider, add_stylesheet
    
    
    implements(IRequestHandler, ITemplateProvider)
    
    # IRequestHandler methods
    
    def match_request(self, req):
        # Any condition evaluating to True will fire the second method.
        return req.path_info == '/<your_path>'
    
    def process_request(self, req):
        "Demo how to interact with your template."
    
        # Check, if you'r really processing the right request by target matching,
        # and only act on input of authorized users - as an added suggestion/option.
        if req.path_info.startswith('/<your_path>') and req.authname != 'anonymous':
            # Check for request type.
            if req.method == 'POST':
                # Ok, go pock for the new value now.
                value = req.args.get('file', 'default_value')))
                # Now go, process it, store it, even redirect away, if you're done.
    
                # Fallback for Trac 0.11 compatibility included.
                referer = req.args.get('referer') or req.get_header('Referer')
    
                # Steer clear of requests going nowhere or loop to self
                if referer is None or \
                        referer.startswith(str(req.abs_href()) + '/<your_path>'):
                    referer = req.abs_href()
                req.redirect(referer)
    
        # Still there, so that's the initial call or anonymous user, hey?
        # So let's prepare information for displaying the template ...
        data = dict(my_var='any_string_or_number')
    
        # Take the env obj from self, if needed.
        env = self.env
        mod = MyOwnSecondaryModule(env)
        if mod.can_do_something:
            data['my_var'] = mod.do('better')
        # Why not apply an own style?
        add_stylesheet(req, 'your_plugin/most_famous_style.css')
    
        return 'your_template.html', data
    
    # ITemplateProvider methods
    
    def get_htdocs_dirs(self):
        """Return the absolute path of a directory containing additional
        static resources (such as images, style sheets, etc).
        """
        return [('your_plugin', resource_filename('your_plugin_pkg_base_dir', 'htdocs'))]
    
    def get_templates_dirs(self):
        """Return the absolute path of the directory containing the provided
        Genshi templates.
        """
        return [resource_filename('your_plugin_pkg_base_dir', 'templates')]
    

    Questions on using various Trac extension point interfaces? See the authoritative wiki documentation on the subject as well!