[copr] master: Start using flask-whooshee (13115d7)

bkabrda at fedoraproject.org bkabrda at fedoraproject.org
Thu Feb 14 13:36:46 UTC 2013


Repository : http://git.fedorahosted.org/cgit/copr.git

On branch  : master

>---------------------------------------------------------------

commit 13115d7ad638e2d9a446f0031206da76bbbb5306
Author: Bohuslav Kabrda <bkabrda at redhat.com>
Date:   Thu Feb 14 14:09:43 2013 +0100

    Start using flask-whooshee


>---------------------------------------------------------------

 coprs_frontend/coprs/__init__.py          |    3 ++
 coprs_frontend/coprs/config.py            |    2 +
 coprs_frontend/coprs/logic/coprs_logic.py |    8 ++++-
 coprs_frontend/coprs/whoosheers.py        |   56 +++++++++++++++++++++++++++++
 requirements.txt                          |    1 +
 5 files changed, 69 insertions(+), 1 deletions(-)

diff --git a/coprs_frontend/coprs/__init__.py b/coprs_frontend/coprs/__init__.py
index f239b65..6a9290c 100644
--- a/coprs_frontend/coprs/__init__.py
+++ b/coprs_frontend/coprs/__init__.py
@@ -5,6 +5,7 @@ import flask
 
 from flask.ext.sqlalchemy import SQLAlchemy
 from flask.ext.openid import OpenID
+from flask.ext.whooshee import Whooshee
 
 app = flask.Flask(__name__)
 
@@ -17,10 +18,12 @@ else:
 
 oid = OpenID(app, app.config['OPENID_STORE'])
 db = SQLAlchemy(app)
+whooshee = Whooshee(app)
 
 import coprs.filters
 import coprs.log
 import coprs.models
+import coprs.whoosheers
 
 from coprs.views import api_ns
 from coprs.views.api_ns import api_general
diff --git a/coprs_frontend/coprs/config.py b/coprs_frontend/coprs/config.py
index 6218ea9..b5ee63e 100644
--- a/coprs_frontend/coprs/config.py
+++ b/coprs_frontend/coprs/config.py
@@ -5,6 +5,7 @@ class Config(object):
     DATA_DIR = os.path.join(os.path.dirname(__file__), '../../data')
     DATABASE = os.path.join(DATA_DIR, 'copr.db')
     OPENID_STORE = os.path.join(DATA_DIR, 'openid_store')
+    WHOOSHEE_DIR = os.path.join(DATA_DIR, 'whooshee')
     SECRET_KEY = 'THISISNOTASECRETATALL'
     BACKEND_PASSWORD = 'thisisbackend'
 
@@ -33,6 +34,7 @@ class UnitTestConfig(Config):
     CSRF_ENABLED = False
     DATABASE = os.path.abspath('tests/data/copr.db')
     OPENID_STORE = os.path.abspath('tests/data/openid_store')
+    WHOOSHEE_DIR = os.path.abspath('tests/data/whooshee')
 
     # SQLAlchemy
     SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.abspath(DATABASE)
diff --git a/coprs_frontend/coprs/logic/coprs_logic.py b/coprs_frontend/coprs/logic/coprs_logic.py
index afdeadb..0a1d373 100644
--- a/coprs_frontend/coprs/logic/coprs_logic.py
+++ b/coprs_frontend/coprs/logic/coprs_logic.py
@@ -4,6 +4,7 @@ from coprs import db
 from coprs import exceptions
 from coprs import helpers
 from coprs import models
+from coprs import whoosheers
 
 class CoprsLogic(object):
     """Used for manipulating Coprs. All methods accept user object as a first argument, as this may be needed in future."""
@@ -51,7 +52,12 @@ class CoprsLogic(object):
 
     @classmethod
     def get_multiple_fulltext(cls, user, search_string):
-        query = models.Copr.query.fulltext(models.Copr.copr_ts_col, search_string)
+        try:
+            ids = whoosheers.CoprUserWhoosheer.search(search_string, values_of='copr_id')
+        except ValueError as e:
+            # too short search_string
+            ids = []
+        query = models.Copr.query.filter(models.Copr.id.in_(ids))
         return query
 
     @classmethod
diff --git a/coprs_frontend/coprs/whoosheers.py b/coprs_frontend/coprs/whoosheers.py
new file mode 100644
index 0000000..d5da048
--- /dev/null
+++ b/coprs_frontend/coprs/whoosheers.py
@@ -0,0 +1,56 @@
+import re
+import os
+
+import whoosh
+import whoosh.fields
+import whoosh.index
+import whoosh.qparser
+
+from flask.ext.sqlalchemy import models_committed
+from flask.ext.whooshee import AbstractWhoosheer
+
+from coprs import app
+from coprs import db
+from coprs import models
+from coprs import whooshee
+
+ at whooshee.register_whoosheer
+class CoprUserWhoosheer(AbstractWhoosheer):
+    schema = whoosh.fields.Schema(
+        copr_id = whoosh.fields.NUMERIC(stored=True, unique=True),
+        user_id = whoosh.fields.NUMERIC(stored=True),
+        username = whoosh.fields.TEXT(),
+        coprname = whoosh.fields.TEXT(),
+        description = whoosh.fields.TEXT(),
+        instructions = whoosh.fields.TEXT())
+
+    models = [models.Copr, models.User]
+    index = None
+
+    @classmethod
+    def update_user(cls, writer, user):
+        # TODO: this is not needed now, as users can't change names, but may be needed later
+        pass
+
+    @classmethod
+    def update_copr(cls, writer, copr):
+        writer.update_document(copr_id=copr.id,
+                               user_id=copr.owner.id,
+                               username=copr.owner.name,
+                               coprname=copr.name,
+                               description=copr.description,
+                               instructions=copr.instructions)
+
+    @classmethod
+    def insert_user(cls, writer, user):
+        # nothing, user doesn't have coprs yet
+        pass
+
+    @classmethod
+    def insert_copr(cls, writer, copr):
+        writer.add_document(copr_id=copr.id,
+                            user_id=copr.owner.id,
+                            username=copr.owner.name,
+                            coprname=copr.name,
+                            description=copr.description,
+                            instructions=copr.instructions)
diff --git a/requirements.txt b/requirements.txt
index d3fb7dd..6217ff4 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -7,3 +7,4 @@ flask-wtf
 alembic
 pytest
 flask-script
+flask-whooshee



More information about the copr-devel mailing list