def update(self):
     """Update widget"""
     self.subform = QuerySubForm(QueryContext(), self.request, self.name)
     self.subform.update()
class ReferenceUploadWidget(z3c.form.widget.Widget, ContentTreeWidget):
    """Reference upload widget"""

    implements(IReferenceUploadWidget)

    klass = u'reference-upload-widget'
    multi_select = False

    def raw_value(self):
        """Returns physical path of referenced object or None"""
        if self.request.get(self.name):
            return self.request.get(self.name)
        dm = getMultiAdapter(
            (self.context, self.field), z3c.form.interfaces.IDataManager)
        try:
            rel_obj = dm.get()
            if rel_obj:
                return '/'.join(rel_obj.getPhysicalPath())
        except TypeError:
            return None

    def object_value(self):
        """Returns the related object"""
        rel_path = self.raw_value()
        if rel_path:
            object_path = getUtility(IObjectPath)
            obj = object_path.resolve(str(rel_path))
            if obj:
                return obj

    def object_value_working_copy(self, obj):
        """Returns the related object's working copy if it exists"""
        if obj:
            wcopies = obj.getBRefs(WorkingCopyRelation.relationship)
            if wcopies:
                return wcopies[0]

    def update(self):
        """Update widget"""
        self.subform = QuerySubForm(QueryContext(), self.request, self.name)
        self.subform.update()

    def renderQueryWidget(self):
        """Overloaded from z3c.formidget.query.widget.QuerySourceRadioWidget"""
        return ''

    def extract(self, default=z3c.form.interfaces.NO_VALUE):
        """Extract the value of submitted element from the request"""
        option = self.request.get(self.name + '_option')
        if option == u'upload':
            file_upload = self.request.get(self.name + '_file')
            if file_upload:
                if isinstance(file_upload, list):
                    file_upload = file_upload[0]
                if file_upload.filename:
                    return file_upload
        elif option == u'select':
            return self.request.get(self.name)
        elif option == u'keep':
            return self.request.get(self.name + '_raw_value')
        return default

    def render_display(self, wcopy=False):
        """Render the plain widget without additional layout"""
        template = getMultiAdapter(
            (self.context, self.request, self.form, self.field, self),
            IPageTemplate, name=z3c.form.interfaces.DISPLAY_MODE)
        obj = self.object_value()
        if wcopy:
            obj = self.object_value_working_copy(obj)
        return template(self, obj=obj)