portal.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #coding:utf-8
  2. from xadmin.sites import site
  3. from xadmin.models import UserSettings
  4. from xadmin.views import BaseAdminPlugin, ModelFormAdminView, DetailAdminView
  5. from xadmin.layout import Fieldset, Column
  6. class BasePortalPlugin(BaseAdminPlugin):
  7. # Media
  8. def get_media(self, media):
  9. return media + self.vendor('xadmin.plugin.portal.js')
  10. def get_layout_objects(layout, clz, objects):
  11. for i, layout_object in enumerate(layout.fields):
  12. if layout_object.__class__ is clz or issubclass(layout_object.__class__, clz):
  13. objects.append(layout_object)
  14. elif hasattr(layout_object, 'get_field_names'):
  15. get_layout_objects(layout_object, clz, objects)
  16. class ModelFormPlugin(BasePortalPlugin):
  17. def _portal_key(self):
  18. return '%s_%s_editform_portal' % (self.opts.app_label, self.opts.model_name)
  19. def get_form_helper(self, helper):
  20. cs = []
  21. layout = helper.layout
  22. get_layout_objects(layout, Column, cs)
  23. for i, c in enumerate(cs):
  24. if not getattr(c, 'css_id', None):
  25. c.css_id = 'column-%d' % i
  26. # make fieldset index
  27. fs = []
  28. get_layout_objects(layout, Fieldset, fs)
  29. fs_map = {}
  30. for i, f in enumerate(fs):
  31. if not getattr(f, 'css_id', None):
  32. f.css_id = 'box-%d' % i
  33. fs_map[f.css_id] = f
  34. try:
  35. layout_pos = UserSettings.objects.get(
  36. user=self.user, key=self._portal_key()).value
  37. layout_cs = layout_pos.split('|')
  38. for i, c in enumerate(cs):
  39. c.fields = [fs_map.pop(j) for j in layout_cs[i].split(
  40. ',') if j in fs_map] if len(layout_cs) > i else []
  41. if fs_map and cs:
  42. cs[0].fields.extend(fs_map.values())
  43. except Exception:
  44. pass
  45. return helper
  46. def block_form_top(self, context, node):
  47. # put portal key and submit url to page
  48. return "<input type='hidden' id='_portal_key' value='%s' />" % self._portal_key()
  49. class ModelDetailPlugin(ModelFormPlugin):
  50. def _portal_key(self):
  51. return '%s_%s_detail_portal' % (self.opts.app_label, self.opts.model_name)
  52. def block_after_fieldsets(self, context, node):
  53. # put portal key and submit url to page
  54. return "<input type='hidden' id='_portal_key' value='%s' />" % self._portal_key()
  55. site.register_plugin(ModelFormPlugin, ModelFormAdminView)
  56. site.register_plugin(ModelDetailPlugin, DetailAdminView)