test.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. from misago.acl.test import patch_user_acl
  2. from misago.categories.models import Category
  3. default_category_acl = {
  4. 'can_see': 1,
  5. 'can_browse': 1,
  6. 'can_see_all_threads': 1,
  7. 'can_see_own_threads': 0,
  8. 'can_hide_threads': 0,
  9. 'can_approve_content': 0,
  10. 'can_edit_posts': 0,
  11. 'can_hide_posts': 0,
  12. 'can_hide_own_posts': 0,
  13. 'can_merge_threads': 0,
  14. 'can_close_threads': 0,
  15. }
  16. def patch_category_acl(acl_patch=None):
  17. def patch_acl(_, user_acl):
  18. category = Category.objects.get(slug="first-category")
  19. category_acl = user_acl['categories'][category.id]
  20. category_acl.update(default_category_acl)
  21. if acl_patch:
  22. category_acl.update(acl_patch)
  23. cleanup_patched_acl(user_acl, category_acl, category)
  24. return patch_user_acl(patch_acl)
  25. def patch_other_user_category_acl(acl_patch=None):
  26. def patch_acl(user, user_acl):
  27. if user.slug != "bobbobertson":
  28. return
  29. category = Category.objects.get(slug="first-category")
  30. category_acl = user_acl['categories'][category.id]
  31. category_acl.update(default_category_acl)
  32. if acl_patch:
  33. category_acl.update(acl_patch)
  34. cleanup_patched_acl(user_acl, category_acl, category)
  35. return patch_user_acl(patch_acl)
  36. def patch_other_category_acl(acl_patch=None):
  37. def patch_acl(_, user_acl):
  38. src_category = Category.objects.get(slug="first-category")
  39. category_acl = user_acl['categories'][src_category.id].copy()
  40. dst_category = Category.objects.get(slug="other-category")
  41. user_acl['categories'][dst_category.id] = category_acl
  42. category_acl.update(default_category_acl)
  43. if acl_patch:
  44. category_acl.update(acl_patch)
  45. cleanup_patched_acl(user_acl, category_acl, dst_category)
  46. return patch_user_acl(patch_acl)
  47. def patch_private_threads_acl(acl_patch=None):
  48. def patch_acl(_, user_acl):
  49. category = Category.objects.private_threads()
  50. category_acl = user_acl['categories'][category.id]
  51. category_acl.update(default_category_acl)
  52. if acl_patch:
  53. category_acl.update(acl_patch)
  54. cleanup_patched_acl(user_acl, category_acl, category)
  55. return patch_user_acl(patch_acl)
  56. def other_user_cant_use_private_threads(user, user_acl):
  57. if user.slug == "bobboberson":
  58. user_acl.update({"can_use_private_threads": False})
  59. def create_category_acl_patch(category_slug, acl_patch):
  60. def created_category_acl_patch(_, user_acl):
  61. category = Category.objects.get(slug=category_slug)
  62. category_acl = user_acl['categories'].get(category.id, {})
  63. category_acl.update(default_category_acl)
  64. if acl_patch:
  65. category_acl.update(acl_patch)
  66. cleanup_patched_acl(user_acl, category_acl, category)
  67. return created_category_acl_patch
  68. def cleanup_patched_acl(user_acl, category_acl, category):
  69. visible_categories = user_acl['visible_categories']
  70. browseable_categories = user_acl['browseable_categories']
  71. if not category_acl['can_see'] and category.id in visible_categories:
  72. visible_categories.remove(category.id)
  73. if not category_acl['can_see'] and category.id in browseable_categories:
  74. browseable_categories.remove(category.id)
  75. if not category_acl['can_browse'] and category.id in browseable_categories:
  76. browseable_categories.remove(category.id)
  77. if category_acl['can_see'] and category.id not in visible_categories:
  78. visible_categories.append(category.id)
  79. if category_acl['can_browse'] and category.id not in browseable_categories:
  80. browseable_categories.append(category.id)