Overview
Bar Galileo implements a comprehensive role-based access control (RBAC) system with user profiles and emergency contact information. This system allows fine-grained permission management through Module-Action-Role relationships.
Role Management Models
Role
Main role definition model.
Role name (max 50 characters, unique)
Optional role description
Example:
from roles.models import Role
# Create a role
role = Role.objects.create(
nombre = 'Mesero' ,
descripcion = 'Personal de servicio de mesas'
)
Module
System modules that can have permissions.
Module name (max 50 characters, unique). Examples: “Products”, “Orders”, “Reports”
Example:
from roles.models import Module
# Create modules
productos = Module.objects.create( nombre = 'Productos' )
pedidos = Module.objects.create( nombre = 'Pedidos' )
reportes = Module.objects.create( nombre = 'Reportes' )
Action
Actions that can be performed on modules.
Action name (max 50 characters, unique). Examples: “View”, “Create”, “Edit”, “Delete”
Example:
from roles.models import Action
# Create actions
ver = Action.objects.create( nombre = 'Ver' )
crear = Action.objects.create( nombre = 'Crear' )
editar = Action.objects.create( nombre = 'Editar' )
eliminar = Action.objects.create( nombre = 'Eliminar' )
RolePermission
Links roles to specific module-action combinations.
Reference to Role model (CASCADE on delete)
Reference to Module model (CASCADE on delete)
Reference to Action model (CASCADE on delete)
Constraints:
unique_together: (‘rol’, ‘modulo’, ‘accion’)
Example:
from roles.models import RolePermission, Role, Module, Action
# Get objects
mesero = Role.objects.get( nombre = 'Mesero' )
pedidos = Module.objects.get( nombre = 'Pedidos' )
ver = Action.objects.get( nombre = 'Ver' )
crear = Action.objects.get( nombre = 'Crear' )
# Grant permissions
RolePermission.objects.create( rol = mesero, modulo = pedidos, accion = ver)
RolePermission.objects.create( rol = mesero, modulo = pedidos, accion = crear)
UserProfile
Connects Django users to roles in the RBAC system.
Reference to Django User model (CASCADE on delete)
Reference to Role model (SET_NULL on delete). Nullable for users without assigned roles.
Example:
from django.contrib.auth.models import User
from roles.models import UserProfile, Role
# Assign role to user
user = User.objects.get( username = 'juan' )
mesero_role = Role.objects.get( nombre = 'Mesero' )
profile, created = UserProfile.objects.get_or_create( user = user)
profile.rol = mesero_role
profile.save()
# Check user's role
if hasattr (user, 'userprofile' ) and user.userprofile.rol:
print ( f "Role: { user.userprofile.rol.nombre } " )
User Profile Models
PerfilUsuario
Extended user profile with personal information.
Reference to Django User model (CASCADE on delete)
Full name (max 100 characters)
ID card number (max 20 characters)
Phone number (max 20 characters)
Address (max 200 characters)
Profile picture (uploaded to ‘img/avatar/’)
Example:
from users.models import PerfilUsuario
from django.contrib.auth.models import User
user = User.objects.get( username = 'maria' )
perfil = PerfilUsuario.objects.create(
user = user,
nombre = 'María García' ,
cedula = '1234567890' ,
telefono = '+573001234567' ,
direccion = 'Calle 10 #20-30, Sogamoso'
)
Emergencia
Emergency contact information linked to user profiles.
Reference to PerfilUsuario model (CASCADE on delete)
Emergency contact name (max 100 characters)
Relationship to user (max 50 characters)
Primary phone (max 20 characters)
Alternative phone (max 20 characters)
Blood type (max 10 characters)
Known allergies (max 200 characters)
Example:
from users.models import Emergencia, PerfilUsuario
perfil = PerfilUsuario.objects.get( user__username = 'maria' )
emergencia = Emergencia.objects.create(
perfil = perfil,
nombre = 'Carlos García' ,
relacion = 'Esposo' ,
telefono = '+573009876543' ,
telefono_alt = '+576087654321' ,
sangre = 'O+' ,
alergias = 'Penicilina'
)
Permission Checking
Check if a user has permission to perform an action on a module:
from roles.models import RolePermission
def user_has_permission ( user , module_name , action_name ):
"""Check if user has permission for module-action combination"""
if not hasattr (user, 'userprofile' ) or not user.userprofile.rol:
return False
return RolePermission.objects.filter(
rol = user.userprofile.rol,
modulo__nombre = module_name,
accion__nombre = action_name
).exists()
# Usage
if user_has_permission(user, 'Productos' , 'Editar' ):
# Allow product editing
pass
Common Workflows
Create Complete RBAC Setup
from roles.models import Role, Module, Action, RolePermission
# Create modules
modules = {
'productos' : Module.objects.create( nombre = 'Productos' ),
'pedidos' : Module.objects.create( nombre = 'Pedidos' ),
'facturacion' : Module.objects.create( nombre = 'Facturación' ),
'reportes' : Module.objects.create( nombre = 'Reportes' ),
}
# Create actions
actions = {
'ver' : Action.objects.create( nombre = 'Ver' ),
'crear' : Action.objects.create( nombre = 'Crear' ),
'editar' : Action.objects.create( nombre = 'Editar' ),
'eliminar' : Action.objects.create( nombre = 'Eliminar' ),
}
# Create Administrator role with all permissions
admin = Role.objects.create(
nombre = 'Administrador' ,
descripcion = 'Acceso completo al sistema'
)
for module in modules.values():
for action in actions.values():
RolePermission.objects.create(
rol = admin,
modulo = module,
accion = action
)
# Create Server role with limited permissions
mesero = Role.objects.create(
nombre = 'Mesero' ,
descripcion = 'Personal de servicio'
)
# Servers can view/create orders
RolePermission.objects.create( rol = mesero, modulo = modules[ 'pedidos' ], accion = actions[ 'ver' ])
RolePermission.objects.create( rol = mesero, modulo = modules[ 'pedidos' ], accion = actions[ 'crear' ])
# Servers can view products
RolePermission.objects.create( rol = mesero, modulo = modules[ 'productos' ], accion = actions[ 'ver' ])
Get All Permissions for a Role
from roles.models import RolePermission
role = Role.objects.get( nombre = 'Mesero' )
permissions = RolePermission.objects.filter( rol = role).select_related( 'modulo' , 'accion' )
for perm in permissions:
print ( f " { perm.modulo.nombre } - { perm.accion.nombre } " )
Users & Roles Feature User-facing documentation for role management
Authentication Authentication and login endpoints