permissions.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. __author__ = 'marcos.medeiros'
  2. class Permission:
  3. def __init__(self, model, instances):
  4. self.model = model
  5. self.instances = instances
  6. def all_instances(model):
  7. def i(request):
  8. if model(request):
  9. return {}
  10. else:
  11. return None
  12. return i
  13. def apply_instances_permission(model, perm):
  14. if perm is None:
  15. return []
  16. if hasattr(perm, 'keys'):
  17. return model.default_manager().filter(**perm)
  18. if hasattr(perm, '__iter__'):
  19. return perm
  20. if hasattr(perm, 'all'):
  21. return perm
  22. return []
  23. def has_instance(model, perm, instance):
  24. p = apply_instances_permission(model, perm)
  25. if hasattr(p, 'filter'):
  26. return p.filter(pk=instance.pk).exists()
  27. if hasattr(p, '__iter__'):
  28. return bool([f for f in p if f.pk == instance.pk])
  29. return False
  30. def to_profile(profile):
  31. if hasattr(profile, "__iter__"):
  32. def m(request):
  33. if not request.user.is_authenticated():
  34. return False
  35. up = [p.pk for p in request.user.profile_set]
  36. for p in up:
  37. if p in profile:
  38. return True
  39. return False
  40. else:
  41. def m(request):
  42. if not request.user.is_authenticated():
  43. return False
  44. up = [p.pk for p in request.user.profile_set.all()]
  45. if profile in up:
  46. return True
  47. return False
  48. return Permission(m, all_instances(m))
  49. def to_staff():
  50. def m(request):
  51. if request.user.is_authenticated() and request.user.is_staff:
  52. return True
  53. return False
  54. return Permission(m, all_instances(m))
  55. def to_all():
  56. def m(request):
  57. return True
  58. return Permission(m, all_instances(m))
  59. def to_superusers():
  60. def m(request):
  61. if request.user.is_authenticated() and request.user.is_superuser:
  62. return True
  63. return False
  64. return Permission(m, all_instances(m))
  65. def to_application_managers(app):
  66. def m(request):
  67. if not request.user.is_authenticated():
  68. return False
  69. up = [a.pk for a in request.user.managed_applications.all()]
  70. if app in up:
  71. return True
  72. return False
  73. return Permission(m, all_instances(m))