fixtures.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. import base64
  2. from misago.settings.models import Group, Setting
  3. from misago.utils import ugettext_lazy as _
  4. from misago.utils import get_msgid
  5. try:
  6. import cPickle as pickle
  7. except ImportError:
  8. import pickle
  9. settings_fixture = (
  10. # Basic options
  11. ('basic', {
  12. 'name': _("Basic Settings"),
  13. 'settings': (
  14. ('board_name', {
  15. 'value': "Misago",
  16. 'type': "string",
  17. 'input': "text",
  18. 'separator': _("Board Name"),
  19. 'name': _("Board Name"),
  20. 'position': 0,
  21. }),
  22. ('board_header', {
  23. 'type': "string",
  24. 'input': "text",
  25. 'name': _("Board Header"),
  26. 'description': _("Some themes allow you to define text in board header. Leave empty to use Board Name instead."),
  27. 'position': 1,
  28. }),
  29. ('board_header_postscript', {
  30. 'value': "Work in progress ",
  31. 'type': "string",
  32. 'input': "text",
  33. 'name': _("Board Header Postscript"),
  34. 'description': _("Additional text displayed in some themes board header after board name."),
  35. 'position': 2,
  36. }),
  37. ('board_index_title', {
  38. 'type': "string",
  39. 'input': "text",
  40. 'separator': _("Board Index"),
  41. 'name': _("Board Index Title"),
  42. 'description': _("If you want to, you can replace page title content on Board Index with custom one."),
  43. 'position': 3,
  44. }),
  45. ('board_index_meta', {
  46. 'type': "string",
  47. 'input': "text",
  48. 'name': _("Board Index Meta-Description"),
  49. 'description': _("Meta-Description used to describe your board's index page."),
  50. 'position': 4,
  51. }),
  52. ('board_credits', {
  53. 'type': "string",
  54. 'input': "textarea",
  55. 'separator': _("Board Footer"),
  56. 'name': _("Custom Credit"),
  57. 'description': _("Custom Credit to display in board footer above software and theme copyright information. You can use HTML."),
  58. 'position': 5,
  59. }),
  60. ('email_footnote', {
  61. 'type': "string",
  62. 'input': "textarea",
  63. 'separator': _("Board E-Mails"),
  64. 'name': _("Custom Footnote in HTML E-mails"),
  65. 'description': _("Custom Footnote to display in HTML e-mail messages sent by board."),
  66. 'position': 6,
  67. }),
  68. ('email_footnote_plain', {
  69. 'type': "string",
  70. 'input': "textarea",
  71. 'name': _("Custom Footnote in plain text E-mails"),
  72. 'description': _("Custom Footnote to display in plain text e-mail messages sent by board."),
  73. 'position': 7,
  74. }),
  75. ),
  76. }),
  77. )
  78. def load_settings_group_fixture(group, fixture):
  79. model_group = Group(
  80. key=group,
  81. name=get_msgid(fixture['name']),
  82. description=get_msgid(fixture.get('description'))
  83. )
  84. model_group.save(force_insert=True)
  85. fixture = fixture.get('settings', ())
  86. for setting in fixture:
  87. value = setting[1].get('value')
  88. value_default = setting[1].get('default')
  89. # Convert boolean True and False to 1 and 0, otherwhise it wont work
  90. if setting[1].get('type') == 'boolean':
  91. value = 1 if value else 0
  92. value_default = 1 if value_default else 0
  93. # Convert array value to string
  94. if setting[1].get('type') == 'array':
  95. value = ','.join(value) if value else ''
  96. value_default = ','.join(value_default) if value_default else ''
  97. # Store setting in database
  98. model_setting = Setting(
  99. setting=setting[0],
  100. group=model_group,
  101. value=value,
  102. value_default=value_default,
  103. type=setting[1].get('type'),
  104. input=setting[1].get('input'),
  105. extra=base64.encodestring(pickle.dumps(setting[1].get('extra', {}), pickle.HIGHEST_PROTOCOL)),
  106. position=setting[1].get('position'),
  107. separator=get_msgid(setting[1].get('separator')),
  108. name=get_msgid(setting[1].get('name')),
  109. description=get_msgid(setting[1].get('description')),
  110. )
  111. model_setting.save(force_insert=True)
  112. def update_settings_group_fixture(group, fixture):
  113. try:
  114. model_group = Group.objects.get(key=group)
  115. settings = {}
  116. for setting in model_group.setting_set.all():
  117. settings[setting.pk] = setting.value
  118. model_group.delete()
  119. load_settings_group_fixture(group, fixture)
  120. for setting in settings:
  121. try:
  122. new_setting = Setting.objects.get(pk=setting)
  123. new_setting.value = settings[setting]
  124. new_setting.save(force_update=True)
  125. except Setting.DoesNotExist:
  126. pass
  127. except Group.DoesNotExist:
  128. load_settings_group_fixture(group, fixture)
  129. def load_settings_fixture(fixture):
  130. for group in fixture:
  131. load_settings_group_fixture(group[0], group[1])
  132. def update_settings_fixture(fixture):
  133. for group in fixture:
  134. update_settings_group_fixture(group[0], group[1])
  135. def load_fixtures():
  136. load_settings_fixture(settings_fixture)
  137. def update_fixtures():
  138. update_settings_fixture(settings_fixture)