def wrapper(request, *args, **kw):
            from cyano.views import login

            user = request.user

            if not user.is_authenticated():
                # Special handling for guests
                user = User.objects.get(username="******")

            # Admins always have full access
            if user.is_superuser:
                return function(request, *args, **kw)

            # Global perm check
            if user.profile.has_perm(permission):
                return function(request, *args, **kw)

            # No perm fallthrough
            msg = "You need global permission \"{}\"".format(permission)

            return login(
                request,
                species=None,
                error=403,
                message=msg,
                force_next=request.build_absolute_uri(),
                required_perm=permission)
        def wrapper(request, *args, **kw):
            from cyano.views import login

            user = request.user

            if not user.is_authenticated():
                # Special handling for guests
                user = User.objects.get(username="******")

            # Admins always have full access
            if user.is_superuser:
                return function(request, *args, **kw)

            # Global perm check
            if user.profile.has_perm(permission):
                return function(request, *args, **kw)

            # No perm fallthrough
            msg = "You need global permission \"{}\"".format(permission)

            return login(request,
                         species=None,
                         error=403,
                         message=msg,
                         force_next=request.build_absolute_uri(),
                         required_perm=permission)
        def wrapper(request, *args, **kw):
            from cyano.views import login

            species = kw.get("species", False)
            item = kw.get("item", False)

            user = request.user

            if not user.is_authenticated():
                # Special handling for guests
                user = User.objects.get(username="******")
            else:
                pass

            # Admins always have full access
            if user.is_superuser:
                return function(request, *args, **kw)

            if species:
                species_old_cls = species.__class__
                species.__class__ = Entry
                allow_item = None

                if item:
                    # __class__ assignment: 'Entry' object layout differs from 'ModelBase'#
                    #item_old_cls = item.__class__
                    #item = item.__class__ = Entry
                    entry_item = Entry.objects.get(pk=item.pk)
                    allow_item = user.profile.has_perm(permission, entry_item)
                    #item.__class__ = item_old_cls

                allow_species = user.profile.has_perm(permission, species)
                species._class__ = species_old_cls

                if allow_species or allow_item:
                    # Has permission
                    return function(request, *args, **kw)
            else:
                raise ValueError(
                    "Species required for permission check. Use global_permission_required to check for global permissions."
                )

            # No perm fallthrough
            msg = "You need permission \"{}\" to access ".format(permission)

            if item:
                msg += "item {} of ".format(item.wid)

            msg += "species {}".format(species.wid)

            return login(request,
                         species=species,
                         error=403,
                         message=msg,
                         force_next=request.build_absolute_uri(),
                         required_perm=permission)
        def wrapper(request, *args, **kw):
            from cyano.views import login

            species = kw.get("species", False)
            item = kw.get("item", False)

            user = request.user

            if not user.is_authenticated():
                # Special handling for guests
                user = User.objects.get(username="******")
            else:
                pass

            # Admins always have full access
            if user.is_superuser:
                return function(request, *args, **kw)

            if species:
                species_old_cls = species.__class__
                species.__class__ = Entry
                allow_item = None

                if item:
                    # __class__ assignment: 'Entry' object layout differs from 'ModelBase'#
                    #item_old_cls = item.__class__
                    #item = item.__class__ = Entry
                    entry_item = Entry.objects.get(pk=item.pk)
                    allow_item = user.profile.has_perm(permission, entry_item)
                    #item.__class__ = item_old_cls

                allow_species = user.profile.has_perm(permission, species)
                species._class__ = species_old_cls

                if allow_species or allow_item:
                    # Has permission
                    return function(request, *args, **kw)
            else:
                raise ValueError("Species required for permission check. Use global_permission_required to check for global permissions.")

            # No perm fallthrough
            msg = "You need permission \"{}\" to access ".format(permission)

            if item:
                msg += "item {} of ".format(item.wid)

            msg += "species {}".format(species.wid)

            return login(
                request,
                species=species,
                error=403,
                message=msg,
                force_next=request.build_absolute_uri(),
                required_perm=permission)