Changeset - cbf3f5814bb5
[Not reviewed]
0 1 0
Christopher Neugebauer - 8 years ago 2016-09-21 09:36:57
chrisjrn@gmail.com
DRYs up the way to define a Stripe-style form field.
1 file changed with 52 insertions and 57 deletions:
0 comments (0 inline, 0 general)
registripe/forms.py
Show inline comments
 
from functools import partial
 

	
 

	
 
import copy
 

	
...
 
@@ -21,36 +19,43 @@ class NoRenderWidget(forms.widgets.HiddenInput):
 

	
 
def secure_striped(widget):
 
def secure_striped(field):
 
    ''' Calls stripe() with secure=True. '''
 
    return striped(widget, True)
 
    return striped(field, True)
 

	
 

	
 
def striped(WidgetClass, secure=False):
 
    ''' Takes a given widget and overrides the render method to be suitable
 
    for stripe.js.
 
def striped(field, secure=False):
 

	
 
    Arguments:
 
        widget: The widget class
 
    oldwidget = field.widget
 
    field.widget = StripeWidgetProxy(oldwidget, secure)
 
    return field
 

	
 
        secure: if True, only the `data-stripe` attribute will be set. Name
 
            will be set to None.
 

	
 
    '''
 
class StripeWidgetProxy(widgets.Widget):
 

	
 
    class StripedWidget(WidgetClass):
 
    def __init__(self, underlying, secure=False):
 
        self.underlying = underlying
 
        self.secure = secure
 

	
 
        def render(self, name, value, attrs=None):
 
    def __deepcopy__(self, memo):
 
        copy_underlying = copy.deepcopy(self.underlying, memo)
 
        return type(self)(copy_underlying)
 

	
 
            if not attrs:
 
                attrs = {}
 
    def __getattribute__(self, attr):
 
        spr = super(StripeWidgetProxy, self).__getattribute__
 
        if attr in ("underlying", "render", "secure", "__deepcopy__"):
 
            return spr(attr)
 
        else:
 
            return getattr(self.underlying, attr)
 

	
 
    def render(self, name, value, attrs=None):
 

	
 
            attrs["data-stripe"] = name
 
        print "RENDER: " + name
 
        if not attrs:
 
            attrs = {}
 

	
 
            if secure:
 
                name = ""
 
        attrs["data-stripe"] = name
 

	
 
            return super(StripedWidget, self).render(
 
                name, value, attrs=attrs
 
            )
 
        if self.secure:
 
            name = ""
 

	
 
    return StripedWidget
 
        return self.underlying.render(name, value, attrs=attrs)
 

	
...
 
@@ -69,3 +74,3 @@ class CreditCardForm(forms.Form):
 

	
 
    number = forms.CharField(
 
    number = secure_striped(forms.CharField(
 
        required=False,
...
 
@@ -74,5 +79,4 @@ class CreditCardForm(forms.Form):
 
        max_length=255,
 
        widget=secure_striped(widgets.TextInput)(),
 
    )
 
    exp_month = forms.IntegerField(
 
    ))
 
    exp_month = secure_striped(forms.IntegerField(
 
        required=False,
...
 
@@ -81,5 +85,4 @@ class CreditCardForm(forms.Form):
 
        max_value=12,
 
        widget=secure_striped(widgets.TextInput)(),
 
    )
 
    exp_year = forms.IntegerField(
 
    ))
 
    exp_year = secure_striped(forms.IntegerField(
 
        required=False,
...
 
@@ -88,5 +91,4 @@ class CreditCardForm(forms.Form):
 
        min_value=lambda: timezone.now().year,
 
        widget=secure_striped(widgets.TextInput)(),
 
    )
 
    cvc = forms.CharField(
 
    ))
 
    cvc = secure_striped(forms.CharField(
 
        required=False,
...
 
@@ -94,4 +96,3 @@ class CreditCardForm(forms.Form):
 
        max_length=4,
 
        widget=secure_striped(widgets.TextInput)(),
 
    )
 
    ))
 

	
...
 
@@ -103,3 +104,3 @@ class CreditCardForm(forms.Form):
 

	
 
    name = forms.CharField(
 
    name = striped(forms.CharField(
 
        required=True,
...
 
@@ -108,5 +109,4 @@ class CreditCardForm(forms.Form):
 
        max_length=255,
 
        widget=striped(widgets.TextInput),
 
    )
 
    address_line1 = forms.CharField(
 
    ))
 
    address_line1 = striped(forms.CharField(
 
        required=True,
...
 
@@ -114,5 +114,4 @@ class CreditCardForm(forms.Form):
 
        max_length=255,
 
        widget=striped(widgets.TextInput),
 
    )
 
    address_line2 = forms.CharField(
 
    ))
 
    address_line2 = striped(forms.CharField(
 
        required=False,
...
 
@@ -120,5 +119,4 @@ class CreditCardForm(forms.Form):
 
        max_length=255,
 
        widget=striped(widgets.TextInput),
 
    )
 
    address_city = forms.CharField(
 
    ))
 
    address_city = striped(forms.CharField(
 
        required=True,
...
 
@@ -126,5 +124,4 @@ class CreditCardForm(forms.Form):
 
        max_length=255,
 
        widget=striped(widgets.TextInput),
 
    )
 
    address_state = forms.CharField(
 
    ))
 
    address_state = striped(forms.CharField(
 
        required=True,
...
 
@@ -132,5 +129,4 @@ class CreditCardForm(forms.Form):
 
        label="Cardholder account state or province",
 
        widget=striped(widgets.TextInput),
 
    )
 
    address_zip = forms.CharField(
 
    ))
 
    address_zip = striped(forms.CharField(
 
        required=True,
...
 
@@ -138,9 +134,8 @@ class CreditCardForm(forms.Form):
 
        label="Cardholder account postal code",
 
        widget=striped(widgets.TextInput),
 
    )
 
    address_country = LazyTypedChoiceField(
 
    ))
 
    address_country = striped(LazyTypedChoiceField(
 
        label="Cardholder account country",
 
        choices=countries,
 
        widget=striped(CountrySelectWidget),
 
    )
 
        widget=CountrySelectWidget,
 
    ))
 

	
0 comments (0 inline, 0 general)