warnings.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. from datetime import timedelta
  2. from django.utils import timezone
  3. from misago.users.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. active_warnings = warnings[:length]
  31. return active_warnings
  32. def update_user_warning_level(user):
  33. warnings = fetch_user_valid_warnings(user)
  34. user.warning_level = len(warnings)
  35. levels = get_warning_levels()
  36. if user.warning_level and levels[user.warning_level].length_in_minutes:
  37. level_length = levels[user.warning_level].length_in_minutes
  38. next_check_date = warnings[-1].given_on
  39. next_check_date += timedelta(minutes=level_length)
  40. user.warning_level_update_on = next_check_date
  41. else:
  42. user.warning_level_update_on = None
  43. user.save(update_fields=('warning_level', 'warning_level_update_on'))
  44. def get_user_warning_level(user):
  45. warning_level_expiration = user.warning_level_update_on
  46. if warning_level_expiration and warning_level_expiration < timezone.now():
  47. update_user_warning_level(user)
  48. return user.warning_level
  49. def get_user_warning_obj(user):
  50. warning_level = get_user_warning_level(user)
  51. if warning_level:
  52. return get_warning_levels()[warning_level]
  53. else:
  54. return None
  55. def is_user_warning_level_max(user):
  56. user_level = get_user_warning_level(user)
  57. levels = len(get_warning_levels())
  58. return user_level == levels - 1
  59. def warn_user(moderator, user, reason=''):
  60. warning = user.warnings.create(reason=reason,
  61. giver=moderator,
  62. giver_username=moderator.username,
  63. giver_slug=moderator.slug)
  64. user.warning_level_update_on = timezone.now()
  65. update_user_warning_level(user)
  66. return warning
  67. def cancel_warning(moderator, user, warning):
  68. warning.cancel(moderator)
  69. user.warning_level_update_on = timezone.now()
  70. update_user_warning_level(user)
  71. def delete_warning(moderator, user, warning):
  72. warning.delete()
  73. user.warning_level_update_on = timezone.now()
  74. update_user_warning_level(user)