fixtures.py 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  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"),
  65. 'description': _("Custom Footnote to display in e-mail messages sent by board."),
  66. 'position': 6,
  67. }),
  68. ),
  69. }),
  70. )
  71. def load_settings_group_fixture(group, fixture):
  72. model_group = Group(
  73. key=group,
  74. name=get_msgid(fixture['name']),
  75. description=get_msgid(fixture.get('description'))
  76. )
  77. model_group.save(force_insert=True)
  78. fixture = fixture.get('settings', ())
  79. for setting in fixture:
  80. value = setting[1].get('value')
  81. value_default = setting[1].get('default')
  82. # Convert boolean True and False to 1 and 0, otherwhise it wont work
  83. if setting[1].get('type') == 'boolean':
  84. value = 1 if value else 0
  85. value_default = 1 if value_default else 0
  86. # Convert array value to string
  87. if setting[1].get('type') == 'array':
  88. value = ','.join(value) if value else ''
  89. value_default = ','.join(value_default) if value_default else ''
  90. # Store setting in database
  91. model_setting = Setting(
  92. setting=setting[0],
  93. group=model_group,
  94. value=value,
  95. value_default=value_default,
  96. type=setting[1].get('type'),
  97. input=setting[1].get('input'),
  98. extra=base64.encodestring(pickle.dumps(setting[1].get('extra', {}), pickle.HIGHEST_PROTOCOL)),
  99. position=setting[1].get('position'),
  100. separator=get_msgid(setting[1].get('separator')),
  101. name=get_msgid(setting[1].get('name')),
  102. description=get_msgid(setting[1].get('description')),
  103. )
  104. model_setting.save(force_insert=True)
  105. def update_settings_group_fixture(group, fixture):
  106. try:
  107. # Get and update group entry
  108. model_group = Group.objects.get(key=group)
  109. model_group.name = get_msgid(fixture['name'])
  110. model_group.description = get_msgid(fixture.get('description'))
  111. model_group.save(force_update=True)
  112. # Update group settings
  113. fixture = fixture.get('settings', ())
  114. for setting in fixture:
  115. try:
  116. # Update setting entry
  117. model_setting = Setting.objects.get(setting=setting[0])
  118. model_setting.value_default = value_default
  119. model_setting.type = setting[1].get('type')
  120. model_setting.input = setting[1].get('input')
  121. model_setting.extra = base64.encodestring(pickle.dumps(setting[1].get('extra', {}), pickle.HIGHEST_PROTOCOL))
  122. model_setting.position = setting[1].get('position')
  123. model_setting.separator = get_msgid(setting[1].get('separator'))
  124. model_setting.name = get_msgid(setting[1].get('name'))
  125. model_setting.description = get_msgid(setting[1].get('description'))
  126. model_setting.save(force_update=True)
  127. except Setting.DoesNotExist:
  128. # Create new setting entry
  129. value = setting[1].get('value')
  130. value_default = setting[1].get('default')
  131. # Convert boolean True and False to 1 and 0, otherwhise it wont work
  132. if setting[1].get('type') == 'boolean':
  133. value = 1 if value else 0
  134. value_default = 1 if value_default else 0
  135. # Convert array value to string
  136. if setting[1].get('type') == 'array':
  137. value = ','.join(value) if value else ''
  138. value_default = ','.join(value_default) if value_default else ''
  139. # Store setting in database
  140. model_setting = Setting(
  141. setting=setting[0],
  142. group=model_group,
  143. value=value,
  144. value_default=value_default,
  145. type=setting[1].get('type'),
  146. input=setting[1].get('input'),
  147. extra=base64.encodestring(pickle.dumps(setting[1].get('extra', {}), pickle.HIGHEST_PROTOCOL)),
  148. position=setting[1].get('position'),
  149. separator=get_msgid(setting[1].get('separator')),
  150. name=get_msgid(setting[1].get('name')),
  151. description=get_msgid(setting[1].get('description')),
  152. )
  153. model_setting.save(force_insert=True)
  154. except Group.DoesNotExist:
  155. load_settings_group_fixture(group, fixture)
  156. def load_settings_fixture(fixture):
  157. for group in fixture:
  158. load_settings_group_fixture(group[0], group[1])
  159. def update_settings_fixture(fixture):
  160. for group in fixture:
  161. update_settings_group_fixture(group[0], group[1])
  162. def load_fixtures():
  163. load_settings_fixture(settings_fixture)