sorting.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. from django.core.urlresolvers import reverse
  2. from django.utils.translation import ugettext_lazy as _
  3. __all__ = ['Sorting']
  4. class Sorting(object):
  5. sortings = (
  6. {
  7. 'method': 'recently-replied',
  8. 'name': _("Recently replied"),
  9. 'order_by': '-last_post_on',
  10. },
  11. {
  12. 'method': 'last-replied',
  13. 'name': _("Last replied"),
  14. 'order_by': 'last_post_on',
  15. },
  16. {
  17. 'method': 'most-replied',
  18. 'name': _("Most replied"),
  19. 'order_by': '-replies',
  20. },
  21. {
  22. 'method': 'least-replied',
  23. 'name': _("Least replied"),
  24. 'order_by': 'replies',
  25. },
  26. {
  27. 'method': 'newest',
  28. 'name': _("Newest"),
  29. 'order_by': '-id',
  30. },
  31. {
  32. 'method': 'oldest',
  33. 'name': _("Oldest"),
  34. 'order_by': 'id',
  35. },
  36. )
  37. def __init__(self, link_name, link_params):
  38. self.link_name = link_name
  39. self.link_params = link_params.copy()
  40. self.default_method = self.sortings[0]['method']
  41. def clean_kwargs(self, kwargs):
  42. sorting = kwargs.get('sort')
  43. if sorting:
  44. if sorting == self.default_method:
  45. kwargs.pop('sort')
  46. return kwargs
  47. available_sortings = [method['method'] for method in self.sortings]
  48. if sorting not in available_sortings:
  49. kwargs.pop('sort')
  50. return kwargs
  51. else:
  52. sorting = self.default_method
  53. self.set_sorting(sorting)
  54. return kwargs
  55. def set_sorting(self, method):
  56. for sorting in self.sortings:
  57. if sorting['method'] == method:
  58. self.sorting = sorting
  59. break
  60. @property
  61. def name(self):
  62. return self.sorting['name']
  63. def choices(self):
  64. choices = []
  65. for sorting in self.sortings:
  66. if sorting['method'] != self.sorting['method']:
  67. if sorting['method'] == self.default_method:
  68. self.link_params.pop('sort', None)
  69. else:
  70. self.link_params['sort'] = sorting['method']
  71. url = reverse(self.link_name, kwargs=self.link_params)
  72. choices.append({
  73. 'name': sorting['name'],
  74. 'url': url,
  75. })
  76. return choices
  77. def sort(self, threads):
  78. threads.sort(self.sorting['order_by'])