Exemple #1
0
    def countFolders(self, collection, user=None, level=None):
        """
        Returns the number of top level folders under this collection. Access
        checking is optional; to circumvent access checks, pass ``level=None``.

        :param collection: The collection.
        :type collection: dict
        :param user: If performing access checks, the user to check against.
        :type user: dict or None
        :param level: The required access level, or None to return the raw
            top-level folder count.
        """
        from girderformindlogger.models.folder import Folder

        fields = () if level is None else ('access', 'public')

        folderModel = Folder()
        folders = folderModel.findWithPermissions(
            {
                'parentId': collection['_id'],
                'parentCollection': 'collection'
            },
            fields=fields,
            user=user,
            level=level)

        return folders.count()
Exemple #2
0
    def subtreeCount(self, doc, includeItems=True, user=None, level=None):
        """
        Return the size of the folders within the collection.  The collection
        is counted as well.

        :param doc: The collection.
        :param includeItems: Whether items should be included in the count.
        :type includeItems: bool
        :param user: If filtering by permission, the user to filter against.
        :param level: If filtering by permission, the required permission level.
        :type level: AccessLevel
        """
        from girderformindlogger.models.folder import Folder

        count = 1
        folderModel = Folder()
        folders = folderModel.findWithPermissions(
            {
                'parentId': doc['_id'],
                'parentCollection': 'collection'
            },
            fields='access',
            user=user,
            level=level)

        count += sum(
            folderModel.subtreeCount(
                folder, includeItems=includeItems, user=user, level=level)
            for folder in folders)
        return count
Exemple #3
0
    def setAccessList(self,
                      doc,
                      access,
                      save=False,
                      recurse=False,
                      user=None,
                      progress=noProgress,
                      setPublic=None,
                      publicFlags=None,
                      force=False):
        """
        Overrides AccessControlledModel.setAccessList to add a recursive
        option. When `recurse=True`, this will set the access list on all
        subfolders to which the given user has ADMIN access level. Any
        subfolders that the given user does not have ADMIN access on will be
        skipped.

        :param doc: The collection to set access settings on.
        :type doc: collection
        :param access: The access control list.
        :type access: dict
        :param save: Whether the changes should be saved to the database.
        :type save: bool
        :param recurse: Whether this access list should be propagated to all
            folders underneath this collection.
        :type recurse: bool
        :param user: The current user (for recursive mode filtering).
        :param progress: Progress context to update.
        :type progress: :py:class:`girderformindlogger.utility.progress.ProgressContext`
        :param setPublic: Pass this if you wish to set the public flag on the
            resources being updated.
        :type setPublic: bool or None
        :param publicFlags: Pass this if you wish to set the public flag list on
            resources being updated.
        :type publicFlags: flag identifier str, or list/set/tuple of them, or None
        :param force: Set this to True to set the flags regardless of the passed in
            user's permissions.
        :type force: bool
        """
        progress.update(increment=1, message='Updating ' + doc['name'])
        if setPublic is not None:
            self.setPublic(doc, setPublic, save=False)

        if publicFlags is not None:
            doc = self.setPublicFlags(doc,
                                      publicFlags,
                                      user=user,
                                      save=False,
                                      force=force)

        doc = AccessControlledModel.setAccessList(self,
                                                  doc,
                                                  access,
                                                  user=user,
                                                  save=save,
                                                  force=force)

        if recurse:
            from girderformindlogger.models.folder import Folder

            folderModel = Folder()
            folders = folderModel.findWithPermissions(
                {
                    'parentId': doc['_id'],
                    'parentCollection': 'collection'
                },
                user=user,
                level=AccessType.ADMIN)

            for folder in folders:
                folderModel.setAccessList(folder,
                                          access,
                                          save=True,
                                          recurse=True,
                                          user=user,
                                          progress=progress,
                                          setPublic=setPublic,
                                          publicFlags=publicFlags)

        return doc