changeset 308:006f6c019bc8

Field usage admin
author Sylvain Beucler <beuc@beuc.net>
date Sun, 15 Aug 2010 15:32:04 +0200
parents b503430e963a
children 33a9bdcc4bdd
files migrate_old_savane.sql savane/tracker/admin.py savane/tracker/models.py templates/tracker/item_form.html
diffstat 4 files changed, 35 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/migrate_old_savane.sql
+++ b/migrate_old_savane.sql
@@ -592,4 +592,6 @@
       IFNULL(custom_keep_history, 0), transition_default_auth
    FROM temp_bugs_field_usage JOIN conv_field_ids
       ON (bug_field_id = old AND tracker_id = 'bugs');
+-- Specify "default" differently
+UPDATE tracker_fieldusage SET group_id=NULL WHERE group_id=100;
 DROP TABLE temp_bugs_field_usage;
--- a/savane/tracker/admin.py
+++ b/savane/tracker/admin.py
@@ -24,6 +24,9 @@
 #class TrackerAdmin(admin.ModelAdmin):
 #    list_display  = ('name',)
 
+class FieldUsageInline(admin.TabularInline):
+    model = FieldUsage
+    raw_id_fields = ('group',)
 class FieldAdmin(admin.ModelAdmin):
     search_fields = ('name', 'label', 'description', )
     ordering = ('tracker', 'name', )
@@ -32,6 +35,15 @@
     list_display_links = ('id', 'name', 'label')
     list_filter = ('tracker', 'display_type', 'scope',
                    'required', 'empty_ok', 'keep_history', 'special', 'custom', )
-    #inlines = ( FieldUsage??, )
+    inlines = ( FieldUsageInline, )
+
+class FieldUsageAdmin(admin.ModelAdmin):
+    search_fields = ('group', 'custom_label', 'custom_description', )
+    ordering = ('group', 'field',)
+    list_display  = ('id', 'group', 'field', 'use_it', 'place', )
+    list_display_links = ('id',)
+    list_filter = ('use_it', 'show_on_add', 'show_on_add_members', 'custom_empty_ok', 'custom_keep_history',)
+    raw_id_fields = ('group',)
 
 admin.site.register(Field, FieldAdmin)
+admin.site.register(FieldUsage, FieldUsageAdmin)
--- a/savane/tracker/models.py
+++ b/savane/tracker/models.py
@@ -84,12 +84,6 @@
                     )
     name = models.CharField(max_length=7, choices=NAME_CHOICES, primary_key=True)
 
-    ITEM_NAMES = (('bugs', _('bug')),
-                  ('patch', _('patch')),
-                  ('support', _('support')),
-                  ('task', _('task')),
-                  )
-
     def __unicode__(self):
         "Used in the admin interface fields list"
         return self.name
@@ -178,12 +172,17 @@
     special = models.BooleanField(help_text=_("field is not entered by the user but by the system"))
     custom = models.BooleanField(help_text=_("let the user change the label and description"))
 
+    def __unicode__(self):
+        return "%s.%s" % (self.tracker_id, self.name)
+
 class FieldUsage(models.Model):
     """
     Field configuration for each group
     """
     class Meta:
         unique_together = (('field', 'group'),)
+        verbose_name = _("field usage")
+        verbose_name_plural = _("field usages")
 
     TRANSITION_DEFAULT_AUTH_CHOICES = (('', _('undefined')),
                                        ('A', _('allowed')),
@@ -196,7 +195,7 @@
                                ('1', _('optional (empty values are accepted)')),
                                ('3', _('mandatory')),)
     field = models.ForeignKey('Field')
-    group = models.ForeignKey(auth_models.Group)
+    group = models.ForeignKey(auth_models.Group, blank=True, null=True, help_text=_("NULL == default"))
     use_it = models.BooleanField(_("used"))
     show_on_add = models.CharField(max_length=1, choices=SHOW_ON_ADD_CHOICES,
                                    default='0', blank=True, null=True)
@@ -204,7 +203,7 @@
       # show_on_add_logged_in = models.BooleanField("show to logged in users")
       # show_on_add_anonymous = models.BooleanField("show to anonymous users")
     show_on_add_members = models.BooleanField(_("show to project members"))
-    place = models.IntegerField() # new:rank
+    place = models.IntegerField(help_text=_("display rank")) # new:rank
     transition_default_auth = models.CharField(max_length=1, choices=TRANSITION_DEFAULT_AUTH_CHOICES, default='A')
 
     custom_empty_ok = models.CharField(max_length=1, choices=CUSTOM_EMPTY_OK_CHOICES,
@@ -390,10 +389,15 @@
         elif self.tracker_id == 'task':
             return self.public_task_id
 
-    def get_item_name(self):
-        for (k,v) in Tracker.ITEM_NAMES:
-            if k == self.tracker_id:
-                return v
+    def get_shortcut(self):
+        if self.tracker_id == 'bugs':
+            return "bug #%d" % self.public_bugs_id
+        elif self.tracker_id == 'patch':
+            return "patch #%d" % self.public_bugs_id
+        elif self.tracker_id == 'support':
+            return "sr #%d" % self.public_bugs_id
+        elif self.tracker_id == 'task':
+            return "task #%d" % self.public_bugs_id
 
     def get_tracker_name(self):
         for (k,v) in Tracker.NAME_CHOICES:
@@ -418,8 +422,8 @@
 
 class ItemMsgId(models.Model):
     """
-    Identifier for in 'Message-Id' and 'References' e-mail fields,
-    used to group messages by conversation
+    Identifier for 'Message-Id' and 'References' e-mail fields, used
+    to group messages by conversation
     """
     item = models.ForeignKey('Item')
     msg_id = models.CharField(max_length=255)
--- a/templates/tracker/item_form.html
+++ b/templates/tracker/item_form.html
@@ -3,7 +3,7 @@
 
 {% block title %}
 {{object.group.name}} - {{object.get_tracker_name}}{% trans ": " %}
-  {{object.get_item_name}} #{{object.get_public_id}},
+  {{object.get_shortcut}},
   {{object.get_summary|truncatewords:5}}
 {% endblock %}
 
@@ -17,7 +17,7 @@
 
 <h1 class="{{object.get_priority_css_class}}">
   <em><a href="{% url savane:tracker:item_detail object.tracker_id object.get_public_id %}"
-    >{{object.get_item_name}} #{{object.get_public_id}}</a></em>{% trans ": " %}
+    >{{object.get_shortcut}}</a></em>{% trans ": " %}
   {{object.get_summary}}
 </h1>