rapid_menu.py 2.0 KB

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