diff --git a/apps/user/admin.py b/apps/user/admin.py index 5440f146..77d060dc 100644 --- a/apps/user/admin.py +++ b/apps/user/admin.py @@ -3,7 +3,7 @@ from django.contrib.auth import get_user_model from django.contrib.auth.admin import UserAdmin as BaseUserAdmin from django.utils.translation import gettext_lazy as _ -from .models import AuthorRequest +from .models import AuthorRequest, EmailSubscription, SubscriptionCategory User = get_user_model() @@ -33,3 +33,17 @@ class AuthorRequestAdmin(admin.ModelAdmin): 'created_at', 'update_at', ) + + +@admin.register(SubscriptionCategory) +class SubscriptionCategoryAdmin(admin.ModelAdmin): + list_display = ('title',) + + +@admin.register(EmailSubscription) +class EmailSubscriptionAdmin(admin.ModelAdmin): + list_display = ( + 'id', + 'user', + 'email', + ) diff --git a/apps/user/migrations/0015_auto_20180315_0547.py b/apps/user/migrations/0015_auto_20180315_0547.py new file mode 100644 index 00000000..dddc43d5 --- /dev/null +++ b/apps/user/migrations/0015_auto_20180315_0547.py @@ -0,0 +1,45 @@ +# Generated by Django 2.0.3 on 2018-03-15 05:47 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('user', '0014_authorrequest_accepted_send_at'), + ] + + operations = [ + migrations.CreateModel( + name='EmailSubscription', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('email', models.EmailField(max_length=254, unique=True, verbose_name='email address')), + ('mailchimp_status', models.PositiveSmallIntegerField(choices=[(0, 'error'), (1, 'sent')], default=0)), + ], + ), + migrations.CreateModel( + name='SubscriptionCategory', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=100)), + ], + options={ + 'verbose_name': 'Категория подписки', + 'verbose_name_plural': 'Категории подписки', + 'ordering': ('title',), + }, + ), + migrations.AddField( + model_name='emailsubscription', + name='categories', + field=models.ManyToManyField(to='user.SubscriptionCategory'), + ), + migrations.AddField( + model_name='emailsubscription', + name='user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/apps/user/migrations/0016_auto_20180315_0603.py b/apps/user/migrations/0016_auto_20180315_0603.py new file mode 100644 index 00000000..3c5d3f47 --- /dev/null +++ b/apps/user/migrations/0016_auto_20180315_0603.py @@ -0,0 +1,20 @@ +# Generated by Django 2.0.3 on 2018-03-15 06:03 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('user', '0015_auto_20180315_0547'), + ] + + operations = [ + migrations.AlterField( + model_name='emailsubscription', + name='user', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='email_subscription', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/apps/user/migrations/0017_subscriptioncategory_auto_add.py b/apps/user/migrations/0017_subscriptioncategory_auto_add.py new file mode 100644 index 00000000..9530f62c --- /dev/null +++ b/apps/user/migrations/0017_subscriptioncategory_auto_add.py @@ -0,0 +1,18 @@ +# Generated by Django 2.0.3 on 2018-03-15 06:18 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('user', '0016_auto_20180315_0603'), + ] + + operations = [ + migrations.AddField( + model_name='subscriptioncategory', + name='auto_add', + field=models.BooleanField(default=False), + ), + ] diff --git a/apps/user/models.py b/apps/user/models.py index dd0ad0a1..c9aad8e8 100644 --- a/apps/user/models.py +++ b/apps/user/models.py @@ -99,10 +99,21 @@ def send_user_info_to_mixpanel(sender, instance=None, created=False, **kwargs): instance.first_name, instance.last_name, instance.date_joined, - instance.role, + dict(User.ROLE_CHOICES).get(instance.role), ) +@receiver(post_save, sender=User) +def auto_create_subscription(sender, instance=None, created=False, **kwargs): + if not hasattr(instance, 'email_subscription'): + instance.email_subscription = EmailSubscription.objects.create( + user=instance, + email=instance.email, + ) + instance.email_subscription.categories.set(SubscriptionCategory.objects.filter(auto_add=True)) + instance.save() + + class AuthorRequestManager(models.Manager): def create_by_user(self, user): obj = self.model( @@ -190,3 +201,27 @@ def handle_authorrequest_update(sender, instance=None, created=False, update_fie ) instance.accepted_send_at = now() instance.save() + + +class SubscriptionCategory(models.Model): + title = models.CharField(max_length=100) + auto_add = models.BooleanField(default=False) + + class Meta: + verbose_name = 'Категория подписки' + verbose_name_plural = 'Категории подписки' + ordering = ('title',) + + +class EmailSubscription(models.Model): + ERROR = 0 + SENT = 1 + MAILCHIMP_STATUS_CHOICES = ( + (ERROR, 'error'), + (SENT, 'sent'), + ) + + user = models.OneToOneField(User, null=True, blank=True, on_delete=models.CASCADE, related_name='email_subscription') + email = models.EmailField(_('email address'), unique=True) + categories = models.ManyToManyField(SubscriptionCategory) + mailchimp_status = models.PositiveSmallIntegerField(choices=MAILCHIMP_STATUS_CHOICES, default=ERROR)