def test_region_views(rf, admin_user):
    get_default_shop()

    view = load(
        "shuup_shipping_table.admin.views.region.RegionListView").as_view()
    request = apply_request_middleware(rf.get("/"), user=admin_user)
    response = view(request)
    assert response.status_code == 200

    view = load(
        "shuup_shipping_table.admin.views.region.RegionEditView").as_view()
    request = apply_request_middleware(rf.get("/"), user=admin_user)
    response = view(request)
    assert response.status_code == 200

    view = load(
        "shuup_shipping_table.admin.views.region.RegionDeleteView").as_view()
    request = apply_request_middleware(rf.post("/"), user=admin_user)
    with pytest.raises(Http404):
        response = view(request, pk=1)

    view = load(
        "shuup_shipping_table.admin.views.region.RegionImportView").as_view()
    request = apply_request_middleware(rf.post("/"), user=admin_user)
    response = view(request)
    assert response.status_code == 302

    view = load(
        "shuup_shipping_table.admin.views.region.RegionExportView").as_view()
    request = apply_request_middleware(rf.get("/"), user=admin_user)
    response = view(request)
    assert response.status_code == 200
def test_region_views(rf, admin_user):
    get_default_shop()

    view = load("shuup_shipping_table.admin.views.region.RegionListView").as_view()
    request = apply_request_middleware(rf.get("/"), user=admin_user)
    response = view(request)
    assert response.status_code == 200

    view = load("shuup_shipping_table.admin.views.region.RegionEditView").as_view()
    request = apply_request_middleware(rf.get("/"), user=admin_user)
    response = view(request)
    assert response.status_code == 200
    
    view = load("shuup_shipping_table.admin.views.region.RegionDeleteView").as_view()
    request = apply_request_middleware(rf.post("/"), user=admin_user)
    with pytest.raises(Http404):
        response = view(request, pk=1)


    view = load("shuup_shipping_table.admin.views.region.RegionImportView").as_view()
    request = apply_request_middleware(rf.post("/"), user=admin_user)
    response = view(request)
    assert response.status_code == 302

    view = load("shuup_shipping_table.admin.views.region.RegionExportView").as_view()
    request = apply_request_middleware(rf.get("/"), user=admin_user)
    response = view(request)
    assert response.status_code == 200
Esempio n. 3
0
 def dispatch(self, request, *args, **kwargs):
     module_str = "%s:%s" % (request.GET.get("module"), request.GET.get("model"))
     self.return_url = reverse("shuup_admin:%s.list" % request.GET.get("return_url"))
     match = resolve(self.return_url)
     default_columns = load("%s:%s" % (match.func.__module__, match.func.__name__)).default_columns
     self.model = load(module_str)
     self.settings = ViewSettings(self.model, default_columns)
     return super(ListSettingsView, self).dispatch(request, *args, **kwargs)
Esempio n. 4
0
    def dispatch(self, request, *args, **kwargs):
        module_str = "%s:%s" % (request.GET.get("module"), request.GET.get("model"))
        self.return_url = reverse("shuup_admin:%s.list" % request.GET.get("return_url"))
        match = resolve(self.return_url)
        view_context = load("%s:%s" % (match.func.__module__, match.func.__name__))

        default_columns = view_context.default_columns
        self.model = load(module_str)
        self.settings = ViewSettings(self.model, default_columns, view_context)
        return super(ListSettingsView, self).dispatch(request, *args, **kwargs)
Esempio n. 5
0
def test_iframe_mode(rf, admin_user, extra_query_param, extra_query_value, expected_script):
    get_default_shop()
    view = load("shuup.admin.modules.categories.views:CategoryEditView").as_view()

    request = apply_request_middleware(rf.get("/", {"mode": "iframe"}), user=admin_user)
    response = view(request)
    if hasattr(response, "render"):
        response.render()
    assert 200 <= response.status_code < 300

    content = force_text(response.content)
    post = extract_form_fields(BeautifulSoup(content, "lxml"))
    post.update({
        "base-name__en": "Name"
    })
    post.pop("base-image")

    # save iframe mode
    request = apply_request_middleware(rf.post("/", post), user=admin_user)
    request.GET = request.GET.copy()
    request.GET["mode"] = "iframe"

    if extra_query_param:
        request.GET[extra_query_param] = extra_query_value

    response = view(request)
    assert response.status_code == 302

    client = Client()
    client.login(username="******", password="******")

    response = client.get(response.url)
    assert response.status_code == 200
    assert expected_script in force_text(response.content)
