signals.py 3.3 KB

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