warnings.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. from datetime import timedelta
  2. from django.utils import timezone
  3. from .models import WarningLevel
  4. def get_warning_levels():
  5. return WarningLevel.objects.dict()
  6. def fetch_user_valid_warnings(user):
  7. levels = get_warning_levels()
  8. max_level = len(levels) - 1
  9. if not max_level:
  10. return []
  11. # build initial list of valid exceptions
  12. queryset = user.warnings.exclude(is_canceled=True)
  13. warnings = [w for w in queryset.order_by('-id')[:max_level]]
  14. if not warnings:
  15. return []
  16. # expire levels
  17. active_warnings = []
  18. for length, level in enumerate(levels.values()[1:]):
  19. length += 1
  20. level_warnings = []
  21. if level.length_in_minutes:
  22. cutoff_date = timezone.now()
  23. cutoff_date -= timedelta(minutes=level.length_in_minutes)
  24. for warning in warnings:
  25. if warning.given_on >= cutoff_date:
  26. level_warnings.append(warning)
  27. if len(level_warnings) == length:
  28. active_warnings = level_warnings[:length]
  29. else:
  30. break
  31. else:
  32. active_warnings = warnings[:length]
  33. return active_warnings
  34. def update_user_warning_level(user):
  35. warnings = fetch_user_valid_warnings(user)
  36. user.warning_level = len(warnings)
  37. levels = get_warning_levels()
  38. if user.warning_level and levels[user.warning_level].length_in_minutes:
  39. level_length = levels[user.warning_level].length_in_minutes
  40. next_check_date = warnings[-1].given_on
  41. next_check_date += timedelta(minutes=level_length)
  42. user.warning_level_update_on = next_check_date
  43. else:
  44. user.warning_level_update_on = None
  45. user.save(update_fields=('warning_level', 'warning_level_update_on'))
  46. def get_user_warning_level(user):
  47. warning_level_expiration = user.warning_level_update_on
  48. if warning_level_expiration and warning_level_expiration < timezone.now():
  49. update_user_warning_level(user)
  50. return user.warning_level
  51. def get_user_warning_obj(user):
  52. warning_level = get_user_warning_level(user)
  53. if warning_level:
  54. return get_warning_levels()[warning_level]
  55. else:
  56. return None
  57. def is_user_warning_level_max(user):
  58. user_level = get_user_warning_level(user)
  59. levels = len(get_warning_levels())
  60. return user_level == levels - 1
  61. def warn_user(moderator, user, reason=''):
  62. warning = user.warnings.create(reason=reason,
  63. giver=moderator,
  64. giver_username=moderator.username,
  65. giver_slug=moderator.slug)
  66. user.warning_level_update_on = timezone.now()
  67. update_user_warning_level(user)
  68. return warning
  69. def cancel_warning(moderator, user, warning):
  70. warning.cancel(moderator)
  71. user.warning_level_update_on = timezone.now()
  72. update_user_warning_level(user)
  73. def delete_warning(moderator, user, warning):
  74. warning.delete()
  75. user.warning_level_update_on = timezone.now()
  76. update_user_warning_level(user)