Esempio n. 6
0
def _configure_basket(request):
    """
    Search for some needed keys in the checkout phases storages
    """

    # (src key, destination key) pair
    search_keys = [
        ('payment_method_id', 'payment_method_id'),
        ('shipping_method_id', 'shipping_method_id'),
        ('shipping', 'shipping_address'),
        ('shipping_extra', 'shipping_address_extra'),
        ('payment', 'payment_address'),
        ('payment_extra', 'payment_address_extra'),
    ]

    for phase in cached_load("SHUUP_CHECKOUT_VIEW_SPEC").phase_specs:
        phase_class = load(phase)

        storage = CheckoutPhaseStorage(request, phase_class.identifier)

        for key, dst_key in search_keys:
            value = storage.get(key)

            # key found, set it to request.basket on dst_key
            if value:
                setattr(request.basket, dst_key, value)
Esempio n. 7
0
def _configure_basket(request):
    """
    Search for some needed keys in the checkout phases storages
    """

    # (src key, destination key) pair
    search_keys = [
        ('payment_method_id', 'payment_method_id'),
        ('shipping_method_id', 'shipping_method_id'),
        ('shipping', 'shipping_address'),
        ('shipping_extra', 'shipping_address_extra'),
        ('payment', 'payment_address'),
        ('payment_extra', 'payment_address_extra'),
    ]

    for phase in cached_load("SHUUP_CHECKOUT_VIEW_SPEC").phase_specs:
        phase_class = load(phase)

        storage = CheckoutPhaseStorage(request, phase_class.identifier)

        for key, dst_key in search_keys:
            value = storage.get(key)

            # key found, set it to request.basket on dst_key
            if value:
                setattr(request.basket, dst_key, value)
Esempio n. 8
0
def test_tour_view(rf, admin_user):
    shop = get_default_shop()
    assert is_tour_complete(shop, "home", admin_user) is False
    view = load("shuup.admin.views.tour:TourView").as_view()
    request = apply_request_middleware(rf.post("/", data={"tourKey": "home"}), user=admin_user)
    view(request)
    assert is_tour_complete(shop, "home", admin_user)
def test_list_view(rf, admin_user):
    shop = factories.get_default_shop()

    product = factories.create_product(sku="test", shop=shop)
    shop_product = product.get_shop_instance(shop)
    shop_product.primary_category = factories.get_default_category()
    shop_product.save()
    shop_product.categories.add(shop_product.primary_category)

    view = load("shuup.admin.modules.products.views:ProductListView").as_view()
    request = apply_request_middleware(rf.get(
        "/", {"jq": json.dumps({
            "perPage": 100,
            "page": 1
        })}),
                                       user=admin_user)
    response = view(request)
    assert 200 <= response.status_code < 300

    data = json.loads(response.content.decode("utf-8"))
    product_data = [
        item for item in data["items"] if item["_id"] == shop_product.pk
    ][0]
    assert product_data["primary_category"] == factories.get_default_category(
    ).name
    assert product_data["categories"] == factories.get_default_category().name
    assert product_data["categories"] == factories.get_default_category().name

    # Suppliers not available by default since multiple suppliers is not enabled
    assert "suppliers" not in product_data
Esempio n. 10
0
 def _load_phases(self):
     phases = OrderedDict()
     for phase_spec in self.phase_specs:
         phase_class = load(phase_spec)
         phases[phase_class.identifier] = self.instantiate_phase_class(
             phase_class)
     return list(phases.values())
Esempio n. 11
0
    def get_context_data(self, **kwargs):
        context = super(CartDetailView, self).get_context_data(**kwargs)
        basket_class = None
        if self.object.class_spec:
            basket_class = load(self.object.class_spec)

        if not basket_class:
            basket_class = cached_load("SHUUP_BASKET_CLASS_SPEC")

        basket = basket_class(self.request,
                              basket_name=self.object.key,
                              shop=self.object.shop)
        context["basket"] = basket

        sources = [
            basket.shipping_address,
            basket.billing_address,
            basket.customer,
            basket.orderer,
        ]

        fields = ("email", "phone", "tax_number")

        for field in fields:
            for source in sources:
                val = getattr(source, field, None)
                if val:
                    context[field] = val
                    break

        return context
Esempio n. 12
0
def test_list_view(rf, admin_user):
    shop = factories.get_default_shop()
    supplier = get_simple_supplier()

    product = factories.create_product(sku="test",
                                       shop=shop,
                                       supplier=supplier)
    shop_product = product.get_shop_instance(shop)
    shop_product.primary_category = factories.get_default_category()
    shop_product.save()
    shop_product.categories.add(shop_product.primary_category)

    view = load(
        "shuup.simple_supplier.admin_module.views:StocksListView").as_view()
    request = apply_request_middleware(rf.get(
        "/", {"jq": json.dumps({
            "perPage": 100,
            "page": 1
        })}),
                                       user=admin_user)
    response = view(request)
    assert 200 <= response.status_code < 300

    data = json.loads(response.content.decode("utf-8"))
    for item in data["items"]:
        assert item["_url"] == ""
Esempio n. 13
0
 def dispatch(self, request, *args, **kwargs):
     module_str = "%s:%s" % (request.GET.get("module"),
                             request.GET.get("model"))
     self.return_url = request.GET.get("return_url")
     self.model = load(module_str)
     self.settings = ViewSettings(self.model, [])
     return super(ListSettingsView, self).dispatch(request, *args, **kwargs)
