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

# -*- 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.contrib import messages
from django.forms.formsets import DEFAULT_MAX_NUM, DEFAULT_MIN_NUM
from django.forms.models import BaseModelFormSet, ModelForm
from django.http import HttpResponseRedirect
from django.utils.translation import ugettext_lazy as _
from django.views.generic import UpdateView

from shuup.admin.base import MenuEntry
from shuup.admin.forms.widgets import ProductChoiceWidget
from shuup.admin.toolbar import PostActionButton, Toolbar
from shuup.admin.utils.urls import get_model_url
from shuup.core.models import Product, ProductCrossSell, ProductCrossSellType


[docs]class ProductCrossSellForm(ModelForm):
[docs] class Meta: model = ProductCrossSell fields = ( "product2", "weight", "type", )
def __init__(self, **kwargs): self.product = kwargs.pop("product") super(ProductCrossSellForm, self).__init__(**kwargs) self.fields["product2"].widget = ProductChoiceWidget() self.fields["product2"].label = _("Product")
[docs] def save(self, commit=True): self.instance.product1 = self.product return super(ProductCrossSellForm, self).save(commit=commit)
[docs]class ProductCrossSellFormSet(BaseModelFormSet): validate_min = False min_num = DEFAULT_MIN_NUM validate_max = False max_num = DEFAULT_MAX_NUM absolute_max = DEFAULT_MAX_NUM model = ProductCrossSell can_delete = True can_order = False extra = 5 def __init__(self, *args, **kwargs): self.product = kwargs.pop("product") super(ProductCrossSellFormSet, self).__init__(*args, **kwargs)
[docs] def form(self, **kwargs): kwargs.setdefault("product", self.product) return ProductCrossSellForm(**kwargs)
[docs]class ProductCrossSellEditView(UpdateView): model = Product template_name = "shuup/admin/products/edit_cross_sell.jinja" context_object_name = "product" form_class = ProductCrossSellFormSet
[docs] def get_breadcrumb_parents(self): return [MenuEntry(text="%s" % self.object, url=get_model_url(self.object, shop=self.request.shop))]
[docs] def get_context_data(self, **kwargs): context = super(ProductCrossSellEditView, self).get_context_data(**kwargs) context["title"] = _("Edit Cross-Sell: %s") % self.object context["toolbar"] = Toolbar( [ PostActionButton( icon="fa fa-save", form_id="xsell_form", text=_("Save"), extra_css_class="btn-success", ), ], view=self, ) return context
[docs] def get_form_kwargs(self): kwargs = super(ProductCrossSellEditView, self).get_form_kwargs() instance = kwargs.pop("instance", None) kwargs["queryset"] = ( ProductCrossSell.objects.filter(product1=instance) .exclude(type=ProductCrossSellType.COMPUTED) .order_by("weight") ) kwargs["product"] = instance return kwargs
[docs] def form_valid(self, form): form.save() messages.success(self.request, _("Changes saved.")) return HttpResponseRedirect(self.request.path)