Beispiel #1
0
    def get_sheets_create(self,
                          context: object,
                          request: Request = None,
                          iresource: IInterface = None) -> [IResourceSheet]:
        """Get creatable sheets for `context` or `iresource`.

        :param request: If not None filter by sheet create permission.
        :param iresource: If not None return sheets for this resource type.
            The `creating` sheet attribute is set to the resource metadata
            of this type. The returned sheets should only be used to
            deserialize data to create a new resource.
        """
        if iresource:
            creating = self.resources_meta[iresource]
        else:
            creating = None
            iresource = get_iresource(context)
        metas = self._get_sheets_meta(iresource, filter_attr='creatable')
        if request:
            metas = self._filter_permission(
                metas, context, request, permission_attr='permission_create')
        sheets = [
            self.get_sheet(context,
                           m.isheet,
                           request=request,
                           creating=creating) for m in metas
        ]
        return sheets
Beispiel #2
0
 def get_sheets_all(self, context: object,
                    request: Request=None) -> [IResourceSheet]:
     """Get all sheets for `context`."""
     iresource = get_iresource(context)
     metas = self._get_sheets_meta(iresource)
     sheets = [self.get_sheet(context, m.isheet, request) for m in metas]
     return sheets
Beispiel #3
0
 def __repr__(self):
     """Return representation of self."""
     iface = get_iresource(self) or self.__class__
     iface_dotted = to_dotted_name(iface)
     oid = getattr(self, '__oid__', None)
     name = getattr(self, '__name__', None)
     identifier = str(oid)
     return '{0} oid: {1} name: {2}'.format(iface_dotted, identifier, name)
Beispiel #4
0
 def get_sheets_all(self,
                    context: object,
                    request: Request = None) -> [IResourceSheet]:
     """Get all sheets for `context`."""
     iresource = get_iresource(context)
     metas = self._get_sheets_meta(iresource)
     sheets = [self.get_sheet(context, m.isheet, request) for m in metas]
     return sheets
Beispiel #5
0
def deferred_content_type_default(node: MappingSchema,
                                  kw: dict) -> str:
    """Return the content_type for the given `context`."""
    creating = kw['creating']
    if creating:
        return ''
    else:
        context = kw['context']
        return get_iresource(context) or IResource
Beispiel #6
0
def deferred_content_type_default(node: MappingSchema,
                                  kw: dict) -> str:
    """Return the content_type for the given `context`."""
    creating = kw['creating']
    if creating:
        return ''
    else:
        context = kw['context']
        return get_iresource(context) or IResource
Beispiel #7
0
def _get_type_name(context: IResource, request: Request) -> str:
    localizer = get_localizer(request)
    if context is None:
        translated_name = ''
    else:
        iresource = get_iresource(context)
        name = request.registry.content.resources_meta[iresource].content_name
        translated_name = localizer.translate(name)
    return translated_name
Beispiel #8
0
def deferred_validate_asset_mime_type(node: SchemaNode, kw: dict):
    """Validate mime type for the uploaded asset file data."""
    from .image import validate_image_data_mimetype
    from adhocracy_core.resources.image import IImage
    context = kw['context']
    creating = kw['creating']
    iresource = creating and creating.iresource or get_iresource(context)
    is_image = iresource.isOrExtends(IImage)
    if is_image:
        return validate_image_data_mimetype
Beispiel #9
0
def deferred_validate_asset_mime_type(node: SchemaNode, kw: dict):
    """Validate mime type for the uploaded asset file data."""
    from .image import validate_image_data_mimetype
    from adhocracy_core.resources.image import IImage
    context = kw['context']
    creating = kw['creating']
    iresource = creating and creating.iresource or get_iresource(context)
    is_image = iresource.isOrExtends(IImage)
    if is_image:
        return validate_image_data_mimetype
