topnav.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. from django.template import loader
  2. from django.utils.text import capfirst
  3. from django.urls.base import reverse, NoReverseMatch
  4. from django.utils.translation import ugettext as _
  5. from xadmin.sites import site
  6. from xadmin.filters import SEARCH_VAR
  7. from xadmin.views import BaseAdminPlugin, CommAdminView
  8. class TopNavPlugin(BaseAdminPlugin):
  9. global_search_models = None
  10. global_add_models = None
  11. def get_context(self, context):
  12. return context
  13. # Block Views
  14. def block_top_navbar(self, context, nodes):
  15. search_models = []
  16. site_name = self.admin_site.name
  17. if self.global_search_models == None:
  18. models = self.admin_site._registry.keys()
  19. else:
  20. models = self.global_search_models
  21. for model in models:
  22. app_label = model._meta.app_label
  23. if self.has_model_perm(model, "view"):
  24. info = (app_label, model._meta.model_name)
  25. if getattr(self.admin_site._registry[model], 'search_fields', None):
  26. try:
  27. search_models.append({
  28. 'title': _('Search %s') % capfirst(model._meta.verbose_name_plural),
  29. 'url': reverse('xadmin:%s_%s_changelist' % info, current_app=site_name),
  30. 'model': model
  31. })
  32. except NoReverseMatch:
  33. pass
  34. return nodes.append(loader.render_to_string('xadmin/blocks/comm.top.topnav.html', {'search_models': search_models, 'search_name': SEARCH_VAR}))
  35. def block_top_navmenu(self, context, nodes):
  36. add_models = []
  37. site_name = self.admin_site.name
  38. if self.global_add_models == None:
  39. models = self.admin_site._registry.keys()
  40. else:
  41. models = self.global_add_models
  42. for model in models:
  43. app_label = model._meta.app_label
  44. if self.has_model_perm(model, "add"):
  45. info = (app_label, model._meta.model_name)
  46. try:
  47. add_models.append({
  48. 'title': _('Add %s') % capfirst(model._meta.verbose_name),
  49. 'url': reverse('xadmin:%s_%s_add' % info, current_app=site_name),
  50. 'model': model
  51. })
  52. except NoReverseMatch:
  53. pass
  54. nodes.append(
  55. loader.render_to_string('xadmin/blocks/comm.top.topnav.html', {'add_models': add_models}))
  56. site.register_plugin(TopNavPlugin, CommAdminView)