Esempio n. 14
0
def test_list_view(rf, admin_user):
    shop = factories.get_default_shop()

    parent_category = factories.CategoryFactory(status=CategoryStatus.VISIBLE)
    parent_category.shops.add(shop)

    child_category = factories.CategoryFactory(status=CategoryStatus.VISIBLE)
    child_category.parent = parent_category
    child_category.save()
    child_category.shops.add(shop)

    view = load(
        "shuup.admin.modules.categories.views:CategoryListView").as_view()
    request = apply_request_middleware(rf.get(
        "/", {"jq": json.dumps({
            "perPage": 100,
            "page": 1
        })}),
                                       user=admin_user)
    response = view(request)
    assert 200 <= response.status_code < 300

    data = json.loads(response.content.decode("utf-8"))
    parent_data = _get_item_data(data, parent_category)
    assert _get_abstract_header(parent_data) == parent_category.name

    child_data = _get_item_data(data, child_category)
    assert _get_abstract_header(child_data) == child_category.name
Esempio n. 15
0
def admin_url(regex,
              view,
              kwargs=None,
              name=None,
              prefix="",
              require_authentication=True,
              permissions=None):
    if permissions is None:
        permissions = (name, ) if name else ()

    if isinstance(view, six.string_types):
        if not view:
            raise ImproperlyConfigured(
                "Error! Empty URL pattern view name not permitted (for pattern `%r`)."
                % regex)
        if prefix:
            view = prefix + "." + view

        view = importing.load(view)

    return AdminRegexURLPattern(regex,
                                view,
                                kwargs,
                                name,
                                require_authentication=require_authentication,
                                permissions=permissions)
Esempio n. 16
0
def test_list_view(rf, class_spec):
    view = load(class_spec).as_view()
    request = rf.get("/", {
        "jq": json.dumps({"perPage": 100, "page": 1})
    })
    response = view(request)
    assert 200 <= response.status_code < 300
Esempio n. 17
0
def test_iframe_mode(rf, admin_user, extra_query_param, extra_query_value,
                     expected_script):
    get_default_shop()
    view = load(
        "shuup.admin.modules.categories.views:CategoryEditView").as_view()

    request = apply_request_middleware(rf.get("/", {"mode": "iframe"}),
                                       user=admin_user)
    response = view(request)
    if hasattr(response, "render"):
        response.render()
    assert 200 <= response.status_code < 300

    content = force_text(response.content)
    post = extract_form_fields(BeautifulSoup(content, "lxml"))
    post.update({"base-name__en": "Name"})
    post.pop("base-image")

    # save iframe mode
    request = apply_request_middleware(rf.post("/", post), user=admin_user)
    request.GET = request.GET.copy()
    request.GET["mode"] = "iframe"

    if extra_query_param:
        request.GET[extra_query_param] = extra_query_value

    response = view(request)
    assert response.status_code == 302

    client = Client()
    client.login(username="******", password="******")

    response = client.get(response.url)
    assert response.status_code == 200
    assert expected_script in force_text(response.content)
Esempio n. 18
0
    def _build_settings_columns(self):
        columns = []
        all_models = [(None, self.model)]

        defaults = [col.id for col in self.default_columns]

        known_names = []

        for identifier, m in self.view_context.related_objects:
            all_models.append((identifier, load(m)))

        for identifier, model in all_models:
            if hasattr(model, "_parler_meta"):
                self._add_translated_columns(columns, defaults, identifier,
                                             known_names, model)
            self._add_local_columns(all_models, columns, defaults, identifier,
                                    known_names, model)
            self._add_m2m_columns(all_models, columns, defaults, identifier,
                                  known_names, model)
            self._add_provided_columns(columns, identifier, known_names, model)

        table_columns = set([col.id for col in columns])
        for default_column in self.default_columns:
            if default_column.id not in table_columns and default_column.id != "select":
                columns.append(default_column)
        return columns
Esempio n. 19
0
def test_list_view(rf, class_spec, admin_user):
    shop = get_default_shop()
    view = load(class_spec).as_view()
    request = apply_request_middleware(rf.get("/", {
        "jq": json.dumps({"perPage": 100, "page": 1})
    }), user=admin_user)
    response = view(request)
    assert 200 <= response.status_code < 300
def test_carrier_views(rf, admin_user):
    get_default_shop()

    view = load("shuup_shipping_table.admin.views.carrier.CarrierListView").as_view()
    request = apply_request_middleware(rf.get("/"), user=admin_user)
    response = view(request)
    assert response.status_code == 200

    view = load("shuup_shipping_table.admin.views.carrier.CarrierEditView").as_view()
    request = apply_request_middleware(rf.get("/"), user=admin_user)
    response = view(request)
    assert response.status_code == 200
    
    view = load("shuup_shipping_table.admin.views.carrier.CarrierDeleteView").as_view()
    request = apply_request_middleware(rf.post("/"), user=admin_user)
    with pytest.raises(Http404):
        response = view(request, pk=1)
Esempio n. 21
0
def test_list_view_with_multiple_suppliers(rf, admin_user):
    shop = factories.get_default_shop()

    product = factories.create_product(sku="test", shop=shop)
    shop_product = product.get_shop_instance(shop)
    shop_product.primary_category = factories.get_default_category()
    shop_product.save()
    shop_product.categories.add(shop_product.primary_category)

    # Also one product with supplier
    supplier = factories.get_default_supplier()
    product2 = factories.create_product(sku="test2", shop=shop, supplier=supplier)
    shop_product2 = product2.get_shop_instance(shop)
    shop_product2.primary_category = factories.get_default_category()
    shop_product2.save()
    shop_product2.categories.add(shop_product.primary_category)

    with override_settings(SHUUP_ENABLE_MULTIPLE_SUPPLIERS=True):
        view = load("shuup.admin.modules.products.views:ProductListView").as_view()
        request = apply_request_middleware(
            rf.get("/", {"jq": json.dumps({"perPage": 100, "page": 1})}), user=admin_user
        )
        response = view(request)
        assert 200 <= response.status_code < 300

        data = json.loads(response.content.decode("utf-8"))
        assert len(data["items"]) == 2
        product_data = [item for item in data["items"] if item["_id"] == shop_product.pk][0]
        assert product_data["primary_category"] == factories.get_default_category().name
        assert product_data["categories"] == factories.get_default_category().name
        assert product_data["categories"] == factories.get_default_category().name
        assert product_data["suppliers"] == ""

        product_data2 = [item for item in data["items"] if item["_id"] == shop_product2.pk][0]
        assert product_data2["suppliers"] == factories.get_default_supplier().name

    with override_settings(SHUUP_ADMIN_SUPPLIER_PROVIDER_SPEC="shuup.testing.supplier_provider.FirstSupplierProvider"):
        view = load("shuup.admin.modules.products.views:ProductListView").as_view()
        request = apply_request_middleware(
            rf.get("/", {"jq": json.dumps({"perPage": 100, "page": 1})}), user=admin_user
        )
        response = view(request)
        assert 200 <= response.status_code < 300

        data = json.loads(response.content.decode("utf-8"))
        assert len(data["items"]) == 1
Esempio n. 22
0
def test_tour_view(rf, admin_user):
    shop = get_default_shop()
    assert is_tour_complete(shop, "home", admin_user) is False
    view = load("shuup.admin.views.tour:TourView").as_view()
    request = apply_request_middleware(rf.post("/", data={"tourKey": "home"}),
                                       user=admin_user)
    view(request)
    assert is_tour_complete(shop, "home", admin_user)
Esempio n. 23
0
def load_setup_wizard_panes(shop, request=None, visible_only=True):
    panes = []
    for pane_spec in getattr(settings, "SHUUP_SETUP_WIZARD_PANE_SPEC", []):
        pane_class = load(pane_spec)
        pane_inst = pane_class(request=request, object=shop)
        if not visible_only or pane_inst.visible():
            panes.append(pane_inst)
    return panes
Esempio n. 24
0
def encode_enum(enum_val):
    enum_cls = enum_val.__class__
    spec = "%s:%s" % (enum_cls.__module__, enum_cls.__name__)
    try:
        if load(spec) != enum_cls:
            raise ImproperlyConfigured("That's not the same class!")
    except ImproperlyConfigured:  # Also raised by `load`
        return enum_val.value  # Fall back to the bare value.
    return [spec, enum_val.value]
Esempio n. 25
0
def encode_enum(enum_val):
    enum_cls = enum_val.__class__
    spec = "%s:%s" % (enum_cls.__module__, enum_cls.__name__)
    try:
        if load(spec) != enum_cls:
            raise ImproperlyConfigured("Error! That's not the same class.")
    except ImproperlyConfigured:  # Also raised by `load`
        return enum_val.value  # Fall back to the bare value.
    return [spec, enum_val.value]
Esempio n. 26
0
def test_detail_view(rf, admin_user, model_and_class):
    get_default_shop()  # obvious prerequisite
    model_func, class_spec = model_and_class
    model = model_func()
    view = load(class_spec).as_view()
    request = apply_request_middleware(rf.get("/"), user=admin_user)
    response = view(request, pk=model.pk)
    if hasattr(response, "render"):
        response.render()
    assert 200 <= response.status_code < 300
Esempio n. 27
0
def test_detail_view(rf, admin_user, model_and_class):
    get_default_shop()  # obvious prerequisite
    model_func, class_spec = model_and_class
    model = model_func()
    view = load(class_spec).as_view()
    request = apply_request_middleware(rf.get("/"), user=admin_user)
    response = view(request, pk=model.pk)
    if hasattr(response, "render"):
        response.render()
    assert 200 <= response.status_code < 300
