search.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. # -*- coding: utf-8 -*-
  2. """
  3. flaskbb.utils.search
  4. ~~~~~~~~~~~~~~~~~~~~
  5. This module contains all the whoosheers for FlaskBB's
  6. full text search.
  7. :copyright: (c) 2016 by the FlaskBB Team.
  8. :license: BSD, see LICENSE for more details.
  9. """
  10. import whoosh
  11. from flask_whooshee import AbstractWhoosheer
  12. from flaskbb.forum.models import Forum, Topic, Post
  13. from flaskbb.user.models import User
  14. class PostWhoosheer(AbstractWhoosheer):
  15. models = [Post]
  16. schema = whoosh.fields.Schema(
  17. post_id=whoosh.fields.NUMERIC(stored=True, unique=True),
  18. username=whoosh.fields.TEXT(),
  19. modified_by=whoosh.fields.TEXT(),
  20. content=whoosh.fields.TEXT()
  21. )
  22. @classmethod
  23. def update_post(cls, writer, post):
  24. writer.update_document(
  25. post_id=post.id,
  26. username=post.username,
  27. modified_by=post.modified_by,
  28. content=post.content
  29. )
  30. @classmethod
  31. def insert_post(cls, writer, post):
  32. writer.add_document(
  33. post_id=post.id,
  34. username=post.username,
  35. modified_by=post.modified_by,
  36. content=post.content
  37. )
  38. @classmethod
  39. def delete_post(cls, writer, post):
  40. writer.delete_by_term('post_id', post.id)
  41. class TopicWhoosheer(AbstractWhoosheer):
  42. models = [Topic]
  43. schema = whoosh.fields.Schema(
  44. topic_id=whoosh.fields.NUMERIC(stored=True, unique=True),
  45. title=whoosh.fields.TEXT(),
  46. username=whoosh.fields.TEXT(),
  47. content=whoosh.fields.TEXT()
  48. )
  49. @classmethod
  50. def update_topic(cls, writer, topic):
  51. writer.update_document(
  52. topic_id=topic.id,
  53. title=topic.title,
  54. username=topic.username,
  55. content=getattr(topic.first_post,'content',None)
  56. )
  57. @classmethod
  58. def insert_topic(cls, writer, topic):
  59. writer.add_document(
  60. topic_id=topic.id,
  61. title=topic.title,
  62. username=topic.username,
  63. content=getattr(topic.first_post,'content',None)
  64. )
  65. @classmethod
  66. def delete_topic(cls, writer, topic):
  67. writer.delete_by_term('topic_id', topic.id)
  68. class ForumWhoosheer(AbstractWhoosheer):
  69. models = [Forum]
  70. schema = whoosh.fields.Schema(
  71. forum_id=whoosh.fields.NUMERIC(stored=True, unique=True),
  72. title=whoosh.fields.TEXT(),
  73. description=whoosh.fields.TEXT()
  74. )
  75. @classmethod
  76. def update_forum(cls, writer, forum):
  77. writer.update_document(
  78. forum_id=forum.id,
  79. title=forum.title,
  80. description=forum.description
  81. )
  82. @classmethod
  83. def insert_forum(cls, writer, forum):
  84. writer.add_document(
  85. forum_id=forum.id,
  86. title=forum.title,
  87. description=forum.description
  88. )
  89. @classmethod
  90. def delete_forum(cls, writer, forum):
  91. writer.delete_by_term('forum_id', forum.id)
  92. class UserWhoosheer(AbstractWhoosheer):
  93. models = [User]
  94. schema = whoosh.fields.Schema(
  95. user_id=whoosh.fields.NUMERIC(stored=True, unique=True),
  96. username=whoosh.fields.TEXT(),
  97. email=whoosh.fields.TEXT()
  98. )
  99. @classmethod
  100. def update_user(cls, writer, user):
  101. writer.update_document(
  102. user_id=user.id,
  103. username=user.username,
  104. email=user.email
  105. )
  106. @classmethod
  107. def insert_user(cls, writer, user):
  108. writer.add_document(
  109. user_id=user.id,
  110. username=user.username,
  111. email=user.email
  112. )
  113. @classmethod
  114. def delete_user(cls, writer, user):
  115. writer.delete_by_term('user_id', user.id)