# HG changeset patch
# User Christian Boos <cboos@neuf.fr>
# Date 1206712277 -3600
# Node ID baa36083f3a2a4e5de7ab0ad48c8542db50feb0a
# Parent  fa5a3be904424e558dd86a3d9ecb4b6dc233e9ac
Move the support for user-friendly /newticket URLs to the process_request method, so that request pre-processors can see the request arguments unmodified. Fixes #5025.

Also reintroduces r6565, to avoid a regression on #5022.

diff --git a/trac/templates/error.html b/trac/templates/error.html
--- a/trac/templates/error.html
+++ b/trac/templates/error.html
@@ -51,7 +51,7 @@
   </head>
 
   <py:def function="create_ticket(teo=False)">
-    <input type="hidden" name="__preview" value="1" />
+    <input type="hidden" name="preview" value="1" />
     <input type="hidden" name="reporter" value="${get_reporter_id(req)}" />
     <input py:if="teo" type="hidden" name="version"
            value="${'dev' in trac.version and 'devel' or trac.version}" />
diff --git a/trac/ticket/web_ui.py b/trac/ticket/web_ui.py
--- a/trac/ticket/web_ui.py
+++ b/trac/ticket/web_ui.py
@@ -38,7 +38,7 @@
 from trac.ticket.notification import TicketNotifyEmail
 from trac.timeline.api import ITimelineEventProvider
 from trac.util import get_reporter_id, partition
-from trac.util.compat import any
+from trac.util.compat import any, set
 from trac.util.datefmt import to_timestamp, utc
 from trac.util.text import CRLF, shorten_line, obfuscate_email_address
 from trac.util.presentation import separated
@@ -139,13 +139,6 @@
 
     def match_request(self, req):
         if re.match(r'/newticket/?$', req.path_info) is not None:
-            if req.method != 'POST':
-                for k in req.args.keys():
-                    if k.startswith('__'): # non field argument
-                        req.args[k[2:]] = req.args[k]
-                    else:
-                        req.args['field_'+k] = req.args[k]
-                    del req.args[k]
             return True
         match = re.match(r'/ticket/([0-9]+)$', req.path_info)
         if match:
@@ -154,6 +147,8 @@
 
     def process_request(self, req):
         if 'id' in req.args:
+            if req.path_info.startswith('/newticket'):
+                raise TracError(_("id can't be set for a new ticket request."))
             return self._process_ticket_request(req)
         return self._process_newticket_request(req)
 
@@ -340,6 +335,18 @@
     def _process_newticket_request(self, req):
         req.perm.require('TICKET_CREATE')
         ticket = Ticket(self.env)
+
+        # support user-friendly URLs like /newticket?version=0.11&priority=low
+        field_names = set([f['name'] for f in ticket.fields])
+        if req.method != 'POST':
+            for k in req.args.keys():
+                if k in field_names:
+                    req.args['field_'+k] = req.args[k]
+                    del req.args[k]
+            # '__preview' used by deployed 0.11dev Tracs (up to beta2)
+            if '__preview' in req.args:
+                req.args['preview'] = True
+                del req.args['__preview']
 
         if req.method == 'POST' and 'field_owner' in req.args and \
                'TICKET_MODIFY' not in req.perm:

