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