Django Membership model registration

50 Views Asked by At

i have some issues with the following code.

I have an authentication system that works fine.

After user registers the account, django send a email with token for account confirmation.

it works fine.

now i want to add some code to save automatically free membership parameter when user click on activation link.

there is something of wrong in my code:

MEMBERSHIP_CHOICES = (('Premium', 'PREMIUM'),
                    ('Free', 'FREE')
)

class Membership(models.Model):
    slug = models.SlugField(null=True, blank=True)
    # name = models.CharField(max_length=100)
    description = models.TextField()
    membership_type = models.CharField(choices=MEMBERSHIP_CHOICES, default='Free',max_length=30)
    price = models.DecimalField(default=0.00, max_digits=5, decimal_places=2)

def __str__(self):
       return self.membership_type

class UserMembership(models.Model):
    user = models.OneToOneField(Customer,
                                related_name='user_membership',
                                on_delete=models.CASCADE)
    membership = models.ForeignKey(Membership, related_name='user_membership',
                                   on_delete=models.SET_NULL, null=True)
    
    start_date = models.DateTimeField(auto_now_add=True)
    end_date = models.DateTimeField(default=18000)  # Calculate based on start_date + 30 days
    
    def __str__(self):
       return self.user.username



def account_activate(request, uidb64, token):
    try:
        uid = force_str(urlsafe_base64_decode(uidb64))
        user = Customer.objects.get(pk=uid)
    except (TypeError, ValueError, OverflowError, user.DoesNotExist):
        user = None
    if user is not None and account_activation_token.check_token(user, token):
        user.is_active = True
        user.save()

    # Create a free membership
    free_membership = Membership.objects.get(membership_type='Free')
    
    # Convert the Membership object to string
    # free_membership_str = str(free_membership)
    print(free_membership)

    # Create a new UserMembership
    user_membership = UserMembership.objects.create(user=user, membership=free_membership)

    # user_membership = UserMembership.objects.create(user=user, membership=free_membership.membership_type)
    # user_membership = UserMembership.objects.create(user=user, membership='Free')
    # user_membership = UserMembership.objects.create(user=user, membership=self.free_membership)
    
    user_membership.save()

    # # Creating a new UserSubscription
    # user_subscription = Subscription.objects.create(user_membership=user_membership)
    # # user_subscription = Subscription()
    # # user_subscription.user_membership = user_membership
    # user_subscription.save()
    # # return user

    login(request, user)
    return redirect("homepage:homepage")
else:
    return render(request, "account/registration/activation_invalid.html")

if i use: user_membership = UserMembership.objects.create(user=user, membership=free_membership)

the issue is: fromisoformat: argument must be str

or

if i use: user_membership = UserMembership.objects.create(user=user, membership='Free')

the issue is: Cannot assign "'Free'": "UserMembership.membership" must be a "Membership" instance.

can you help me? thanks

0

There are 0 best solutions below