Package coprs :: Module whoosheers
[hide private]
[frames] | no frames]

Source Code for Module coprs.whoosheers

  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 # treat dash as a normal character - so searching for example 21 # "copr-dev" will really search for "copr-dev" 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] # copr-specific: must inherit from CoprSearchRelatedData class 36 37 auto_update = False 38 39 @classmethod
40 - def update_copr(cls, writer, copr):
50 51 @classmethod
52 - def update_package(cls, writer, package):
53 writer.update_document(copr_id=package.copr.id, packages=cls.get_package_names(package.copr))
54 55 @classmethod
56 - def insert_copr(cls, writer, copr):
66 67 @classmethod
68 - def insert_package(cls, writer, package):
69 writer.update_document(copr_id=package.copr.id, packages=cls.get_package_names(package.copr))
70 71 @classmethod
72 - def delete_copr(cls, writer, copr):
73 writer.delete_by_term("copr_id", copr.id)
74 75 @classmethod
76 - def delete_package(cls, writer, package):
77 writer.update_document(copr_id=package.copr.id, packages=cls.get_package_names(package.copr))
78 79 @classmethod
80 - def get_chroot_info(cls, copr):
81 # NOTE: orm db session for Copr model is already committed at the point insert_*/update_* methods are called. 82 # Hence we use db.engine directly (for a new session). 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
94 - def get_package_names(cls, copr):
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
105 - def on_commit(cls, app, changes):
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
117 118 -class WhoosheeStamp(object):
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
128 - def current(cls):
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
136 - def store(cls):
137 with open(cls.PATH, "w") as f: 138 f.write(cls.current())
139 140 @classmethod
141 - def read(cls):
142 try: 143 with open(cls.PATH, "r") as f: 144 return f.read().rstrip() 145 except OSError: 146 return None
147 148 @classmethod
149 - def is_valid(cls):
150 return cls.read() == cls.current()
151