Esempio n. 28
0
def get_order_identifier(order):
    if order.identifier:
        raise ValueError("Order passed to get_order_identifier() already has an identifier")
    order_identifier_method = settings.SHUUP_ORDER_IDENTIFIER_METHOD
    if order_identifier_method == "id":
        return force_text(order.id)
    elif callable(order_identifier_method):
        return order_identifier_method(order)
    else:
        getter = load(order_identifier_method, "Order identifier generator")
        return getter(order)
def test_carrier_views(rf, admin_user):
    get_default_shop()

    view = load(
        "shuup_shipping_table.admin.views.carrier.CarrierListView").as_view()
    request = apply_request_middleware(rf.get("/"), user=admin_user)
    response = view(request)
    assert response.status_code == 200

    view = load(
        "shuup_shipping_table.admin.views.carrier.CarrierEditView").as_view()
    request = apply_request_middleware(rf.get("/"), user=admin_user)
    response = view(request)
    assert response.status_code == 200

    view = load("shuup_shipping_table.admin.views.carrier.CarrierDeleteView"
                ).as_view()
    request = apply_request_middleware(rf.post("/"), user=admin_user)
    with pytest.raises(Http404):
        response = view(request, pk=1)
Esempio n. 30
0
def _load_provide_objects(category):
    provide_specs = _get_provide_specs_from_apps(category)
    loaded_provides = _loaded_provides[category]
    if set(provide_specs) != set(loaded_provides.keys()):  # Changes occurred, reload provides
        _uncache(category)
        explanation = "Loading provides %s" % category
        loaded_provides = OrderedDict()
        for spec in provide_specs:
            loaded_provides[spec] = load(spec, explanation)
        _loaded_provides[category] = loaded_provides
    return _loaded_provides.get(category, {})
Esempio n. 31
0
def _load_provide_objects(category):
    provide_specs = _get_provide_specs_from_apps(category)
    loaded_provides = _loaded_provides[category]
    if set(provide_specs) != set(loaded_provides.keys()):  # Changes occurred, reload provides
        _uncache(category)
        explanation = "Loading provides %s" % category
        loaded_provides = OrderedDict()
        for spec in provide_specs:
            loaded_provides[spec] = load(spec, explanation)
        _loaded_provides[category] = loaded_provides
    return _loaded_provides.get(category, {})
Esempio n. 32
0
def get_order_identifier(order):
    if order.identifier:
        raise ValueError("Error! Order passed to function `get_order_identifier()` already has an identifier.")
    order_identifier_method = settings.SHUUP_ORDER_IDENTIFIER_METHOD
    if order_identifier_method == "id":
        return force_text(order.id)
    elif callable(order_identifier_method):
        return order_identifier_method(order)
    else:
        getter = load(order_identifier_method, "Order identifier generator")
        return getter(order)
Esempio n. 33
0
def test_toolbar_button(rf, admin_user):
    shop = get_default_shop()
    supplier = get_default_supplier()
    product = create_product("simple-test-product", shop)
    order = create_order_with_product(product, supplier, 6, 6, shop=shop)
    view = load("shuup.admin.modules.orders.views.OrderDetailView").as_view()
    request = apply_request_middleware(rf.get("/"), user=admin_user)
    response = view(request, pk=order.pk)
    expected_button_class = "SimplePrintoutsToolbarButton"
    toolbar = response.context_data.get("toolbar")
    assert any(button.__class__.__name__ == expected_button_class for button in toolbar)
    assert response.status_code == 200
Esempio n. 34
0
 def load_mass_actions(self):
     # TODO: Make extendable through provides in near future
     actions = []
     for action in self.mass_actions:
         obj = load(action)()
         redirects = isinstance(obj, PicotableRedirectMassAction)
         actions.append({
             "key": obj.identifier,
             "value": obj.label,
             "redirects": redirects,
             "redirect_url": obj.redirect_url if redirects else None
         })
     return actions
Esempio n. 35
0
 def load_mass_actions(self):
     # TODO: Make extendable through provides in near future
     actions = []
     for action in self.mass_actions:
         obj = load(action)()
         redirects = isinstance(obj, PicotableRedirectMassAction)
         actions.append({
             "key": obj.identifier,
             "value": obj.label,
             "redirects": redirects,
             "redirect_url": obj.redirect_url if redirects else None
         })
     return actions
Esempio n. 36
0
def test_toolbar_button(rf, admin_user):
    shop = get_default_shop()
    supplier = get_default_supplier()
    product = create_product("simple-test-product", shop)
    order = create_order_with_product(product, supplier, 6, 6, shop=shop)
    view = load("shuup.admin.modules.orders.views.OrderDetailView").as_view()
    request = apply_request_middleware(rf.get("/"), user=admin_user)
    response = view(request, pk=order.pk)
    expected_button_class = "SimplePrintoutsToolbarButton"
    toolbar = response.context_data.get("toolbar")
    assert any(button.__class__.__name__ == expected_button_class
               for button in toolbar)
    assert response.status_code == 200
