Switch to unified view

a/Allura/allura/model/project.py b/Allura/allura/model/project.py
...
...
3
3
4
from tg import config
4
from tg import config
5
from pylons import c, g, request
5
from pylons import c, g, request
6
import pkg_resources
6
import pkg_resources
7
from webob import exc
7
from webob import exc
8
from pymongo import bson
8
from bson import ObjectId
9
9
10
from ming import schema as S
10
from ming import schema as S
11
from ming.utils import LazyProperty
11
from ming.utils import LazyProperty
12
from ming.orm import ThreadLocalORMSession
12
from ming.orm import ThreadLocalORMSession
13
from ming.orm.base import mapper, session, state
13
from ming.orm.base import mapper, session, state
...
...
56
56
57
    @classmethod
57
    @classmethod
58
    def fire_when_ready(cls):
58
    def fire_when_ready(cls):
59
        now = datetime.utcnow()
59
        now = datetime.utcnow()
60
        # Lock the objects to fire
60
        # Lock the objects to fire
61
        nonce = bson.ObjectId()
61
        nonce = ObjectId()
62
        m = mapper(cls)
62
        m = mapper(cls)
63
        session(cls).impl.update_partial(
63
        session(cls).impl.update_partial(
64
            m.doc_cls,
64
            m.doc_cls,
65
            {'when' : { '$lt':now},
65
            {'when' : { '$lt':now},
66
             'nonce': None },
66
             'nonce': None },
...
...
78
78
79
class ProjectFile(File):    
79
class ProjectFile(File):    
80
    class __mongometa__:
80
    class __mongometa__:
81
        session = main_orm_session
81
        session = main_orm_session
82
82
83
    metadata=FieldProperty(dict(
83
    project_id=FieldProperty(S.ObjectId)
84
            project_id=S.ObjectId,
84
    category=FieldProperty(str)
85
            category=str,
86
            filename=str))
87
85
88
class ProjectCategory(MappedClass):
86
class ProjectCategory(MappedClass):
89
    class __mongometa__:
87
    class __mongometa__:
90
        session = main_orm_session
88
        session = main_orm_session
91
        name='project_category'
89
        name='project_category'
...
...
145
    _extra_tool_status = FieldProperty([str])
143
    _extra_tool_status = FieldProperty([str])
146
144
147
    @classmethod
145
    @classmethod
148
    def default_database_uri(cls, shortname):
146
    def default_database_uri(cls, shortname):
149
        base = config.get('ming.project.master')
147
        base = config.get('ming.project.master')
148
        db = config.get('ming.project.database')
150
        shard = ''.join(ch.lower() for ch in shortname if ch.isalpha())[-cls.SHARD_LENGTH:]
149
        shard = ''.join(ch.lower() for ch in shortname if ch.isalpha())[-cls.SHARD_LENGTH:]
151
        return base + '-' + shard
150
        return base + '/' + db + '-' + shard
152
151
153
    @LazyProperty
152
    @LazyProperty
154
    def allowed_tool_status(self):
153
    def allowed_tool_status(self):
155
        return ['production'] + self._extra_tool_status
154
        return ['production'] + self._extra_tool_status
156
155
...
...
205
    def best_download_url(self):
204
    def best_download_url(self):
206
        provider = plugin.ProjectRegistrationProvider.get()
205
        provider = plugin.ProjectRegistrationProvider.get()
207
        return provider.best_download_url(self)
206
        return provider.best_download_url(self)
208
207
209
    def get_screenshots(self):
208
    def get_screenshots(self):
210
        return ProjectFile.query.find({'metadata.project_id':self._id, 'metadata.category':'screenshot'}).all()
209
        return ProjectFile.query.find(dict(
210
                project_id=self._id,
211
                category='screenshot')).all()
211
212
212
    @property
213
    @property
213
    def icon(self):
214
    def icon(self):
214
        return ProjectFile.query.find({'metadata.project_id':self._id, 'metadata.category':'icon'}).first()
215
        return ProjectFile.query.get(
216
            project_id=self._id,
217
            category='icon')
215
218
216
    @property
219
    @property
217
    def description_html(self):
220
    def description_html(self):
218
        return g.markdown.convert(self.description)
221
        return g.markdown.convert(self.description)
219
222