Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: SpikeeLabs/django-admin-action-tools
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: v1.1.0-alpha.1
Choose a base ref
...
head repository: SpikeeLabs/django-admin-action-tools
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: v1.1.0-alpha.2
Choose a head ref
  • 1 commit
  • 5 files changed
  • 1 contributor

Commits on Oct 24, 2022

  1. Unverified

    This commit is not signed, but one or more authors requires that any commit attributed to them is signed.
    Copy the full SHA
    a0df649 View commit details
Showing with 95 additions and 324 deletions.
  1. +17 −0 README.md
  2. +7 −5 admin_action_tools/admin/confirm_tool.py
  3. +14 −6 admin_action_tools/admin/form_tool.py
  4. +42 −312 poetry.lock
  5. +15 −1 tests/market/admin/inventory_admin.py
17 changes: 17 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -237,6 +237,23 @@ If you only want the action (same as confirm only), you can pass the following a
This will chain 2 forms and confirmation.
The confirmation page will have the actions & form values displayed.

if you want to not display the impacted objects, you can use

```py
from admin_confirm import AdminConfirmMixin, ActionFormMixin, confirm_action, add_form_to_action
from django_object_actions import DjangoObjectActions
from myapp.form import NoteActionForm, SecondForm

class MyModelAdmin(AdminConfirmMixin, ActionFormMixin, DjangoObjectActions, ModelAdmin):
change_actions = ["action1"]

@add_form_to_action(NoteActionForm, display_queryset=False)
@add_form_to_action(SecondForm, display_queryset=False)
@confirm_action(display_queryset=False)
def action1(self, request, object, forms=None):
# Do something with the object and forms
```


## Development
Check out our [development process](docs/development_process.md) if you're interested.
12 changes: 7 additions & 5 deletions admin_action_tools/admin/confirm_tool.py
Original file line number Diff line number Diff line change
@@ -392,7 +392,9 @@ def _change_confirmation_view(self, request, object_id, form_url, extra_context)
}
return self.render_change_confirmation(request, context)

def run_confirm_tool(self, func: Callable, request: HttpRequest, queryset_or_object, display_form):
def run_confirm_tool(
self, func: Callable, request: HttpRequest, queryset_or_object, display_form: bool, display_queryset: bool
):
tool_chain: ToolChain = ToolChain(request)
step = tool_chain.get_next_step(CONFIRM_ACTION)

@@ -406,7 +408,7 @@ def run_confirm_tool(self, func: Callable, request: HttpRequest, queryset_or_obj
url = back_url(queryset, self.model._meta)
return HttpResponseRedirect(url)

form_instance = self.get_tools_result(tool_chain)
form_instance = self.get_tools_result(tool_chain) if display_form else None

# get_actions will only return the actions that are allowed
has_perm = self._get_actions(request).get(func.__name__) is not None
@@ -418,7 +420,7 @@ def run_confirm_tool(self, func: Callable, request: HttpRequest, queryset_or_obj
context = {
**self.admin_site.each_context(request),
"title": title,
"queryset": queryset,
"queryset": queryset if display_queryset else [],
"has_perm": has_perm,
"action": func.__name__,
"action_display_name": action_display_name,
@@ -435,7 +437,7 @@ def run_confirm_tool(self, func: Callable, request: HttpRequest, queryset_or_obj
return self.render_action_confirmation(request, context)


def confirm_action(display_form=True):
def confirm_action(display_form=True, display_queryset=True):
"""
@confirm_action() function wrapper for Django ModelAdmin actions
Will redirect to a confirmation page to ask for confirmation
@@ -451,7 +453,7 @@ def confirm_action_decorator(func):

@functools.wraps(func)
def func_wrapper(modeladmin: AdminConfirmMixin, request, queryset_or_object):
return modeladmin.run_confirm_tool(func, request, queryset_or_object, display_form)
return modeladmin.run_confirm_tool(func, request, queryset_or_object, display_form, display_queryset)

return func_wrapper

20 changes: 14 additions & 6 deletions admin_action_tools/admin/form_tool.py
Original file line number Diff line number Diff line change
@@ -20,7 +20,13 @@ class ActionFormMixin(BaseMixin):
action_form_template: str = None

def build_context(
self, request: HttpRequest, func: Callable, queryset: QuerySet, form_instance: Form, tool_name: str
self,
request: HttpRequest,
func: Callable,
queryset: QuerySet,
form_instance: Form,
tool_name: str,
display_queryset: bool,
):
action_display_name = snake_to_title_case(func.__name__)
title = f"Configure Action: {action_display_name}"
@@ -33,7 +39,7 @@ def build_context(
"action_display_name": action_display_name,
"action_checkbox_name": helpers.ACTION_CHECKBOX_NAME,
"submit_name": "confirm_action",
"queryset": queryset,
"queryset": queryset if display_queryset else [],
"media": self.media + form_instance.media,
"opts": opts,
"form": form_instance,
@@ -64,7 +70,9 @@ def load_form(data, metadata):
form_instance.is_valid()
return form_instance

def run_form_tool(self, func: Callable, request: HttpRequest, queryset_or_object, form: forms):
def run_form_tool(
self, func: Callable, request: HttpRequest, queryset_or_object, form: forms, display_queryset: bool
):
tool_chain: ToolChain = ToolChain(request)
tool_name = f"{CONFIRM_FORM}_{form.__name__}"
step = tool_chain.get_next_step(tool_name)
@@ -88,13 +96,13 @@ def run_form_tool(self, func: Callable, request: HttpRequest, queryset_or_object
form_instance = form()

queryset: QuerySet = self.to_queryset(request, queryset_or_object)
context = self.build_context(request, func, queryset, form_instance, tool_name)
context = self.build_context(request, func, queryset, form_instance, tool_name, display_queryset)

# Display form
return self.render_action_form(request, context)


def add_form_to_action(form: Form):
def add_form_to_action(form: Form, display_queryset=True):
"""
@add_form_to_action function wrapper for Django ModelAdmin actions
Will redirect to a form page to ask for more information
@@ -109,7 +117,7 @@ def add_form_to_action_decorator(func):

@functools.wraps(func)
def func_wrapper(modeladmin: ActionFormMixin, request, queryset_or_object):
return modeladmin.run_form_tool(func, request, queryset_or_object, form)
return modeladmin.run_form_tool(func, request, queryset_or_object, form, display_queryset)

return func_wrapper

Loading