You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by tv...@apache.org on 2013/03/22 23:54:40 UTC

[13/21] git commit: [#4299] ticket:293 Use ProjectUserCombo for 'user' type custom field

[#4299] ticket:293 Use ProjectUserCombo for 'user' type custom field


Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/672f7ba5
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/672f7ba5
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/672f7ba5

Branch: refs/heads/master
Commit: 672f7ba5c3e6338a6136a8965dd753d0bb7f293f
Parents: 3c5a73b
Author: Igor Bondarenko <je...@gmail.com>
Authored: Thu Mar 14 14:34:20 2013 +0000
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Fri Mar 22 21:55:16 2013 +0000

----------------------------------------------------------------------
 ForgeTracker/forgetracker/widgets/ticket_form.py |   51 +++++++++++-----
 1 files changed, 35 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/672f7ba5/ForgeTracker/forgetracker/widgets/ticket_form.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/widgets/ticket_form.py b/ForgeTracker/forgetracker/widgets/ticket_form.py
index c870686..1334b37 100644
--- a/ForgeTracker/forgetracker/widgets/ticket_form.py
+++ b/ForgeTracker/forgetracker/widgets/ticket_form.py
@@ -7,20 +7,24 @@ import ew as ew_core
 import ew.jinja2_ew as ew
 
 from allura import model as M
-from forgetracker import model
 
 class TicketCustomFields(ew.CompoundField):
     template='jinja:forgetracker:templates/tracker_widgets/ticket_custom_fields.html'
 
+    def __init__(self, *args, **kwargs):
+        super(TicketCustomFields, self).__init__(*args, **kwargs)
+        self._fields = None
+
     @property
     def fields(self):
         # milestone is kind of special because of the layout
         # add it to the main form rather than handle with the other customs
-        fields = []
-        for cf in c.app.globals.custom_fields:
-            if cf.name != '_milestone':
-                fields.append(TicketCustomField.make(cf))
-        return fields
+        if self._fields is None:
+            self._fields = []
+            for cf in c.app.globals.custom_fields:
+                if cf.name != '_milestone':
+                    self._fields.append(TicketCustomField.make(cf))
+        return self._fields
 
 class GenericTicketForm(ew.SimpleForm):
     defaults=dict(
@@ -40,21 +44,36 @@ class GenericTicketForm(ew.SimpleForm):
                     del field.options[field.options.index(milestone)]
             ctx = self.context_for(field)
         elif idx == 'assigned_to':
-            user = ctx.get('value')
-            if isinstance(user, basestring):
-                user = M.User.by_username(user)
-            if user:
-                field.options = [
-                    ew.Option(
-                        py_value=user.username,
-                        label='%s (%s)' % (user.display_name, user.username))
-                ]
+            self._add_current_value_to_user_field(field, ctx.get('value'))
+        elif idx == 'custom_fields':
+            for cf in c.app.globals.custom_fields:
+                if cf.type == 'user':
+                    user = ctx.get('value', {}).get(cf.name)
+                    for f in field.fields:
+                        if f.name == cf.name:
+                            self._add_current_value_to_user_field(f, user)
 
         display = field.display(**ctx)
         if ctx['errors'] and field.show_errors and not ignore_errors:
             display = "%s<div class='error'>%s</div>" % (display, ctx['errors'])
         return display
 
+    def _add_current_value_to_user_field(self, field, user):
+        """Adds current field's value to `ProjectUserCombo` options.
+
+        This is done to be able to select default value when widget loads,
+        since normally `ProjectUserCombo` shows without any options, and loads
+        them asynchronously (via ajax).
+        """
+        if isinstance(user, basestring):
+            user = M.User.by_username(user)
+        if user and user != M.User.anonymous():
+            field.options = [
+                ew.Option(
+                    py_value=user.username,
+                    label='%s (%s)' % (user.display_name, user.username))
+            ]
+
     @property
     def fields(self):
         fields = [
@@ -146,7 +165,7 @@ class TicketCustomField(object):
         return ew.NumberField(label=field.label, name=str(field.name))
 
     def _user(field):
-        return ffw.ProjectUserSelect(label=field.label, name=str(field.name))
+        return ffw.ProjectUserCombo(label=field.label, name=str(field.name))
 
     @staticmethod
     def _default(field):