signals.py 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. from collections import OrderedDict
  2. from datetime import timedelta
  3. from django.contrib.auth import get_user_model
  4. from django.db.models import Q
  5. from django.dispatch import Signal, receiver
  6. from django.utils import timezone
  7. from django.utils.translation import ugettext as _
  8. from misago.conf import settings
  9. from misago.core.pgutils import chunk_queryset
  10. from .models import AuditTrail
  11. from .profilefields import profilefields
  12. UserModel = get_user_model()
  13. anonymize_user_content = Signal()
  14. archive_user_data = Signal()
  15. delete_user_content = Signal()
  16. remove_old_ips = Signal()
  17. username_changed = Signal()
  18. @receiver(archive_user_data)
  19. def archive_user_details(sender, archive=None, **kwargs):
  20. archive.add_dict('details', OrderedDict([
  21. (_('Username'), sender.username),
  22. (_('E-mail'), sender.email),
  23. (_('Joined on'), sender.joined_on),
  24. (_('Joined from ip'), sender.joined_from_ip or 'unavailable'),
  25. ]))
  26. @receiver(archive_user_data)
  27. def archive_user_profile_fields(sender, archive=None, **kwargs):
  28. clean_profile_fields = OrderedDict()
  29. for profile_fields_group in profilefields.get_fields_groups():
  30. for profile_field in profile_fields_group['fields']:
  31. if sender.profile_fields.get(profile_field.fieldname):
  32. field_value = sender.profile_fields[profile_field.fieldname]
  33. clean_profile_fields[str(profile_field.label)] = field_value
  34. if clean_profile_fields:
  35. archive.add_dict('profile_fields', clean_profile_fields)
  36. @receiver(archive_user_data)
  37. def archive_user_avatar(sender, archive=None, **kwargs):
  38. avatars_path = ['avatar']
  39. archive.add_model_file(sender.avatar_tmp, avatars_path)
  40. archive.add_model_file(sender.avatar_src, avatars_path)
  41. for avatar in sender.avatar_set.iterator():
  42. archive.add_model_file(avatar.image, avatars_path)
  43. @receiver(archive_user_data)
  44. def archive_user_audit_trail(sender, archive=None, **kwargs):
  45. queryset = sender.audittrail_set.order_by('id')
  46. for audit_trail in chunk_queryset(queryset):
  47. item_name = audit_trail.created_at.strftime('audit_trail_%H%M%S')
  48. item_path = [audit_trail.created_at.year, audit_trail.created_at.month, audit_trail.created_at.day]
  49. archive.add_text(item_name, audit_trail.ip_address, item_path)
  50. @receiver(archive_user_data)
  51. def archive_user_name_history(sender, archive=None, **kwargs):
  52. for name_change in sender.namechanges.order_by('id').iterator():
  53. item_name = name_change.changed_on.strftime('name_change_%H%M%S')
  54. item_path = [name_change.changed_on.year, name_change.changed_on.month, name_change.changed_on.day]
  55. archive.add_dict(item_name, OrderedDict([
  56. (_("New username"), name_change.new_username),
  57. (_("Old username"), name_change.old_username),
  58. ]), item_path)
  59. @receiver(username_changed)
  60. def handle_name_change(sender, **kwargs):
  61. sender.user_renames.update(changed_by_username=sender.username)
  62. @receiver(remove_old_ips)
  63. def remove_old_registrations_ips(sender, **kwargs):
  64. datetime_cutoff = timezone.now() - timedelta(days=settings.MISAGO_IP_STORE_TIME)
  65. ip_is_too_new = Q(joined_on__gt=datetime_cutoff)
  66. ip_is_already_removed = Q(joined_from_ip__isnull=True)
  67. queryset = UserModel.objects.exclude(ip_is_too_new | ip_is_already_removed)
  68. queryset.update(joined_from_ip=None)
  69. @receiver(remove_old_ips)
  70. def remove_old_audit_trails(sender, **kwargs):
  71. removal_cutoff = timezone.now() - timedelta(days=settings.MISAGO_IP_STORE_TIME)
  72. AuditTrail.objects.filter(created_at__lte=removal_cutoff).delete()