class ObjectFieldWidget(FieldWidget): grok.adapts(ObjectField, Interface, Interface) def prepareContentValue(self, value): if value is NO_VALUE: return {self.identifier: []} return {self.identifier: value} def update(self): super(ObjectFieldWidget, self).update() value = self.component.dataManager(self.inputValue()) form = cloneFormData(self.form, value, self.identifier) self.objectWidgets = Widgets(form=form, request=self.request) self.objectWidgets.extend(self.component.objectFields) self.objectWidgets.update()
def update(self): super(MultiGenericFieldWidget, self).update() self.valueWidgets.update() requireCollectionResources() self.jsonAddIdentifier = None self.jsonAddTemplate = None self.includeEmptyMessage = self.allowRemove if self.allowAdding: self.jsonAddIdentifier = 'id' + md5hash(self.identifier) widgets = Widgets() widgets.append(self.createValueWidget( '{' + self.jsonAddIdentifier + '}', None)) widgets.update() self.jsonAddTemplate = list(widgets)[0]
def update(self): super(ObjectFieldWidget, self).update() value = self.component.dataManager(self.inputValue()) form = cloneFormData(self.form, value, self.identifier) self.objectWidgets = Widgets(form=form, request=self.request) self.objectWidgets.extend(self.component.objectFields) self.objectWidgets.update()
def __init__(self, field, value_field, form, request): super(MultiGenericFieldWidget, self).__init__(field, form, request) self.allowAdding = field.allowAdding self.allowRemove = field.allowRemove self.inlineValidation = field.inlineValidation self.valueField = value_field self.valueWidgets = Widgets() self.haveValues = False
def updateLines(self, mark_selected=False): self.lines = [] self.lineWidgets = [] manager = IRolePermissionManager(self.getContent()) for position, item in enumerate(self.getItems()): prefix = '%s.line-%d' % (self.prefix, position) form = cloneFormData( self, content=PermissionWrapper(item, manager), prefix=prefix) form.selected = False titleField = SchemaField(TextLine( __name__="title", title=u"title", default=u"")) titleField.mode = DISPLAY titleField.ignoreRequest = True titleField.ignoreContent = True titleField.readonly = True titleField.defaultValue = item.title lineWidget = Widgets(form=form, request=self.request) # Checkbox to select the line selectedField = SelectField(identifier=position) if mark_selected: # Mark selected lines selectedExtractor = getWidgetExtractor( selectedField, form, self.request) if selectedExtractor is not None: value, error = selectedExtractor.extract() if value: form.selected = True lineWidget.extend(selectedField) lineWidget.extend(titleField) self.lines.append(form) self.lineWidgets.append(lineWidget)
def updateLines(self, mark_selected=False): self.lines = [] self.lineWidgets = [] self.batching = None items = self.getItems() if self.batchSize: items = self.batchFactory( items, name=self.prefix, factory=self.batchItemFactory, count=self.batchSize, request=self.request) self.batching = queryMultiAdapter( (self.getFormForTable(), items, self.request), IBatching)() for position, item in enumerate(items): prefix = '%s.line-%s' % (self.prefix, self.getItemIdentifier(item, position)) form = cloneFormData(self, content=item, prefix=prefix) form.selected = False # Checkbox to select the line form.selectedField = self.createSelectedField(item) if mark_selected: # Mark selected lines selectedExtractor = form.widgetFactory.extractor( form.selectedField) if selectedExtractor is not None: value, error = selectedExtractor.extract() if value: form.selected = True lineWidget = Widgets(form=form, request=self.request) lineWidget.extend(form.selectedField) self.lines.append(form) self.lineWidgets.append(lineWidget)
def jsonTemplateWidget(self): widgets = Widgets() widgets.append(self.createValueWidget('{identifier}', None)) widgets.update() return list(widgets)[0]
class MultiGenericFieldWidget(FieldWidget): grok.adapts(ICollectionField, Interface, Interface, Interface) allowAdding = True allowRemove = True inlineValidation = False def __init__(self, field, value_field, form, request): super(MultiGenericFieldWidget, self).__init__(field, form, request) self.allowAdding = field.allowAdding self.allowRemove = field.allowRemove self.inlineValidation = field.inlineValidation self.valueField = value_field self.valueWidgets = Widgets() self.haveValues = False def createValueWidget(self, new_identifier, value): field = self.valueField.clone(new_identifier=str(new_identifier)) form = cloneFormData(self.form, prefix=self.identifier) if value is not None: form.ignoreContent = False form.setContentData(NoneDataManager(value)) else: form.ignoreRequest = False form.ignoreContent = True return form.widgetFactory.widget(field) def addValueWidget(self, new_identifier, value): widget = self.createValueWidget(new_identifier, value) if widget is not None: self.valueWidgets.append(widget) return widget def prepareContentValue(self, values): count = 0 if values is not NO_VALUE: for position, value in enumerate(values): # Create new widgets for each value self.addValueWidget(position, value) count += len(values) if self.allowAdding and self.required and not count: self.addValueWidget(count, None) count += 1 if count: self.haveValues = True return {self.identifier: str(count)} def prepareRequestValue(self, values, extractor): value_count = 0 errors = None identifier_count = int(values.get(self.identifier, '0')) remove_something = self.identifier + '.remove' in values add_something = self.identifier + '.add' in values if self.inlineValidation: # If inlineValidation is on, and we removed or added # something, we extract this field to get the # validation messages right away (if the user clicked # on add or remove, he cannot have clicked on an # action button) if add_something or remove_something: ignored, errors = extractor.extract() if errors: self.form.errors.append(errors) for position in range(0, identifier_count): value_marker = (self.identifier, position,) value_present = '%s.present.%d' % value_marker in values if not value_present: continue value_identifier = '%s.field.%d' % value_marker value_selected = '%s.checked.%d' % value_marker in values if remove_something and value_selected: if errors and value_identifier in errors: # If the field have an error, remove it del errors[value_identifier] continue # We need to provide the widget error now, but cannot set # all of them on the form now, as we might remove them # with delete self.addValueWidget(position, None) value_count += 1 if (add_something or (self.allowAdding and self.required and not value_count)): self.addValueWidget(identifier_count, None) value_count += 1 values[self.identifier] = str(identifier_count + 1) if value_count: self.haveValues = True if errors: if len(errors) > 1: self.form.errors.append( Error(_(u"There were errors."), self.form.prefix)) else: # If no errors are left, remove from the form (top level error) del self.form.errors[self.identifier] return values @property def jsonTemplateWidget(self): widgets = Widgets() widgets.append(self.createValueWidget('{identifier}', None)) widgets.update() return list(widgets)[0] def update(self): super(MultiGenericFieldWidget, self).update() self.valueWidgets.update() requireCollectionResources() self.jsonAddIdentifier = None self.jsonAddTemplate = None self.includeEmptyMessage = self.allowRemove if self.allowAdding: self.jsonAddIdentifier = 'id' + md5hash(self.identifier) widgets = Widgets() widgets.append(self.createValueWidget( '{' + self.jsonAddIdentifier + '}', None)) widgets.update() self.jsonAddTemplate = list(widgets)[0]
def __init__(self, context, request): super(FormCanvas, self).__init__(context, request) self.actionWidgets = Widgets(form=self, request=self.request) self.fieldWidgets = Widgets(form=self, request=self.request)
class FormCanvas(GrokViewSupport, FormData): """This represent a sumple form setup: setup some fields and actions, prepare widgets for it. """ grok.baseclass() grok.implements(interfaces.ISimpleFormCanvas) label = u'' description = u'' actions = Actions() fields = Fields() protected = False csrftoken = None def __init__(self, context, request): super(FormCanvas, self).__init__(context, request) self.actionWidgets = Widgets(form=self, request=self.request) self.fieldWidgets = Widgets(form=self, request=self.request) def setUpToken(self): self.csrftoken = self.request.getCookies().get('__csrftoken__') if self.csrftoken is None: # It is possible another form, that is rendered as part of # this request, already set a csrftoken. In that case we # should find it in the response cookie and use that. setcookie = self.request.response.getCookie('__csrftoken__') if setcookie is not None: self.csrftoken = setcookie['value'] else: # Ok, nothing found, we should generate one and set # it in the cookie ourselves. Note how we ``str()`` # the hex value of the ``os.urandom`` call here, as # Python-3 will return bytes and the cookie roundtrip # of a bytes values gets messed up. self.csrftoken = str(binascii.hexlify(os.urandom(32))) self.request.response.setCookie( '__csrftoken__', self.csrftoken, path='/', expires=None, # equivalent to "remove on browser quit" httpOnly=True, # no javascript access please. ) def checkToken(self): cookietoken = self.request.getCookies().get('__csrftoken__') if cookietoken is None: # CSRF is enabled, so we really should get a token from the # cookie. We didn't get it, so this submit is invalid! raise InvalidCSRFToken(_('Invalid CSRF token')) if cookietoken != self.request.form.get('__csrftoken__', None): # The token in the cookie is different from the one in the # form data. This submit is invalid! raise InvalidCSRFToken(_('Invalid CSRF token')) def extractData(self, fields=None): if fields is None: fields = self.fields return super(FormCanvas, self).extractData(fields) def haveRequiredFields(self): return reduce( operator.or_, [False] + map(operator.attrgetter('required'), self.fields)) def updateActions(self): if self.protected: # This form has CSRF protection enabled. self.checkToken() return self.actions.process(self, self.request) def updateWidgets(self): self.fieldWidgets.extend(self.fields) self.actionWidgets.extend(self.actions) self.fieldWidgets.update() self.actionWidgets.update()