[copr] master: Add a view function for fulltext; alter the template a bit to display the search text (05e4fa9)
by bkabrda@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 05e4fa92e8c8333ba2c6258165672b60d762f209
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Fri Feb 1 12:25:56 2013 +0100
Add a view function for fulltext; alter the template a bit to display the search text
>---------------------------------------------------------------
coprs_frontend/coprs/static/copr.css | 5 +++++
coprs_frontend/coprs/templates/coprs/show.html | 9 ++++++---
.../coprs/views/coprs_ns/coprs_general.py | 12 ++++++++++++
3 files changed, 23 insertions(+), 3 deletions(-)
diff --git a/coprs_frontend/coprs/static/copr.css b/coprs_frontend/coprs/static/copr.css
index a014c68..c5c6f3b 100644
--- a/coprs_frontend/coprs/static/copr.css
+++ b/coprs_frontend/coprs/static/copr.css
@@ -137,6 +137,11 @@ div.copr .repos {
color: #808080;
}
+div.search-results {
+ font-size: 1.3em;
+ text-align: center;
+}
+
div.add-copr {
background-color: #ececec;
padding: 0.5em;
diff --git a/coprs_frontend/coprs/templates/coprs/show.html b/coprs_frontend/coprs/templates/coprs/show.html
index 0b98ed1..c28ebcc 100644
--- a/coprs_frontend/coprs/templates/coprs/show.html
+++ b/coprs_frontend/coprs/templates/coprs/show.html
@@ -17,6 +17,9 @@
{% if g.user %}
<div class="add-copr">+ <a href={{ url_for('coprs_ns.copr_add') }}>add a new Copr</a></div>
{% endif %}
+ {% if fulltext %}
+ <div class="search-results">Displaying results for search "{{ fulltext }}"</div>
+ {% endif %}
{% for copr in coprs %}
<div class="copr">
<a href="{{ url_for('coprs_ns.copr_detail', username = copr.owner.name, coprname = copr.name) }}">{{ copr.owner.name }}/{{ copr.name }}</a>
@@ -30,8 +33,8 @@
{% else %}
<p>No coprs...</p>
{% endfor %}
- <div class="pagination">
- {{ render_pagination(request, paginator) }}
- </div>
+ <div class="pagination">
+ {{ render_pagination(request, paginator) }}
+ </div>
</div>
{% endblock %}
diff --git a/coprs_frontend/coprs/views/coprs_ns/coprs_general.py b/coprs_frontend/coprs/views/coprs_ns/coprs_general.py
index 4e5172a..fb00e4c 100644
--- a/coprs_frontend/coprs/views/coprs_ns/coprs_general.py
+++ b/coprs_frontend/coprs/views/coprs_ns/coprs_general.py
@@ -51,6 +51,18 @@ def coprs_by_allowed(username=None, page=1):
coprs = paginator.sliced_query
return flask.render_template('coprs/show.html', coprs=coprs, paginator=paginator)
+(a)coprs_ns.route('/fulltext/', defaults = {'page': 1})
+(a)coprs_ns.route('/fulltext/<int:page>/')
+def coprs_fulltext_search(page=1):
+ fulltext = flask.request.args.get('fulltext', '')
+ query = coprs_logic.CoprsLogic.get_multiple_fulltext(flask.g.user, fulltext)
+ paginator = helpers.Paginator(query, query.count(), page)
+
+ coprs = paginator.sliced_query
+ return flask.render_template('coprs/show.html',
+ coprs=coprs,
+ paginator=paginator,
+ fulltext=fulltext)
@coprs_ns.route('/add/')
@login_required
11 years, 3 months
[copr] master: Add a logic function for fulltext search (9d1526a)
by bkabrda@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 9d1526a677a578fb90b7ff9037c685837acf8cd3
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Fri Feb 1 12:25:03 2013 +0100
Add a logic function for fulltext search
>---------------------------------------------------------------
coprs_frontend/coprs/logic/coprs_logic.py | 5 +++++
1 files changed, 5 insertions(+), 0 deletions(-)
diff --git a/coprs_frontend/coprs/logic/coprs_logic.py b/coprs_frontend/coprs/logic/coprs_logic.py
index 1fd32e8..ba0266a 100644
--- a/coprs_frontend/coprs/logic/coprs_logic.py
+++ b/coprs_frontend/coprs/logic/coprs_logic.py
@@ -51,6 +51,11 @@ class CoprsLogic(object):
return query
@classmethod
+ def get_multiple_fulltext(cls, user, search_string):
+ query = models.Copr.query.filter(models.Copr.copr_ts_col.match(search_string))
+ return query
+
+ @classmethod
def add(cls, user, name, repos, selected_chroots, description,
instructions, check_for_duplicates=False):
copr = models.Copr(name=name,
11 years, 3 months
[copr] master: Add fulltext search capability to copr model (8edd8b2)
by bkabrda@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 8edd8b29e5da6161a2218ac80a6746597310b27c
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Fri Feb 1 12:24:16 2013 +0100
Add fulltext search capability to copr model
- TODO: we will also need to search user model for name
- TODO: make it work on sqlite for development
>---------------------------------------------------------------
.../versions/3a035889852c_add_copr_fulltext.py | 44 ++++++++++++++++++++
coprs_frontend/coprs/models.py | 16 +++++++
coprs_frontend/coprs/sql_types.py | 10 ++++
3 files changed, 70 insertions(+), 0 deletions(-)
diff --git a/coprs_frontend/alembic/versions/3a035889852c_add_copr_fulltext.py b/coprs_frontend/alembic/versions/3a035889852c_add_copr_fulltext.py
new file mode 100644
index 0000000..ac0c71a
--- /dev/null
+++ b/coprs_frontend/alembic/versions/3a035889852c_add_copr_fulltext.py
@@ -0,0 +1,44 @@
+"""add_copr_fulltext
+
+Revision ID: 3a035889852c
+Revises: 3c3cce7a5fe0
+Create Date: 2013-02-01 10:06:37.034495
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = '3a035889852c'
+down_revision = '3c3cce7a5fe0'
+
+from alembic import op
+import sqlalchemy as sa
+
+from coprs import sql_types
+
+def upgrade():
+ ### commands auto generated by Alembic - please adjust! ###
+ op.add_column('copr', sa.Column('copr_ts_col', sql_types.Tsvector(), nullable=True))
+ op.create_index('copr_ts_idx', 'copr', ['copr_ts_col'], postgresql_using='gin')
+
+ session = sa.orm.sessionmaker(bind=op.get_bind())()
+ metadata = sa.MetaData()
+ op.execute("UPDATE copr \
+ SET copr_ts_col = to_tsvector('pg_catalog.english', coalesce(name, '') || ' ' || \
+ coalesce(description, '') || ' ' || coalesce(instructions, ''))")
+ if op.get_bind().dialect.name == 'postgresql':
+ # no need to coalesce here, the trigger doesn't need it
+ op.execute("CREATE TRIGGER copr_ts_update BEFORE INSERT OR UPDATE \
+ ON copr \
+ FOR EACH ROW EXECUTE PROCEDURE \
+ tsvector_update_trigger(copr_ts_col, 'pg_catalog.english', name, description, instructions);")
+ elif op.get_bind().dialect.name == 'sqlite':
+ pass #TODO
+ ### end Alembic commands ###
+
+
+def downgrade():
+ ### commands auto generated by Alembic - please adjust! ###
+ op.drop_column('copr', 'copr_ts_col')
+ if op.get_bind().dialect.name == 'postgresql':
+ op.execute("DROP TRIGGER copr_ts_update ON copr")
+ ### end Alembic commands ###
diff --git a/coprs_frontend/coprs/models.py b/coprs_frontend/coprs/models.py
index cfa6857..eef1082 100644
--- a/coprs_frontend/coprs/models.py
+++ b/coprs_frontend/coprs/models.py
@@ -1,10 +1,12 @@
import datetime
+import sqlalchemy
from sqlalchemy.ext.associationproxy import association_proxy
from coprs import constants
from coprs import db
from coprs import helpers
+from coprs import sql_types
class Serializer(object):
def to_dict(self, options = {}):
@@ -114,6 +116,9 @@ class Copr(db.Model, Serializer):
instructions = db.Column(db.Text)
# duplicate information, but speeds up a lot and makes queries simpler
build_count = db.Column(db.Integer, default = 0)
+ # fulltext
+ copr_ts_col = db.Column(sql_types.Tsvector)
+ copr_ts_idx = db.Index('copr_ts_col', postgresql_using='gin')
# relations
owner_id = db.Column(db.Integer, db.ForeignKey('user.id'))
@@ -132,6 +137,17 @@ class Copr(db.Model, Serializer):
def instructions_or_not_filled(self):
return self.instructions or 'Instructions not filled in by author.'
+# fulltext search trigger for copr
+sqlalchemy.event.listen(
+ Copr.__table__,
+ 'after_create',
+ sqlalchemy.schema.DDL("CREATE TRIGGER copr_ts_update BEFORE INSERT OR UPDATE \
+ ON copr \
+ FOR EACH ROW EXECUTE PROCEDURE \
+ tsvector_update_trigger(copr_ts_col, 'pg_catalog.english', name, description, instructions);").\
+ execute_if(dialect='postgresql')
+)
+
class CoprPermission(db.Model, Serializer):
# 0 = nothing, 1 = asked for, 2 = approved
# not using enum, as that translates to varchar on some DBs
diff --git a/coprs_frontend/coprs/sql_types.py b/coprs_frontend/coprs/sql_types.py
new file mode 100644
index 0000000..ea6376d
--- /dev/null
+++ b/coprs_frontend/coprs/sql_types.py
@@ -0,0 +1,10 @@
+from sqlalchemy import types
+from sqlalchemy.ext import compiler
+
+class Tsvector(types.UnicodeText):
+ # TODO: define the custom operator to perform fulltext searches ?
+ pass
+
+(a)compiler.compiles(Tsvector, 'postgresql')
+def compile_tsvector(element, compiler, **kw):
+ return 'tsvector'
11 years, 3 months
[copr] master: Delete forgotten debug print (5eadce6)
by bkabrda@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 5eadce66b39c641010cd680498fac39601bcffc0
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Fri Feb 1 09:18:13 2013 +0100
Delete forgotten debug print
>---------------------------------------------------------------
.../coprs/views/coprs_ns/coprs_general.py | 1 -
1 files changed, 0 insertions(+), 1 deletions(-)
diff --git a/coprs_frontend/coprs/views/coprs_ns/coprs_general.py b/coprs_frontend/coprs/views/coprs_ns/coprs_general.py
index 2f32925..4e5172a 100644
--- a/coprs_frontend/coprs/views/coprs_ns/coprs_general.py
+++ b/coprs_frontend/coprs/views/coprs_ns/coprs_general.py
@@ -93,7 +93,6 @@ def copr_new():
def copr_detail(username, coprname):
query = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname, with_mock_chroots=True)
try:
- print dir(db)
copr = query.one()
except sqlalchemy.orm.exc.NoResultFound:
return page_not_found('Copr with name {0} does not exist.'.format(coprname))
11 years, 3 months
[copr] master: when you want to have more than one item in a list, good idea to separate them with commas (ca05d75)
by Seth Vidal
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit ca05d758b76cd899afee7675afd935eba4717702
Author: Seth Vidal <skvidal(a)fedoraproject.org>
Date: Thu Jan 31 23:20:23 2013 -0500
when you want to have more than one item in a list,
good idea to separate them with commas
>---------------------------------------------------------------
backend/mockremote.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/backend/mockremote.py b/backend/mockremote.py
index 94cb56e..308c21a 100755
--- a/backend/mockremote.py
+++ b/backend/mockremote.py
@@ -511,7 +511,7 @@ class MockRemote(object):
self.callback.log("Success building %s" % os.path.basename(pkg))
built_pkgs.append(pkg)
# createrepo with the new pkgs
- for d in [self.destdir + self.destdir + '/' + self.chroot]:
+ for d in [self.destdir, self.destdir + '/' + self.chroot]:
rc, out, err = createrepo(d)
if err.strip():
self.callback.error("Error making local repo: %s" % d)
11 years, 3 months
[copr] master: list doesn't have copy() of course (e4bb93e)
by Seth Vidal
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit e4bb93e68a6d2f9fa348b1a95c0674f71143d2c1
Author: Seth Vidal <skvidal(a)fedoraproject.org>
Date: Thu Jan 31 19:43:02 2013 -0500
list doesn't have copy() of course
>---------------------------------------------------------------
backend/dispatcher.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/backend/dispatcher.py b/backend/dispatcher.py
index d7e162a..610b619 100644
--- a/backend/dispatcher.py
+++ b/backend/dispatcher.py
@@ -294,7 +294,7 @@ class Worker(multiprocessing.Process):
self.callback.log('Starting build: id=%r builder=%r timeout=%r destdir=%r chroot=%r repos=%r' % (job.build_id,ip, job.timeout, job.destdir, chroot, str(job.repos)))
self.callback.log('building pkgs: %s' % ' '.join(job.pkgs))
try:
- chroot_repos = job.repos.copy()
+ chroot_repos = list(job.repos)
chroot_repos.append(job.results + '/' + chroot)
chrootlogfile = chroot_destdir + '/build-%s.log' % job.build_id
mr = mockremote.MockRemote(builder=ip, timeout=job.timeout,
11 years, 3 months
[copr] master: typo - need to run pyflakes before I commit more :) (7f513fd)
by Seth Vidal
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 7f513fd1691b5a63bcefdd1a638a710868256521
Author: Seth Vidal <skvidal(a)fedoraproject.org>
Date: Thu Jan 31 19:34:48 2013 -0500
typo - need to run pyflakes before I commit more :)
>---------------------------------------------------------------
backend/mockremote.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/backend/mockremote.py b/backend/mockremote.py
index 4c52a87..94cb56e 100755
--- a/backend/mockremote.py
+++ b/backend/mockremote.py
@@ -511,7 +511,7 @@ class MockRemote(object):
self.callback.log("Success building %s" % os.path.basename(pkg))
built_pkgs.append(pkg)
# createrepo with the new pkgs
- for d in [self.destdir + self.destdir + '/' + self.chroot]
+ for d in [self.destdir + self.destdir + '/' + self.chroot]:
rc, out, err = createrepo(d)
if err.strip():
self.callback.error("Error making local repo: %s" % d)
11 years, 3 months
[copr] master: - createrepo on the chroot dir - add the chroot repo to the mockchain automatically. (619953f)
by Seth Vidal
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 619953f5563a09045d2e1a817fb25a94412bbf83
Author: Seth Vidal <skvidal(a)fedoraproject.org>
Date: Thu Jan 31 19:10:21 2013 -0500
- createrepo on the chroot dir
- add the chroot repo to the mockchain automatically.
>---------------------------------------------------------------
backend/dispatcher.py | 6 +++---
backend/mockremote.py | 11 ++++++-----
2 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/backend/dispatcher.py b/backend/dispatcher.py
index 5fa6aa0..d7e162a 100644
--- a/backend/dispatcher.py
+++ b/backend/dispatcher.py
@@ -174,8 +174,6 @@ class Worker(multiprocessing.Process):
jobdata.destdir = self.opts.destdir + '/' + build['copr']['owner']['name'] + '/' + build['copr']['name'] + '/'
jobdata.build_id = build['id']
jobdata.results = self.opts.results_baseurl + '/' + build['copr']['owner']['name'] + '/' + build['copr']['name'] + '/'
- # add the results dir to the jobdata.repos
- jobdata.repos.append(jobdata.results)
jobdata.copr_id = build['copr']['id']
jobdata.user_id = build['user_id']
jobdata.user_name = build['copr']['owner']['name']
@@ -296,10 +294,12 @@ class Worker(multiprocessing.Process):
self.callback.log('Starting build: id=%r builder=%r timeout=%r destdir=%r chroot=%r repos=%r' % (job.build_id,ip, job.timeout, job.destdir, chroot, str(job.repos)))
self.callback.log('building pkgs: %s' % ' '.join(job.pkgs))
try:
+ chroot_repos = job.repos.copy()
+ chroot_repos.append(job.results + '/' + chroot)
chrootlogfile = chroot_destdir + '/build-%s.log' % job.build_id
mr = mockremote.MockRemote(builder=ip, timeout=job.timeout,
destdir=job.destdir, chroot=chroot, cont=True, recurse=True,
- repos=job.repos,
+ repos=chroot_repos,
callback=mockremote.CliLogCallBack(quiet=True,logfn=chrootlogfile))
mr.build_pkgs(job.pkgs)
except mockremote.MockRemoteError, e:
diff --git a/backend/mockremote.py b/backend/mockremote.py
index 2e1e19f..4c52a87 100755
--- a/backend/mockremote.py
+++ b/backend/mockremote.py
@@ -511,11 +511,12 @@ class MockRemote(object):
self.callback.log("Success building %s" % os.path.basename(pkg))
built_pkgs.append(pkg)
# createrepo with the new pkgs
- rc, out, err = createrepo(self.destdir)
- if err.strip():
- self.callback.error("Error making local repo: %s" % self.destdir)
- self.callback.error("%s" % err)
- #FIXME - maybe clean up .repodata and .olddata here?
+ for d in [self.destdir + self.destdir + '/' + self.chroot]
+ rc, out, err = createrepo(d)
+ if err.strip():
+ self.callback.error("Error making local repo: %s" % d)
+ self.callback.error("%s" % err)
+ #FIXME - maybe clean up .repodata and .olddata here?
if self.failed:
if len(self.failed) != len(to_be_built):
11 years, 3 months