def renderImmutable(self, ctx, key, args, errors): form = iformal.IForm(ctx) namer = self._namer(key) originalIdName = namer('original_id') # Get the original key from a hidden field in the request, # then try the request form.data initial data. originalKey = self._getFromArgs(args, originalIdName) if not errors and not originalKey: originalKey = args.get(key) originalKey = self._blankField(originalKey) if originalKey: # The is no uploaded file, but there is an original, so render a # URL to it if self.originalKeyIsURL: tmpURL = originalKey else: tmpURL = widgetResourceURL(form.name).child(key).child( self.FROM_CONVERTIBLE).child(originalKey) yield T.p[T.img(src=tmpURL)] else: # No uploaded file, no original yield T.p[T.strong['Nothing uploaded']] if originalKey: # key of the original that can be used to get a file later yield T.input(name=originalIdName, value=originalKey, type='hidden')
def getResource(self, ctx, key, segments): """ Return an Resource that contains the image, either a file from the resource manager, or a data object from the convertible. """ if segments[0] == self.FROM_RESOURCE_MANAGER: # Resource manager can provide a path so return a static.File # instance that points to the file rm = iformal.IForm(ctx).resourceManager (mimetype, path, fileName) = rm.getResourcePath(segments[1]) return static.File(path, mimetype), [] elif segments[0] == self.FROM_CONVERTIBLE: # The convertible can provide a file like object so create a # static.Data instance with the data from the convertible. def _(result): mimetype, filelike, fileName = result data = filelike.read() filelike.close() return static.Data(data, mimetype), [] d = defer.maybeDeferred(self.convertibleFactory( self.original).fromType, segments[1], context=ctx) d.addCallback(_) return d else: return None
def __init__(self, ctx, restWriter, key, srcId): self.restWriter = restWriter form = iformal.IForm(ctx) u = widgetResourceURLFromContext( ctx, form.name).child(key).child(srcId).child('_submit') self.destId = srcId + '-dest' formId = srcId + '-form' stan = T.html( )[T.head()[T.script(type="text/javascript")[""" function ReSTTranslate() { dest = document.getElementById('%(destId)s'); form = document.getElementById('%(formId)s'); src = parent.document.getElementById('%(srcId)s'); dest.value = src.value; form.submit(); } """ % { 'srcId': srcId, 'destId': self.destId, 'formId': formId }]], T.body( )[T.form(id=formId, method="POST", action=u )[T.input(type="hidden", name=self.destId, id=self.destId)], T.script(type="text/javascript")["ReSTTranslate();"], ], ] self.docFactory = loaders.stan(stan)
def _renderTag(self, ctx, key, value, readonly): html = [] tag = T.textarea(name=key, id=render_cssid(key), cols=self.cols, rows=self.rows)[value or ''] if readonly: tag(class_='readonly', readonly='readonly') html.append(tag) if self.values is None: return html def renderOptions(ctx, options): for value, label in options: yield T.option(value=value)[label] selecttrigger = T.select(name='%s__selecttrigger' % key, data=self.values)[renderOptions] form = iformal.IForm(ctx) js = T.xml( "var x = document.getElementById('%(form)s');x.%(key)s.value += x.%(key)s__selecttrigger.options[x.%(key)s__selecttrigger.options.selectedIndex].value + "\\n";" % { 'key': key, 'form': form.name }) aonclick = T.a(onclick=js)['add'] html.append(T.div(class_="add")[selecttrigger, aonclick]) return html
def processInput(self, ctx, key, args): """ Process the request, storing any uploaded file in the resource manager. """ resourceManager = iformal.IForm( ctx ).resourceManager # Ping the resource manager with any resource ids that I know self._registerWithResourceManager( key, args, resourceManager ) fileitem = inevow.IRequest(ctx).fields[key] name = fileitem.filename.decode(util.getPOSTCharset(ctx)) if name: # Store the uploaded file in the resource manager resourceManager.setResource( key, fileitem.file, name ) # Validating against an uploaded file. Should the fact that there is # original file meet a required field validation? value = resourceManager.getResourceForWidget( key ) value = self.convertibleFactory(self.original).toType( value ) # check to see if we should remove this if self.removeable is True: remove = args.get('%s_remove'%key, [None])[0] if remove is not None: value = (None,None,None) return self.original.validate( value )
def render(self, ctx, key, args, errors): """ Render the data. This either renders a link to the original file, if specified, and no new file has been uploaded. Or a link to the uploaded file. The request to get the data should be routed to the getResouce method. """ form = iformal.IForm(ctx) namer = self._namer(key) resourceIdName = namer('resource_id') originalIdName = namer('original_id') # get the resource id first from the resource manager # then try the request resourceId = form.resourceManager.getResourceId(key) if resourceId is None: resourceId = self._getFromArgs(args, resourceIdName) resourceId = self._blankField(resourceId) # Get the original key from a hidden field in the request, # then try the request file.data initial data. originalKey = self._getFromArgs(args, originalIdName) if not errors and not originalKey: originalKey = args.get(key) originalKey = self._blankField(originalKey) if resourceId: # Have an uploaded file, so render a URL to the uploaded file tmpURL = widgetResourceURL(form.name).child(key).child( self.FROM_RESOURCE_MANAGER).child(resourceId) yield T.p[T.img(src=tmpURL)] elif originalKey: # The is no uploaded file, but there is an original, so render a # URL to it if self.originalKeyIsURL: tmpURL = originalKey else: tmpURL = widgetResourceURL(form.name).child(key).child( self.FROM_CONVERTIBLE).child(originalKey) yield T.p[T.img(src=tmpURL)] else: # No uploaded file, no original yield T.p[T.strong['Nothing uploaded']] yield T.input(name=key, id=render_cssid(key), type='file') # Id of uploaded file in the resource manager yield T.input(name=resourceIdName, value=resourceId, type='hidden') if originalKey: # key of the original that can be used to get a file later yield T.input(name=originalIdName, value=originalKey, type='hidden')
def render_field(self, ctx, data): # No fancy widget-stuff here ourform = iformal.IForm(ctx) classes = ['field', 'subheading-field'] ctx.tag.fillSlots('fieldId', '%s-%s-field' % (ourform.name, self.field.name)) # XXX: unused... ctx.tag.fillSlots('fieldClass', ' '.join(classes)) ctx.tag.fillSlots('fieldContents', self.field.label) return ctx.tag
def render_input(self, ctx, data): # No fancy widget-stuff here ourform = iformal.IForm(ctx) classes = ['submit-input'] ctx.tag.fillSlots('inputId', '%s-action-%s' % (ourform.name, self.field.name)) ctx.tag.fillSlots('inputClass', ' '.join(classes)) ctx.tag.fillSlots('inputName', self.field.name) # just terminal name component for actions ctx.tag.fillSlots('inputValue', self.field.label) return ctx.tag
def _renderTag(self, ctx, key, value, readonly): tag = T.invisible() ta = T.textarea(name=key, id=render_cssid(key), cols=self.cols, rows=self.rows)[value or ''] if readonly: ta(class_='readonly', readonly='readonly') tag[ta] if not readonly: try: import docutils except ImportError: raise else: form = iformal.IForm(ctx) srcId = render_cssid(key) previewDiv = render_cssid(key, 'preview-div') frameId = render_cssid(key, 'preview-frame') targetURL = widgetResourceURLFromContext( ctx, form.name).child(key).child(srcId) tag[T.br()] onclick = [ "return Forms.Util.previewShow('", previewDiv, "', '", frameId, "', '", targetURL, "');" ] tag[T.button(onclick=onclick)['Preview ...']] tag[T.div(id=previewDiv, class_="preview-hidden")[ T.iframe(class_="preview-frame", name=frameId, id=frameId), T.br(), T.button(onclick=[ "return Forms.Util.previewHide('", previewDiv, "');" ])['Close']]] return tag
def formErrorsFinder(ctx): form = iformal.IForm(ctx) return form.errors
def _storeInResourceManager(self, ctx, key, originalKey): resourceManager = iformal.IForm( ctx ).resourceManager resourceManager.setResource( key, originalKey[1], originalKey[2] ) resourceId = resourceManager.getResourceId( key ) return resourceId
def render(self, ctx, key, args, errors): """ Render the data. This either renders a link to the original file, if specified, and no new file has been uploaded. Or a link to the uploaded file. The request to get the data should be routed to the getResouce method. """ form = iformal.IForm( ctx ) namer = self._namer( key ) resourceIdName = namer( 'resource_id' ) originalIdName = namer( 'original_id' ) # get the resource id first from the resource manager # then try the request resourceId = form.resourceManager.getResourceId( key ) if resourceId is None: resourceId = self._getFromArgs( args, resourceIdName ) resourceId = self._blankField( resourceId ) # Get the original key from a hidden field in the request, # then try the request file.data initial data. originalKey = self._getFromArgs( args, originalIdName ) if not errors and not originalKey: originalKey = args.get( key ) originalKey = self._blankField( originalKey ) # if we have a removeable attribute, generate the html if self.removeable is True: checkbox = T.input(type='checkbox', name='%s_remove'%key, id=render_cssid('%s_remove'%key),class_='upload-checkbox-remove',value='remove') if args.get('%s_remove'%key, [None])[0] is not None: checkbox = checkbox = checkbox(checked='checked') removeableHtml = T.p[ 'check to remove', checkbox] else: removeableHtml = '' if resourceId: # Have an uploaded file, so render a link to the uploaded file tmpURL = widgetResourceURL(form.name).child(key).child( self.FROM_RESOURCE_MANAGER ).child(resourceId) value = form.resourceManager.getResourceForWidget( key ) yield [ T.p[T.a(href=tmpURL)[value[2]]], removeableHtml] elif originalKey: # The is no uploaded file, but there is an original, so render a # URL to it if self.originalKeyIsURL: tmpURL = originalKey yield [ T.p[T.img(src=tmpURL)], removeableHtml ] else: # Copy the data to the resource manager and render from there resourceId = self._storeInResourceManager(ctx, key, originalKey) tmpURL = widgetResourceURL(form.name).child(key).child( self.FROM_RESOURCE_MANAGER ).child(resourceId) yield [ T.p[T.a(href=tmpURL)[originalKey[2]]], removeableHtml] else: # No uploaded file, no original yield T.p[T.strong['Nothing uploaded']] yield T.input(name=key, id=render_cssid(key),type='file') # Id of uploaded file in the resource manager yield T.input(name=resourceIdName,value=resourceId,type='hidden') if originalKey and self.originalKeyIsURL: # key of the original that can be used to get a file later yield T.input(name=originalIdName,value=originalKey,type='hidden')