Esempio n. 37
0
    def load_mass_actions(self):
        actions = []
        for action in self._get_mass_actions():
            obj = load(action)()
            action_data = {}
            extra_data = obj.get_action_info(self.request)

            if extra_data and isinstance(extra_data, dict):
                action_data.update(extra_data)

            action_data.update({"key": obj.identifier, "value": obj.label})
            actions.append(action_data)
        return actions
Esempio n. 38
0
File: urls.py Progetto: rogasp/shuup
def admin_url(regex, view, kwargs=None, name=None, prefix='', require_authentication=True, permissions=()):
    if isinstance(view, six.string_types):
        if not view:
            raise ImproperlyConfigured('Empty URL pattern view name not permitted (for pattern %r)' % regex)
        if prefix:
            view = prefix + '.' + view

        view = importing.load(view)

    return AdminRegexURLPattern(
        regex, view, kwargs, name,
        require_authentication=require_authentication,
        permissions=permissions
    )
Esempio n. 39
0
    def _load_phases(self):
        phases = OrderedDict()

        for phase_spec in self.phase_specs:
            phase_class = load(phase_spec)
            phase = self.instantiate_phase_class(phase_class)
            phases[phase_class.identifier] = phase

            # check whether the phase spawns new phases,
            # if so, then let's spawn then and add the phases
            for spawned_phase in phase.spawn_phases(self):
                phases[spawned_phase.identifier] = spawned_phase

        return list(phases.values())
Esempio n. 40
0
    def load_mass_actions(self):
        # TODO: Make extendable through provides in near future
        actions = []
        for action in self.mass_actions:
            obj = load(action)()
            action_data = {}
            extra_data = obj.get_action_info(self.request)

            if extra_data and isinstance(extra_data, dict):
                action_data.update(extra_data)

            action_data.update({"key": obj.identifier, "value": obj.label})
            actions.append(action_data)
        return actions
Esempio n. 41
0
    def _load_module(self):
        spec = self.default_module_spec
        module_identifier = self.module_identifier
        if module_identifier:
            impls = self.get_module_implementation_map()
            if module_identifier not in impls:
                raise ModuleNotFound(
                    "Invalid module identifier %r in %s" % (module_identifier, force_ascii(repr(self)))
                )
            spec = impls[module_identifier]

        cls = load(spec, context_explanation="Loading module for %s" % force_ascii(repr(self)))

        options = getattr(self, self.module_options_field, None) or {}
        return cls(self, options)
Esempio n. 42
0
def get_reference_number(order):
    if order.reference_number:
        raise ValueError("Order passed to get_reference_number() already has a reference number")
    reference_number_method = settings.SHUUP_REFERENCE_NUMBER_METHOD
    if reference_number_method == "unique":
        return get_unique_reference_number(order)
    elif reference_number_method == "running":
        return get_running_reference_number(order)
    elif reference_number_method == "shop_running":
        return get_shop_running_reference_number(order)
    elif callable(reference_number_method):
        return reference_number_method(order)
    else:
        getter = load(reference_number_method, "Reference number generator")
        return getter(order)
Esempio n. 43
0
    def _load_module(self):
        spec = self.default_module_spec
        module_identifier = self.module_identifier
        if module_identifier:
            impls = self.get_module_implementation_map()
            if module_identifier not in impls:
                raise ModuleNotFound(
                    "Invalid module identifier %r in %s" % (module_identifier, force_ascii(repr(self)))
                )
            spec = impls[module_identifier]

        cls = load(spec, context_explanation="Loading module for %s" % force_ascii(repr(self)))

        options = getattr(self, self.module_options_field, None) or {}
        return cls(self, options)
Esempio n. 44
0
def get_reference_number(order):
    if order.reference_number:
        raise ValueError("Order passed to get_reference_number() already has a reference number")
    reference_number_method = settings.SHUUP_REFERENCE_NUMBER_METHOD
    if reference_number_method == "unique":
        return get_unique_reference_number(order)
    elif reference_number_method == "running":
        return get_running_reference_number(order)
    elif reference_number_method == "shop_running":
        return get_shop_running_reference_number(order)
    elif callable(reference_number_method):
        return reference_number_method(order)
    else:
        getter = load(reference_number_method, "Reference number generator")
        return getter(order)
Esempio n. 45
0
def test_list_view(rf, class_spec, admin_user):
    get_default_shop()
    view = load(class_spec).as_view()

    # normal request
    request = apply_request_middleware(rf.get("/"), user=admin_user)
    response = view(request)
    assert response.status_code == 200

    # picotable request
    request = apply_request_middleware(rf.get("/", {
        "jq": json.dumps({"perPage": 100, "page": 1})
    }), user=admin_user)
    response = view(request)
    assert 200 <= response.status_code < 300
