django-plans icon indicating copy to clipboard operation
django-plans copied to clipboard

Allow create user plans on Django Admin

Open eduardo-matos opened this issue 11 years ago • 6 comments

Currently there is no way to create a user plan on Django Admin. The user field should be displayed.

This functionality is good for manual registration.

eduardo-matos avatar Sep 29 '14 19:09 eduardo-matos

Hi there @eduardo-matos, Currently you can manually create a UserPlan by first creating a new User in the admin and then edit his UserPlan which is automatically created after user-creation. Is this what you were looking for?

As an aside: in order for this to work, you need at one plan marked as "default" plan. That way, all created users will immediately be assigned this plan after creation.

kevwilde avatar Oct 27 '14 19:10 kevwilde

I have some users that were created before including the django-plans app. The only way I can associate these users with an userplan is by editing via shell, which I was trying to avoid.

My idea was to create a new userplan manually (via admin page), choosing an existing user in the "create userplan" page. Since the "user" field is omitted, There is no way to do that.

eduardo-matos avatar Nov 03 '14 15:11 eduardo-matos

A quick fix is to override UserPlan inside your admin

from plans.models import UserPlan
from plans.admin import UserPlanAdmin

class UserPlanMyAdmin(UserPlanAdmin):
    fields = ('user', 'plan', 'expire', 'active')

admin.site.unregister(UserPlan)
admin.site.register(UserPlan,UserPlanMyAdmin)

maxpaynestory avatar Jun 28 '18 10:06 maxpaynestory

Having user editable/writeable on the admin has one annoying con as well, which is when there are many users and simply loading them in a "select" html widget will cause load, especially when there are many users in the database.

If Django admin had a default feature to have a search-friendly select box for related field it would be much easier.

To learn more about this problem you may have a look at https://stackoverflow.com/questions/14912872/django-admin-dropdown-of-1000s-of-users.

To solve such issue there are:

  • https://github.com/applegrew/django-select2
  • https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.raw_id_fields

My vote for the second option which is using raw_id_fields in admin panel. Which gives something like:

image

The solution provided by @maxpaynestory is also an hack that can be done as well, but still will have the same problem that I described.

I am open for any suggestion here and would love to discuss it.

Alir3z4 avatar Jun 28 '18 11:06 Alir3z4

For the problem with users created prior introducing django-plans, I would recommend introducing adminaction to the sources. The code might be pretty simple:

for user in UserProfile.objects.filter(userplan=None):
     UserPlan.objects.create(user=user, plan=Plan.objects.get(default=True))

Although there might be other cases, when the manual editation of UserPlans would be needed.

PetrDlouhy avatar Jul 20 '18 22:07 PetrDlouhy

An complete fix here is to use @maxpaynestory solution with Django 2+ autocomplete.

class UserPlanMyAdmin(UserPlanAdmin):
    fields = ('user', 'plan', 'expire', 'active')
    autocomplete_fields = ['user', 'plan']

bezkos avatar Feb 28 '22 10:02 bezkos