1 import os
2 import whoosh
3 import time
4
5 from subprocess import Popen, PIPE
6 from flask_whooshee import AbstractWhoosheer
7
8 from coprs import app
9 from coprs import models
10 from coprs import whooshee
11 from coprs import db
12
13
14 @whooshee.register_whoosheer
15 -class CoprWhoosheer(AbstractWhoosheer):
16 schema = whoosh.fields.Schema(
17 copr_id=whoosh.fields.NUMERIC(stored=True, unique=True),
18 user_id=whoosh.fields.NUMERIC(stored=True),
19 group_id=whoosh.fields.NUMERIC(stored=True),
20
21
22 ownername=whoosh.fields.TEXT(
23 analyzer=whoosh.analysis.StandardAnalyzer(
24 expression=r"@?\w+(-\.?\w+)*"), field_boost=2),
25 coprname=whoosh.fields.TEXT(
26 analyzer=whoosh.analysis.StandardAnalyzer(
27 expression=r"\w+(-\.?\w+)*"), field_boost=3),
28 chroots=whoosh.fields.TEXT(field_boost=2),
29 packages=whoosh.fields.TEXT(
30 analyzer=whoosh.analysis.StandardAnalyzer(
31 expression=r"\s+", gaps=True), field_boost=2),
32 description=whoosh.fields.TEXT(),
33 instructions=whoosh.fields.TEXT())
34
35 models = [models.Copr, models.Package]
36
37 auto_update = False
38
39 @classmethod
50
51 @classmethod
54
55 @classmethod
66
67 @classmethod
70
71 @classmethod
73 writer.delete_by_term("copr_id", copr.id)
74
75 @classmethod
78
79 @classmethod
81
82
83 result = db.engine.execute(
84 """
85 SELECT os_release, os_version, arch
86 FROM mock_chroot
87 JOIN copr_chroot ON copr_chroot.mock_chroot_id=mock_chroot.id
88 WHERE copr_chroot.copr_id={0}
89 """.format(copr.id)
90 )
91 return ["{}-{}-{}".format(t[0], t[1], t[2]) for t in result.fetchall()]
92
93 @classmethod
95 result = db.engine.execute(
96 """
97 SELECT name
98 FROM package
99 WHERE copr_id={0}
100 """.format(copr.id)
101 )
102 return [row[0] for row in result.fetchall()]
103
104 @classmethod
106 """Should be registered with flask.ext.sqlalchemy.models_committed."""
107 for change in changes:
108 if change[0].__class__ in cls.models:
109 copr_id = change[0].get_search_related_copr_id()
110 db.engine.execute(
111 """
112 UPDATE copr SET latest_indexed_data_update = {0}
113 WHERE copr.id = {1}
114 """.format(int(time.time()), copr_id)
115 )
116
119 """
120 When a whooshee package is updated, it is often needed to rebuild
121 indexes. This class manages a stamp file containing whooshee packages
122 versions and decides whether they are still up-to-date or not.
123 """
124
125 PATH = os.path.join(app.config["WHOOSHEE_DIR"], "whooshee-version")
126
127 @classmethod
129 packages = ["python3-flask-whooshee", "python3-whoosh"]
130 cmd = ["rpm", "-q", "--qf", "%{NAME}-%{VERSION}\n"] + packages
131 process = Popen(cmd, stdout=PIPE, stderr=PIPE)
132 out, err = process.communicate()
133 return out.decode("utf-8").rstrip()
134
135 @classmethod
137 with open(cls.PATH, "w") as f:
138 f.write(cls.current())
139
140 @classmethod
142 try:
143 with open(cls.PATH, "r") as f:
144 return f.read().rstrip()
145 except OSError:
146 return None
147
148 @classmethod
151