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

Source Code for Module coprs.whoosheers

  1  import whoosh 
  2  import time 
  3   
  4  from flask.ext.whooshee import AbstractWhoosheer 
  5   
  6  from coprs import models 
  7  from coprs import whooshee 
  8  from coprs import db 
9 10 11 @whooshee.register_whoosheer 12 -class CoprWhoosheer(AbstractWhoosheer):
13 schema = whoosh.fields.Schema( 14 copr_id=whoosh.fields.NUMERIC(stored=True, unique=True), 15 user_id=whoosh.fields.NUMERIC(stored=True), 16 group_id=whoosh.fields.NUMERIC(stored=True), 17 # treat dash as a normal character - so searching for example 18 # "copr-dev" will really search for "copr-dev" 19 ownername=whoosh.fields.TEXT( 20 analyzer=whoosh.analysis.StandardAnalyzer( 21 expression=r"@?\w+(-\.?\w+)*"), field_boost=2), 22 coprname=whoosh.fields.TEXT( 23 analyzer=whoosh.analysis.StandardAnalyzer( 24 expression=r"\w+(-\.?\w+)*"), field_boost=3), 25 chroots=whoosh.fields.TEXT(field_boost=2), 26 packages=whoosh.fields.TEXT( 27 analyzer=whoosh.analysis.StandardAnalyzer( 28 expression=r"\s+", gaps=True), field_boost=2), 29 description=whoosh.fields.TEXT(), 30 instructions=whoosh.fields.TEXT()) 31 32 models = [models.Copr, models.Package] # copr-specific: must inherit from CoprSearchRelatedData class 33 34 auto_update = False 35 36 @classmethod
37 - def update_copr(cls, writer, copr):
38 writer.update_document(copr_id=copr.id, 39 user_id=copr.user.id, 40 group_id=copr.group.id if copr.group else None, 41 ownername=copr.owner_name, 42 coprname=copr.name, 43 chroots=cls.get_chroot_info(copr), 44 packages=cls.get_package_names(copr), 45 description=copr.description, 46 instructions=copr.instructions)
47 48 @classmethod
49 - def update_package(cls, writer, package):
50 writer.update_document(copr_id=package.copr.id, packages=cls.get_package_names(package.copr))
51 52 @classmethod
53 - def insert_copr(cls, writer, copr):
54 writer.add_document(copr_id=copr.id, 55 user_id=copr.user.id, 56 group_id=copr.group.id if copr.group else None, 57 ownername=copr.owner_name, 58 coprname=copr.name, 59 chroots=cls.get_chroot_info(copr), 60 packages=cls.get_package_names(copr), 61 description=copr.description, 62 instructions=copr.instructions)
63 64 @classmethod
65 - def insert_package(cls, writer, package):
66 writer.update_document(copr_id=package.copr.id, packages=cls.get_package_names(package.copr))
67 68 @classmethod
69 - def delete_copr(cls, writer, copr):
70 writer.delete_by_term("copr_id", copr.id)
71 72 @classmethod
73 - def delete_package(cls, writer, package):
74 writer.update_document(copr_id=package.copr.id, packages=cls.get_package_names(package.copr))
75 76 @classmethod
77 - def get_chroot_info(cls, copr):
78 # NOTE: orm db session for Copr model is already commited at the point insert_*/update_* methods are called. 79 # Hence we use db.engine directly (for a new session). 80 result = db.engine.execute( 81 """ 82 SELECT os_release, os_version, arch 83 FROM mock_chroot 84 JOIN copr_chroot ON copr_chroot.mock_chroot_id=mock_chroot.id 85 WHERE copr_chroot.copr_id={0} 86 """.format(copr.id) 87 ) 88 return ["{}-{}-{}".format(t[0], t[1], t[2]) for t in result.fetchall()]
89 90 @classmethod
91 - def get_package_names(cls, copr):
92 result = db.engine.execute( 93 """ 94 SELECT name 95 FROM package 96 WHERE copr_id={0} 97 """.format(copr.id) 98 ) 99 return [row[0] for row in result.fetchall()]
100 101 @classmethod
102 - def on_commit(cls, app, changes):
103 """Should be registered with flask.ext.sqlalchemy.models_committed.""" 104 for change in changes: 105 if change[0].__class__ in cls.models: 106 copr_id = change[0].get_search_related_copr_id() 107 db.engine.execute( 108 """ 109 UPDATE copr SET latest_indexed_data_update = {0} 110 WHERE copr.id = {1} 111 """.format(int(time.time()), copr_id) 112 )
113