populate.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. # -*- coding: utf-8 -*-
  2. """
  3. flaskbb.utils.populate
  4. ~~~~~~~~~~~~~~~~~~~~
  5. A module that makes creating data more easily
  6. :copyright: (c) 2014 by the FlaskBB Team.
  7. :license: BSD, see LICENSE for more details.
  8. """
  9. from flaskbb.management.models import Setting, SettingsGroup
  10. from flaskbb.user.models import User, Group
  11. from flaskbb.forum.models import Post, Topic, Forum, Category
  12. def delete_settings_from_fixture(fixture):
  13. """
  14. Deletes the settings from a fixture from the database.
  15. """
  16. for settingsgroup in fixture:
  17. group = SettingsGroup.query.filter_by(key=settingsgroup[0]).first()
  18. for settings in settingsgroup[1]['settings']:
  19. setting = Setting.query.filter_by(key=settings[0]).first()
  20. setting.delete()
  21. group.delete()
  22. def create_settings_from_fixture(fixture):
  23. """
  24. Inserts the settings from a fixture into the database.
  25. """
  26. for settingsgroup in fixture:
  27. group = SettingsGroup(
  28. key=settingsgroup[0],
  29. name=settingsgroup[1]['name'],
  30. description=settingsgroup[1]['description']
  31. )
  32. group.save()
  33. for settings in settingsgroup[1]['settings']:
  34. setting = Setting(
  35. key=settings[0],
  36. value=settings[1]['value'],
  37. value_type=settings[1]['value_type'],
  38. name=settings[1]['name'],
  39. description=settings[1]['description'],
  40. extra=settings[1].get('extra', ""), # Optional field
  41. settingsgroup=group.key
  42. )
  43. setting.save()
  44. def update_settings_from_fixture(fixture, overwrite_group=False,
  45. overwrite_setting=False):
  46. """
  47. Updates the database settings from a fixture.
  48. Returns the number of updated groups and settings.
  49. """
  50. groups_count = 0
  51. settings_count = 0
  52. for settingsgroup in fixture:
  53. group = SettingsGroup.query.filter_by(key=settingsgroup[0]).first()
  54. if group is not None and overwrite_group or group is None:
  55. groups_count += 1
  56. group = SettingsGroup(
  57. key=settingsgroup[0],
  58. name=settingsgroup[1]['name'],
  59. description=settingsgroup[1]['description']
  60. )
  61. group.save()
  62. for settings in settingsgroup[1]['settings']:
  63. setting = Setting.query.filter_by(key=settings[0]).first()
  64. if setting is not None and overwrite_setting or setting is None:
  65. settings_count += 1
  66. setting = Setting(
  67. key=settings[0],
  68. value=settings[1]['value'],
  69. value_type=settings[1]['value_type'],
  70. name=settings[1]['name'],
  71. description=settings[1]['description'],
  72. extra=settings[1].get('extra', ""),
  73. settingsgroup=group.key
  74. )
  75. setting.save()
  76. return groups_count, settings_count
  77. def create_default_settings():
  78. """
  79. Creates the default settings
  80. """
  81. from flaskbb.fixtures.settings import fixture
  82. create_settings_from_fixture(fixture)
  83. def create_default_groups():
  84. """
  85. This will create the 5 default groups
  86. """
  87. from flaskbb.fixtures.groups import fixture
  88. result = []
  89. for key, value in fixture.items():
  90. group = Group(name=key)
  91. for k, v in value.items():
  92. setattr(group, k, v)
  93. group.save()
  94. result.append(group)
  95. return result
  96. def create_admin_user(username, password, email):
  97. """
  98. Creates the administrator user
  99. """
  100. admin_group = Group.query.filter_by(admin=True).first()
  101. user = User()
  102. user.username = username
  103. user.password = password
  104. user.email = email
  105. user.primary_group_id = admin_group.id
  106. user.save()
  107. def create_welcome_forum():
  108. """
  109. This will create the `welcome forum` that nearly every
  110. forum software has after the installation process is finished
  111. """
  112. if User.query.count() < 1:
  113. raise "You need to create the admin user first!"
  114. user = User.query.filter_by(id=1).first()
  115. category = Category(title="My Category", position=1)
  116. category.save()
  117. forum = Forum(title="Welcome", description="Your first forum",
  118. category_id=category.id)
  119. forum.save()
  120. topic = Topic(title="Welcome!")
  121. post = Post(content="Have fun with your new FlaskBB Forum!")
  122. topic.save(user=user, forum=forum, post=post)
  123. def create_test_data():
  124. """
  125. Creates 5 users, 2 categories and 2 forums in each category. It also opens
  126. a new topic topic in each forum with a post.
  127. """
  128. create_default_groups()
  129. create_default_settings()
  130. # create 5 users
  131. for u in range(1, 6):
  132. username = "test%s" % u
  133. email = "test%s@example.org" % u
  134. user = User(username=username, password="test", email=email)
  135. user.primary_group_id = u
  136. user.save()
  137. user1 = User.query.filter_by(id=1).first()
  138. user2 = User.query.filter_by(id=2).first()
  139. # create 2 categories
  140. for i in range(1, 3):
  141. category_title = "Test Category %s" % i
  142. category = Category(title=category_title,
  143. description="Test Description")
  144. category.save()
  145. # create 2 forums in each category
  146. for j in range(1, 3):
  147. if i == 2:
  148. j += 2
  149. forum_title = "Test Forum %s %s" % (j, i)
  150. forum = Forum(title=forum_title, description="Test Description",
  151. category_id=i)
  152. forum.save()
  153. # create a topic
  154. topic = Topic()
  155. post = Post()
  156. topic.title = "Test Title %s" % j
  157. post.content = "Test Content"
  158. topic.save(post=post, user=user1, forum=forum)
  159. # create a second post in the forum
  160. post = Post()
  161. post.content = "Test Post"
  162. post.save(user=user2, topic=topic)
  163. def insert_mass_data():
  164. """
  165. Creates 100 topics in the first forum and each topic has 100 posts.
  166. """
  167. user1 = User.query.filter_by(id=1).first()
  168. user2 = User.query.filter_by(id=2).first()
  169. forum = Forum.query.filter_by(id=1).first()
  170. # create 1000 topics
  171. for i in range(1, 101):
  172. # create a topic
  173. topic = Topic()
  174. post = Post()
  175. topic.title = "Test Title %s" % i
  176. post.content = "Test Content"
  177. topic.save(post=post, user=user1, forum=forum)
  178. # create 100 posts in each topic
  179. for j in range(1, 100):
  180. post = Post()
  181. post.content = "Test Post"
  182. post.save(user=user2, topic=topic)