Skip to content

Commit

Permalink
Build forms
Browse files Browse the repository at this point in the history
  • Loading branch information
gomezjdaniel committed Jan 29, 2013
1 parent 3a7e137 commit 084b1ce
Showing 1 changed file with 116 additions and 23 deletions.
139 changes: 116 additions & 23 deletions ngforms.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,24 @@
import re


class Form(object)
class Form(object):

def build(self):
fields = ''.join([f.build(self) for f in self.fields])

return """
<form class="form-horizontal" name="f" novalidate ng-init="val = false;"
ng-submit="f.$valid && submit()"><fieldset>%s</fieldset></form>
""" % fields

def validate(self):
pass

@property
def fields(self):
raise NotImplemented()

@property
def validations(self):
raise NotImplemented()

Expand All @@ -18,19 +27,18 @@ def field(self, name):


class Validation(object):
"""The name of the field containing the value"""
input = ""

def __init__(self, name, message, attr):
def __init__(self, name, message, attrs):
self.name = name
self.message = message
self.attr = attr
self.attrs = attrs

def validate(self, form):
raise NotImplemented()


class MinLength(Validation)
class MinLength(Validation):
def __init__(self, min, message):
super(MinLength, self).__init__("minlength", message,
{"ng-minlength" : min})
Expand All @@ -40,48 +48,133 @@ def validate(self, form):
return len(form.field(self.input)) >= min


class MaxLength(Validation)
class MaxLength(Validation):
def __init__(self, max, message):
super(MaxLength, self).__init__("maxLength", message,
super(MaxLength, self).__init__("maxlength", message,
{"ng-maxlength" : max})
self.max = max

def validate(self, form):
return len(form.field(self.input)) =< max
return len(form.field(self.input)) <= max


class Required(Validation)
class Required(Validation):
def __init__(self, message):
super(Required, self).__init__("required", message, {"required"})
super(Required, self).__init__("required", message, {"required": ''})

def validate(self, form):
return len(form.field(self.input)) > 0


class Email(Validation)
class Email(Validation):
def __init__(self, message):
super(Email, self).__init__("email", message, {})

def validate(self, form):
return re.match("^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$",
form.field(self.input))
is not None
return not re.match("^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$",
form.field(self.input)) is None


class Match(Validation)
def __init__(self, value, message):
super(Match, self).__init__("match", message, {})
self.value = value
class Match(Validation):
def __init__(self, field, message):
super(Match, self).__init__("match", message, {'match': field})
self.field = field

def validate(self, form):
return value == form.field(self.input)
return form.field(field) == form.field(self.input)


class Pattern(Validation)
class Pattern(Validation):
def __init__(self, pattern, message):
super(Pattern, self).__init__("pattern", message,
{"pattern" : pattern})
super(Pattern, self).__init__("pattern", message, {"pattern" : pattern})
self.pattern = pattern

def validate(self, form):
return re.match(pattern,form.field(self.input)) is not None
return not re.match(pattern,form.field(self.input)) is None


class Field(object):
def __init__(self, id, name):
self.id = id
self.name = name

def build(self, form):
vals = form.validations[self.id]
errs = " || ".join(['f.%s.$error.%s' % (self.id, val.name) for val in vals])

attrs = {}
for val in vals:
attrs.update(val.attrs)

messages = []
for v in vals:
messages.append('<span ng-show="f.%s.$error.%s">%s</span>' %
(self.id, v.name, v.message))
messages = ''.join(messages)

if len(self.name) == 0:
return attrs, """
<div class="control-group" ng-class="val && (%s) && 'error'">
%%s
<p class="help-block error" ng-show="val && f.%s.$invalid">
%s
</p>
</div>
""" % (errs, self.id, messages)

return attrs, """
<div class="control-group" ng-class="val && (%s) && 'error'">
<label class="control-label" for="%s">%s</label>
<div class="controls">%%s
<p class="help-block error" ng-show="val && f.%s.$invalid">
%s
</p>
</div>
</div>
""" % (errs, self.id, self.name, self.id, messages)


class InputField(Field):
def __init__(self, id, cls, name, type='text', placeholder=''):
super(InputField, self).__init__(id, name)

self.type = type
self.placeholder = placeholder
self.cls = cls

def build(self, form):
attrs = {
"type": self.type,
"id": self.id,
"name": self.name,
"placeholder": self.placeholder,
"class": ' '.join(self.cls),
"ng-model": 'data.%s' % self.id,
}

(at, tmpl) = super(InputField, self).build(form)
attrs.update(at)

input = [' %s="%s"' % (k, v) for k,v in attrs.iteritems()]
input = '<input%s>' % ''.join(input)

return tmpl % input

"""
class EditAccountForm(Form):
@property
def validations(self):
return {
"name": [Required("oops"), MinLength(4, "ops")],
}
@property
def fields(self):
return [
InputField(id="name", placeholder="test@example.com", type="email",
cls=["input-xlarge"], name="Nombre"),
]
print EditAccountForm().build()
"""

0 comments on commit 084b1ce

Please sign in to comment.