1

私のシステムに紹介システムを実装したいのですが、登録ユーザーはドロップボックス1と同じように紹介リンク(つまり/ register / referral / 123123 /)をメールで送信して他の人を招待できます(人がサインアップすると、紹介者は追加のボーナスを受け取ります。現在、私はそれを次のように実装しています:モデル:

class UserReferral(models.Model):
STATUS_INVITED = 1
STATUS_ACCEPTED = 2
STATUS_EXPIRED = 3

STATUS_CHOICES = (
    (STATUS_INVITED, 'Invited'),
    (STATUS_ACCEPTED, 'Accepted'),
    (STATUS_EXPIRED, 'Expired'),
    )

referrer = models.ForeignKey(User, related_name='referrers')
referred = models.ForeignKey(User, related_name='referred')
number = models.IntegerField()
status = models.IntegerField(choices=STATUS_CHOICES, default=STATUS_INVITED)

class Meta:
    unique_together = (('referrer', 'referred'),)

def __unicode__(self):
    return 'User %s referred %s' % (self.referrer.get_full_name(), self.referred.get_full_name())

@property
def referral_expired(self):
    expiration_date = datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS)
    return (self.status == self.STATUS_ACCEPTED or
                   (self.referred.date_joined + expiration_date <= datetime_now()))

ビュー:このビューは、登録ユーザーが新しい紹介の招待状を送信するために使用します

@login_required
def invite_friends(request, template_name='accounts/invite_friends.html'):
if request.method == 'POST':
    form = InviteForm(request.POST, user=request.user)
    if form.is_valid():
        emails = form.cleaned_data['emails']
        for email in emails:
            try:
                user_referral = UserReferral.objects.get(referrer=request.user, referred__email=email)
            except UserReferral.DoesNotExist:
                random_username = ''.join(random.choice(string.ascii_uppercase) for x in range(6))
                user = User.objects.create(username=random_username, password=email, is_active=False)  # Dummy user to be overridden
                user_referral = UserReferral.objects.create(referrer=request.user, referred=user, number=random.randint(10000, 99999))
                send_mail('accounts/notifications/invite_friends', recipient_list=[email],
                        context={'user': request.user, 'number': user_referral.number})

        messages.add_message(request, messages.SUCCESS, "Invites are sent.")
        return redirect(reverse('profile_dashboard'))
else:
    form = InviteForm(user=request.user)
return render(request, template_name, locals())

これは、紹介されたユーザーが登録できるURLであり、基本的に紹介コードを使用して元の登録関数を呼び出し、紹介コードが存在するかどうかを登録ビューで確認します。存在する場合は、紹介されたユーザーインスタンスをUserReferralインスタンスからフェッチしてデータを入力します。登録フォームからのユーザーデータとその新しいユーザーを保存します。

def referred_signup(request, referral_code):
user_referral = get_object_or_404(UserReferral, number=referral_code)
if user_referral.referral_expired:
    raise Http404
response = register(request, referral_code=referral_code)
return response

そのため、新しい招待状が生成されるたびに、ダミーの非アクティブな「リファラー」ユーザーアカウントを作成します。そして、登録時にユーザー入力フォームから名前やパスワードなどを入力し、UserReferralインスタンスのステータスをACTIVATEDに変更します。これに代わるより良い方法はありますか?

4

0 に答える 0