Source code for shuup.admin.modules.products.views.toolbars

# -*- coding: utf-8 -*-
# This file is part of Shuup.
#
# Copyright (c) 2012-2021, Shuup Commerce Inc. All rights reserved.
#
# This source code is licensed under the OSL-3.0 license found in the
# LICENSE file in the root directory of this source tree.
from __future__ import unicode_literals

from django.utils.translation import ugettext_lazy as _
from enumfields import Enum

from shuup.admin.toolbar import (
    DropdownActionButton,
    DropdownDivider,
    DropdownHeader,
    DropdownItem,
    Toolbar,
    get_default_edit_toolbar,
)
from shuup.admin.utils.urls import get_model_url
from shuup.apps.provides import get_provide_objects
from shuup.utils.django_compat import reverse


[docs]class ProductActionCategory(Enum): MAIN = 1 CHILD_CROSS_SELL = 2 CHILD_PACKAGE = 3 CHILD_OTHER = 5
# TODO: Rewrite this for 2.0.
[docs]class EditProductToolbar(Toolbar): def __init__(self, view): super(EditProductToolbar, self).__init__() self.view = view self.request = view.request self.product = view.object.product self.extend( get_default_edit_toolbar( self.view, "product_form", delete_url="shuup_admin:shop_product.delete", with_save_as_copy=True, copy_url="shuup_admin:shop_product.copy", ) ) if self.product.pk: self._build_existing_product() def _build_existing_product(self): product = self.product # :type product: shuup.core.models.Product # static buttons self._build_action_menu(product) def _build_action_menu(self, product): # cross selling cross_sell_button = DropdownItem( text=_("Manage Cross-Selling"), icon="fa fa-random", url=reverse("shuup_admin:shop_product.edit_cross_sell", kwargs={"pk": product.pk}), ) menu_items = [ menu_item for menu_item in self._get_header_items( header=_("Cross-Selling"), divider=False, identifier=ProductActionCategory.CHILD_CROSS_SELL ) ] menu_items.append(cross_sell_button) # packages for item in self._get_variation_and_package_menu_items(product): menu_items.append(item) provided_items = get_provide_objects("admin_product_toolbar_action_item") if provided_items: other_menu = [] for button in provided_items: if button.visible_for_object(product): other_menu.append(button(product)) if other_menu: for item in self._get_header_items(header=_("Other"), identifier=ProductActionCategory.CHILD_OTHER): menu_items.append(item) menu_items.extend(other_menu) # add the actual Action button self.append( DropdownActionButton( menu_items, icon="fa fa-star", text=_("Actions"), extra_css_class="btn-inverse btn-actions", identifier=ProductActionCategory.MAIN, ) ) def _get_header_items(self, header, divider=True, identifier=None): if divider: yield DropdownDivider() yield DropdownHeader(text=header, identifier=identifier) def _get_package_url(self, product): return reverse("shuup_admin:shop_product.edit_package", kwargs={"pk": product.pk}) def _get_children_items(self, children): for child in children: yield DropdownItem( text=_("Child: %s") % child, icon="fa fa-eye", url=get_model_url(child, shop=self.request.shop), ) def _get_parent_and_sibling_items(self, parent, siblings): yield DropdownItem( text=_("Parent: %s") % parent, icon="fa fa-eye", url=get_model_url(parent, shop=self.request.shop), ) for sib in siblings: yield DropdownItem( text=_("Sibling: %s") % sib, icon="fa fa-eye", url=get_model_url(sib, shop=self.request.shop), ) def _get_package_menu_items(self, product): for item in self._get_header_items(_("Packages"), identifier=ProductActionCategory.CHILD_PACKAGE): yield item if product.is_package_parent(): yield DropdownItem( text=_("Manage Package"), icon="fa fa-cube", url=self._get_package_url(product), ) for child in self._get_children_items(product.get_all_package_children()): yield child elif product.is_package_child(): for parent in product.get_all_package_parents(): for item in self._get_parent_and_sibling_items( parent, [sib for sib in parent.get_all_package_children() if sib != product] ): yield item def _get_variation_and_package_menu_items(self, product): is_package_product = product.is_container() or product.is_package_child() if is_package_product: for item in self._get_package_menu_items(product): yield item if not is_package_product: # package header for item in self._get_header_items(_("Packages"), identifier=ProductActionCategory.CHILD_PACKAGE): yield item yield DropdownItem( text=_("Convert to Package Parent"), icon="fa fa-retweet", url=self._get_package_url(product), )