コード例 #1
0
ファイル: object.py プロジェクト: thefunny42/Zeam-Form-ZTK
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()
コード例 #2
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]
コード例 #3
0
ファイル: object.py プロジェクト: thefunny42/Zeam-Form-ZTK
 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()
コード例 #4
0
 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
コード例 #5
0
    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)
コード例 #6
0
ファイル: form.py プロジェクト: thefunny42/Zeam-Form-Table
    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)
コード例 #7
0
 def jsonTemplateWidget(self):
     widgets = Widgets()
     widgets.append(self.createValueWidget('{identifier}', None))
     widgets.update()
     return list(widgets)[0]
コード例 #8
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]
コード例 #9
0
ファイル: form.py プロジェクト: thefunny42/Zeam-Form
 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)
コード例 #10
0
ファイル: form.py プロジェクト: thefunny42/Zeam-Form
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()