changeset 334:70f5630b1e1e

Tracker: more display form fields
author Sylvain Beucler <beuc@beuc.net>
date Sun, 22 Aug 2010 22:18:04 +0200
parents 1de0e15f60d6
children 0718a9ef6cd5
files doc/scripts/tracker_gendefs.py migrate_old_savane.sql savane/tracker/defs.py savane/tracker/models.py templates/tracker/item_form.html
diffstat 5 files changed, 81 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- a/doc/scripts/tracker_gendefs.py
+++ b/doc/scripts/tracker_gendefs.py
@@ -18,17 +18,17 @@
     name = row[1]
     field_names.append(name)
     defs[name] = ''
-    if name == 'field_name':
-        defs[name] += "    'name' : {\n"
-    else:
-        defs[name] += "    '"+name+"' : {\n"
+    defs[name] += "    '"+name+"' : {\n"
     for i,val in enumerate(row):
         if i <= 0 \
                 or (complex_defs[name]['display_type'] not in ('TA', 'TF') and tfields[i] == 'display_size'):
             continue
         else:
+            col_name = tfields[i]
+            if col_name == 'field_name':
+                col_name = 'name'
             defs[name] += "        " \
-                + "'"+tfields[i]+"'" \
+                + "'"+col_name+"'" \
                 + ": "
             if tfields[i] == 'label' or tfields[i] == 'description':
                 defs[name] += '_("' + val + '"),'
@@ -37,11 +37,10 @@
                 # override priority.required so we have a common
                 # definition for all trackers
                 defs[name] += str(0)+","
-            elif (name=='priority' or name=='resolution_id') \
-                    and tfields[i] == 'empty_ok':
-                # override priority.empty_ok so we have a common
-                # definition for all trackers
-                defs[name] += str(1)+","
+            elif name in ('bug_id','group_id','submitted_by','date','close_date',) \
+                    and tfields[i] == 'display_type':
+                # not editable, no display_type
+                defs[name] += "'',"
             elif type(val) == long:
                 defs[name] += str(val)+","
             else:
--- a/migrate_old_savane.sql
+++ b/migrate_old_savane.sql
@@ -551,7 +551,7 @@
      keep_history, transition_default_auth)
   SELECT
       'bugs', NULL, field_name, use_it, IF(show_on_add<2,0,1), IF(show_on_add%2=0,0,1), show_on_add_members, place,
-      label, description, custom_display_size, custom_empty_ok,
+      label, description, display_size, custom_empty_ok,
       keep_history, transition_default_auth
     FROM temp_bugs_field_usage JOIN savane_old.bugs_field
         USING (bug_field_id)
@@ -562,7 +562,7 @@
      keep_history, transition_default_auth)
   SELECT
       'bugs', NULL, field_name, 0, IF(show_on_add<2,0,1), IF(show_on_add%2=0,0,1), show_on_add_members, place,
-      label, description, custom_display_size, custom_empty_ok,
+      label, description, display_size, custom_empty_ok,
       keep_history, transition_default_auth
     FROM temp_task_field_usage JOIN savane_old.task_field
         USING (bug_field_id)
@@ -582,7 +582,6 @@
 DROP TABLE temp_bugs_field_usage;
 DROP TABLE temp_task_field_usage;
 
-
 -- Get rid of field_value duplicates (old mysql/php/savane bug?)
 -- Apparently this affects 'None' values.
 -- Give priority to the last one (arbitrarily).
