Unreleased:
  added: []
  fixed: []
  changed: []
  deprecated: []
  removed: []
  security: []
2.0.1:
  fixed:
  - unpin max django version
  changed:
  - convert to uv
2.0.0:
  added:
  - python3.11 support
  - python3.10 support
  - django4 support
  - django4.2 support
  - django3.2 support
  removed:
  - python3.6 support
  - python3.7 support
  - django2.2 support
  - django3.0 support
  - django3.1 support
1.9.1:
  fixed:
  - bug where group permissions overwrote direct permissions
1.9.0:
  added:
  - python3.9 support
  - django3.1 support
  - added rest.ModelViewSetPermission django-rest-framework permission class
  - added grainy_namespace property to decorated models
  - added util.check_permissions helper function
  - added util.get_permissions helper function
  - added GRAINY_ANONYMOUS_GROUP setting
  fixed:
  - fix django-admin user and group admin view unregister
  - fix instance namespacing on decorated models that have a grainy parent defined
  changed:
  - grainy handler classes moved to handlers.py to prevent circular depdendency issue
1.8.0:
  added:
  - remote grainy permissions
  - field level permission checks when POST/PUT/PATCHing to REST api (#14)
  - python3.8 support
  changed:
  - 'fix #36: Grainy decorators should allow setting of Permissions class to use for
    permission checks'
  removed:
  - python2.7 support
  - python3.4 support
  - python3.5 support
  - django1.11 support
1.7.0:
  added:
  - tests for django 2.1
  - 'fix #33: easy namespace inheritance through related models'
  - 'fix #31: add delete_permission function to grainy manager'
  - 'fix #35: Custom permission holder implementation'
  fixed:
  - 'admin inlines: sort by namespace alphabetically (#24)'
  changed:
  - move from facsimile to Ctl (#32)
1.6.2:
  fixed:
  - when applying perms to a grainy view response, make sure to return the proper
    container when it is empty
1.6.1:
  fixed:
  - Fixed issue with namespace formatting for grainy views that was introduced in
    1.6.0 where trying to format using url parameters would raise a KeyError
1.6.0:
  added:
  - grainy view decorators can now access the request object when formatting namespaces
  - you can now use extra keyword arguments passed to `Grainy.namespace` and `helpers.namespace`
    to further format the namespace string
  changed:
  - 'grainy view decorators: renamed `explicit_object` to `explicit_instance`'
1.5.0:
  added:
  - '`util.Permissions.get` now accepts the `explicit` keyword argument'
  - '`decorators.grainy_view` now accepts the `explicit_object` keyword argument'
  fixed:
  - '`util.Permissions.get` now works correctly'
  changed:
  - '`decorators.grainy_view` request GET parameters now available for namespace formatting'
  - '`decorators.grainy_view` get_object() now available as `instance` for base namespace
    formatting if it exists'
  - '`decorators.grainy_decorator` decorator namespaces can now be passed as lists
    in which case the resulting namespace is a joint namespace of all the elements'
1.4.0:
  added:
  - implemented `decorators.grainy_view_response`
  - implemented `decorators.grainy_json_view_response`
  - implemented `decorators.grainy_rest_viewset_response`
  changed:
  - '`decorators.grainy_view` now simply decorates all response handlers'
  - '`decorators.grainy_json_view` now simply decorates all response handlers'
  - '`decorators.grainy_rest_viewset` now simply decorates all response handlers'
1.3.0:
  added:
  - 'grainy_model: allow specifying of custom instance namespace formatting'
  - 'grainy_view: impl explicit namespace handling during request gating'
1.2.1:
  fixed:
  - Template files not being installed
1.2.0:
  added:
  - 'Permissions.instances(): add `explicit` keyword argument'
  - 'Permissions.instances(): add `ignore_grant_all` keyword argument'
  - 'Permissions.check(): add `ignore_grant_all` keyword argument'
1.1.0:
  added:
  - Passing a `tuple` or `list` to `helpers.namespace` will now return a joint namespace
    of all contained elements
  - Implemented `util.Permissions.instances` method to retrieve all instances of a
    model according to permissions
  - '`decorators.grainy_view` decorator can now use url parameters to format it s
    namespace'
1.0.0:
  added:
  - grainy authentication backend
  - django admin integration
  - str_flags function
  - PermissioManager.add_permission
  - Default permissions for AnonymousUser
  - decorators.grainy_view
  - decorators.grainy_rest_viewset
  - helpers.dict_get_namespace
  - helpers.request_method_to_flag
  - helpers.request_to_flag
  - util.Permissions.grant_all property
  - conf.REQUEST_METHOD_TO_FLAG
  fixed:
  - util.Permissions now accepts AnonynmousUser as object
  changed:
  - renamed `convert_flags` to `int_flags`
  - moved `str_flags` and `int_flags` functions from util.py to helpers.py
  - moved `namespace` function from util.py to models.py
  - removed `clear` argument from `PermissionManager.add_permission_set`