Beispiel #10
0
    def get_sheets_read(self, context: object, request: Request=None) -> list:
        """Get readable sheets for `context` and set the 'context' attribute.

        :param request: If set check permissions.
        """
        iresource = get_iresource(context)
        sheets = self.sheets_read[iresource].copy()
        self._add_context(sheets, context)
        self._filter_permission(sheets, 'permission_view', context, request)
        return sheets
Beispiel #11
0
 def get_resources_meta_addable(self, context: object,
                                request: Request) -> list:
     """Get addable resource meta for context, mind permissions."""
     iresource = get_iresource(context)
     addables = self.resources_meta_addable[iresource]
     addables_allowed = []
     for resource_meta in addables:
         if self._can_add_resource(request, resource_meta, context):
             addables_allowed.append(resource_meta)
     return addables_allowed
Beispiel #12
0
 def get_resources_meta_addable(self, context: object,
                                request: Request) -> list:
     """Get addable resource meta for context, mind permissions."""
     iresource = get_iresource(context)
     addables = self.resources_meta_addable[iresource]
     addables_allowed = []
     for resource_meta in addables:
         if self._can_add_resource(request, resource_meta, context):
             addables_allowed.append(resource_meta)
     return addables_allowed
Beispiel #13
0
    def get_sheets_read(self,
                        context: object,
                        request: Request = None) -> list:
        """Get readable sheets for `context` and set the 'context' attribute.

        :param request: If set check permissions.
        """
        iresource = get_iresource(context)
        sheets = self.sheets_read[iresource].copy()
        self._add_context(sheets, context)
        self._filter_permission(sheets, 'permission_view', context, request)
        return sheets
Beispiel #14
0
    def get_sheets_create(self, context: object, request: Request=None,
                          iresource: IInterface=None):
        """Get creatable sheets for `context` and set the 'context' attribute.

        :param iresource: If set return creatable sheets for this resource
                         type. Else return the creatable sheets of `context`.
        :param request: If set check permissions.
        """
        iresource = iresource or get_iresource(context)
        sheets = self.sheets_create[iresource].copy()
        self._add_context(sheets, context)
        self._filter_permission(sheets, 'permission_create', context, request)
        return sheets
Beispiel #15
0
    def get_sheets_read(self, context: object,
                        request: Request=None) -> [IResourceSheet]:
        """Get readable sheets for `context`.

        :param request: If not None filter by sheet edit permission.
        """
        iresource = get_iresource(context)
        metas = self._get_sheets_meta(iresource, filter_attr='readable')
        if request:
            metas = self._filter_permission(metas, context, request,
                                            permission_attr='permission_view')
        sheets = [self.get_sheet(context, m.isheet, request=request)
                  for m in metas]
        return sheets
Beispiel #16
0
def create_initial_content_for_item(context, registry, options):
    """Add first version and the Tags LAST and FIRST."""
    iresource = get_iresource(context)
    metadata = registry.content.resources_meta[iresource]
    create = registry.content.create
    first_version = create(metadata.item_type.__identifier__, parent=context,
                           **options)
    tags_sheet = get_sheet(context,
                           adhocracy_core.sheets.tags.ITags,
                           registry=registry)
    request = options.get('request', None)
    tags_sheet.set({'FIRST': first_version,
                    'LAST': first_version},
                   request=request)
Beispiel #17
0
    def get_sheets_create(self,
                          context: object,
                          request: Request = None,
                          iresource: IInterface = None):
        """Get creatable sheets for `context` and set the 'context' attribute.

        :param iresource: If set return creatable sheets for this resource
                         type. Else return the creatable sheets of `context`.
        :param request: If set check permissions.
        """
        iresource = iresource or get_iresource(context)
        sheets = self.sheets_create[iresource].copy()
        self._add_context(sheets, context)
        self._filter_permission(sheets, 'permission_create', context, request)
        return sheets
