signals.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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 gettext as _
  8. from ..conf import settings
  9. from ..core.pgutils import chunk_queryset
  10. from .models import AuditTrail, DataDownload
  11. from .profilefields import profilefields
  12. User = get_user_model()
  13. anonymize_user_data = 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(
  21. "details",
  22. OrderedDict(
  23. [
  24. (_("Username"), sender.username),
  25. (_("E-mail"), sender.email),
  26. (_("Joined on"), sender.joined_on),
  27. (_("Joined from ip"), sender.joined_from_ip or "unavailable"),
  28. ]
  29. ),
  30. )
  31. @receiver(archive_user_data)
  32. def archive_user_profile_fields(sender, archive=None, **kwargs):
  33. clean_profile_fields = OrderedDict()
  34. for profile_fields_group in profilefields.get_fields_groups():
  35. for profile_field in profile_fields_group["fields"]:
  36. if sender.profile_fields.get(profile_field.fieldname):
  37. field_value = sender.profile_fields[profile_field.fieldname]
  38. clean_profile_fields[str(profile_field.label)] = field_value
  39. if clean_profile_fields:
  40. archive.add_dict("profile_fields", clean_profile_fields)
  41. @receiver(archive_user_data)
  42. def archive_user_avatar(sender, archive=None, **kwargs):
  43. archive.add_model_file(sender.avatar_tmp, directory="avatar", prefix="tmp")
  44. archive.add_model_file(sender.avatar_src, directory="avatar", prefix="src")
  45. for avatar in sender.avatar_set.iterator():
  46. archive.add_model_file(avatar.image, directory="avatar", prefix=avatar.size)
  47. @receiver(archive_user_data)
  48. def archive_user_audit_trail(sender, archive=None, **kwargs):
  49. for audit_trail in chunk_queryset(sender.audittrail_set):
  50. item_name = audit_trail.created_on.strftime("%H%M%S-audit-trail")
  51. archive.add_text(item_name, audit_trail.ip_address, date=audit_trail.created_on)
  52. @receiver(archive_user_data)
  53. def archive_user_name_history(sender, archive=None, **kwargs):
  54. for name_change in sender.namechanges.order_by("id").iterator():
  55. item_name = name_change.changed_on.strftime("%H%M%S-name-change")
  56. archive.add_dict(
  57. item_name,
  58. OrderedDict(
  59. [
  60. (_("New username"), name_change.new_username),
  61. (_("Old username"), name_change.old_username),
  62. ]
  63. ),
  64. date=name_change.changed_on,
  65. )
  66. @receiver(username_changed)
  67. def handle_name_change(sender, **kwargs):
  68. sender.user_renames.update(changed_by_username=sender.username)
  69. @receiver(remove_old_ips)
  70. def remove_old_registrations_ips(sender, **kwargs):
  71. datetime_cutoff = timezone.now() - timedelta(days=settings.MISAGO_IP_STORE_TIME)
  72. ip_is_too_new = Q(joined_on__gt=datetime_cutoff)
  73. ip_is_already_removed = Q(joined_from_ip__isnull=True)
  74. queryset = User.objects.exclude(ip_is_too_new | ip_is_already_removed)
  75. queryset.update(joined_from_ip=None)
  76. @receiver(remove_old_ips)
  77. def remove_old_audit_trails(sender, **kwargs):
  78. removal_cutoff = timezone.now() - timedelta(days=settings.MISAGO_IP_STORE_TIME)
  79. AuditTrail.objects.filter(created_on__lte=removal_cutoff).delete()
  80. @receiver(anonymize_user_data)
  81. def delete_data_downloads(sender, **kwargs):
  82. for data_download in chunk_queryset(sender.datadownload_set):
  83. data_download.delete()