Beispiel #1
0
    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),
            )
Beispiel #2
0
    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),
            )
Beispiel #3
0
 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),
         )
Beispiel #4
0
 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),
         )
Beispiel #5
0
    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
        ))
Beispiel #6
0
    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",
            ))
Beispiel #7
0
    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}))
        ]
Beispiel #8
0
 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
Beispiel #9
0
 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
Beispiel #10
0
    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",
            ))
Beispiel #11
0
    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"))
Beispiel #12
0
    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
Beispiel #13
0
 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")
Beispiel #14
0
    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
Beispiel #15
0
    """
    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