Beispiel #18
0
def _create_new_version(event, appstruct) -> IResource:
    appstructs = _get_writable_appstructs(event.object, event.registry)
    appstructs[IVersionable.__identifier__]['follows'] = [event.object]
    appstructs[event.isheet.__identifier__] = appstruct
    registry = event.registry
    iresource = get_iresource(event.object)
    new_version = registry.content.create(iresource.__identifier__,
                                          parent=event.object.__parent__,
                                          appstructs=appstructs,
                                          creator=event.creator,
                                          registry=event.registry,
                                          root_versions=event.root_versions,
                                          is_batchmode=event.is_batchmode,
                                          )
    return new_version
Beispiel #19
0
def deferred_workflow_validator(node: SchemaNode, kw: dict) -> callable:
    """Deferred workflow name validator."""
    context = kw['context']
    registry = kw['registry']
    creating = kw['creating']
    if creating:
        meta = creating
    else:
        iresource = get_iresource(context)
        meta = registry.content.resources_meta[iresource]
    if meta.default_workflow in meta.alternative_workflows:
        workflows = ('',) + meta.alternative_workflows
    else:
        workflows = ('', meta.default_workflow) + meta.alternative_workflows
    return OneOf(workflows)
Beispiel #20
0
def deferred_workflow_validator(node: SchemaNode, kw: dict) -> callable:
    """Deferred workflow name validator."""
    context = kw['context']
    registry = kw['registry']
    creating = kw['creating']
    if creating:
        meta = creating
    else:
        iresource = get_iresource(context)
        meta = registry.content.resources_meta[iresource]
    if meta.default_workflow in meta.alternative_workflows:
        workflows = ('', ) + meta.alternative_workflows
    else:
        workflows = ('', meta.default_workflow) + meta.alternative_workflows
    return OneOf(workflows)
Beispiel #21
0
def create_initial_content_for_item(context, registry, options):
    """Add first version and the Tags LAST and FIRST."""
    iresource = get_iresource(context)
    metadata = registry.content.resources_meta[iresource]
    item_type = metadata.item_type
    create = registry.content.create
    first_version = create(item_type.__identifier__, parent=context)

    tag_first_data = {'adhocracy_core.sheets.tags.ITag': {'elements':
                                                          [first_version]},
                      'adhocracy_core.sheets.name.IName': {'name': u'FIRST'}}
    create(ITag.__identifier__, parent=context, appstructs=tag_first_data)
    tag_last_data = {'adhocracy_core.sheets.tags.ITag': {'elements':
                                                         [first_version]},
                     'adhocracy_core.sheets.name.IName': {'name': u'LAST'}}
    create(ITag.__identifier__, parent=context, appstructs=tag_last_data)
Beispiel #22
0
def sdi_organisation_columns(folder, subobject, request, default_columnspec):
    """Mapping function to add info columns to the sdi organisation listing."""
    content = request.registry.content
    content_name = ''
    title = ''
    if subobject:
        iresource = get_iresource(subobject)
        metadata = content.resources_meta[iresource]
        content_name = metadata.content_name
        if IProcess.providedBy(subobject):
            title = content.get_sheet_field(subobject, ITitle, 'title')
    additional_columns = [
        {'name': 'Type', 'value': content_name},
        {'name': 'Title', 'value': title},
    ]
    return default_columnspec + additional_columns
Beispiel #23
0
def create_initial_content_for_item(context, registry, options):
    """Add first version and the Tags LAST and FIRST."""
    iresource = get_iresource(context)
    metadata = registry.content.resources_meta[iresource]
    item_type = metadata.item_type
    create = registry.content.create
    first_version = create(item_type.__identifier__, parent=context)

    tag_first_data = {'adhocracy_core.sheets.tags.ITag': {'elements':
                                                          [first_version]},
                      'adhocracy_core.sheets.name.IName': {'name': u'FIRST'}}
    create(ITag.__identifier__, parent=context, appstructs=tag_first_data)
    tag_last_data = {'adhocracy_core.sheets.tags.ITag': {'elements':
                                                         [first_version]},
                     'adhocracy_core.sheets.name.IName': {'name': u'LAST'}}
    create(ITag.__identifier__, parent=context, appstructs=tag_last_data)
