1
+ """
2
+ Indexes sqlalchemy changes to elasticsearch. It does not handle
3
+ db cascades so they should be avoided.
4
+ """
5
+
6
+ import transaction
1
7
from sqlalchemy import event
2
8
from elasticsearch import Elasticsearch
3
9
from pyramid .threadlocal import get_current_registry
6
12
from warehouse .packaging .models import Release
7
13
8
14
9
- release_options = dict (index = "warehouse" ,
10
- doc_type = "release" )
11
-
12
-
13
- def get_elasticsearch ():
14
- """Configures Elasticsearch and returns the object"""
15
- es_url = get_current_registry ().settings ["elasticsearch.url" ]
16
- return Elasticsearch ([es_url ])
15
+ release_defaults = dict (index = "warehouse" ,
16
+ doc_type = "release" )
17
17
18
-
19
- @event .listens_for (Release , 'after_insert' )
20
- @event .listens_for (Release , 'after_update' )
21
- def release_insert_update (mapper , connection , target ):
22
- """Signal insert/update events for Release model"""
23
- es = get_elasticsearch ()
18
+ def handle_insert (elasticsearch_url , target ):
19
+ es = Elasticsearch ([es_url ])
24
20
es .index (id = target .name ,
25
21
body = {"name" : target .name ,
26
22
"version" : target .version ,
27
23
"description" : target .description ,
28
24
"summary" : target .summary ,
29
25
"license" : target .license ,
30
26
"download_url" : target .download_url },
31
- ** release_options )
32
-
33
-
34
- @event .listens_for (Release , 'before_delete' )
35
- def release_delete (mapper , connection , target ):
36
- """Signal idelete event for Release model"""
37
- es = get_elasticsearch ()
38
- es .delete (id = target .id , ** release_options )
39
-
40
-
41
- @event .listens_for (_Session , 'after_bulk_update' )
42
- def release_after_bulk_update (update_context ):
43
- pass # TODO: implement
44
-
45
-
46
- @event .listens_for (_Session , 'after_bulk_delete' )
47
- def release_after_bulk_delete (update_context ):
48
- pass # TODO: implement
27
+ ** release_defaults )
28
+
29
+ def handle_delete (elasticsearch_url , target ):
30
+ es = Elasticsearch ([es_url ])
31
+ es .delete (id = target .id , ** release_defaults )
32
+
33
+ def includeme (config ):
34
+ """Register elasticsearch callbacks"""
35
+ elasticsearch_url = config .registry .settings ["elasticsearch.url" ]
36
+
37
+ @event .listens_for (Release , 'after_insert' )
38
+ @event .listens_for (Release , 'after_update' )
39
+ def release_insert_update (mapper , connection , target ):
40
+ """Signal insert/update events for Release model"""
41
+ tx = transaction .get ()
42
+ tx .addAfterCommitHook (handle_insert , args = (elasticsearch_url , target ))
43
+
44
+ @event .listens_for (Release , 'before_delete' )
45
+ def release_delete (mapper , connection , target ):
46
+ """Signal idelete event for Release model"""
47
+ tx = transaction .get ()
48
+ tx .addAfterCommitHook (handle_delete , args = (elasticsearch_url , target ))
49
+
50
+ @event .listens_for (_Session , 'after_bulk_update' )
51
+ def release_after_bulk_update (update_context ):
52
+ import pdb ;pdb .set_trace ()
53
+
54
+ @event .listens_for (_Session , 'before_bulk_delete' )
55
+ def release_after_bulk_delete (update_context ):
56
+ """Get affected ids before they are deleted"""
57
+ import pdb ;pdb .set_trace ()
0 commit comments