Switch to unified view

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)