from __future__ import unicode_literals

from django import forms
from django.contrib.contenttypes.admin import GenericStackedInline

from .forms import object_version_choices
from .models import PublishAction


class ActionInline(GenericStackedInline):
    model = PublishAction
    fields = ('scheduled_time', 'publish_version')
    extra = 0

    def get_formset(self, request, obj=None, form=None, **kwargs):
        class VersionForm(forms.ModelForm):
            """
            Customised form which limits the users choices to versions which have been saved for
            this object.
            """
            class Meta:
                widgets = {
                    'publish_version': forms.widgets.Select(
                        choices=object_version_choices(obj=obj),
                    ),
                }

        BaseFormset = super(ActionInline, self).get_formset(
            request, obj, form=VersionForm, **kwargs
        )

        class ActionFormset(BaseFormset):
            """
            Customised formset to save the user who has created/updated the action.
            """
            def save_new(self, form, commit):
                obj = super(ActionFormset, self).save_new(form, commit=False)
                obj.user = request.user
                obj.save()
                return obj

            def save_existing(self, form, instance, commit):
                obj = super(ActionFormset, self).save_existing(form, instance, commit=False)
                obj.user = request.user
                obj.save()
                return obj

        return ActionFormset

from __future__ import unicode_literals

from django import forms
from django.contrib.contenttypes.admin import GenericStackedInline

from .forms import object_version_choices
from .models import PublishAction


class ActionInline(GenericStackedInline):
    model = PublishAction
    fields = ('scheduled_time', 'publish_version')
    extra = 0

    def get_formset(self, request, obj=None, form=None, **kwargs):
        BaseFormset = super(ActionInline, self).get_formset(request, obj, **kwargs)

        class ActionFormset(BaseFormset):
            """
            Customised formset to save the user who has created/updated the action.
            """
            def save_new(self, form, commit):
                obj = super(ActionFormset, self).save_new(form, commit=False)
                obj.user = request.user
                obj.save()
                return obj

            def save_existing(self, form, instance, commit):
                obj = super(ActionFormset, self).save_existing(form, instance, commit=False)
                obj.user = request.user
                obj.save()
                return obj

        # Customised widget which limits the users choices to versions which have been saved for
        # this object.
        ActionFormset.form.base_fields['publish_version'].widget = forms.widgets.Select(
            choices=object_version_choices(obj=obj),
        )

        return ActionFormset

Rework the versions form widget
Rework the versions form widget

  from __future__ import unicode_literals
  
  from django import forms
  from django.contrib.contenttypes.admin import GenericStackedInline
  
  from .forms import object_version_choices
  from .models import PublishAction
  
  
  class ActionInline(GenericStackedInline):
      model = PublishAction
      fields = ('scheduled_time', 'publish_version')
      extra = 0
  
      def get_formset(self, request, obj=None, form=None, **kwargs):
-         class VersionForm(forms.ModelForm):
-             """
-             Customised form which limits the users choices to versions which have been saved for
-             this object.
-             """
-             class Meta:
-                 widgets = {
-                     'publish_version': forms.widgets.Select(
-                         choices=object_version_choices(obj=obj),
-                     ),
-                 }
- 
-         BaseFormset = super(ActionInline, self).get_formset(
+         BaseFormset = super(ActionInline, self).get_formset(request, obj, **kwargs)
-             request, obj, form=VersionForm, **kwargs
-         )
  
          class ActionFormset(BaseFormset):
              """
              Customised formset to save the user who has created/updated the action.
              """
              def save_new(self, form, commit):
                  obj = super(ActionFormset, self).save_new(form, commit=False)
                  obj.user = request.user
                  obj.save()
                  return obj
  
              def save_existing(self, form, instance, commit):
                  obj = super(ActionFormset, self).save_existing(form, instance, commit=False)
                  obj.user = request.user
                  obj.save()
                  return obj
  
+         # Customised widget which limits the users choices to versions which have been saved for
+         # this object.
+         ActionFormset.form.base_fields['publish_version'].widget = forms.widgets.Select(
+             choices=object_version_choices(obj=obj),
+         )
+ 
          return ActionFormset
  
Rework the versions form widget
## Code Before:
from __future__ import unicode_literals

from django import forms
from django.contrib.contenttypes.admin import GenericStackedInline

from .forms import object_version_choices
from .models import PublishAction


class ActionInline(GenericStackedInline):
    model = PublishAction
    fields = ('scheduled_time', 'publish_version')
    extra = 0

    def get_formset(self, request, obj=None, form=None, **kwargs):
        class VersionForm(forms.ModelForm):
            """
            Customised form which limits the users choices to versions which have been saved for
            this object.
            """
            class Meta:
                widgets = {
                    'publish_version': forms.widgets.Select(
                        choices=object_version_choices(obj=obj),
                    ),
                }

        BaseFormset = super(ActionInline, self).get_formset(
            request, obj, form=VersionForm, **kwargs
        )

        class ActionFormset(BaseFormset):
            """
            Customised formset to save the user who has created/updated the action.
            """
            def save_new(self, form, commit):
                obj = super(ActionFormset, self).save_new(form, commit=False)
                obj.user = request.user
                obj.save()
                return obj

            def save_existing(self, form, instance, commit):
                obj = super(ActionFormset, self).save_existing(form, instance, commit=False)
                obj.user = request.user
                obj.save()
                return obj

        return ActionFormset

## Instruction:
Rework the versions form widget
## Code After:
from __future__ import unicode_literals

from django import forms
from django.contrib.contenttypes.admin import GenericStackedInline

from .forms import object_version_choices
from .models import PublishAction


class ActionInline(GenericStackedInline):
    model = PublishAction
    fields = ('scheduled_time', 'publish_version')
    extra = 0

    def get_formset(self, request, obj=None, form=None, **kwargs):
        BaseFormset = super(ActionInline, self).get_formset(request, obj, **kwargs)

        class ActionFormset(BaseFormset):
            """
            Customised formset to save the user who has created/updated the action.
            """
            def save_new(self, form, commit):
                obj = super(ActionFormset, self).save_new(form, commit=False)
                obj.user = request.user
                obj.save()
                return obj

            def save_existing(self, form, instance, commit):
                obj = super(ActionFormset, self).save_existing(form, instance, commit=False)
                obj.user = request.user
                obj.save()
                return obj

        # Customised widget which limits the users choices to versions which have been saved for
        # this object.
        ActionFormset.form.base_fields['publish_version'].widget = forms.widgets.Select(
            choices=object_version_choices(obj=obj),
        )

        return ActionFormset
