from django import forms
from django.forms.widgets import TextInput
from django.core.files.uploadedfile import UploadedFile
from django.utils.safestring import mark_safe
from django.template import loader
import base64
import datetime
import json
class HtmlDateInput(TextInput):
def __init__(self, *args, **kwargs):
kwargs.update({'attrs': {'type': 'date', 'required-pattern': '[0-9]{4}-[0-9]{2}-[0-9]{2}'}})
super(HtmlDateInput, self).__init__(*args, **kwargs)
def format_value(self, val):
if isinstance(val, datetime.datetime):
val = val.date()
return super(HtmlDateInput, self).format_value(val)
class RequiredFileUploadWidget(forms.FileInput):
def __init__(self, filename=None, attrs=None):
self.filename = filename
super(RequiredFileUploadWidget, self).__init__(attrs)
def render(self, name, value, attrs=None):
output = []
if value and hasattr(value, 'url'):
output.append('Current file: '.format(value.url))
if self.filename:
output.append(self.filename)
else:
output.append(value.name)
output.append('
')
output.append("Upload new file: ")
output.append(super(RequiredFileUploadWidget, self).render(name, value, attrs))
return mark_safe(''.join(output))
class PrettyPrintJsonWidget(forms.Textarea):
def render(self, name, value, attrs=None, renderer=None):
# This is mighty ugly -- we parse the json and then turn it back into json.
# Luckily this isn't called often :)
try:
if value is not None:
if isinstance(value, dict):
# Already a dict, so just turn it into json
value = json.dumps(value, indent=2)
else:
value = json.dumps(json.loads(value), indent=2)
except ValueError:
# Don't try to do anything if it's not valid json
pass
t = super(PrettyPrintJsonWidget, self).render(name, value, attrs, renderer)
return t
class MonospaceTextarea(forms.Textarea):
def render(self, name, value, attrs=None, renderer=None):
attrs['class'] = "{0} text-monospace".format(attrs.get('class', ''))
return super(MonospaceTextarea, self).render(name, value, attrs, renderer)
class TagOptionsTextWidget(forms.Textarea):
def __init__(self, taglist, *args, **kwargs):
self.taglist = taglist
super(TagOptionsTextWidget, self).__init__(*args, **kwargs)
def render(self, name, value, attrs=None, renderer=None):
t = super(TagOptionsTextWidget, self).render(name, value, attrs, renderer)
return t + mark_safe('