Beispiel #24
0
def _create_new_version(event, appstruct) -> IResource:
    appstructs = _get_writable_appstructs(event.object, event.registry)
    appstructs[IVersionable.__identifier__]['follows'] = [event.object]
    appstructs[event.isheet.__identifier__] = appstruct
    registry = event.registry
    iresource = get_iresource(event.object)
    new_version = registry.content.create(iresource.__identifier__,
                                          parent=event.object.__parent__,
                                          appstructs=appstructs,
                                          creator=event.creator,
                                          registry=event.registry,
                                          root_versions=event.root_versions,
                                          is_batchmode=event.is_batchmode,
                                          autoupdated=True,
                                          )
    return new_version
Beispiel #25
0
    def can_add_resource(self, request: Request, meta: ResourceMetadata,
                         context: IPool) -> bool:
        """Check that the resource type in `meta` is addable to `context`.

        For the `bplan` process we want anonymous to create proposal items
        and the first non empty version. To make this work we check
        the item create permission instead of the version create permission if
        the first version is empty (without sheet data).
        """
        if self._is_bplan_and_has_no_version_with_sheet_data(meta, context):
            from adhocracy_core.utils import get_iresource
            iresource = get_iresource(context)
            permission = self.resources_meta[iresource].permission_create
        else:
            permission = meta.permission_create
        allowed = request.has_permission(permission, context)
        return allowed
Beispiel #26
0
def set_default_workflow(root, registry):  # pragma: no cover
    """Set default workflow if no workflow in IWorkflowAssignment sheet."""
    from adhocracy_core.utils import get_iresource
    from adhocracy_core.sheets.workflow import IWorkflowAssignment
    catalogs = find_service(root, 'catalogs')
    resources = _search_for_interfaces(catalogs, IWorkflowAssignment)
    for resource in resources:
        iresource = get_iresource(resource)
        meta = registry.content.resources_meta[iresource]
        default_workflow_name = meta.default_workflow
        sheet = registry.content.get_sheet(resource, IWorkflowAssignment)
        workflow_name = sheet.get()['workflow']
        if not workflow_name and default_workflow_name:
            logger.info('Set default workflow {0} for {1}'.format(
                default_workflow_name, resource))
            sheet._store_data({'workflow': meta.default_workflow},
                              initialize_workflow=False)
Beispiel #27
0
    def get_workflow(self, context: object) -> IWorkflow:
        """Get workflow of `context` or None.

        :raises RuntimeConfigurationError: if workflow is not registered
        """
        iresource = get_iresource(context)
        if iresource is None:
            return None
        name = self.resources_meta[iresource].workflow_name
        if name == '':
            return None
        try:
            workflow = self.workflows[name]
        except KeyError:
            msg = 'Workflow name is not registered: {0}'.format(name)
            raise RuntimeConfigurationError(msg)
        return workflow
Beispiel #28
0
    def can_add_resource(self, request: Request, meta: ResourceMetadata,
                         context: IPool) -> bool:
        """Check that the resource type in `meta` is addable to `context`.

        For the `bplan` process we want anonymous to create proposal items
        and the first non empty version. To make this work we check
        the item create permission instead of the version create permission if
        the first version is empty (without sheet data).
        """
        if self._is_bplan_and_has_no_version_with_sheet_data(meta, context):
            from adhocracy_core.utils import get_iresource
            iresource = get_iresource(context)
            permission = self.resources_meta[iresource].permission_create
        else:
            permission = meta.permission_create
        allowed = request.has_permission(permission, context)
        return allowed
