fixtures.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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. except Exception as e:
  21. print 'Could not load fixtures from %s:\n%s' % (name, e)
  22. return False
  23. def update_fixture(name):
  24. """
  25. If fixture module contains update function, use it to update fixture
  26. """
  27. try:
  28. fixture = import_module(name)
  29. fixture.update()
  30. return True
  31. except (ImportError, AttributeError):
  32. return False
  33. except Exception as e:
  34. print 'Could not update fixture from %s:\n%s' % (name, e)
  35. return False
  36. def load_settings_group_fixture(group, fixture):
  37. model_group = SettingsGroup(
  38. key=group,
  39. name=get_msgid(fixture['name']),
  40. description=get_msgid(fixture.get('description'))
  41. )
  42. model_group.save(force_insert=True)
  43. fixture = fixture.get('settings', ())
  44. position = 0
  45. for setting in fixture:
  46. value = setting[1].get('value')
  47. value_default = setting[1].get('default')
  48. # Convert boolean True and False to 1 and 0, otherwhise it wont work
  49. if setting[1].get('type') == 'boolean':
  50. value = 1 if value else 0
  51. value_default = 1 if value_default else 0
  52. # Convert array value to string
  53. if setting[1].get('type') == 'array':
  54. value = ','.join(value) if value else ''
  55. value_default = ','.join(value_default) if value_default else ''
  56. # Store setting in database
  57. model_setting = Setting(
  58. setting=setting[0],
  59. group=model_group,
  60. value=value,
  61. value_default=value_default,
  62. normalize_to=setting[1].get('type'),
  63. field=setting[1].get('input'),
  64. extra=base64.encodestring(pickle.dumps(setting[1].get('extra', {}), pickle.HIGHEST_PROTOCOL)),
  65. position=position,
  66. separator=get_msgid(setting[1].get('separator')),
  67. name=get_msgid(setting[1].get('name')),
  68. description=get_msgid(setting[1].get('description')),
  69. )
  70. model_setting.save(force_insert=True)
  71. position += 1
  72. def update_settings_group_fixture(group, fixture):
  73. try:
  74. model_group = SettingsGroup.objects.get(key=group)
  75. settings = {}
  76. for setting in model_group.setting_set.all():
  77. settings[setting.pk] = setting.value
  78. model_group.delete()
  79. load_settings_group_fixture(group, fixture)
  80. for setting in settings:
  81. try:
  82. new_setting = Setting.objects.get(pk=setting)
  83. new_setting.value = settings[setting]
  84. new_setting.save(force_update=True)
  85. except Setting.DoesNotExist:
  86. pass
  87. except SettingsGroup.DoesNotExist:
  88. load_settings_group_fixture(group, fixture)
  89. def load_settings_fixture(fixture):
  90. for group in fixture:
  91. load_settings_group_fixture(group[0], group[1])
  92. def update_settings_fixture(fixture):
  93. for group in fixture:
  94. update_settings_group_fixture(group[0], group[1])
  95. def load_monitor_fixture(fixture):
  96. for id in fixture.keys():
  97. item = MonitorItem.objects.create(
  98. id=id,
  99. value=fixture[id],
  100. updated=timezone.now()
  101. )