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