Framework Git

Framework Git

Open in ChatGPT
Ask ChatGPT about this page
Open in Claude
Ask Claude about this page

Permissions and Roles

Frappe controls access with roles. A role is a named group of permissions
(read, write, create, delete, and more). You assign roles to users, and you grant
permissions to roles per DocType. So far only Administrator and the System Manager role can touch your DocTypes. Here you add a Librarian role and give
it the access it needs.

Create the role

Create a new Role record:

http://library.localhost:8000/desk/role/new

Set Role Name to Librarian and save. Leave Desk Access ticked so users
with this role can use the Desk.

Grant permissions on the DocTypes

There are two places to edit permissions, and they store the rules differently:

  • The Role Permissions Manager (/desk/permission-manager) creates Custom
    DocPerm
    records in the database. These are overrides that stay on the site and
    are not written to your app's files.
  • The DocType form's Permissions table writes the rules into the DocType's
    own JSON. With developer mode on, this keeps them in version control with the
    rest of the schema.

For an app you are building, edit the rules on the DocType so they travel with the
code. Open the Article DocType:

http://library.localhost:8000/desk/doctype/Article

Scroll to the Permissions section and add a row for the Librarian role. Tick
the permissions you want. For a librarian managing the catalogue:

  • Read, Write, Create: yes
  • Delete: leave off if librarians should not remove records
  • Report, Export, Print, Email: yes for day-to-day work

Save the DocType. Repeat for Library Member and Library Transaction.

Where permissions are stored

Because you edited them on the DocType with developer mode on, the rules are
written into the DocType's JSON under permissions, so they are tracked in your
app's files. The permissions block in article.json looks like this:

"permissions": [
 {
  "role": "Librarian",
  "read": 1,
  "write": 1,
  "create": 1,
  "print": 1,
  "report": 1,
  "export": 1
 },
 {
  "role": "System Manager",
  "read": 1,
  "write": 1,
  "create": 1,
  "delete": 1
 }
]

Assign the role to a user

Create a test user and give them the role:

http://library.localhost:8000/desk/user/new

Fill in an email and name, then in the Roles section tick Librarian and
save. Log in as that user (or use a private browser window) to confirm they can
open the Article list, create records, but not see admin-only DocTypes.

Field-level and row-level access

Two finer controls exist when you need them:

  • Permlevels: set a field's Perm Level to a number above 0 to hide or
    protect it, then grant that level separately in the permission rules. Useful for
    fields only managers should edit.
  • User Permissions: restrict a user to specific records, for example only the
    members at their branch. These are set per user, not per role.

For checking and enforcing permissions in your own Python code (frappe.has_permission,
ignore_permissions, and query conditions), see
Permissions in Code.

Continue to Reports and Print.

Last updated 1 hour ago
Was this helpful?
Thanks!