Esempio n. 46
0
def load_setup_wizard_panes(shop, request=None, visible_only=True):
    """
    Load the setup Wizard panes.
    The result will be a list of valid pane instances.

    :type request: HttpRequest|None
    :param visible_only: whether to return only visible panes
    :type visible_only: bool
    """
    panes = []
    for pane_spec in getattr(settings, "SHUUP_SETUP_WIZARD_PANE_SPEC", []):
        pane_class = load(pane_spec)
        pane_inst = pane_class(request=request, object=shop)
        if pane_inst.valid() and (not visible_only or pane_inst.visible()):
            panes.append(pane_inst)
    return panes
Esempio n. 47
0
    def load_mass_actions(self):
        actions = []
        for action in self._get_mass_actions():
            obj = load(action)()
            action_data = {}
            extra_data = obj.get_action_info(self.request)

            if extra_data and isinstance(extra_data, dict):
                action_data.update(extra_data)

            action_data.update({
                "key": obj.identifier,
                "value": obj.label
            })
            actions.append(action_data)
        return actions
Esempio n. 48
0
    def load(cls, identifier, theme=None):
        """
        Get a plugin class based on the identifier from the `xtheme_plugin` provides registry.

        :param identifier: Plugin class identifier
        :type identifier: str
        :return: A plugin class, or None
        :rtype: class[Plugin]|None
        """
        loaded_plugin = get_identifier_to_object_map("xtheme_plugin").get(identifier)
        if not loaded_plugin and theme is not None:
            for plugin_spec in theme.plugins:
                plugin = load(plugin_spec)
                if plugin.identifier == identifier:
                    return plugin
        return loaded_plugin
Esempio n. 49
0
def load_setup_wizard_pane(shop, request, pane_id):
    """
    Search, load and return a valid Wizard Pane by its identifier.

    :type request: HttpRequest
    :param pane_id: the pane identifier
    :type pane_id: str

    :return: the pane instance or None
    :rtype: shuup.admin.views.wizard.WizardPane|None
    """
    for pane_spec in getattr(settings, "SHUUP_SETUP_WIZARD_PANE_SPEC", []):
        pane_class = load(pane_spec)
        pane_inst = pane_class(request=request, object=shop)
        if pane_inst.identifier == pane_id and pane_inst.valid():
            return pane_inst
Esempio n. 50
0
    def load(cls, identifier, theme=None):
        """
        Get a plugin class based on the identifier from the `xtheme_plugin` provides registry.

        :param identifier: Plugin class identifier
        :type identifier: str
        :return: A plugin class, or None
        :rtype: class[Plugin]|None
        """
        loaded_plugin = get_identifier_to_object_map("xtheme_plugin").get(identifier)
        if not loaded_plugin and theme is not None:
            for plugin_spec in theme.plugins:
                plugin = load(plugin_spec)
                if plugin.identifier == identifier:
                    return plugin
        return loaded_plugin
Esempio n. 51
0
def admin_url(regex, view, kwargs=None, name=None, prefix='', require_authentication=True, permissions=None):
    if permissions is None:
        permissions = ((name,) if name else ())

    if isinstance(view, six.string_types):
        if not view:
            raise ImproperlyConfigured('Empty URL pattern view name not permitted (for pattern %r)' % regex)
        if prefix:
            view = prefix + '.' + view

        view = importing.load(view)

    return AdminRegexURLPattern(
        regex, view, kwargs, name,
        require_authentication=require_authentication,
        permissions=permissions
    )
Esempio n. 52
0
def test_menu_view(rf, admin_user):
    get_default_shop()  # obvious prerequisite
    view = load("shuup.admin.views.menu:MenuToggleView").as_view()
    request = apply_request_middleware(rf.post("/"), user=admin_user)

    assert "menu_open" not in request.session

    response = view(request)
    if hasattr(response, "render"):
        response.render()
    assert response.status_code == 200
    assert not request.session["menu_open"]  # Menu closed

    response = view(request)
    if hasattr(response, "render"):
        response.render()
    assert response.status_code == 200
    assert request.session["menu_open"]  # Menu open
Esempio n. 53
0
    def view(request, *args, **kwargs):
        handler_attr = HANDLER_ATTR_FMT % error_status

        # look for compatible error handlers
        for handler_spec in settings.SHUUP_ERROR_PAGE_HANDLERS_SPEC:
            handler = load(handler_spec)()

            # return a response for the error status
            if handler.can_handle_error(request, error_status):
                return handler.handle_error(request, error_status)

        # tries to use the default handler (set in django's root urlconf)
        # otherwise just a blank response
        fallback_handler = _URLCONF_ERROR_HANDLERS.get(handler_attr)
        if fallback_handler and callable(fallback_handler):
            return fallback_handler(request)
        else:
            return HttpResponse(status=error_status)
