diff --git a/colab/accounts/models.py b/colab/accounts/models.py index e7e21486..35f632dc 100644 --- a/colab/accounts/models.py +++ b/colab/accounts/models.py @@ -9,7 +9,7 @@ from django.utils.translation import ugettext_lazy as _ from .signals import (user_created, user_password_changed, - user_basic_info_updated) + user_basic_info_updated, delete_user) from .utils import mailman @@ -93,6 +93,14 @@ def set_password(self, raw_password): if self.pk: user_password_changed.send(User, user=self, password=raw_password) + def delete(self, using=None): + + emails = " ".join(self.emails.values_list('address', flat=True)) + super(User, self).delete(using) + + user = User.objects.filter(id=self.id) + if not user: + delete_user.send(User, user=self, emails=emails) # We need to have `email` field set as unique but Django does not # support field overriding (at least not until 1.6). diff --git a/colab/accounts/signals.py b/colab/accounts/signals.py index d1f0a186..9417b42d 100644 --- a/colab/accounts/signals.py +++ b/colab/accounts/signals.py @@ -1,7 +1,6 @@ - from django.dispatch import Signal - user_created = Signal(providing_args=['user', 'password']) user_password_changed = Signal(providing_args=['user', 'password']) user_basic_info_updated = Signal(providing_args=['user', 'update_email']) +delete_user = Signal(providing_args=['user', 'emails']) diff --git a/colab/super_archives/apps.py b/colab/super_archives/apps.py index 19f36c34..db840f64 100644 --- a/colab/super_archives/apps.py +++ b/colab/super_archives/apps.py @@ -1,4 +1,3 @@ - from django.apps import AppConfig @@ -7,5 +6,4 @@ class SuperArchivesConfig(AppConfig): verbose_name = 'Super Archives' def ready(self): - pass - # from . import signals + import colab.super_archives.signals # NOQA diff --git a/colab/super_archives/signals.py b/colab/super_archives/signals.py index ba3a4f75..746cf620 100644 --- a/colab/super_archives/signals.py +++ b/colab/super_archives/signals.py @@ -1,23 +1,16 @@ - -from django.db.models.signals import post_save -from django.dispatch import receiver -from django.conf import settings - from .models import EmailAddress +from django.dispatch import receiver +from colab.accounts.signals import (delete_user) -@receiver(post_save, sender=settings.AUTH_USER_MODEL) -def create_email_address(sender, instance, created, **kwargs): - if not created: - return +@receiver(delete_user) +def delete_user_from_superarchive(sender, **kwargs): + user = kwargs.get('user') + emails = [] - email, email_created = EmailAddress.objects.get_or_create( - address=instance.email, - defaults={ - 'real_name': instance.get_full_name(), - 'user': instance, - } - ) + if kwargs.get('emails'): + emails = kwargs.get('emails').split(' ') - email.user = instance - email.save() + for email in emails: + EmailAddress.objects.filter(address=email).first().delete() + user.update_subscription(email, []) diff --git a/colab/super_archives/tests/test_signals.py b/colab/super_archives/tests/test_signals.py new file mode 100644 index 00000000..29447d92 --- /dev/null +++ b/colab/super_archives/tests/test_signals.py @@ -0,0 +1,43 @@ +# -*- coding:utf-8 -*- + +from mock import patch + +from colab.accounts.models import User +from django.test import TestCase +from colab.super_archives.models import EmailAddress + + +class SignalsTest(TestCase): + def setUp(self): + self.user = self.create_user() + + def create_user(self): + user = User() + user.username = "USERtestCoLaB" + user.set_password("123colab4") + user.email = "usertest@colab.com.br" + user.id = 1 + user.first_name = "USERtestCoLaB" + user.last_name = "COLAB" + user.save() + + return user + + @patch.object(User, 'update_subscription') + def test_delete_user_without_email(self, update_subscription_mock): + update_subscription_mock.return_value = True + self.user.delete() + self.assertEqual(0, update_subscription_mock.call_count) + + @patch.object(User, 'update_subscription') + def test_delete_user_with_email(self, update_subscription_mock): + update_subscription_mock.return_value = True + + EmailAddress.objects.get_or_create(user=self.user, + address="usertest@colab.com.br") + EmailAddress.objects.get_or_create(user=self.user, + address="teste@gmail.com") + + self.user.delete() + self.assertEqual(2, update_subscription_mock.call_count) + self.assertEqual(0, EmailAddress.objects.count())