changeset 331:e29de6a47cc1

Select box choices display
author Sylvain Beucler <beuc@beuc.net>
date Sun, 22 Aug 2010 13:50:15 +0200
parents 965cc693342b
children 7234fcf49cc0
files migrate_old_savane.sql savane/tracker/models.py templates/tracker/item_form.html
diffstat 3 files changed, 51 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/migrate_old_savane.sql
+++ b/migrate_old_savane.sql
@@ -541,7 +541,10 @@
 -- twice or something.
 -- Give priority to the last one.
 -- Need to create a real table - a temporary one has issues with being "reopened" in joins
-DROP TABLE IF EXISTS temp_bugs_field_usage;
+-- The following produces a warning that and MySQL employees can't
+-- understand that it's a problem - commenting:
+-- (http://bugs.mysql.com/bug.php?id=2839)
+-- DROP TABLE IF EXISTS temp_bugs_field_usage;
 CREATE TABLE temp_bugs_field_usage AS SELECT * FROM savane_old.bugs_field_usage;
 ALTER TABLE temp_bugs_field_usage ADD (id INT auto_increment PRIMARY KEY);
 DELETE FROM temp_bugs_field_usage
@@ -558,11 +561,11 @@
 -- tracker.defs.
 TRUNCATE tracker_fieldoverlay;
 INSERT INTO tracker_fieldoverlay
-    (group_id, field_name, use_it, show_on_add_anonymous, show_on_add_connected, show_on_add_members, rank,
+    (tracker_id, group_id, field_name, use_it, show_on_add_anonymous, show_on_add_connected, show_on_add_members, rank,
      label, description, display_size, empty_ok,
      keep_history, transition_default_auth)
   SELECT
-      group_id, field_name, use_it, IF(show_on_add<2,0,1), IF(show_on_add%2=0,0,1), show_on_add_members, place,
+      'bugs', group_id, field_name, use_it, IF(show_on_add<2,0,1), IF(show_on_add%2=0,0,1), show_on_add_members, place,
       custom_label, custom_description, custom_display_size, custom_empty_ok,
       IFNULL(custom_keep_history, 0), transition_default_auth
     FROM temp_bugs_field_usage JOIN savane_old.bugs_field
@@ -587,10 +590,10 @@
 -- field_id <- bug_field_id
 TRUNCATE tracker_fieldvalue;
 INSERT INTO tracker_fieldvalue
-    (group_id, field_name, value_id, `value`, description,
-     order_id, status, email_ad, send_all_flag)
+    (tracker_id, group_id, field_name, value_id, `value`, description,
+     rank, status, email_ad, send_all_flag)
   SELECT
-     group_id, field_name, value_id, `value`, savane_old.bugs_field_value.description,
+     'bugs', group_id, field_name, value_id, `value`, savane_old.bugs_field_value.description,
      order_id, status, email_ad, send_all_flag
    FROM savane_old.bugs_field_value JOIN savane_old.bugs_field
       USING (bug_field_id);
--- a/savane/tracker/models.py
+++ b/savane/tracker/models.py
@@ -162,7 +162,8 @@
     TRANSITION_DEFAULT_AUTH_CHOICES = (('', _('undefined')),
                                        ('A', _('allowed')),
                                        ('F', _('forbidden')),)
-    group = models.ForeignKey(auth_models.Group)
+    tracker = models.ForeignKey(Tracker)
+    group = models.ForeignKey(auth_models.Group, blank=True, null=True, help_text=_("NULL == default"))
     field_name = models.CharField(max_length=32)
 
     # If not Field.required:
@@ -229,7 +230,8 @@
     STATUS_CHOICES = (('A', _('active')),
                       ('H', _('hidden')), # mask previously-active or system fields
                       ('P', _('permanent')),) # status cannot be modified, always visible
-    group = models.ForeignKey(auth_models.Group)
+    tracker = models.ForeignKey(Tracker)
+    group = models.ForeignKey(auth_models.Group, blank=True, null=True, help_text=_("NULL == default"))
     field_name = models.CharField(max_length=32)
     value_id = models.IntegerField(db_index=True) # group_specific value identifier
       # It's not a duplicate of 'id', as it's the value referenced by
@@ -237,7 +239,7 @@
       # customized per-project.
     value = models.CharField(max_length=255) # label
     description = models.TextField()
-    order_id = models.IntegerField() # new:rank
+    rank = models.IntegerField()
     status = models.CharField(max_length=1, choices=STATUS_CHOICES, default='A', db_index=True)
 
     # Field category: specific (bad!) field for e-mail notifications
@@ -245,6 +247,31 @@
                                 help_text=_("comma-separated list of e-mail addresses to notify when an item is created or modified in this category"))
     send_all_flag = models.BooleanField(_("send on all updates"), default=True)
 
+    def __unicode__(self):
+        #return "%s.%s: %s (%d)" % (self.tracker_id, self.field_name, self.value, self.value_id)
+        group_name = '<default>'
+        if self.group_id != 0:
+            group_name = self.group.name
+        return "%s.%s: %s (%d)" % (group_name, self.field_name, self.value, self.value_id)
+
+def field_get_values(tracker_id, group, field_name):
+    """
+    Return all possible values for this select box field
+    """
+    if field_name == 'assigned_to':
+        # Hard-coded processing: it's a list of project members
+        default_values = [{'value_id' : -1, 'value' : _("None")}]
+        for user in group.user_set.order_by('username'):
+            default_values.append({'value_id' : user.pk, 'value' : user.username})
+    else:
+        #tracker_id=tracker_id, 
+        default_values = list(FieldValue.objects \
+            .filter(group=None, field_name=field_name).exclude(status='H') \
+            .values('value_id', 'value', 'rank'))
+        # value overlays
+        default_values.sort(key=lambda x: x['rank'])
+    return default_values
+
 # Auto_increment counters
 # We could make this more generic, but we'd have to implement
 # per-tracker atomic ID increment manually.
@@ -430,10 +457,13 @@
         overlay values (cf. FieldOverlay model definition).
         """
         fields = deepcopy(default_fields[self.tracker_id])
-        overlays = FieldOverlay.objects.filter(group=self.group)
+        overlays = FieldOverlay.objects.filter(tracker=self.tracker_id, group=self.group)
         for overlay in overlays:
             name = overlay.field_name
             overlay.apply_on[fields[name]]
+        for name in fields:
+            if fields[name]['display_type'] == 'SB':
+                fields[name]['values'] = field_get_values(self.tracker_id, self.group, name)
         return fields
 
     def get_form_fields(self, user=None):
@@ -477,7 +507,13 @@
                 html += '</select>\n'
                 html += u'<input type="text" length="4" maxlength="4" name="%s_yearfd" value="TODO">' % (name)
             elif field['display_type'] == 'SB':
-                html += u'<select name="%s"><option value="-1">TODO</option></select>' % (name)
+                html += u'<select name="%s">\n' % name
+                for option in field['values']:
+                    selected = ''
+                    if option['value_id'] == value:
+                        selected = ' selected="selected"'
+                    html += u'<option value="%d"%s>%s</option>\n' % (option['value_id'], selected, ugettext(option['value']))
+                html += '</select>'
             elif field['display_type'] == 'TA':
                 html += u'<textarea name="%s">%s</textarea>' % (name, value)
             elif field['display_type'] == 'TF':
--- a/templates/tracker/item_form.html
+++ b/templates/tracker/item_form.html
@@ -41,6 +41,7 @@
   <td>{{ object.date }}</td>
   <td colspan="2" class="button"><input type="submit" value="{% trans "Submit changes and return to this item" %}" /></td>
 </tr>
+<tr><td colspan="4" style="height: 15px;"></td></tr>
 {{object.get_form}}
 </table>