Esempio n. 54
0
def test_list_view(rf, admin_user):
    shop = factories.get_default_shop()
    product = factories.create_product(sku="test", shop=shop)
    shop_product = product.get_shop_instance(shop)
    shop_product.primary_category = factories.get_default_category()
    shop_product.save()
    shop_product.categories.add(shop_product.primary_category)

    view = load("shuup.admin.modules.products.views:ProductListView").as_view()
    request = apply_request_middleware(rf.get("/", {
        "jq": json.dumps({"perPage": 100, "page": 1})
    }), user=admin_user)
    response = view(request)
    assert 200 <= response.status_code < 300

    data = json.loads(response.content.decode("utf-8"))
    product_data = [item for item in data["items"] if item["_id"] == shop_product.pk][0]
    assert product_data["primary_category"] == factories.get_default_category().name
    assert product_data["categories"] == factories.get_default_category().name
Esempio n. 55
0
def get_reference_number(order):
    from shuup import configuration
    from shuup.admin.modules.settings.consts import ORDER_REFERENCE_NUMBER_METHOD_FIELD

    if order.reference_number:
        raise ValueError("Order passed to get_reference_number() already has a reference number")
    reference_number_method = configuration.get(
        order.shop, ORDER_REFERENCE_NUMBER_METHOD_FIELD, settings.SHUUP_REFERENCE_NUMBER_METHOD)
    if reference_number_method == "unique":
        return get_unique_reference_number_for_order(order)
    elif reference_number_method == "running":
        return get_running_reference_number(order)
    elif reference_number_method == "shop_running":
        return get_shop_running_reference_number(order)
    elif callable(reference_number_method):
        return reference_number_method(order)
    else:
        getter = load(reference_number_method, "Reference number generator")
        return getter(order)
Esempio n. 56
0
def test_list_view(rf, admin_user):
    shop = factories.get_default_shop()
    supplier = get_simple_supplier()

    product = factories.create_product(sku="test", shop=shop, supplier=supplier)
    shop_product = product.get_shop_instance(shop)
    shop_product.primary_category = factories.get_default_category()
    shop_product.save()
    shop_product.categories.add(shop_product.primary_category)

    view = load("shuup.simple_supplier.admin_module.views:StocksListView").as_view()
    request = apply_request_middleware(rf.get("/", {
        "jq": json.dumps({"perPage": 100, "page": 1})
    }), user=admin_user)
    response = view(request)
    assert 200 <= response.status_code < 300

    data = json.loads(response.content.decode("utf-8"))
    for item in data["items"]:
        assert item["_url"] == ""
Esempio n. 57
0
    def get_theme_plugin_choices(self, empty_label=None):
        """
        Get a sorted list of 2-tuples (identifier and name) of available theme specific Xtheme plugins.

        Handy for `<select>` boxes.

        :param empty_label: Label for the "empty" choice. If falsy, no empty choice is prepended
        :type empty_label: str|None
        :return: List of 2-tuples
        :rtype: Iterable[tuple[str, str]]
        """
        choices = []
        if empty_label:
            choices.append(("", empty_label))

        for plugin_spec in self.plugins:
            plugin = load(plugin_spec)
            choices.append((
                plugin.identifier,
                getattr(plugin, "name", None) or plugin.identifier
            ))
        choices.sort()
        return choices
Esempio n. 58
0
def test_detail_view(rf, admin_user, model_and_class):
    get_default_shop()  # obvious prerequisite
    model_func, class_spec = model_and_class
    model = model_func()
    view = load(class_spec).as_view()
    request = apply_request_middleware(rf.get("/"), user=admin_user)

    if model_func == get_default_product:
        pk = model.shop_products.first().pk
    else:
        pk = model.pk

    response = view(request, pk=pk)
    if hasattr(response, "render"):
        response.render()
    assert 200 <= response.status_code < 300

    # request with iframe mode
    request = apply_request_middleware(rf.get("/", {"mode": "iframe"}), user=admin_user)
    response = view(request, pk=pk)
    if hasattr(response, "render"):
        response.render()
    assert 200 <= response.status_code < 300
Esempio n. 59
0
    def _build_settings_columns(self):
        columns = []
        all_models = [(None, self.model)]

        defaults = [col.id for col in self.default_columns]

        known_names = []

        for identifier, m in self.view_context.related_objects:
            all_models.append((identifier, load(m)))

        for identifier, model in all_models:
            if hasattr(model, "_parler_meta"):
                self._add_translated_columns(columns, defaults, identifier, known_names, model)
            self._add_local_columns(all_models, columns, defaults, identifier, known_names, model)
            self._add_m2m_columns(all_models, columns, defaults, identifier, known_names, model)
            self._add_provided_columns(columns, identifier, known_names, model)

        table_columns = set([col.id for col in columns])
        for default_column in self.default_columns:
            if default_column.id not in table_columns and default_column.id != "select":
                columns.append(default_column)
        return columns