rapid_menu.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. # coding=utf-8
  2. __author__ = 'marcos.medeiros'
  3. import locale
  4. from django import template
  5. from django.utils.safestring import mark_safe
  6. from django.utils.html import escape
  7. from rapid.registry import registry
  8. from rapid.wrappers import ModelData
  9. from django.utils.translation import to_locale, get_language
  10. register = template.Library()
  11. # noinspection PyBroadException
  12. try:
  13. locale.setlocale(locale.LC_ALL, str(to_locale(get_language())))
  14. except:
  15. locale.setlocale(locale.LC_ALL, str('C'))
  16. def _app_menu(app, request):
  17. models = list(app.models)
  18. # noinspection PyTypeChecker
  19. models.sort(key=lambda md: ModelData(md).model_name(), cmp=locale.strcoll)
  20. sub = '<li class="menu-group"><div>%s</div><ul class="submenu">\n' % escape(app.menu_name.capitalize())
  21. has_model = False
  22. for m in models:
  23. st = registry.model_entry(m).get('list')
  24. if st:
  25. read = st.permission.model(request)
  26. if read:
  27. has_model = True
  28. cd = ModelData(st.model)
  29. sub += '<li><a href="%s">%s</a></li>\n' % (
  30. registry.get_url_of_action(m, 'list'),
  31. escape(cd.model_name_plural().title()),
  32. )
  33. sub += '</ul></li>\n'
  34. if has_model:
  35. return sub
  36. return ""
  37. @register.simple_tag
  38. def menu(request):
  39. ret = u"""
  40. <nav id="menu">
  41. <style scoped>
  42. nav li.menu-group{
  43. cursor: pointer;
  44. }
  45. nav li.menu-group.collapsed > ul{
  46. display: none;
  47. }
  48. </style>
  49. """
  50. ret += '<ul class="menu">\n'
  51. mm = registry.modules()
  52. mm.sort(key=lambda a: a.menu_name, cmp=locale.strcoll)
  53. for m in mm:
  54. ret += _app_menu(m, request)
  55. ret += u"""
  56. </ul>
  57. <script>
  58. $(document).ready(function(){
  59. $("nav li.menu-group").addClass("collapsed");
  60. $("nav li.menu-group > div").click(function(){$(this).parent().toggleClass("collapsed")});
  61. });
  62. </script>
  63. </nav>
  64. """
  65. return mark_safe(ret)