fixtures.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import base64
  2. from django.utils import timezone
  3. from django.utils.importlib import import_module
  4. from misago.models import MonitorItem, SettingsGroup, Setting
  5. from misago.utils.translation import get_msgid
  6. try:
  7. import cPickle as pickle
  8. except ImportError:
  9. import pickle
  10. def load_fixture(name):
  11. """
  12. Load fixture
  13. """
  14. try:
  15. fixture = import_module(name)
  16. fixture.load()
  17. return True
  18. except (ImportError, AttributeError):
  19. return False
  20. def update_fixture(name):
  21. """
  22. If fixture module contains update function, use it to update fixture
  23. """
  24. try:
  25. fixture = import_module(name)
  26. fixture.update()
  27. return True
  28. except (ImportError, AttributeError):
  29. return False
  30. def load_settings_group_fixture(group, fixture):
  31. model_group = SettingsGroup(
  32. key=group,
  33. name=get_msgid(fixture['name']),
  34. description=get_msgid(fixture.get('description'))
  35. )
  36. model_group.save(force_insert=True)
  37. fixture = fixture.get('settings', ())
  38. position = 0
  39. for setting in fixture:
  40. value = setting[1].get('value')
  41. value_default = setting[1].get('default')
  42. # Convert boolean True and False to 1 and 0, otherwhise it wont work
  43. if setting[1].get('type') == 'boolean':
  44. value = 1 if value else 0
  45. value_default = 1 if value_default else 0
  46. # Convert array value to string
  47. if setting[1].get('type') == 'array':
  48. value = ','.join(value) if value else ''
  49. value_default = ','.join(value_default) if value_default else ''
  50. # Store setting in database
  51. model_setting = Setting(
  52. setting=setting[0],
  53. group=model_group,
  54. value=value,
  55. value_default=value_default,
  56. normalize_to=setting[1].get('type'),
  57. field=setting[1].get('input'),
  58. extra=base64.encodestring(pickle.dumps(setting[1].get('extra', {}), pickle.HIGHEST_PROTOCOL)),
  59. position=position,
  60. separator=get_msgid(setting[1].get('separator')),
  61. name=get_msgid(setting[1].get('name')),
  62. description=get_msgid(setting[1].get('description')),
  63. )
  64. model_setting.save(force_insert=True)
  65. position += 1
  66. def update_settings_group_fixture(group, fixture):
  67. try:
  68. model_group = SettingsGroup.objects.get(key=group)
  69. settings = {}
  70. for setting in model_group.setting_set.all():
  71. settings[setting.pk] = setting.value
  72. model_group.delete()
  73. load_settings_group_fixture(group, fixture)
  74. for setting in settings:
  75. try:
  76. new_setting = Setting.objects.get(pk=setting)
  77. new_setting.value = settings[setting]
  78. new_setting.save(force_update=True)
  79. except Setting.DoesNotExist:
  80. pass
  81. except SettingsGroup.DoesNotExist:
  82. load_settings_group_fixture(group, fixture)
  83. def load_settings_fixture(fixture):
  84. for group in fixture:
  85. load_settings_group_fixture(group[0], group[1])
  86. def update_settings_fixture(fixture):
  87. for group in fixture:
  88. update_settings_group_fixture(group[0], group[1])
  89. def load_monitor_fixture(fixture):
  90. for id in fixture.keys():
  91. item = MonitorItem.objects.create(
  92. id=id,
  93. value=fixture[id][0],
  94. type=fixture[id][1],
  95. updated=timezone.now()
  96. )
  97. def update_monitor_fixture(fixture):
  98. for id in fixture.keys():
  99. try:
  100. item = MonitorItem.objects.get(id=id)
  101. item.type = fixture[id][1]
  102. item.updated = timezone.now()
  103. item.save(force_update=True)
  104. except MonitorItem.DoesNotExist:
  105. MonitorItem.objects.create(
  106. id=id,
  107. value=fixture[id][0],
  108. type=fixture[id][1],
  109. updated=timezone.now()
  110. )