|
a/Allura/allura/model/session.py |
|
b/Allura/allura/model/session.py |
1 |
import logging
|
1 |
import logging
|
2 |
import urllib
|
|
|
3 |
from itertools import chain
|
|
|
4 |
|
2 |
|
5 |
from pylons import c
|
3 |
from pylons import c
|
6 |
|
4 |
|
7 |
from ming import Session
|
5 |
from ming import Session
|
8 |
from ming.datastore import ShardedDataStore
|
6 |
from ming.datastore import ShardedDataStore
|
|
... |
|
... |
20 |
self.main_session = main_session
|
18 |
self.main_session = main_session
|
21 |
|
19 |
|
22 |
@property
|
20 |
@property
|
23 |
def db(self):
|
21 |
def db(self):
|
24 |
try:
|
22 |
try:
|
25 |
# Our MagicalC makes sure allura.project is set in the environ when
|
23 |
p = self.project
|
26 |
# c.project is set
|
|
|
27 |
p = environ.get('allura.project', None)
|
|
|
28 |
if p is None:
|
|
|
29 |
# But if we're not using MagicalC, as in paster shell....
|
|
|
30 |
try:
|
|
|
31 |
p = getattr(c, 'project', None)
|
|
|
32 |
except TypeError:
|
|
|
33 |
# running without MagicalC, inside a request (likely EasyWidgets)
|
|
|
34 |
return None
|
|
|
35 |
if p is None: return None
|
|
|
36 |
if p.database_uri:
|
24 |
if p.database_uri:
|
37 |
scheme, rest = p.database_uri.split('://')
|
25 |
scheme, rest = p.database_uri.split('://')
|
38 |
host, database = rest.split('/', 1)
|
26 |
host, database = rest.split('/', 1)
|
39 |
return ShardedDataStore.get(scheme + '://' + host, database).db
|
27 |
return ShardedDataStore.get(scheme + '://' + host, database).db
|
40 |
return getattr(self.main_session.bind.conn, p.database)
|
28 |
return getattr(self.main_session.bind.conn, p.database)
|
41 |
except (KeyError, AttributeError), ex:
|
29 |
except (KeyError, AttributeError), ex:
|
42 |
return None
|
30 |
return None
|
|
|
31 |
|
|
|
32 |
@property
|
|
|
33 |
def project(self):
|
|
|
34 |
# Our MagicalC makes sure allura.project is set in the environ when
|
|
|
35 |
# c.project is set
|
|
|
36 |
p = environ.get('allura.project', None)
|
|
|
37 |
if p is None:
|
|
|
38 |
# But if we're not using MagicalC, as in paster shell....
|
|
|
39 |
try:
|
|
|
40 |
p = getattr(c, 'project', None)
|
|
|
41 |
except TypeError:
|
|
|
42 |
# running without MagicalC, inside a request (likely EasyWidgets)
|
|
|
43 |
return None
|
|
|
44 |
if p is None: return None
|
|
|
45 |
return p
|
43 |
|
46 |
|
44 |
def _impl(self, cls):
|
47 |
def _impl(self, cls):
|
45 |
db = self.db
|
48 |
db = self.db
|
46 |
if db:
|
49 |
if db:
|
47 |
return db[cls.__mongometa__.name]
|
50 |
return db[cls.__mongometa__.name]
|
|
... |
|
... |
51 |
class ArtifactSessionExtension(SessionExtension):
|
54 |
class ArtifactSessionExtension(SessionExtension):
|
52 |
|
55 |
|
53 |
def __init__(self, session):
|
56 |
def __init__(self, session):
|
54 |
SessionExtension.__init__(self, session)
|
57 |
SessionExtension.__init__(self, session)
|
55 |
self.objects_added = []
|
58 |
self.objects_added = []
|
|
|
59 |
self.objects_modified = []
|
56 |
self.objects_deleted = []
|
60 |
self.objects_deleted = []
|
57 |
|
61 |
|
58 |
def before_flush(self, obj=None):
|
62 |
def before_flush(self, obj=None):
|
59 |
if obj is None:
|
63 |
if obj is None:
|
60 |
self.objects_added = list(
|
64 |
self.objects_added = list(self.session.uow.new)
|
61 |
chain(self.session.uow.new,
|
65 |
self.objects_modified = list(self.session.uow.dirty)
|
62 |
self.session.uow.dirty))
|
|
|
63 |
self.objects_deleted = list(self.session.uow.deleted)
|
66 |
self.objects_deleted = list(self.session.uow.deleted)
|
64 |
else: # pragma no cover
|
67 |
else: # pragma no cover
|
65 |
st = state(obj)
|
68 |
st = state(obj)
|
66 |
if st.status in (st.new, st.dirty):
|
69 |
if st.status == st.new:
|
67 |
self.objects_added = [ obj ]
|
70 |
self.objects_added = [ obj ]
|
|
|
71 |
elif st.status == st.dirty:
|
|
|
72 |
self.objects_modified = [ obj ]
|
68 |
elif st.status == st.deleted:
|
73 |
elif st.status == st.deleted:
|
69 |
self.objects_deleted = [ obj ]
|
74 |
self.objects_deleted = [ obj ]
|
70 |
|
75 |
|
71 |
def after_flush(self, obj=None):
|
76 |
def after_flush(self, obj=None):
|
72 |
if not getattr(self.session, 'disable_artifact_index', False):
|
77 |
if not getattr(self.session, 'disable_artifact_index', False):
|
73 |
from .artifact import ArtifactLink
|
78 |
from .artifact import ArtifactLink
|
|
|
79 |
from .stats import CPA
|
74 |
if self.objects_deleted:
|
80 |
if self.objects_deleted:
|
75 |
search.remove_artifacts(self.objects_deleted)
|
81 |
search.remove_artifacts(self.objects_deleted)
|
76 |
for obj in self.objects_deleted:
|
82 |
for obj in self.objects_deleted:
|
77 |
ArtifactLink.remove(obj)
|
83 |
ArtifactLink.remove(obj)
|
78 |
if self.objects_added:
|
84 |
to_update = self.objects_added + self.objects_modified
|
|
|
85 |
if to_update:
|
79 |
search.add_artifacts(self.objects_added)
|
86 |
search.add_artifacts(to_update)
|
80 |
for obj in self.objects_added:
|
87 |
for obj in to_update:
|
81 |
try:
|
88 |
try:
|
82 |
ArtifactLink.add(obj)
|
89 |
ArtifactLink.add(obj)
|
83 |
except:
|
90 |
except:
|
84 |
log.exception('Error adding ArtifactLink for %s', obj)
|
91 |
log.exception('Error adding ArtifactLink for %s', obj)
|
85 |
session(ArtifactLink).flush()
|
92 |
session(ArtifactLink).flush()
|
|
|
93 |
for obj in self.objects_added:
|
|
|
94 |
CPA.post('create', obj)
|
|
|
95 |
for obj in self.objects_modified:
|
|
|
96 |
CPA.post('modify', obj)
|
|
|
97 |
for obj in self.objects_deleted:
|
|
|
98 |
CPA.post('delete', obj)
|
86 |
self.objects_added = []
|
99 |
self.objects_added = []
|
|
|
100 |
self.objects_modified = []
|
87 |
self.objects_deleted = []
|
101 |
self.objects_deleted = []
|
88 |
|
102 |
|
89 |
main_doc_session = Session.by_name('main')
|
103 |
main_doc_session = Session.by_name('main')
|
90 |
project_doc_session = ProjectSession(main_doc_session)
|
104 |
project_doc_session = ProjectSession(main_doc_session)
|
91 |
main_orm_session = ThreadLocalORMSession(main_doc_session)
|
105 |
main_orm_session = ThreadLocalORMSession(main_doc_session)
|