Django

Code

Ticket #2856: 2856.diff

File 2856.diff, 3.2 kB (added by ionut_bizau, 7 months ago)

Added a new field (object_exists) to LogEntry?, which becomes False after the object that that entry is referring to is deleted. I think this approach is better than just looking for the object by id, both for performance and for the situation where an object with the same id is added later. This field is then checked in the template.

  • django/contrib/admin/models.py

    old new  
    1111 
    1212class LogEntryManager(models.Manager): 
    1313    def log_action(self, user_id, content_type_id, object_id, object_repr, action_flag, change_message=''): 
    14         e = self.model(None, None, user_id, content_type_id, smart_unicode(object_id), object_repr[:200], action_flag, change_message) 
     14        deletion = action_flag == DELETION 
     15 
     16        if deletion: 
     17            for log in self.filter(object_id__exact=object_id): 
     18                log.object_exists = False 
     19                log.save() 
     20 
     21        e = self.model(None, None, user_id, content_type_id, smart_unicode(object_id), not deletion, object_repr[:200], action_flag, change_message) 
    1522        e.save() 
    1623 
    1724class LogEntry(models.Model): 
     
    1926    user = models.ForeignKey(User) 
    2027    content_type = models.ForeignKey(ContentType, blank=True, null=True) 
    2128    object_id = models.TextField(_('object id'), blank=True, null=True) 
     29    object_exists = models.BooleanField(_('object exists')) 
    2230    object_repr = models.CharField(_('object repr'), max_length=200) 
    2331    action_flag = models.PositiveSmallIntegerField(_('action flag')) 
    2432    change_message = models.TextField(_('change message'), blank=True) 
     
    4957        """ 
    5058        Returns the admin URL to edit the object represented by this log entry. 
    5159        This is relative to the Django admin index page. 
     60        Returns None if the object has been deleted. 
    5261        """ 
    53         return mark_safe(u"%s/%s/%s/" % (self.content_type.app_label, self.content_type.model, self.object_id)) 
     62        if self.object_exists: 
     63            return mark_safe(u"%s/%s/%s/" % (self.content_type.app_label, self.content_type.model, self.object_id)) 
     64        else: 
     65            return None 
     66 
  • django/contrib/admin/templates/admin/index.html

    old new  
    5858            {% else %} 
    5959            <ul class="actionlist"> 
    6060            {% for entry in admin_log %} 
    61             <li class="{% if entry.is_addition %}addlink{% endif %}{% if entry.is_change %}changelink{% endif %}{% if entry.is_deletion %}deletelink{% endif %}">{% if not entry.is_deletion %}<a href="{{ entry.get_admin_url }}">{% endif %}{{ entry.object_repr|escape }}{% if not entry.is_deletion %}</a>{% endif %}<br /><span class="mini quiet">{% filter capfirst %}{% trans entry.content_type.name %}{% endfilter %}</span></li> 
     61            <li class="{% if entry.is_addition %}addlink{% endif %}{% if entry.is_change %}changelink{% endif %}{% if entry.is_deletion %}deletelink{% endif %}">{% if entry.object_exists %}<a href="{{ entry.get_admin_url }}">{% endif %}{{ entry.object_repr|escape }}{% if not entry.is_deletion %}</a>{% endif %}<br /><span class="mini quiet">{% filter capfirst %}{% trans entry.content_type.name %}{% endfilter %}</span></li> 
    6262            {% endfor %} 
    6363            </ul> 
    6464            {% endif %}