Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 1st, 2012  |  syntax: None  |  size: 2.95 KB  |  hits: 18  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. Custom columns using Django admin
  2. subject | year | quarter | sales |
  3. ----------------------------------
  4.    1    | 2010 |   1     | 20    |
  5.    1    | 2010 |   2     | 100   |
  6.    1    | 2010 |   3     | 100   |
  7.    1    | 2010 |   4     | 20    |
  8.    1    | 2011 |   1     | 30    |
  9.    1    | 2011 |   2     | 50    |
  10.    1    | 2011 |   4     | 40    |
  11.    2    | 2010 |   1     | 30    |
  12.    2    | 2010 |   2     | 20    |
  13.  [..-GO ON this way...]
  14.        
  15. subject | sales current year | sales current quarter | sales last year | sales current quarter last year |
  16. ----------------------------------------------------------------------------------------------------------
  17.   1     |  110               |  30                   |  240            |  20
  18. [AND SO ON]
  19.        
  20. from django.db.models import Sum
  21.  
  22. class Data(models.Model):
  23.     ...
  24.  
  25.     # Method used by `get_current_year_sales` and `get_last_year_sales`
  26.     # to stay DRY. Not for use directly in admin.
  27.     def get_year_sales(self, year):
  28.         qs = self.model._default_manager.filter(year=year)
  29.         sales_agg = qs.aggregate(Sum('sales'))
  30.         return sales_agg['sales__sum']
  31.  
  32.     # Method used by `get_current_quarter_sales` and `get_last_quarter_sales`
  33.     # to stay DRY. Not for use directly in admin.
  34.     def get_quarter_sales(self, year, quarter):
  35.         qs = self.model._default_manager.filter(year=year, quarter=quarter)
  36.         sales_agg = qs.aggregate(Sum('sales'))
  37.         return sales_agg['sales__sum']
  38.  
  39.     def get_current_year_sales(self):
  40.         return self.get_year_sales(datetime.now().year)
  41.     get_current_year_sales.short_description = 'Sales (Current Year)'
  42.  
  43.     def get_last_year_sales(self):
  44.         return self.get_year_sales(datetime.now().year-1)
  45.     get_last_year_sales.short_description = 'Sales (Last Year)'
  46.  
  47.     def get_current_quarter_sales(self):
  48.         # Determine current quarter logic here as `current_quarter`
  49.         # `quarter_year` will likely be same as current year here,
  50.         # but will need to be calculated for previous quarter
  51.         return self.get_quarter_sales(quarter_year, current_quarter)
  52.     get_current_quarter_sales.short_description = 'Sales (Current Quarter)'
  53.  
  54.     def get_current_quarter_sales(self):
  55.         # Logic here to determine last quarter as `last_quarter`
  56.         # Logic to determine what year last quarter was in as `quarter_year`
  57.         return self.get_quarter_sales(quarter_year, last_quarter)
  58.     get_last_quarter_sales.short_description = 'Sales (Last Quarter)'
  59.        
  60. class DataAdmin(admin.ModelAdmin):
  61.     ...
  62.     list_display = ('subject', 'get_current_year_sales', 'get_last_year_sales', 'get_current_quarter_sales', 'get_last_quarter_sales')
  63.        
  64. # models.py
  65. class Data(models.Model):
  66.     year = models.DateField()
  67.     sales = models.IntegerField()
  68.     # ...
  69.  
  70.     def sales_current_year(self):
  71.         return self.model._default_manager.get_query_set().filter(year=2012).annotate(Sum('sales'))
  72.  
  73.  # admin.py
  74.  class DataAdmin(admin.ModelAdmin):
  75.       list_display = ('sales_current_year')