def _get_variation_and_package_menu_items(self, product): is_variation_product = (product.is_variation_parent() or product.is_variation_child()) if is_variation_product: for item in self._get_variation_menu_items(product): yield item 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_variation_product or 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), ) # variation header for item in self._get_header_items(_("Variations"), identifier=ProductActionCategory.CHILD_VARIATION): yield item yield DropdownItem( text=_("Convert to Variation Parent"), icon="fa fa-retweet", url=self._get_variation_url(product), )
def _get_variation_and_package_menu_items(self, product): is_variation_product = (product.is_variation_parent() or product.is_variation_child()) if is_variation_product: for item in self._get_variation_menu_items(product): yield item is_package_product = (product.is_package_parent() or product.is_package_child()) if is_package_product: for item in self._get_package_menu_items(product): yield item if not (is_variation_product or is_package_product): for item in self._get_header_item(_("Packages")): yield item yield DropdownItem( text=_("Convert to Package Parent"), icon="fa fa-retweet", url=self._get_package_url(product), ) for item in self._get_header_item(_("Variations")): yield item yield DropdownItem( text=_("Convert to Variation Parent"), icon="fa fa-retweet", url=self._get_variation_url(product), )
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_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 _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: for item in self._get_header_items(header=_("Other"), identifier=ProductActionCategory.CHILD_OTHER): menu_items.append(item) for button in provided_items: if button.visible_for_object(product): menu_items.append(button(product)) # add the actual Action button self.append(DropdownActionButton( menu_items, icon="fa fa-star", text=_(u"Actions"), extra_css_class="btn-inverse btn-actions", identifier=ProductActionCategory.MAIN ))
def _build_existing_product(self): product = self.product # :type product: shuup.core.models.Product save_as_copy_button = JavaScriptActionButton( onclick="saveAsACopy()", text=_("Save as a copy"), icon="fa fa-clone", ) self.append(save_as_copy_button) 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 = [ DropdownHeader(text=_("Cross-Selling")), cross_sell_button ] for item in self._get_variation_and_package_menu_items(product): menu_items.append(item) for button in get_provide_objects("admin_product_toolbar_action_item"): if button.visible_for_object(product): menu_items.append(button(product)) if menu_items: self.append(DropdownActionButton( menu_items, icon="fa fa-star", text=_(u"Actions"), extra_css_class="btn-info", ))
def get_menu_items(self): shipment_items = [] for shipment_id in self.order.shipments.values_list("pk", flat=True): shipment_items.append( DropdownItem(text=_("Get Delivery Slip (Shipment %(id)s)") % {"id": shipment_id}, icon="fa fa-truck", url=reverse("shuup_admin:printouts.delivery_pdf", kwargs={"shipment_pk": shipment_id}))) return shipment_items + [ DropdownItem(text=_("Get Order Confirmation"), icon="fa fa-money", url=reverse("shuup_admin:printouts.confirmation_pdf", kwargs={"order_pk": self.order.pk})) ]
def _get_variation_menu_items(self, product): for item in self._get_header_item(_("Variations")): yield item yield DropdownItem( text=_("Manage Variations"), icon="fa fa-sitemap", url=self._get_variation_url(product), ) if product.is_variation_parent(): for child in self._get_children_items(product.variation_children.all()): yield child elif product.is_variation_child(): for item in self._get_parent_and_sibling_items(product.variation_parent, product.get_variation_siblings()): yield item
def _get_package_menu_items(self, product): for item in self._get_header_item(_("Packages")): yield item yield DropdownItem( text=_("Manage Package"), icon="fa fa-cube", url=self._get_package_url(product), ) if product.is_package_parent(): 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 _build_existing_product(self): product = self.product # :type product: shuup.core.models.Product cross_sell_button = DropdownItem( text=_("Manage Cross-Selling"), icon="fa fa-random", url=reverse("shuup_admin:product.edit_cross_sell", kwargs={"pk": product.pk}), ) menu_items = [ DropdownHeader(text=_("Cross-Selling")), cross_sell_button ] for item in self._get_variation_and_package_menu_items(product): menu_items.append(item) self.append( DropdownActionButton( menu_items, icon="fa fa-star", text=_(u"Actions"), extra_css_class="btn-info", ))
def _build_existing_user(self): user = self.user change_password_button = DropdownItem(url=reverse( "shuup_admin:user.change-password", kwargs={"pk": user.pk}), text=_(u"Change Password"), icon="fa fa-exchange") reset_password_button = DropdownItem( url=reverse("shuup_admin:user.reset-password", kwargs={"pk": user.pk}), disable_reason=(_("User has no email address") if not getattr(user, 'email', '') else None), text=_(u"Send Password Reset Email"), icon="fa fa-envelope") permissions_button = DropdownItem( url=reverse("shuup_admin:user.change-permissions", kwargs={"pk": user.pk}), text=_(u"Edit Permissions"), icon="fa fa-lock", required_permissions=["auth.change_permission"]) menu_items = [ change_password_button, reset_password_button, permissions_button, DropdownDivider() ] person_contact = PersonContact.objects.filter(user=user).first() if person_contact: contact_url = reverse("shuup_admin:contact.detail", kwargs={"pk": person_contact.pk}) menu_items.append( DropdownItem( url=contact_url, icon="fa fa-search", text=_(u"Contact Details"), )) else: contact_url = reverse("shuup_admin:contact.new" ) + "?type=person&user_id=%s" % user.pk menu_items.append( DropdownItem( url=contact_url, icon="fa fa-plus", text=_(u"New Contact"), tooltip=_( "Create a new contact and associate it with this user") )) self.append( DropdownActionButton( menu_items, icon="fa fa-star", text=_(u"Actions"), extra_css_class="btn-info", )) if not user.is_active: self.append( PostActionButton( post_url=self.request.path, name="set_is_active", value="1", icon="fa fa-check-circle", text=_(u"Activate User"), extra_css_class="btn-gray", )) else: self.append( PostActionButton( post_url=self.request.path, name="set_is_active", value="0", icon="fa fa-times-circle", text=_(u"Deactivate User"), extra_css_class="btn-gray", )) if (self.request.user.is_superuser and get_front_url() and user.is_active and not user.is_superuser and not user.is_staff): self.append( PostActionButton(post_url=reverse("shuup_admin:user.login-as", kwargs={"pk": user.pk}), text=_(u"Login as User"), extra_css_class="btn-gray"))
for module in get_modules(): url_permissions = set(get_permissions_from_urls(module.get_urls())) module_permissions = set(module.get_required_permissions()) for permission in (url_permissions | module_permissions): # Only requirement for permissions are that they # are list of strings assert isinstance(permission, six.string_types) @pytest.mark.django_db @pytest.mark.parametrize("button_class, kwargs", [(URLActionButton, { "url": "/test/url/" }), (JavaScriptActionButton, { "onclick": None }), (PostActionButton, {}), (DropdownActionButton, { "items": [DropdownItem()] }), (DropdownItem, {})]) def test_toolbar_button_permissions(rf, button_class, kwargs): permissions = set( ["shuup.add_product", "shuup.delete_product", "shuup.change_product"]) request = rf.get("/") request.user = factories.get_default_staff_user() button = button_class(required_permissions=permissions, **kwargs) rendered_button = "".join(bit for bit in button.render(request)) assert not rendered_button # Set permissions for the user set_permissions_for_group(request.user.groups.first(), permissions) rendered_button = "".join(bit for bit in button.render(request)) assert rendered_button
def get_split_save_button(self, save_form_id): return DropdownActionButton([ DropdownItem(onclick="setNextActionAndSubmit('%s', 'return')" % save_form_id, text=_("Save and Exit")), DropdownItem(onclick="setNextActionAndSubmit('%s', 'new')" % save_form_id, text=_("Save and Create New")), JavaScriptActionButton(onclick="saveAsACopy()", text=_("Save as a copy"), icon="fa fa-clone"), ], extra_css_class="btn-primary")
def get_toolbar(self): order = self.object toolbar = Toolbar() action_menu_items = [] if not (order.is_paid() or order.is_canceled() or order.has_refunds()): action_menu_items.append( DropdownItem( url=reverse("shuup_admin:order.create-payment", kwargs={"pk": order.pk}), icon="fa fa-money", text=_("Create Payment"), ) ) if (order.get_unshipped_products() and not order.is_canceled() and not order.has_refunds()): action_menu_items.append( DropdownItem( url=reverse("shuup_admin:order.create-shipment", kwargs={"pk": order.pk}), icon="fa fa-truck", text=_("Create Shipment"), ) ) if order.can_create_refund() and order.payments.exists(): action_menu_items.append( DropdownItem( url=reverse("shuup_admin:order.create-refund", kwargs={"pk": order.pk}), icon="fa fa-dollar", text=_("Create Refund"), ) ) toolbar.append( DropdownActionButton( action_menu_items, icon="fa fa-star", text=_(u"Actions"), extra_css_class="btn-info", ) ) toolbar.append(PostActionButton( post_url=reverse("shuup_admin:order.set-status", kwargs={"pk": order.pk}), name="status", value=OrderStatus.objects.get_default_complete().pk, text=_("Set Complete"), icon="fa fa-check-circle", disable_reason=( _("This order can not be set as complete at this point") if not order.can_set_complete() else None ), extra_css_class="btn-success" )) toolbar.append(PostActionButton( post_url=reverse("shuup_admin:order.set-status", kwargs={"pk": order.pk}), name="status", value=OrderStatus.objects.get_default_canceled().pk, text=_("Cancel Order"), icon="fa fa-trash", disable_reason=( _("Paid, shipped, or canceled orders cannot be canceled") if not order.can_set_canceled() else None ), extra_css_class="btn-danger btn-inverse" )) toolbar.append(URLActionButton( text=_("Edit order"), icon="fa fa-money", disable_reason=_("This order cannot modified at this point") if not order.can_edit() else None, url=reverse("shuup_admin:order.edit", kwargs={"pk": order.pk}), extra_css_class="btn-info" )) for button in get_provide_objects("admin_order_toolbar_button"): toolbar.append(button(order)) return toolbar
""" for module in get_modules(): url_permissions = set(get_permissions_from_urls(module.get_urls())) module_permissions = set(module.get_required_permissions()) for permission in (url_permissions | module_permissions): # Only requirement for permissions are that they # are list of strings assert isinstance(permission, six.string_types) @pytest.mark.django_db @pytest.mark.parametrize("button_class, kwargs", [ (URLActionButton, {"url": "/test/url/"}), (JavaScriptActionButton, {"onclick": None}), (PostActionButton, {}), (DropdownActionButton, {"items": [DropdownItem()]}), (DropdownItem, {}) ]) def test_toolbar_button_permissions(rf, button_class, kwargs): permissions = set(["shuup.add_product", "shuup.delete_product", "shuup.change_product"]) request = rf.get("/") request.user = factories.get_default_staff_user() button = button_class(required_permissions=permissions, **kwargs) rendered_button = "".join(bit for bit in button.render(request)) assert not rendered_button # Set permissions for the user set_permissions_for_group(request.user.groups.first(), permissions) rendered_button = "".join(bit for bit in button.render(request)) assert rendered_button