You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
200 lines
5.4 KiB
200 lines
5.4 KiB
import six
|
|
from python_anticaptcha.exceptions import InvalidWidthException, MissingNameException
|
|
|
|
|
|
class BaseField(object):
|
|
label = None
|
|
labelHint = None
|
|
|
|
def serialize(self, name=None):
|
|
data = {}
|
|
if self.label:
|
|
data['label'] = self.label or False
|
|
if self.labelHint:
|
|
data['labelHint'] = self.labelHint or False
|
|
return data
|
|
|
|
|
|
class NameBaseField(BaseField):
|
|
name = None
|
|
|
|
def serialize(self, name=None):
|
|
data = super(NameBaseField, self).serialize(name)
|
|
if name:
|
|
data['name'] = name
|
|
elif self.name:
|
|
data['name'] = self.name
|
|
else:
|
|
raise MissingNameException(cls=self.__class__)
|
|
return data
|
|
|
|
|
|
class SimpleText(BaseField):
|
|
contentType = 'text'
|
|
|
|
def __init__(self, content, label=None, labelHint=None, width=None):
|
|
self.label = label
|
|
self.labelHint = labelHint
|
|
|
|
self.content = content
|
|
self.width = width
|
|
|
|
def serialize(self, name=None):
|
|
data = super(SimpleText, self).serialize(name)
|
|
data['contentType'] = self.contentType
|
|
data['content'] = self.content
|
|
|
|
if self.width:
|
|
if self.width not in [100, 50, 33, 25]:
|
|
raise InvalidWidthException(self.width)
|
|
data['inputOptions'] = {}
|
|
data['width'] = self.width
|
|
return data
|
|
|
|
|
|
class Image(BaseField):
|
|
contentType = 'image'
|
|
|
|
def __init__(self, imageUrl, label=None, labelHint=None):
|
|
self.label = label
|
|
self.labelHint = labelHint
|
|
self.imageUrl = imageUrl
|
|
|
|
def serialize(self, name=None):
|
|
data = super(Image, self).serialize(name)
|
|
data['contentType'] = self.contentType
|
|
data['content'] = self.imageUrl
|
|
return data
|
|
|
|
|
|
class WebLink(BaseField):
|
|
contentType = 'link'
|
|
|
|
def __init__(self, linkText, linkUrl, label=None, labelHint=None, width=None):
|
|
self.label = label
|
|
self.labelHint = labelHint
|
|
|
|
self.linkText = linkText
|
|
self.linkUrl = linkUrl
|
|
|
|
self.width = width
|
|
|
|
def serialize(self, name=None):
|
|
data = super(WebLink, self).serialize(name)
|
|
data['contentType'] = self.contentType
|
|
|
|
if self.width:
|
|
if self.width not in [100, 50, 33, 25]:
|
|
raise InvalidWidthException(self.width)
|
|
data['inputOptions'] = {}
|
|
data['width'] = self.width
|
|
|
|
data.update({'content': {'url': self.linkUrl,
|
|
'text': self.linkText}})
|
|
|
|
return data
|
|
|
|
|
|
class TextInput(NameBaseField):
|
|
def __init__(self, placeHolder=None, label=None, labelHint=None, width=None):
|
|
self.label = label
|
|
self.labelHint = labelHint
|
|
|
|
self.placeHolder = placeHolder
|
|
|
|
self.width = width
|
|
|
|
def serialize(self, name=None):
|
|
data = super(TextInput, self).serialize(name)
|
|
data['inputType'] = 'text'
|
|
|
|
data['inputOptions'] = {}
|
|
|
|
if self.width:
|
|
if self.width not in [100, 50, 33, 25]:
|
|
raise InvalidWidthException(self.width)
|
|
|
|
data['inputOptions']['width'] = str(self.width)
|
|
|
|
if self.placeHolder:
|
|
data['inputOptions']['placeHolder'] = self.placeHolder
|
|
return data
|
|
|
|
|
|
class Textarea(NameBaseField):
|
|
def __init__(self, placeHolder=None, rows=None, label=None, width=None, labelHint=None):
|
|
self.label = label
|
|
self.labelHint = labelHint
|
|
|
|
self.placeHolder = placeHolder
|
|
self.rows = rows
|
|
self.width = width
|
|
|
|
def serialize(self, name=None):
|
|
data = super(Textarea, self).serialize(name)
|
|
data['inputType'] = 'textarea'
|
|
data['inputOptions'] = {}
|
|
if self.rows:
|
|
data['inputOptions']['rows'] = str(self.rows)
|
|
if self.placeHolder:
|
|
data['inputOptions']['placeHolder'] = self.placeHolder
|
|
if self.width:
|
|
data['inputOptions']['width'] = str(self.width)
|
|
return data
|
|
|
|
|
|
class Checkbox(NameBaseField):
|
|
def __init__(self, text, label=None, labelHint=None):
|
|
self.label = label
|
|
self.labelHint = labelHint
|
|
|
|
self.text = text
|
|
|
|
def serialize(self, name=None):
|
|
data = super(Checkbox, self).serialize(name)
|
|
data['inputType'] = 'checkbox'
|
|
data['inputOptions'] = {'label': self.text}
|
|
return data
|
|
|
|
|
|
class Select(NameBaseField):
|
|
type = 'select'
|
|
|
|
def __init__(self, label=None, choices=None, labelHint=None):
|
|
self.label = label
|
|
self.labelHint = labelHint
|
|
self.choices = choices or ()
|
|
|
|
def get_choices(self):
|
|
for choice in self.choices:
|
|
if isinstance(choice, six.text_type):
|
|
yield choice, choice
|
|
else:
|
|
yield choice
|
|
|
|
def serialize(self, name=None):
|
|
data = super(Select, self).serialize(name)
|
|
data['inputType'] = self.type
|
|
|
|
data['inputOptions'] = []
|
|
for value, caption in self.get_choices():
|
|
data['inputOptions'].append({"value": value,
|
|
"caption": caption})
|
|
|
|
return data
|
|
|
|
|
|
class Radio(Select):
|
|
type = 'radio'
|
|
|
|
|
|
class ImageUpload(NameBaseField):
|
|
def __init__(self, label=None, labelHint=None):
|
|
self.label = label
|
|
self.labelHint = labelHint
|
|
|
|
def serialize(self, name=None):
|
|
data = super(ImageUpload, self).serialize(name)
|
|
data['inputType'] = 'imageUpload'
|
|
return data
|