Source code for shoop.admin.modules.services.forms

# -*- coding: utf-8 -*-
# This file is part of Shoop.
#
# Copyright (c) 2012-2016, Shoop Ltd. All rights reserved.
#
# This source code is licensed under the AGPLv3 license found in the
# LICENSE file in the root directory of this source tree.

from __future__ import unicode_literals

from django import forms
from django.utils.translation import ugettext_lazy as _

from shoop.admin.forms import ShoopAdminForm
from shoop.core.models import (
    FixedCostBehaviorComponent, GroupAvailabilityBehaviorComponent,
    PaymentMethod, RoundingBehaviorComponent, ServiceProvider, ShippingMethod,
    StaffOnlyBehaviorComponent, WaivingCostBehaviorComponent,
    WeightLimitsBehaviorComponent
)


[docs]class BaseMethodForm(ShoopAdminForm):
[docs] class Meta: model = None exclude = [ "identifier", "behavior_components", "old_module_identifier", "old_module_data" ] base_fields = [ "choice_identifier", "name", "description", "enabled", "shop", "logo", "tax_class" ]
def __init__(self, **kwargs): self.request = kwargs.pop("request") self.instance = kwargs.get("instance") selected_provider = self.get_service_provider(self.request.GET.get("provider")) if selected_provider: self.service_provider = selected_provider super(BaseMethodForm, self).__init__(**kwargs) self.fields["choice_identifier"] = forms.ChoiceField( choices=_get_service_choices(self.service_provider), required=bool(self.service_provider), label=_("Service"), ) self.fields[self.service_provider_attr].required = True
[docs] def get_service_provider(self, id): if not id: return return ServiceProvider.objects.filter(id=id).first()
@property def service_provider(self): return getattr(self.instance, self.service_provider_attr) if self.instance else None @service_provider.setter def service_provider(self, value): setattr(self.instance, self.service_provider_attr, value) def _save_master(self, commit=True): if self.instance.pk: return super(BaseMethodForm, self)._save_master(commit) # New services are always created with provider.create_service method service_data = self._get_cleaned_data_without_translations() provider = service_data.pop(self.service_provider_attr) choice_identifier = service_data.pop("choice_identifier") return provider.create_service(choice_identifier, **service_data)
def _get_service_choices(service_provider): if not service_provider: return [] service_choices = service_provider.get_service_choices() return [(sc.identifier, sc.name) for sc in service_choices]
[docs]class AlwaysChangedModelForm(forms.ModelForm): """ ModelForm that can be saved if it is empty or has unchanged lines on creation """
[docs] def has_changed(self, *args, **kwargs): if self.instance.pk is None: return True return super(AlwaysChangedModelForm, self).has_changed(*args, **kwargs)
[docs]class ShippingMethodForm(BaseMethodForm): service_provider_attr = "carrier"
[docs] class Meta(BaseMethodForm.Meta): model = ShippingMethod fields = ["carrier"] + BaseMethodForm.Meta.base_fields help_texts = { "carrier": _("Select carrier before filling other fields.") }
[docs]class PaymentMethodForm(BaseMethodForm): service_provider_attr = "payment_processor"
[docs] class Meta(BaseMethodForm.Meta): model = PaymentMethod fields = ["payment_processor"] + BaseMethodForm.Meta.base_fields help_texts = { "payment_processor": _("Select payment processor before filling other fields.") }
[docs]class FixedCostBehaviorComponentForm(ShoopAdminForm):
[docs] class Meta: model = FixedCostBehaviorComponent exclude = ["identifier"] labels = { "price_value": _("Price"), }
[docs]class WaivingCostBehaviorComponentForm(ShoopAdminForm):
[docs] class Meta: model = WaivingCostBehaviorComponent exclude = ["identifier"] labels = { "price_value": _("Price"), "waive_limit_value": _("Waive limit") }
[docs]class WeightLimitsBehaviorComponentForm(forms.ModelForm):
[docs] class Meta: model = WeightLimitsBehaviorComponent exclude = ["identifier"]
[docs]class GroupAvailabilityBehaviorComponentForm(forms.ModelForm):
[docs] class Meta: model = GroupAvailabilityBehaviorComponent exclude = ["identifier"]
[docs]class StaffOnlyBehaviorComponentForm(AlwaysChangedModelForm):
[docs] class Meta: model = StaffOnlyBehaviorComponent exclude = ["identifier"]
[docs]class RoundingBehaviorComponentForm(AlwaysChangedModelForm):
[docs] class Meta: model = RoundingBehaviorComponent exclude = ["identifier"]