예제 #1
0
def build_delivery_address_form(request):
    """ Builds a form class representing form asking for delivery addresses for items of an order. """
    def init(self, *args, **kwargs):
        kwargs["initial"] = self.__initial
        super(self.__class__, self).__init__(*args, **kwargs)

    def has_items(self):
        """ Returns True if there are items which to choose addresses for. """
        return self.__items.exists()

    def has_addresses(self):
        """ Returns True if there are addresses which to choose from. """
        return self.__addresses.exists()

    def get_address_fields(self):
        """ Iterates through all address field_dict in form. """
        for name in self.__address_fields:
            yield BoundField(self, self.__address_fields[name], name)

    def get_item_address_pairs(self):
        """ Iterates through all (order items / address) pairs displayed on the form. """
        for field_name in self.__address_fields:
            yield (self.__items.get(id__exact=field_name.split("_")[1]),
                   self.cleaned_data.get(field_name))

    def clean_hdnValidationHash(self):
        """ Ensures that the validation hash gotten from sent form is correct. """
        given_hash = self.cleaned_data.get("hdnValidationHash")
        our_hash = ShoppingCartItem.validation_hash_for_shopping_cart(request)
        if not given_hash == our_hash:
            self.add_common_error(CHECKOUT_ERR_MSG_INVALID_HASH)

    items = ShoppingCartItem.items_of_user_with_albums_and_addresses(
        request.user)
    addresses = Address.addresses_of_user(request.user)
    validation_hash = ShoppingCartItem.validation_hash_for_shopping_cart(
        request)

    field_dict = {}
    address_field_dict = {}
    initial_value_dict = {}

    field_dict["hdnValidationHash"] = forms.CharField(
        widget=forms.HiddenInput())
    initial_value_dict["hdnValidationHash"] = validation_hash

    for item in items:
        field_name = u"cmbAddress_" + unicode(item.id)

        new_field = DeliveryAddressChoiceField(queryset=addresses,
                                               empty_label=None,
                                               label=item.album.title)
        field_dict[field_name] = new_field
        address_field_dict[field_name] = new_field

        if item.deliveryAddress:
            initial_value_dict[field_name] = item.deliveryAddress

    members = {
        "__request": request,
        "__items": items,
        "__addresses": addresses,
        "__validation_hash": validation_hash,
        "base_fields": field_dict,
        "__address_fields": address_field_dict,
        "__initial": initial_value_dict,
        "has_items": has_items,
        "has_addresses": has_addresses,
        "address_fields": get_address_fields,
        "item_address_pairs": get_item_address_pairs,
        "clean_hdnValidationHash": clean_hdnValidationHash,
        "__init__": init
    }

    return type("DeliveryAddressForm", (CommonAlbumizerBaseForm, ), members)
예제 #2
0
def build_delivery_address_form(request):
    """ Builds a form class representing form asking for delivery addresses for items of an order. """

    def init(self, *args, **kwargs):
        kwargs["initial"] = self.__initial
        super(self.__class__, self).__init__(*args, **kwargs)

    def has_items(self):
        """ Returns True if there are items which to choose addresses for. """
        return self.__items.exists()

    def has_addresses(self):
        """ Returns True if there are addresses which to choose from. """
        return self.__addresses.exists()

    def get_address_fields(self):
        """ Iterates through all address field_dict in form. """
        for name in self.__address_fields:
            yield BoundField(self, self.__address_fields[name], name)

    def get_item_address_pairs(self):
        """ Iterates through all (order items / address) pairs displayed on the form. """
        for field_name in self.__address_fields:
            yield (self.__items.get(id__exact = field_name.split("_")[1]),
                   self.cleaned_data.get(field_name))

    def clean_hdnValidationHash(self):
        """ Ensures that the validation hash gotten from sent form is correct. """
        given_hash = self.cleaned_data.get("hdnValidationHash")
        our_hash = ShoppingCartItem.validation_hash_for_shopping_cart(request)
        if not given_hash == our_hash:
            self.add_common_error(CHECKOUT_ERR_MSG_INVALID_HASH)

    items = ShoppingCartItem.items_of_user_with_albums_and_addresses(request.user)
    addresses = Address.addresses_of_user(request.user)
    validation_hash = ShoppingCartItem.validation_hash_for_shopping_cart(request)

    field_dict = {}
    address_field_dict = {}
    initial_value_dict = {}

    field_dict["hdnValidationHash"] = forms.CharField(
        widget = forms.HiddenInput()
    )
    initial_value_dict["hdnValidationHash"] = validation_hash

    for item in items:
        field_name = u"cmbAddress_" + unicode(item.id)

        new_field = DeliveryAddressChoiceField(
            queryset = addresses,
            empty_label = None,
            label = item.album.title
        )
        field_dict[field_name] = new_field
        address_field_dict[field_name] = new_field

        if item.deliveryAddress:
            initial_value_dict[field_name] = item.deliveryAddress

    members = {
        "__request": request,
        "__items": items,
        "__addresses": addresses,
        "__validation_hash": validation_hash,
        "base_fields": field_dict,
        "__address_fields": address_field_dict,
        "__initial": initial_value_dict,
        "has_items": has_items,
        "has_addresses": has_addresses,
        "address_fields": get_address_fields,
        "item_address_pairs": get_item_address_pairs,
        "clean_hdnValidationHash": clean_hdnValidationHash,
        "__init__": init
    }

    return type("DeliveryAddressForm", (CommonAlbumizerBaseForm,), members)