Beispiel #29
0
    def get_workflow(self, context: object) -> IWorkflow:
        """Get workflow of `context` or None.

        :raises RuntimeConfigurationError: if workflow is not registered
        """
        iresource = get_iresource(context)
        try:
            name = self.resources_meta[iresource].workflow_name
        except KeyError:  # ease testing
            return None
        if name == '':
            return None
        try:
            workflow = self.workflows[name]
        except KeyError:
            msg = 'Workflow name is not registered: {0}'.format(name)
            raise RuntimeConfigurationError(msg)
        return workflow
Beispiel #30
0
    def get_sheets_read(self,
                        context: object,
                        request: Request = None) -> [IResourceSheet]:
        """Get readable sheets for `context`.

        :param request: If not None filter by sheet edit permission.
        """
        iresource = get_iresource(context)
        metas = self._get_sheets_meta(iresource, filter_attr='readable')
        if request:
            metas = self._filter_permission(metas,
                                            context,
                                            request,
                                            permission_attr='permission_view')
        sheets = [
            self.get_sheet(context, m.isheet, request=request) for m in metas
        ]
        return sheets
Beispiel #31
0
def create_initial_content_for_item(context, registry, options):
    """Add first version and the Tags LAST and FIRST."""
    iresource = get_iresource(context)
    metadata = registry.content.resources_meta[iresource]
    create = registry.content.create
    first_version = create(metadata.item_type.__identifier__,
                           parent=context,
                           **options)
    request = options.get('request', None)
    tags_sheet = registry.content.get_sheet(
        context,
        adhocracy_core.sheets.tags.ITags,
        request=request,
    )
    tags_sheet.set({
        'FIRST': first_version,
        'LAST': first_version
    },
                   autoupdated=True)
Beispiel #32
0
    def get_sheets_create(self, context: object,
                          request: Request=None,
                          iresource: IInterface=None) -> [IResourceSheet]:
        """Get creatable sheets for `context` or `iresource`.

        :param request: If not None filter by sheet create permission.
        :param iresource: If not None return sheets for this resource type.
            The `creating` sheet attribute is set to the resource metadata
            of this type. The returned sheets should only be used to
            deserialize data to create a new resource.
        """
        if iresource:
            creating = self.resources_meta[iresource]
        else:
            creating = None
            iresource = get_iresource(context)
        metas = self._get_sheets_meta(iresource, filter_attr='creatable')
        if request:
            metas = self._filter_permission(metas, context, request,
                                            permission_attr='permission_create'
                                            )
        sheets = [self.get_sheet(context, m.isheet, request=request,
                                 creating=creating) for m in metas]
        return sheets
Beispiel #33
0
 def get_sheets_all(self, context: object) -> list:
     """Get all sheets for `context` and set the 'context' attribute."""
     iresource = get_iresource(context)
     sheets = self.sheets_all[iresource].copy()
     self._add_context(sheets, context)
     return sheets
Beispiel #34
0
 def _can_add_version_one(self, request, context):
     iresource = get_iresource(context)
     # since there is only version zero, the permission of
     # the item is checked instead of the one from the itemversion
     permission = self.resources_meta[iresource].permission_create
     return request.has_permission(permission, context)
def deferred_content_type_default(node: colander.MappingSchema, kw: dict) -> str:
    """Return the content_type for the given `context`."""
    context = kw.get("context")
    return get_iresource(context) or IResource
Beispiel #36
0
 def get_sheets_all(self, context: object) -> list:
     """Get all sheets for `context` and set the 'context' attribute."""
     iresource = get_iresource(context)
     sheets = self.sheets_all[iresource].copy()
     self._add_context(sheets, context)
     return sheets
Beispiel #37
0
def deferred_content_type_default(node: colander.MappingSchema,
                                  kw: dict) -> str:
    """Return the content_type for the given `context`."""
    context = kw.get('context')
    return get_iresource(context) or IResource
Beispiel #38
0
 def _can_add_version_one(self, request, context):
     iresource = get_iresource(context)
     # since there is only version zero, the permission of
     # the item is checked instead of the one from the itemversion
     permission = self.resources_meta[iresource].permission_create
     return request.has_permission(permission, context)