--- a/savane/tracker/defs.py
+++ b/savane/tracker/defs.py
@@ -63,7 +63,7 @@
 field_defs = {
     'bug_id' : {
         'name': 'bug_id',
-        'display_type': 'TF',
+        'display_type': '',
         'scope': 'S',
         'required': 1,
         'special': 1,
@@ -71,7 +71,7 @@
     },
     'group_id' : {
         'name': 'group_id',
-        'display_type': 'TF',
+        'display_type': '',
         'scope': 'S',
         'required': 1,
         'special': 1,
@@ -79,7 +79,7 @@
     },
     'submitted_by' : {
         'name': 'submitted_by',
-        'display_type': 'SB',
+        'display_type': '',
         'scope': 'S',
         'required': 1,
         'special': 1,
@@ -87,7 +87,7 @@
     },
     'date' : {
         'name': 'date',
-        'display_type': 'DF',
+        'display_type': '',
         'scope': 'S',
         'required': 1,
         'special': 1,
@@ -95,7 +95,7 @@
     },
     'close_date' : {
         'name': 'close_date',
-        'display_type': 'DF',
+        'display_type': '',
         'scope': 'S',
         'required': 1,
         'special': 1,
--- a/savane/tracker/models.py
+++ b/savane/tracker/models.py
@@ -41,7 +41,8 @@
 # EDIT: actually I think only forms fields cannot be overriden, it
 # still can be done programmatically
 
-DISPLAY_TYPE_CHOICES = (('DF', _('date field')),
+DISPLAY_TYPE_CHOICES = (('', _('not editable')),
+                        ('DF', _('date field')),
                         ('SB', _('select box')),
                         ('TA', _('text area')),
                         ('TF', _('text field')),)
@@ -217,6 +218,14 @@
             field_definition['transition_default_auth'] = self.transition_default_auth
         elif field_definition['display_type'] in ('TA', 'TF'):
             field_definition['display_size'] = self.display_size
+            print field_definition['name'], field_definition['display_size']
+            # Make it easier to access the field from templates:
+            if field_definition['display_type'] == 'TF':
+                field_definition['input_size'] = field_definition['display_size'].split("/")[0]
+                field_definition['input_maxlength'] = field_definition['display_size'].split("/")[1]
+            else:
+                field_definition['textarea_cols'] = field_definition['display_size'].split("/")[0]
+                field_definition['textarea_rows'] = field_definition['display_size'].split("/")[1]
         if self.group_id is None or field_definition['special'] != 1:
             field_definition['keep_history'] = self.keep_history
         if self.group_id is None or field_definition['custom'] == 1:
@@ -308,6 +317,10 @@
                 v.append(o)
         values.sort(key=lambda x: x['rank'])
 
+    # Try to apply a translation:
+    for v in values:
+        v['value'] = ugettext(v['value'])
+
     return values
 
 # Auto_increment counters
@@ -488,7 +501,7 @@
         elif self.tracker_id == 'task':
             return "task"
 
-    def get_fields(self):
+    def get_field_defs(self):
         """
         Return fields definition for this group tracker (default
         values + group-specific overlay).  Only apply sensible
@@ -502,7 +515,7 @@
                 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,
+                fields[name]['choices'] = field_get_values(self.tracker_id, self.group,
                                                           fields[name], self.get_value(name))
         return fields
 
@@ -510,7 +523,7 @@
         """
         Return displayable fields, ordered by rank
         """
-        fields = self.get_fields().copy()
+        fields = self.get_field_defs()
         ret = []
         for name in fields.keys():
             if (not (fields[name]['required'] or fields[name]['use_it'])
@@ -565,15 +578,17 @@
                 html += u'<input type="text" size="4" maxlength="4" name="%s_yearfd" value="TODO">' % (name)
             elif field['display_type'] == 'SB':
                 html += u'<select name="%s">\n' % name
-                for option in field['values']:
+                for option in field['choices']:
                     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 += u'<option value="%d"%s>%s</option>\n' % (option['value_id'], selected, option['value'])
                 html += '</select>'
             elif field['display_type'] == 'TA':
+                # TODO: display_size
                 html += u'<textarea name="%s">%s</textarea>' % (name, value)
             elif field['display_type'] == 'TF':
+                # TODO: display_size
                 html += u'<input type="text" name="%s" value="%s" />' % (name, value)
             html += '</td>\n'
 
--- a/templates/tracker/item_form.html
+++ b/templates/tracker/item_form.html
@@ -27,14 +27,17 @@
 <tr>
   <th>{% trans "Submitted by" %}{% trans ": " %}</th>
   <td>
-  {% if object.submitted_by %}
-  <a href="{% url savane:svmain:user_detail object.submitted_by.username %}"
-  >{{object.submitted_by.get_full_name}}
-    &lt;{{object.submitted_by.username}}&gt;</a>
-  {% else %}
-  {% trans "Anonymous" %}
-  {% endif %}</td>
-  <td colspan="2" class="button"><input type="submit" style="font-weight: bold;" value="{% trans "Submit changes and browse items" %}" />
+    {% if object.submitted_by %}
+    <a href="{% url savane:svmain:user_detail object.submitted_by.username %}"
+    >{{object.submitted_by.get_full_name}}
+      &lt;{{object.submitted_by.username}}&gt;</a>
+    {% else %}
+    {% trans "Anonymous" %}
+    {% endif %}
+  </td>
+  <td colspan="2" class="button">
+    <input type="submit" style="font-weight: bold;" value="{% trans "Submit changes and browse items" %}" />
+  </td>
 </tr>
 <tr>
   <th>{% trans "Submitted on" %}{% trans ": " %}</th>
@@ -43,10 +46,43 @@
 </tr>
 <tr><td colspan="4" style="height: 15px;"></td></tr>
 {{object.get_form}}
+<tr>
+  <th>{% trans "Summary" %}{% trans ": "%}</th>
+  <td colspan="3">
+    <input type="text" name="summary" value="{{object.get_summary}}"
+      maxlength="{{object.get_field_defs.summary.input_maxlength}}"
+      size="{{object.get_field_defs.summary.input_size}}"
+    />
+  </td>
+</tr>
 </table>
 
+
 <h2>{% trans "Post a comment" %}</h2>
 
+<p class="preinput">{% trans "Add a new comment" %}{% trans ": " %}<br />
+  <textarea cols="65" rows="16" name="comment"></textarea>
+</p>
+<p class="preinput">{% trans "Comment type & canned response" %}{% trans ": " %}<br />
+  <select name="comment_type_id">
+    {% for choice in object.get_field_defs.comment_type_id.choices %}
+    <option value="{{choice.value_id}}">{{choice.value}}</option>
+    {% endfor %}
+  </select>
+  &nbsp;
+  {% if 0 %}
+  <select named="canned_response">
+  <option value="">TODO</option>
+  </select>
+  {% else %}
+  {% trans "No canned response available" %}
+  &nbsp;
+  <a class="smaller" href="TODO">
+  ({% trans "Or define a new canned response" %})
+  </a>
+  {% endif %}
+</p>
+
 <h2>{% trans "Discussion" %}</h2>
 
 <h2>{% trans "Attached files" %}</h2>