You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by ke...@apache.org on 2021/10/08 20:41:33 UTC
[allura] branch master updated (3fc130b -> c65ce7a)
This is an automated email from the ASF dual-hosted git repository.
kentontaylor pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/allura.git.
from 3fc130b Handle historical activities with null icon_url value
new 9e81c11 Remove old unused OldProjectRole class
new 1f1fd23 Add type hints for all mapped classes' query attrs
new 76104cb Special property hinting
new c65ce7a Convert document/collection mapping to be like other MappedClass types
The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
Allura/allura/model/__init__.py | 8 +-
Allura/allura/model/artifact.py | 35 ++++++-
Allura/allura/model/attachments.py | 7 ++
Allura/allura/model/auth.py | 69 +++++++------
Allura/allura/model/discuss.py | 22 +++-
Allura/allura/model/filesystem.py | 7 ++
Allura/allura/model/index.py | 87 ++++++++--------
Allura/allura/model/monq_model.py | 7 ++
Allura/allura/model/multifactor.py | 8 ++
Allura/allura/model/neighborhood.py | 9 ++
Allura/allura/model/notification.py | 19 ++--
Allura/allura/model/oauth.py | 20 +++-
Allura/allura/model/project.py | 18 +++-
Allura/allura/model/repo.py | 4 +-
Allura/allura/model/repo_refresh.py | 37 ++++---
Allura/allura/model/repository.py | 137 +++++++++++++++++--------
Allura/allura/model/stats.py | 6 ++
Allura/allura/model/webhook.py | 6 ++
Allura/allura/scripts/refreshrepo.py | 4 -
ForgeBlog/forgeblog/model/blog.py | 15 +++
ForgeChat/forgechat/model/chat.py | 9 ++
ForgeDiscussion/forgediscussion/model/forum.py | 19 ++++
ForgeFeedback/forgefeedback/model/feedback.py | 12 ++-
ForgeFiles/forgefiles/model/files.py | 16 ++-
ForgeGit/forgegit/model/git_repo.py | 21 +++-
ForgeSVN/forgesvn/model/svn.py | 8 ++
ForgeShortUrl/forgeshorturl/model/shorturl.py | 6 ++
ForgeTracker/forgetracker/model/ticket.py | 24 ++++-
ForgeUserStats/forgeuserstats/model/stats.py | 6 ++
ForgeWiki/forgewiki/model/wiki.py | 15 +++
30 files changed, 496 insertions(+), 165 deletions(-)
[allura] 02/04: Add type hints for all mapped classes' query attrs
Posted by ke...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
kentontaylor pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/allura.git
commit 1f1fd23c203ed990b80ca27e758ec36b66b09826
Author: Dave Brondsema <db...@slashdotmedia.com>
AuthorDate: Wed Sep 29 10:01:09 2021 -0400
Add type hints for all mapped classes' query attrs
---
Allura/allura/model/artifact.py | 31 +++++++++++++++++++++++++-
Allura/allura/model/attachments.py | 7 ++++++
Allura/allura/model/auth.py | 16 ++++++++++++-
Allura/allura/model/discuss.py | 17 ++++++++++++++
Allura/allura/model/filesystem.py | 7 ++++++
Allura/allura/model/monq_model.py | 7 ++++++
Allura/allura/model/multifactor.py | 8 +++++++
Allura/allura/model/neighborhood.py | 9 ++++++++
Allura/allura/model/notification.py | 13 ++++++++---
Allura/allura/model/oauth.py | 13 +++++++++++
Allura/allura/model/project.py | 16 ++++++++++++-
Allura/allura/model/repository.py | 10 +++++++++
Allura/allura/model/stats.py | 6 +++++
Allura/allura/model/webhook.py | 6 +++++
ForgeBlog/forgeblog/model/blog.py | 15 +++++++++++++
ForgeChat/forgechat/model/chat.py | 9 ++++++++
ForgeDiscussion/forgediscussion/model/forum.py | 19 ++++++++++++++++
ForgeFeedback/forgefeedback/model/feedback.py | 10 +++++++--
ForgeFiles/forgefiles/model/files.py | 13 +++++++++++
ForgeGit/forgegit/model/git_repo.py | 7 ++++++
ForgeSVN/forgesvn/model/svn.py | 8 +++++++
ForgeShortUrl/forgeshorturl/model/shorturl.py | 6 +++++
ForgeTracker/forgetracker/model/ticket.py | 20 +++++++++++++++++
ForgeUserStats/forgeuserstats/model/stats.py | 6 +++++
ForgeWiki/forgewiki/model/wiki.py | 15 +++++++++++++
25 files changed, 286 insertions(+), 8 deletions(-)
diff --git a/Allura/allura/model/artifact.py b/Allura/allura/model/artifact.py
index 2fd9cb6..fe5992f 100644
--- a/Allura/allura/model/artifact.py
+++ b/Allura/allura/model/artifact.py
@@ -20,6 +20,7 @@ from __future__ import absolute_import
import logging
from collections import defaultdict
from datetime import datetime
+import typing
import pymongo
from tg import tmpl_context as c, app_globals as g
@@ -49,6 +50,9 @@ from .notification import MailFooter
from .filesystem import File
import six
+if typing.TYPE_CHECKING:
+ from ming.odm.mapper import Query
+
log = logging.getLogger(__name__)
@@ -83,6 +87,8 @@ class Artifact(MappedClass, SearchIndexable):
if c.project and not skip_last_updated:
c.project.last_updated = datetime.utcnow()
+ query: 'Query[Artifact]'
+
type_s = 'Generic Artifact'
# Artifact base schema
@@ -500,6 +506,8 @@ class Snapshot(Artifact):
'author.id',
]
+ query: 'Query[Snapshot]'
+
_id = FieldProperty(S.ObjectId)
artifact_id = FieldProperty(S.ObjectId)
artifact_class = FieldProperty(str)
@@ -573,6 +581,8 @@ class VersionedArtifact(Artifact):
name = str('versioned_artifact')
history_class = Snapshot
+ query: 'Query[VersionedArtifact]'
+
version = FieldProperty(S.Int, if_missing=0)
def commit(self, update_stats=True):
@@ -678,7 +688,6 @@ class VersionedArtifact(Artifact):
class Message(Artifact):
-
"""
A message
@@ -690,6 +699,9 @@ class Message(Artifact):
class __mongometa__:
session = artifact_orm_session
name = str('message')
+
+ query: 'Query[Message]'
+
type_s = 'Generic Message'
_id = FieldProperty(str, if_missing=h.gen_message_id)
@@ -738,6 +750,9 @@ class AwardFile(File):
class __mongometa__:
session = main_orm_session
name = str('award_file')
+
+ query: 'Query[AwardFile]'
+
award_id = FieldProperty(S.ObjectId)
@@ -747,6 +762,9 @@ class Award(Artifact):
session = main_orm_session
name = str('award')
indexes = ['short']
+
+ query: 'Query[Award]'
+
type_s = 'Generic Award'
from .project import Neighborhood
@@ -790,6 +808,9 @@ class AwardGrant(Artifact):
session = main_orm_session
name = str('grant')
indexes = ['short']
+
+ query: 'Query[AwardGrant]'
+
type_s = 'Generic Award Grant'
_id = FieldProperty(S.ObjectId)
@@ -876,6 +897,8 @@ class Feed(MappedClass):
('pubdate', pymongo.DESCENDING)),
]
+ query: 'Query[Feed]'
+
_id = FieldProperty(S.ObjectId)
ref_id = ForeignIdProperty('ArtifactReference')
neighborhood_id = ForeignIdProperty('Neighborhood')
@@ -1001,6 +1024,8 @@ class VotableArtifact(MappedClass):
session = main_orm_session
name = str('vote')
+ query: 'Query[VotableArtifact]'
+
votes = FieldProperty(int, if_missing=0)
votes_up = FieldProperty(int, if_missing=0)
votes_down = FieldProperty(int, if_missing=0)
@@ -1129,6 +1154,8 @@ class MovedArtifact(Artifact):
session = artifact_orm_session
name = str('moved_artifact')
+ query: 'Query[MovedArtifact]'
+
_id = FieldProperty(S.ObjectId)
app_config_id = ForeignIdProperty(
'AppConfig', if_missing=lambda: c.app.config._id)
@@ -1145,6 +1172,8 @@ class SpamCheckResult(MappedClass):
('user_id', 'result'),
]
+ query: 'Query[SpamCheckResult]'
+
_id = FieldProperty(S.ObjectId)
ref_id = ForeignIdProperty('ArtifactReference')
ref = RelationProperty('ArtifactReference', via='ref_id')
diff --git a/Allura/allura/model/attachments.py b/Allura/allura/model/attachments.py
index 36a8f66..d362ea0 100644
--- a/Allura/allura/model/attachments.py
+++ b/Allura/allura/model/attachments.py
@@ -17,6 +17,8 @@
from __future__ import unicode_literals
from __future__ import absolute_import
+import typing
+
from tg import tmpl_context as c
from ming.orm import FieldProperty
from ming import schema as S
@@ -26,6 +28,9 @@ from allura.lib import helpers as h
from .session import project_orm_session
from .filesystem import File
+if typing.TYPE_CHECKING:
+ from ming.odm.mapper import Query
+
class BaseAttachment(File):
thumbnail_size = (255, 255)
@@ -38,6 +43,8 @@ class BaseAttachment(File):
session = project_orm_session
indexes = ['artifact_id', 'app_config_id']
+ query: 'Query[BaseAttachment]'
+
artifact_id = FieldProperty(S.ObjectId)
app_config_id = FieldProperty(S.ObjectId)
type = FieldProperty(str)
diff --git a/Allura/allura/model/auth.py b/Allura/allura/model/auth.py
index e846a81..f33bb38 100644
--- a/Allura/allura/model/auth.py
+++ b/Allura/allura/model/auth.py
@@ -19,7 +19,7 @@ from __future__ import unicode_literals
from __future__ import absolute_import
import logging
import calendar
-from typing import ClassVar
+import typing
import six
from markupsafe import Markup
@@ -55,6 +55,10 @@ from .session import project_orm_session
from .timeline import ActivityNode, ActivityObject
+if typing.TYPE_CHECKING:
+ from ming.odm.mapper import Query
+
+
log = logging.getLogger(__name__)
@@ -78,6 +82,8 @@ class EmailAddress(MappedClass):
indexes = ['nonce', ]
unique_indexes = [('email', 'claimed_by_user_id'), ]
+ query: 'Query[EmailAddress]'
+
_id = FieldProperty(S.ObjectId)
email = FieldProperty(str)
claimed_by_user_id = FieldProperty(S.ObjectId, if_missing=None)
@@ -187,6 +193,8 @@ class AuthGlobals(MappedClass):
name = str('auth_globals')
session = main_orm_session
+ query: 'Query[AuthGlobals]'
+
_id = FieldProperty(int)
next_uid = FieldProperty(int, if_missing=10000)
@@ -241,6 +249,8 @@ class User(MappedClass, ActivityNode, ActivityObject, SearchIndexable):
dict(fields=('tool_data.phone_verification.number_hash',), sparse=True),
]
+ query: 'Query[User]'
+
type_s = 'User'
_id = FieldProperty(S.ObjectId)
@@ -848,6 +858,8 @@ class ProjectRole(MappedClass):
('roles',),
]
+ query: 'Query[ProjectRole]'
+
_id = FieldProperty(S.ObjectId)
user_id = AlluraUserProperty(if_missing=None)
project_id = ForeignIdProperty('Project', if_missing=None)
@@ -1064,6 +1076,8 @@ class UserLoginDetails(MappedClass):
unique_indexes = [('user_id', 'ip', 'ua'), # DuplicateKeyError checked in add_login_detail
]
+ query: 'Query[UserLoginDetails]'
+
_id = FieldProperty(S.ObjectId)
user_id = AlluraUserProperty(required=True)
ip = FieldProperty(str)
diff --git a/Allura/allura/model/discuss.py b/Allura/allura/model/discuss.py
index 2db1b5c..f0b4bc1 100644
--- a/Allura/allura/model/discuss.py
+++ b/Allura/allura/model/discuss.py
@@ -20,6 +20,7 @@ from __future__ import absolute_import
import os
import logging
from datetime import datetime
+import typing
import jinja2
import pymongo
@@ -46,6 +47,9 @@ from .types import MarkdownCache
from six.moves import range
from six.moves import map
+if typing.TYPE_CHECKING:
+ from ming.odm.mapper import Query
+
log = logging.getLogger(__name__)
@@ -53,6 +57,9 @@ class Discussion(Artifact, ActivityObject):
class __mongometa__:
name = str('discussion')
+
+ query: 'Query[Discussion]'
+
type_s = 'Discussion'
parent_id = FieldProperty(schema.Deprecated)
@@ -146,6 +153,9 @@ class Thread(Artifact, ActivityObject):
('mod_date', pymongo.DESCENDING)),
('discussion_id',),
]
+
+ query: 'Query[Thread]'
+
type_s = 'Thread'
_id = FieldProperty(str, if_missing=lambda: h.nonce(10))
@@ -466,6 +476,8 @@ class PostHistory(Snapshot):
class __mongometa__:
name = str('post_history')
+ query: 'Query[PostHistory]'
+
artifact_id = ForeignIdProperty('Post')
@classmethod
@@ -506,6 +518,9 @@ class Post(Message, VersionedArtifact, ActivityObject, ReactableArtifact):
('discussion_id', 'status', 'timestamp'),
'thread_id'
]
+
+ query: 'Query[Post]'
+
type_s = 'Post'
thread_id = ForeignIdProperty(Thread)
@@ -827,6 +842,8 @@ class DiscussionAttachment(BaseAttachment):
polymorphic_identity = str('DiscussionAttachment')
indexes = ['filename', 'discussion_id', 'thread_id', 'post_id']
+ query: 'Query[DiscussionAttachment]'
+
discussion_id = FieldProperty(schema.ObjectId)
thread_id = FieldProperty(str)
post_id = FieldProperty(str)
diff --git a/Allura/allura/model/filesystem.py b/Allura/allura/model/filesystem.py
index dac761d..32d3296 100644
--- a/Allura/allura/model/filesystem.py
+++ b/Allura/allura/model/filesystem.py
@@ -21,6 +21,7 @@ import os
import re
from io import BytesIO
import logging
+import typing
import PIL
from gridfs import GridFS
@@ -33,6 +34,10 @@ from .session import project_orm_session
from allura.lib import utils
from io import open
+if typing.TYPE_CHECKING:
+ from ming.odm.mapper import Query
+
+
log = logging.getLogger(__name__)
SUPPORTED_BY_PIL = set([
@@ -52,6 +57,8 @@ class File(MappedClass):
name = str('fs')
indexes = ['filename']
+ query: 'Query[File]'
+
_id = FieldProperty(schema.ObjectId)
file_id = FieldProperty(schema.ObjectId)
filename = FieldProperty(str, if_missing='unknown')
diff --git a/Allura/allura/model/monq_model.py b/Allura/allura/model/monq_model.py
index 2af31ed..b14095f 100644
--- a/Allura/allura/model/monq_model.py
+++ b/Allura/allura/model/monq_model.py
@@ -22,6 +22,7 @@ import time
import traceback
import logging
from datetime import datetime, timedelta
+import typing
import pymongo
from tg import tmpl_context as c, app_globals as g
@@ -37,6 +38,10 @@ from ming.orm.declarative import MappedClass
from allura.lib.helpers import log_output, null_contextmanager
from .session import task_orm_session
+if typing.TYPE_CHECKING:
+ from ming.odm.mapper import Query
+
+
log = logging.getLogger(__name__)
@@ -81,6 +86,8 @@ class MonQTask(MappedClass):
],
]
+ query: 'Query[MonQTask]'
+
_id = FieldProperty(S.ObjectId)
state = FieldProperty(S.OneOf(*states))
priority = FieldProperty(int)
diff --git a/Allura/allura/model/multifactor.py b/Allura/allura/model/multifactor.py
index 0d232b9..a0a87cd 100644
--- a/Allura/allura/model/multifactor.py
+++ b/Allura/allura/model/multifactor.py
@@ -18,6 +18,7 @@
from __future__ import unicode_literals
from __future__ import absolute_import
import logging
+import typing
from ming import schema as S
from ming.odm import FieldProperty
@@ -25,6 +26,9 @@ from ming.odm.declarative import MappedClass
from .session import main_orm_session
+if typing.TYPE_CHECKING:
+ from ming.odm.mapper import Query
+
log = logging.getLogger(__name__)
@@ -38,6 +42,8 @@ class TotpKey(MappedClass):
name = str('multifactor_totp')
unique_indexes = ['user_id']
+ query: 'Query[TotpKey]'
+
_id = FieldProperty(S.ObjectId)
user_id = FieldProperty(S.ObjectId, required=True)
key = FieldProperty(S.Binary, required=True) # S.Binary ok? ming 0.5.x make_safe doesn't know about bytes/Binary
@@ -53,6 +59,8 @@ class RecoveryCode(MappedClass):
name = str('multifactor_recovery_code')
indexes = ['user_id']
+ query: 'Query[RecoveryCode]'
+
_id = FieldProperty(S.ObjectId)
user_id = FieldProperty(S.ObjectId, required=True)
code = FieldProperty(str, required=True)
diff --git a/Allura/allura/model/neighborhood.py b/Allura/allura/model/neighborhood.py
index 24fbe81..9b57ee3 100644
--- a/Allura/allura/model/neighborhood.py
+++ b/Allura/allura/model/neighborhood.py
@@ -21,6 +21,7 @@ import re
import json
import logging
from collections import OrderedDict
+import typing
from ming import schema as S
from ming.orm import FieldProperty, RelationProperty
@@ -36,6 +37,10 @@ from .session import main_orm_session
from .filesystem import File
from .types import MarkdownCache
+if typing.TYPE_CHECKING:
+ from ming.odm.mapper import Query
+
+
log = logging.getLogger(__name__)
@@ -45,6 +50,8 @@ class NeighborhoodFile(File):
session = main_orm_session
indexes = ['neighborhood_id']
+ query: 'Query[NeighborhoodFile]'
+
neighborhood_id = FieldProperty(S.ObjectId)
@@ -68,6 +75,8 @@ class Neighborhood(MappedClass):
name = str('neighborhood')
unique_indexes = ['url_prefix']
+ query: 'Query[Neighborhood]'
+
_id = FieldProperty(S.ObjectId)
name = FieldProperty(str)
# e.g. http://adobe.openforge.com/ or projects/
diff --git a/Allura/allura/model/notification.py b/Allura/allura/model/notification.py
index bff46ec..558f426 100644
--- a/Allura/allura/model/notification.py
+++ b/Allura/allura/model/notification.py
@@ -40,6 +40,7 @@ import logging
from bson import ObjectId
from datetime import datetime, timedelta
from collections import defaultdict
+import typing
from tg import tmpl_context as c, app_globals as g
from tg import config
@@ -61,6 +62,9 @@ from .auth import User, AlluraUserProperty
import six
from six.moves import filter
+if typing.TYPE_CHECKING:
+ from ming.odm.mapper import Query
+
log = logging.getLogger(__name__)
@@ -68,7 +72,6 @@ MAILBOX_QUIESCENT = None # Re-enable with [#1384]: timedelta(minutes=10)
class Notification(MappedClass):
-
'''
Temporarily store notifications that will be emailed or displayed as a web flash.
This does not contain any recipient information.
@@ -79,6 +82,8 @@ class Notification(MappedClass):
name = str('notification')
indexes = ['project_id']
+ query: 'Query[Notification]'
+
_id = FieldProperty(str, if_missing=h.gen_message_id)
# Classify notifications
@@ -382,7 +387,6 @@ class Notification(MappedClass):
class Mailbox(MappedClass):
-
'''
Holds a queue of notifications for an artifact, or a user (webflash messages)
for a subscriber.
@@ -405,6 +409,8 @@ class Mailbox(MappedClass):
('project_id', 'app_config_id', 'artifact_index_id', 'topic'),
]
+ query: 'Query[Mailbox]'
+
_id = FieldProperty(S.ObjectId)
user_id = AlluraUserProperty(if_missing=lambda: c.user._id)
project_id = ForeignIdProperty('Project', if_missing=lambda: c.project._id)
@@ -709,7 +715,6 @@ class MailFooter(object):
class SiteNotification(MappedClass):
-
"""
Storage for site-wide notification.
"""
@@ -721,6 +726,8 @@ class SiteNotification(MappedClass):
('active', '_id'),
]
+ query: 'Query[SiteNotification]'
+
_id = FieldProperty(S.ObjectId)
content = FieldProperty(str, if_missing='')
active = FieldProperty(bool, if_missing=True)
diff --git a/Allura/allura/model/oauth.py b/Allura/allura/model/oauth.py
index 7dc5da9..c661bb0 100644
--- a/Allura/allura/model/oauth.py
+++ b/Allura/allura/model/oauth.py
@@ -18,6 +18,7 @@
from __future__ import unicode_literals
from __future__ import absolute_import
import logging
+import typing
import oauth2 as oauth
from tg import tmpl_context as c, app_globals as g
@@ -34,6 +35,10 @@ from .session import main_orm_session
from .types import MarkdownCache
from .auth import AlluraUserProperty
+if typing.TYPE_CHECKING:
+ from ming.odm.mapper import Query
+
+
log = logging.getLogger(__name__)
@@ -46,6 +51,8 @@ class OAuthToken(MappedClass):
polymorphic_on = 'type'
polymorphic_identity = None
+ query: 'Query[OAuthToken]'
+
_id = FieldProperty(S.ObjectId)
type = FieldProperty(str)
api_key = FieldProperty(str, if_missing=lambda: h.nonce(20))
@@ -65,6 +72,8 @@ class OAuthConsumerToken(OAuthToken):
name = str('oauth_consumer_token')
unique_indexes = [('name', 'user_id')]
+ query: 'Query[OAuthConsumerToken]'
+
type = FieldProperty(str, if_missing='consumer')
user_id = AlluraUserProperty(if_missing=lambda: c.user._id)
name = FieldProperty(str)
@@ -108,6 +117,8 @@ class OAuthRequestToken(OAuthToken):
class __mongometa__:
polymorphic_identity = str('request')
+ query: 'Query[OAuthRequestToken]'
+
type = FieldProperty(str, if_missing='request')
consumer_token_id = ForeignIdProperty('OAuthConsumerToken')
user_id = AlluraUserProperty(if_missing=lambda: c.user._id)
@@ -122,6 +133,8 @@ class OAuthAccessToken(OAuthToken):
class __mongometa__:
polymorphic_identity = str('access')
+ query: 'Query[OAuthAccessToken]'
+
type = FieldProperty(str, if_missing='access')
consumer_token_id = ForeignIdProperty('OAuthConsumerToken')
request_token_id = ForeignIdProperty('OAuthToken')
diff --git a/Allura/allura/model/project.py b/Allura/allura/model/project.py
index 49af70a..de1ff2f 100644
--- a/Allura/allura/model/project.py
+++ b/Allura/allura/model/project.py
@@ -22,7 +22,7 @@ import logging
from calendar import timegm
from collections import Counter, OrderedDict
from hashlib import sha256
-
+import typing
from datetime import datetime
from copy import deepcopy
import six.moves.urllib.request
@@ -69,6 +69,10 @@ from .filesystem import File
import six
from six.moves import map
+if typing.TYPE_CHECKING:
+ from ming.odm.mapper import Query
+
+
log = logging.getLogger(__name__)
# max sitemap entries per tool type
@@ -83,6 +87,8 @@ class ProjectFile(File):
session = main_orm_session
indexes = [('project_id', 'category')]
+ query: 'Query[ProjectFile]'
+
project_id = FieldProperty(S.ObjectId)
category = FieldProperty(str)
caption = FieldProperty(str)
@@ -95,6 +101,8 @@ class ProjectCategory(MappedClass):
session = main_orm_session
name = str('project_category')
+ query: 'Query[ProjectCategory]'
+
_id = FieldProperty(S.ObjectId)
parent_id = FieldProperty(S.ObjectId, if_missing=None)
name = FieldProperty(str)
@@ -130,6 +138,8 @@ class TroveCategory(MappedClass):
extensions = [TroveCategoryMapperExtension]
indexes = ['trove_cat_id', 'trove_parent_id', 'shortname', 'fullpath']
+ query: 'Query[TroveCategory]'
+
_id = FieldProperty(S.ObjectId)
trove_cat_id = FieldProperty(int, if_missing=None)
trove_parent_id = FieldProperty(int, if_missing=None)
@@ -210,6 +220,8 @@ class Project(SearchIndexable, MappedClass, ActivityNode, ActivityObject):
('neighborhood_id', 'is_nbhd_project', 'deleted')]
unique_indexes = [('neighborhood_id', 'shortname')]
+ query: 'Query[Project]'
+
type_s = 'Project'
# Project schema
@@ -1361,6 +1373,8 @@ class AppConfig(MappedClass, ActivityObject):
'options.import_id',
('options.mount_point', 'project_id')]
+ query: 'Query[AppConfig]'
+
# AppConfig schema
_id = FieldProperty(S.ObjectId)
project_id = ForeignIdProperty(Project)
diff --git a/Allura/allura/model/repository.py b/Allura/allura/model/repository.py
index 0c87dd8..2712d5b 100644
--- a/Allura/allura/model/repository.py
+++ b/Allura/allura/model/repository.py
@@ -34,6 +34,7 @@ from threading import Thread
from six.moves.queue import Queue
from itertools import chain, islice
from difflib import SequenceMatcher
+import typing
import tg
from paste.deploy.converters import asint, asbool
@@ -64,6 +65,9 @@ from .session import repository_orm_session
from io import open
from six.moves import range
+if typing.TYPE_CHECKING:
+ from ming.odm.mapper import Query
+
log = logging.getLogger(__name__)
config = utils.ConfigProxy(
@@ -351,6 +355,9 @@ class Repository(Artifact, ActivityObject):
class __mongometa__:
name = str('generic-repository')
indexes = ['upstream_repo.name']
+
+ query: 'Query[Repository]'
+
_impl = None
repo_id = 'repo'
type_s = 'Repository'
@@ -801,6 +808,9 @@ class MergeRequest(VersionedArtifact, ActivityObject):
name = str('merge-request')
indexes = ['commit_id', 'creator_id']
unique_indexes = [('app_config_id', 'request_number')]
+
+ query: 'Query[MergeRequest]'
+
type_s = 'MergeRequest'
request_number = FieldProperty(int)
diff --git a/Allura/allura/model/stats.py b/Allura/allura/model/stats.py
index cb53f60..dffe19f 100644
--- a/Allura/allura/model/stats.py
+++ b/Allura/allura/model/stats.py
@@ -20,6 +20,7 @@ from __future__ import absolute_import
import six
from datetime import datetime
+import typing
from tg import config
from paste.deploy.converters import asbool
@@ -35,6 +36,9 @@ from allura.lib import helpers as h
from six.moves import range
from functools import reduce
+if typing.TYPE_CHECKING:
+ from ming.odm.mapper import Query
+
class Stats(MappedClass):
@@ -43,6 +47,8 @@ class Stats(MappedClass):
session = main_orm_session
unique_indexes = ['_id']
+ query: 'Query[Stats]'
+
_id = FieldProperty(S.ObjectId)
visible = FieldProperty(bool, if_missing=True)
diff --git a/Allura/allura/model/webhook.py b/Allura/allura/model/webhook.py
index 7eae3ed..d399a25 100644
--- a/Allura/allura/model/webhook.py
+++ b/Allura/allura/model/webhook.py
@@ -19,6 +19,7 @@ from __future__ import unicode_literals
from __future__ import absolute_import
import datetime as dt
import json
+import typing
from ming.odm import FieldProperty, session
from paste.deploy.converters import asint
@@ -28,12 +29,17 @@ from allura.model import Artifact
from allura.lib import helpers as h
import six
+if typing.TYPE_CHECKING:
+ from ming.odm.mapper import Query
+
class Webhook(Artifact):
class __mongometa__:
name = str('webhook')
unique_indexes = [('app_config_id', 'type', 'hook_url')]
+ query: 'Query[Webhook]'
+
type = FieldProperty(str)
hook_url = FieldProperty(str)
secret = FieldProperty(str)
diff --git a/ForgeBlog/forgeblog/model/blog.py b/ForgeBlog/forgeblog/model/blog.py
index d2b56bb..b0e9630 100644
--- a/ForgeBlog/forgeblog/model/blog.py
+++ b/ForgeBlog/forgeblog/model/blog.py
@@ -22,6 +22,7 @@ import functools
import re
from datetime import datetime
from random import randint
+import typing
from tg import tmpl_context as c, app_globals as g
from tg import config as tg_config
@@ -38,6 +39,10 @@ from allura.lib import helpers as h
from allura.lib import utils
import six
+if typing.TYPE_CHECKING:
+ from ming.odm.mapper import Query
+
+
config = utils.ConfigProxy(
common_suffix='forgemail.domain')
@@ -49,6 +54,8 @@ class Globals(MappedClass):
session = M.project_orm_session
indexes = ['app_config_id']
+ query: 'Query[Globals]'
+
type_s = 'BlogGlobals'
_id = FieldProperty(schema.ObjectId)
app_config_id = ForeignIdProperty(
@@ -60,6 +67,9 @@ class BlogPostSnapshot(M.Snapshot):
class __mongometa__:
name = str('blog_post_snapshot')
+
+ query: 'Query[BlogPostSnapshot]'
+
type_s = 'Blog Post Snapshot'
def original(self):
@@ -114,6 +124,8 @@ class BlogPost(M.VersionedArtifact, ActivityObject):
('neighborhood_id', 'state', 'timestamp'),
]
+ query: 'Query[BlogPost]'
+
type_s = 'Blog Post'
title = FieldProperty(str, if_missing='Untitled')
@@ -337,6 +349,9 @@ class BlogAttachment(M.BaseAttachment):
class __mongometa__:
polymorphic_identity = str('BlogAttachment')
+
+ query: 'Query[BlogAttachment]'
+
attachment_type = FieldProperty(str, if_missing='BlogAttachment')
diff --git a/ForgeChat/forgechat/model/chat.py b/ForgeChat/forgechat/model/chat.py
index a2079fe..09b90e8 100644
--- a/ForgeChat/forgechat/model/chat.py
+++ b/ForgeChat/forgechat/model/chat.py
@@ -18,6 +18,7 @@
from __future__ import unicode_literals
from __future__ import absolute_import
from datetime import datetime
+import typing
from ming import schema as S
from ming.orm import FieldProperty, Mapper
@@ -26,6 +27,9 @@ from ming.orm.declarative import MappedClass
from allura import model as M
from allura.model.types import MarkdownCache
+if typing.TYPE_CHECKING:
+ from ming.odm.mapper import Query
+
class ChatChannel(MappedClass):
@@ -35,6 +39,8 @@ class ChatChannel(MappedClass):
indexes = ['project_id']
unique_indexes = ['channel']
+ query: 'Query[ChatChannel]'
+
_id = FieldProperty(S.ObjectId)
project_id = FieldProperty(S.ObjectId)
app_config_id = FieldProperty(S.ObjectId)
@@ -46,6 +52,9 @@ class ChatMessage(M.Artifact):
class __mongometa__:
name = str('chat_message')
indexes = ['timestamp']
+
+ query: 'Query[ChatMessage]'
+
type_s = 'Chat Message'
timestamp = FieldProperty(datetime, if_missing=datetime.utcnow)
diff --git a/ForgeDiscussion/forgediscussion/model/forum.py b/ForgeDiscussion/forgediscussion/model/forum.py
index 30440f2..a80d1c8 100644
--- a/ForgeDiscussion/forgediscussion/model/forum.py
+++ b/ForgeDiscussion/forgediscussion/model/forum.py
@@ -20,6 +20,7 @@ from __future__ import absolute_import
import re
import logging
from itertools import chain
+import typing
import pymongo
from tg import tmpl_context as c
@@ -34,6 +35,10 @@ from allura.model.notification import MailFooter
from allura.lib import utils
from allura.lib import helpers as h
+if typing.TYPE_CHECKING:
+ from ming.odm.mapper import Query
+
+
config = utils.ConfigProxy(
common_suffix='forgemail.domain')
@@ -44,6 +49,9 @@ class Forum(M.Discussion):
class __mongometa__:
name = str('forum')
+
+ query: 'Query[Forum]'
+
type_s = 'Discussion'
parent_id = FieldProperty(schema.ObjectId, if_missing=None)
@@ -145,6 +153,9 @@ class ForumThread(M.Thread):
'discussion_id',
'import_id', # may be used by external legacy systems
]
+
+ query: 'Query[ForumThread]'
+
type_s = 'Thread'
discussion_id = ForeignIdProperty(Forum)
@@ -212,6 +223,8 @@ class ForumPostHistory(M.PostHistory):
class __mongometa__:
name = str('post_history')
+ query: 'Query[ForumPostHistory]'
+
artifact_id = ForeignIdProperty('ForumPost')
@@ -228,6 +241,9 @@ class ForumPost(M.Post):
('timestamp', pymongo.DESCENDING),
),
]
+
+ query: 'Query[ForumPost]'
+
type_s = 'Post'
discussion_id = ForeignIdProperty(Forum)
@@ -255,6 +271,9 @@ class ForumAttachment(M.DiscussionAttachment):
class __mongometa__:
polymorphic_identity = str('ForumAttachment')
+
+ query: 'Query[ForumAttachment]'
+
attachment_type = FieldProperty(str, if_missing='ForumAttachment')
diff --git a/ForgeFeedback/forgefeedback/model/feedback.py b/ForgeFeedback/forgefeedback/model/feedback.py
index 51f53fa..2e30ca8 100644
--- a/ForgeFeedback/forgefeedback/model/feedback.py
+++ b/ForgeFeedback/forgefeedback/model/feedback.py
@@ -21,9 +21,9 @@ import logging
import six.moves.urllib.request
import six.moves.urllib.parse
import six.moves.urllib.error
-# Non-stdlib imports
-
+import typing
from datetime import datetime
+
from bson import ObjectId
from tg import tmpl_context as c
from ming import schema
@@ -38,6 +38,9 @@ from allura.model.project import ProjectRole
from allura.model.timeline import ActivityObject
from allura.lib import helpers as h
+if typing.TYPE_CHECKING:
+ from ming.odm.mapper import Query
+
log = logging.getLogger(__name__)
@@ -49,7 +52,10 @@ class Feedback(VersionedArtifact, ActivityObject):
('project_id', 'reported_by_id'),
]
+ query: 'Query[Feedback]'
+
type_s = 'Feedback'
+
_id = FieldProperty(schema.ObjectId)
created_date = FieldProperty(datetime, if_missing=datetime.utcnow)
rating = FieldProperty(str, if_missing='')
diff --git a/ForgeFiles/forgefiles/model/files.py b/ForgeFiles/forgefiles/model/files.py
index ecfef2b..c5af9de 100755
--- a/ForgeFiles/forgefiles/model/files.py
+++ b/ForgeFiles/forgefiles/model/files.py
@@ -24,6 +24,7 @@ from datetime import datetime
from six.moves.urllib.parse import quote
import re
+import typing
from ming import schema as S
from ming.orm import Mapper
@@ -38,6 +39,10 @@ from allura.model.filesystem import File
from allura.model.timeline import ActivityObject
from allura.lib import helpers as h
+if typing.TYPE_CHECKING:
+ from ming.odm.mapper import Query
+
+
README_RE = re.compile(r'^README(\.[^.]*)?$', re.IGNORECASE)
@@ -49,7 +54,10 @@ class Upload(VersionedArtifact, ActivityObject):
name = 'upload'
session = project_orm_session
+ query: 'Query[Upload]'
+
type_s = 'Upload'
+
_id = FieldProperty(S.ObjectId)
filename = FieldProperty(str)
filetype = FieldProperty(str)
@@ -79,7 +87,10 @@ class UploadFolder(VersionedArtifact, ActivityObject):
name = 'upload_folder'
session = project_orm_session
+ query: 'Query[UploadFolder]'
+
type_s = 'UploadFolder'
+
_id = FieldProperty(S.ObjectId)
folder_name = FieldProperty(str)
project_id = ForeignIdProperty('Project', if_missing=lambda: c.project._id)
@@ -153,6 +164,8 @@ class UploadFiles(File):
if c.project and not skip_last_updated:
c.project.last_updated = datetime.utcnow()
+ query: 'Query[UploadFiles]'
+
artifact_id = FieldProperty(S.ObjectId)
app_config_id = FieldProperty(S.ObjectId)
type = FieldProperty(str)
diff --git a/ForgeGit/forgegit/model/git_repo.py b/ForgeGit/forgegit/model/git_repo.py
index 7c5827b..07662ca 100644
--- a/ForgeGit/forgegit/model/git_repo.py
+++ b/ForgeGit/forgegit/model/git_repo.py
@@ -25,6 +25,7 @@ import tempfile
from datetime import datetime
from contextlib import contextmanager
from time import time
+import typing
import tg
import git
@@ -44,6 +45,10 @@ from allura import model as M
from io import open
from six.moves import zip
+if typing.TYPE_CHECKING:
+ from ming.odm.mapper import Query
+
+
log = logging.getLogger(__name__)
gitdb.util.mman = gitdb.util.mman.__class__(
@@ -70,6 +75,8 @@ class Repository(M.Repository):
class __mongometa__:
name = str('git-repository')
+ query: 'Query[Repository]'
+
@LazyProperty
def _impl(self):
return GitImplementation(self)
diff --git a/ForgeSVN/forgesvn/model/svn.py b/ForgeSVN/forgesvn/model/svn.py
index 5b40b5d..1fc18bb 100644
--- a/ForgeSVN/forgesvn/model/svn.py
+++ b/ForgeSVN/forgesvn/model/svn.py
@@ -31,6 +31,7 @@ from io import BytesIO
from datetime import datetime
import tempfile
from shutil import rmtree
+import typing
import six
import tg
@@ -52,6 +53,10 @@ from io import open
from six.moves import range
from six.moves import map
+if typing.TYPE_CHECKING:
+ from ming.odm.mapper import Query
+
+
log = logging.getLogger(__name__)
@@ -62,6 +67,9 @@ class Repository(M.Repository):
class __mongometa__:
name = str('svn-repository')
+
+ query: 'Query[Repository]'
+
branches = FieldProperty([dict(name=str, object_id=str)])
_refresh_precompute = False
diff --git a/ForgeShortUrl/forgeshorturl/model/shorturl.py b/ForgeShortUrl/forgeshorturl/model/shorturl.py
index 90aa038..0f21bc0 100644
--- a/ForgeShortUrl/forgeshorturl/model/shorturl.py
+++ b/ForgeShortUrl/forgeshorturl/model/shorturl.py
@@ -17,6 +17,7 @@
from __future__ import unicode_literals
from __future__ import absolute_import
+import typing
import pymongo
from tg import config
from tg import tmpl_context as c
@@ -25,6 +26,9 @@ from datetime import datetime
from allura.model.auth import User
from allura import model as M
+if typing.TYPE_CHECKING:
+ from ming.odm.mapper import Query
+
class ShortUrl(M.Artifact):
@@ -32,6 +36,8 @@ class ShortUrl(M.Artifact):
name = str('short_urls')
unique_indexes = [('short_name', 'app_config_id')]
+ query: 'Query[ShortUrl]'
+
type_s = 'ShortUrl'
full_url = FieldProperty(str)
short_name = FieldProperty(str)
diff --git a/ForgeTracker/forgetracker/model/ticket.py b/ForgeTracker/forgetracker/model/ticket.py
index 6242ba8..404223f 100644
--- a/ForgeTracker/forgetracker/model/ticket.py
+++ b/ForgeTracker/forgetracker/model/ticket.py
@@ -25,6 +25,7 @@ import json
import difflib
from datetime import datetime, timedelta
import os
+import typing
from bson import ObjectId
import six
@@ -80,6 +81,9 @@ from allura.lib.security import require_access
from allura.tasks import mail_tasks
from forgetracker import search as tsearch
+if typing.TYPE_CHECKING:
+ from ming.odm.mapper import Query
+
log = logging.getLogger(__name__)
@@ -103,7 +107,10 @@ class Globals(MappedClass):
session = project_orm_session
indexes = ['app_config_id']
+ query: 'Query[Globals]'
+
type_s = 'Globals'
+
_id = FieldProperty(schema.ObjectId)
app_config_id = ForeignIdProperty(
AppConfig, if_missing=lambda: c.app.config._id)
@@ -549,6 +556,8 @@ class TicketHistory(Snapshot):
class __mongometa__:
name = str('ticket_history')
+ query: 'Query[TicketHistory]'
+
def original(self):
return Ticket.query.get(_id=self.artifact_id)
@@ -595,7 +604,10 @@ class Bin(Artifact, ActivityObject):
class __mongometa__:
name = str('bin')
+ query: 'Query[Bin]'
+
type_s = 'Bin'
+
_id = FieldProperty(schema.ObjectId)
summary = FieldProperty(str, required=True, allow_none=False)
terms = FieldProperty(str, if_missing='')
@@ -646,7 +658,10 @@ class Ticket(VersionedArtifact, ActivityObject, VotableArtifact):
('app_config_id', 'ticket_num'),
]
+ query: 'Query[Ticket]'
+
type_s = 'Ticket'
+
_id = FieldProperty(schema.ObjectId)
created_date = FieldProperty(datetime, if_missing=datetime.utcnow)
@@ -1377,6 +1392,9 @@ class TicketAttachment(BaseAttachment):
class __mongometa__:
polymorphic_identity = str('TicketAttachment')
+
+ query: 'Query[TicketAttachment]'
+
attachment_type = FieldProperty(str, if_missing='TicketAttachment')
@@ -1389,6 +1407,8 @@ class MovedTicket(MovedArtifact):
('app_config_id', 'ticket_num'),
]
+ query: 'Query[MovedTicket]'
+
ticket_num = FieldProperty(int, required=True, allow_none=False)
def url(self):
diff --git a/ForgeUserStats/forgeuserstats/model/stats.py b/ForgeUserStats/forgeuserstats/model/stats.py
index 7c0f050..c428c78 100644
--- a/ForgeUserStats/forgeuserstats/model/stats.py
+++ b/ForgeUserStats/forgeuserstats/model/stats.py
@@ -20,6 +20,7 @@ from __future__ import absolute_import
from ming.orm import FieldProperty
from ming import schema as S
from datetime import datetime, timedelta
+import typing
from ming.orm import Mapper
from tg import request
@@ -27,6 +28,9 @@ from allura.lib import plugin
from allura.model.session import main_orm_session
from allura.model import Stats
+if typing.TYPE_CHECKING:
+ from ming.odm.mapper import Query
+
class UserStats(Stats):
@@ -35,6 +39,8 @@ class UserStats(Stats):
session = main_orm_session
unique_indexes = ['_id', 'user_id']
+ query: 'Query[UserStats]'
+
tot_logins_count = FieldProperty(int, if_missing=0)
last_login = FieldProperty(datetime)
lastmonthlogins = FieldProperty([datetime])
diff --git a/ForgeWiki/forgewiki/model/wiki.py b/ForgeWiki/forgewiki/model/wiki.py
index 48be17f..5d14871 100644
--- a/ForgeWiki/forgewiki/model/wiki.py
+++ b/ForgeWiki/forgewiki/model/wiki.py
@@ -20,6 +20,7 @@ from __future__ import absolute_import
from datetime import datetime
import difflib
import os
+import typing
# g is a namespace for globally accessable app helpers
from tg import app_globals as g
@@ -49,6 +50,10 @@ from allura.model.types import MarkdownCache
from allura.lib import helpers as h
from allura.lib import utils
+if typing.TYPE_CHECKING:
+ from ming.odm.mapper import Query
+
+
config = utils.ConfigProxy(
common_suffix='forgemail.domain')
@@ -60,7 +65,10 @@ class Globals(MappedClass):
session = project_orm_session
indexes = ['app_config_id']
+ query: 'Query[Globals]'
+
type_s = 'WikiGlobals'
+
_id = FieldProperty(schema.ObjectId)
app_config_id = ForeignIdProperty(
'AppConfig', if_missing=lambda: context.app.config._id)
@@ -72,6 +80,8 @@ class PageHistory(Snapshot):
class __mongometa__:
name = str('page_history')
+ query: 'Query[PageHistory]'
+
def original(self):
return Page.query.get(_id=self.artifact_id)
@@ -110,6 +120,8 @@ class Page(VersionedArtifact, ActivityObject):
history_class = PageHistory
unique_indexes = [('app_config_id', 'title')]
+ query: 'Query[Page]'
+
title = FieldProperty(str)
text = FieldProperty(schema.String, if_missing='')
text_cache = FieldProperty(MarkdownCache)
@@ -283,6 +295,9 @@ class WikiAttachment(BaseAttachment):
class __mongometa__:
polymorphic_identity = str('WikiAttachment')
+
+ query: 'Query[WikiAttachment]'
+
attachment_type = FieldProperty(str, if_missing='WikiAttachment')
Mapper.compile_all()
[allura] 03/04: Special property hinting
Posted by ke...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
kentontaylor pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/allura.git
commit 76104cbd79742abd46b48f2a9cd6a75ed2e3253f
Author: Dave Brondsema <db...@slashdotmedia.com>
AuthorDate: Wed Sep 29 10:00:38 2021 -0400
Special property hinting
---
Allura/allura/model/auth.py | 7 ++++---
Allura/allura/model/discuss.py | 3 ++-
Allura/allura/model/notification.py | 4 ++--
Allura/allura/model/oauth.py | 7 ++++---
Allura/allura/model/project.py | 2 +-
ForgeFeedback/forgefeedback/model/feedback.py | 2 +-
ForgeFiles/forgefiles/model/files.py | 3 ++-
ForgeTracker/forgetracker/model/ticket.py | 4 ++--
8 files changed, 18 insertions(+), 14 deletions(-)
diff --git a/Allura/allura/model/auth.py b/Allura/allura/model/auth.py
index f33bb38..add60ac 100644
--- a/Allura/allura/model/auth.py
+++ b/Allura/allura/model/auth.py
@@ -33,6 +33,7 @@ import re
from pytz import timezone
import pymongo
from pymongo.errors import DuplicateKeyError
+from bson import ObjectId
from tg import config
from tg import tmpl_context as c, app_globals as g
from tg import request
@@ -277,7 +278,7 @@ class User(MappedClass, ActivityNode, ActivityObject, SearchIndexable):
))
# Additional top-level fields can/should be accessed with get/set_pref also
# Not sure why we didn't put them within the 'preferences' dictionary :(
- display_name = FieldPropertyDisplayName(str)
+ display_name: str = FieldPropertyDisplayName(str)
# Personal data
sex = FieldProperty(
S.OneOf('Male', 'Female', 'Other', 'Unknown',
@@ -861,7 +862,7 @@ class ProjectRole(MappedClass):
query: 'Query[ProjectRole]'
_id = FieldProperty(S.ObjectId)
- user_id = AlluraUserProperty(if_missing=None)
+ user_id: ObjectId = AlluraUserProperty(if_missing=None)
project_id = ForeignIdProperty('Project', if_missing=None)
name = FieldProperty(str)
roles = FieldProperty([S.ObjectId])
@@ -1079,7 +1080,7 @@ class UserLoginDetails(MappedClass):
query: 'Query[UserLoginDetails]'
_id = FieldProperty(S.ObjectId)
- user_id = AlluraUserProperty(required=True)
+ user_id: ObjectId = AlluraUserProperty(required=True)
ip = FieldProperty(str)
ua = FieldProperty(str)
extra = FieldProperty({
diff --git a/Allura/allura/model/discuss.py b/Allura/allura/model/discuss.py
index f0b4bc1..cfcc1e1 100644
--- a/Allura/allura/model/discuss.py
+++ b/Allura/allura/model/discuss.py
@@ -33,6 +33,7 @@ from ming.orm.base import session
from ming.orm.property import (FieldProperty, RelationProperty,
ForeignIdProperty)
from ming.utils import LazyProperty
+from bson import ObjectId
from allura.lib import helpers as h
from allura.lib import security
@@ -529,7 +530,7 @@ class Post(Message, VersionedArtifact, ActivityObject, ReactableArtifact):
status = FieldProperty(schema.OneOf('ok', 'pending', 'spam',
if_missing='pending'))
last_edit_date = FieldProperty(datetime, if_missing=None)
- last_edit_by_id = AlluraUserProperty()
+ last_edit_by_id: ObjectId = AlluraUserProperty()
edit_count = FieldProperty(int, if_missing=0)
spam_check_id = FieldProperty(str, if_missing='')
text_cache = FieldProperty(MarkdownCache)
diff --git a/Allura/allura/model/notification.py b/Allura/allura/model/notification.py
index 558f426..97314d4 100644
--- a/Allura/allura/model/notification.py
+++ b/Allura/allura/model/notification.py
@@ -104,7 +104,7 @@ class Notification(MappedClass):
subject = FieldProperty(str)
text = FieldProperty(str)
link = FieldProperty(str)
- author_id = AlluraUserProperty()
+ author_id: ObjectId = AlluraUserProperty()
feed_meta = FieldProperty(S.Deprecated)
artifact_reference = FieldProperty(S.Deprecated)
pubdate = FieldProperty(datetime, if_missing=datetime.utcnow)
@@ -412,7 +412,7 @@ class Mailbox(MappedClass):
query: 'Query[Mailbox]'
_id = FieldProperty(S.ObjectId)
- user_id = AlluraUserProperty(if_missing=lambda: c.user._id)
+ user_id: ObjectId = AlluraUserProperty(if_missing=lambda: c.user._id)
project_id = ForeignIdProperty('Project', if_missing=lambda: c.project._id)
app_config_id = ForeignIdProperty(
'AppConfig', if_missing=lambda: c.app.config._id)
diff --git a/Allura/allura/model/oauth.py b/Allura/allura/model/oauth.py
index c661bb0..cd585c5 100644
--- a/Allura/allura/model/oauth.py
+++ b/Allura/allura/model/oauth.py
@@ -29,6 +29,7 @@ import pymongo
from ming import schema as S
from ming.orm import FieldProperty, RelationProperty, ForeignIdProperty, session
from ming.orm.declarative import MappedClass
+from bson import ObjectId
from allura.lib import helpers as h
from .session import main_orm_session
@@ -75,7 +76,7 @@ class OAuthConsumerToken(OAuthToken):
query: 'Query[OAuthConsumerToken]'
type = FieldProperty(str, if_missing='consumer')
- user_id = AlluraUserProperty(if_missing=lambda: c.user._id)
+ user_id: ObjectId = AlluraUserProperty(if_missing=lambda: c.user._id)
name = FieldProperty(str)
description = FieldProperty(str, if_missing='')
description_cache = FieldProperty(MarkdownCache)
@@ -121,7 +122,7 @@ class OAuthRequestToken(OAuthToken):
type = FieldProperty(str, if_missing='request')
consumer_token_id = ForeignIdProperty('OAuthConsumerToken')
- user_id = AlluraUserProperty(if_missing=lambda: c.user._id)
+ user_id: ObjectId = AlluraUserProperty(if_missing=lambda: c.user._id)
callback = FieldProperty(str)
validation_pin = FieldProperty(str)
@@ -138,7 +139,7 @@ class OAuthAccessToken(OAuthToken):
type = FieldProperty(str, if_missing='access')
consumer_token_id = ForeignIdProperty('OAuthConsumerToken')
request_token_id = ForeignIdProperty('OAuthToken')
- user_id = AlluraUserProperty(if_missing=lambda: c.user._id)
+ user_id: ObjectId = AlluraUserProperty(if_missing=lambda: c.user._id)
is_bearer = FieldProperty(bool, if_missing=False)
user = RelationProperty('User')
diff --git a/Allura/allura/model/project.py b/Allura/allura/model/project.py
index de1ff2f..694e0eb 100644
--- a/Allura/allura/model/project.py
+++ b/Allura/allura/model/project.py
@@ -229,7 +229,7 @@ class Project(SearchIndexable, MappedClass, ActivityNode, ActivityObject):
parent_id = FieldProperty(S.ObjectId, if_missing=None)
neighborhood_id = ForeignIdProperty(Neighborhood)
shortname = FieldProperty(str)
- name = ProjectNameFieldProperty(str)
+ name: str = ProjectNameFieldProperty(str)
show_download_button = FieldProperty(S.Deprecated)
short_description = FieldProperty(str, if_missing='')
summary = FieldProperty(str, if_missing='')
diff --git a/ForgeFeedback/forgefeedback/model/feedback.py b/ForgeFeedback/forgefeedback/model/feedback.py
index 2e30ca8..5d12523 100644
--- a/ForgeFeedback/forgefeedback/model/feedback.py
+++ b/ForgeFeedback/forgefeedback/model/feedback.py
@@ -60,7 +60,7 @@ class Feedback(VersionedArtifact, ActivityObject):
created_date = FieldProperty(datetime, if_missing=datetime.utcnow)
rating = FieldProperty(str, if_missing='')
description = FieldProperty(str, if_missing='')
- reported_by_id = AlluraUserProperty(if_missing=lambda: c.user._id)
+ reported_by_id: ObjectId = AlluraUserProperty(if_missing=lambda: c.user._id)
project_id = ForeignIdProperty('Project', if_missing=lambda: c.project._id)
reported_by = RelationProperty(User, via='reported_by_id')
diff --git a/ForgeFiles/forgefiles/model/files.py b/ForgeFiles/forgefiles/model/files.py
index c5af9de..e5090e5 100755
--- a/ForgeFiles/forgefiles/model/files.py
+++ b/ForgeFiles/forgefiles/model/files.py
@@ -29,6 +29,7 @@ import typing
from ming import schema as S
from ming.orm import Mapper
from ming.orm import FieldProperty, ForeignIdProperty, RelationProperty
+from bson import ObjectId
from tg import tmpl_context as c
@@ -173,7 +174,7 @@ class UploadFiles(File):
parent_folder_id = ForeignIdProperty('UploadFolder')
created_date = FieldProperty(datetime, if_missing=datetime.utcnow)
mod_date = FieldProperty(datetime, if_missing=datetime.utcnow)
- author_id = AlluraUserProperty(if_missing=lambda: c.user._id)
+ author_id: ObjectId = AlluraUserProperty(if_missing=lambda: c.user._id)
parent_folder = RelationProperty('UploadFolder', via='parent_folder_id')
linked_to_download = FieldProperty(bool, if_missing=False)
path = FieldProperty(str)
diff --git a/ForgeTracker/forgetracker/model/ticket.py b/ForgeTracker/forgetracker/model/ticket.py
index 404223f..7033407 100644
--- a/ForgeTracker/forgetracker/model/ticket.py
+++ b/ForgeTracker/forgetracker/model/ticket.py
@@ -669,8 +669,8 @@ class Ticket(VersionedArtifact, ActivityObject, VotableArtifact):
summary = FieldProperty(str)
description = FieldProperty(str, if_missing='')
description_cache = FieldProperty(MarkdownCache)
- reported_by_id = AlluraUserProperty(if_missing=lambda: c.user._id)
- assigned_to_id = AlluraUserProperty(if_missing=None)
+ reported_by_id: ObjectId = AlluraUserProperty(if_missing=lambda: c.user._id)
+ assigned_to_id: ObjectId = AlluraUserProperty(if_missing=None)
milestone = FieldProperty(str, if_missing='')
status = FieldProperty(str, if_missing='')
custom_fields = FieldProperty({str: None})
[allura] 04/04: Convert document/collection mapping to be like
other MappedClass types
Posted by ke...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
kentontaylor pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/allura.git
commit c65ce7a46791be9af71e6de9f7f204ea5a7be2c9
Author: Dave Brondsema <db...@slashdotmedia.com>
AuthorDate: Wed Sep 29 18:05:56 2021 -0400
Convert document/collection mapping to be like other MappedClass types
---
Allura/allura/model/__init__.py | 4 +-
Allura/allura/model/artifact.py | 4 +-
Allura/allura/model/auth.py | 39 +++++------
Allura/allura/model/discuss.py | 2 +-
Allura/allura/model/index.py | 87 ++++++++++++------------
Allura/allura/model/notification.py | 2 +-
Allura/allura/model/repo.py | 4 +-
Allura/allura/model/repo_refresh.py | 37 ++++++----
Allura/allura/model/repository.py | 127 +++++++++++++++++++++++------------
Allura/allura/scripts/refreshrepo.py | 4 --
ForgeGit/forgegit/model/git_repo.py | 14 ++--
11 files changed, 190 insertions(+), 134 deletions(-)
diff --git a/Allura/allura/model/__init__.py b/Allura/allura/model/__init__.py
index 9572e68..75d7fa6 100644
--- a/Allura/allura/model/__init__.py
+++ b/Allura/allura/model/__init__.py
@@ -29,7 +29,7 @@ from .artifact import VotableArtifact
from .discuss import Discussion, Thread, PostHistory, Post, DiscussionAttachment
from .attachments import BaseAttachment
from .auth import AuthGlobals, User, ProjectRole, EmailAddress
-from .auth import AuditLog, audit_log, AlluraUserProperty, UserLoginDetails
+from .auth import AuditLog, AlluraUserProperty, UserLoginDetails
from .filesystem import File
from .notification import Notification, Mailbox, SiteNotification
from .repository import Repository, RepositoryImplementation
@@ -58,7 +58,7 @@ __all__ = [
'ArtifactReference', 'Shortlink', 'Artifact', 'MovedArtifact', 'Message', 'VersionedArtifact', 'Snapshot', 'Feed',
'AwardFile', 'Award', 'AwardGrant', 'VotableArtifact', 'Discussion', 'Thread', 'PostHistory', 'Post',
'DiscussionAttachment', 'BaseAttachment', 'AuthGlobals', 'User', 'ProjectRole', 'EmailAddress',
- 'AuditLog', 'audit_log', 'AlluraUserProperty', 'File', 'Notification', 'Mailbox', 'Repository',
+ 'AuditLog', 'AlluraUserProperty', 'File', 'Notification', 'Mailbox', 'Repository',
'RepositoryImplementation', 'MergeRequest', 'GitLikeTree', 'Stats', 'OAuthToken', 'OAuthConsumerToken',
'OAuthRequestToken', 'OAuthAccessToken', 'MonQTask', 'Webhook', 'ACE', 'ACL', 'EVERYONE', 'ALL_PERMISSIONS',
'DENY_ALL', 'MarkdownCache', 'main_doc_session', 'main_orm_session', 'project_doc_session', 'project_orm_session',
diff --git a/Allura/allura/model/artifact.py b/Allura/allura/model/artifact.py
index fe5992f..25b6c4b 100644
--- a/Allura/allura/model/artifact.py
+++ b/Allura/allura/model/artifact.py
@@ -900,7 +900,7 @@ class Feed(MappedClass):
query: 'Query[Feed]'
_id = FieldProperty(S.ObjectId)
- ref_id = ForeignIdProperty('ArtifactReference')
+ ref_id: str = ForeignIdProperty('ArtifactReference')
neighborhood_id = ForeignIdProperty('Neighborhood')
project_id = ForeignIdProperty('Project')
app_config_id = ForeignIdProperty('AppConfig')
@@ -1175,7 +1175,7 @@ class SpamCheckResult(MappedClass):
query: 'Query[SpamCheckResult]'
_id = FieldProperty(S.ObjectId)
- ref_id = ForeignIdProperty('ArtifactReference')
+ ref_id: str = ForeignIdProperty('ArtifactReference')
ref = RelationProperty('ArtifactReference', via='ref_id')
project_id = ForeignIdProperty('Project')
project = RelationProperty('Project', via='project_id')
diff --git a/Allura/allura/model/auth.py b/Allura/allura/model/auth.py
index add60ac..fb17054 100644
--- a/Allura/allura/model/auth.py
+++ b/Allura/allura/model/auth.py
@@ -38,7 +38,7 @@ from tg import config
from tg import tmpl_context as c, app_globals as g
from tg import request
from ming import schema as S
-from ming import Field, collection
+from ming import Field
from ming.orm import session, state
from ming.orm import FieldProperty, RelationProperty, ForeignIdProperty
from ming.orm.declarative import MappedClass
@@ -51,7 +51,7 @@ from allura.lib import plugin
from allura.lib import utils
from allura.lib.decorators import memoize
from allura.lib.search import SearchIndexable
-from .session import main_orm_session, main_doc_session, main_explicitflush_orm_session
+from .session import main_orm_session, main_explicitflush_orm_session
from .session import project_orm_session
from .timeline import ActivityNode, ActivityObject
@@ -984,18 +984,26 @@ class ProjectRole(MappedClass):
user_id={'$ne': None}, roles=self._id)).all()
-audit_log = collection(
- str('audit_log'), main_doc_session,
- Field('_id', S.ObjectId()),
- Field('project_id', S.ObjectId, if_missing=None,
- index=True), # main view of audit log queries by project_id
- Field('user_id', S.ObjectId, if_missing=None, index=True),
- Field('timestamp', datetime, if_missing=datetime.utcnow),
- Field('url', str),
- Field('message', str))
+class AuditLog(MappedClass):
+ class __mongometa__:
+ session = main_orm_session
+ name = str('audit_log')
+ indexes = [
+ 'project_id',
+ 'user_id',
+ ]
+ query: 'Query[AuditLog]'
+
+ _id = FieldProperty(S.ObjectId)
+ project_id = ForeignIdProperty('Project', if_missing=None)
+ project = RelationProperty('Project')
+ user_id: ObjectId = AlluraUserProperty()
+ user = RelationProperty('User')
+ timestamp = FieldProperty(datetime, if_missing=datetime.utcnow)
+ url = FieldProperty(str)
+ message = FieldProperty(str)
-class AuditLog(object):
@property
def timestamp_str(self):
return self.timestamp.strftime('%Y-%m-%d %H:%M:%S')
@@ -1056,13 +1064,6 @@ class AuditLog(object):
return cls.log_user(message, *args, **kwargs)
-main_orm_session.mapper(AuditLog, audit_log, properties=dict(
- project_id=ForeignIdProperty('Project'),
- project=RelationProperty('Project'),
- user_id=AlluraUserProperty(),
- user=RelationProperty('User')))
-
-
class UserLoginDetails(MappedClass):
"""
Store unique entries for users' previous login details.
diff --git a/Allura/allura/model/discuss.py b/Allura/allura/model/discuss.py
index cfcc1e1..fd1b423 100644
--- a/Allura/allura/model/discuss.py
+++ b/Allura/allura/model/discuss.py
@@ -161,7 +161,7 @@ class Thread(Artifact, ActivityObject):
_id = FieldProperty(str, if_missing=lambda: h.nonce(10))
discussion_id = ForeignIdProperty(Discussion)
- ref_id = ForeignIdProperty('ArtifactReference')
+ ref_id: str = ForeignIdProperty('ArtifactReference')
subject = FieldProperty(str, if_missing='')
num_replies = FieldProperty(int, if_missing=0)
num_views = FieldProperty(int, if_missing=0)
diff --git a/Allura/allura/model/index.py b/Allura/allura/model/index.py
index 790667a..27fc9dd 100644
--- a/Allura/allura/model/index.py
+++ b/Allura/allura/model/index.py
@@ -20,6 +20,8 @@ from __future__ import absolute_import
import re
import logging
from itertools import groupby
+
+from ming.odm.property import FieldProperty
from six.moves.cPickle import dumps, loads
from collections import defaultdict
from six.moves.urllib.parse import unquote
@@ -28,51 +30,39 @@ import bson
import pymongo
from tg import tmpl_context as c
-from ming import collection, Field, Index
from ming import schema as S
from ming.utils import LazyProperty
-from ming.orm import session, mapper
-from ming.orm import ForeignIdProperty, RelationProperty
+from ming.odm import session, MappedClass
+from ming.odm import ForeignIdProperty, RelationProperty
from allura.lib import helpers as h
-from .session import main_doc_session, main_orm_session
+from .session import main_orm_session
from .project import Project
import six
log = logging.getLogger(__name__)
-# Collection definitions
-ArtifactReferenceDoc = collection(
- str('artifact_reference'), main_doc_session,
- Field('_id', str),
- Field('artifact_reference', dict(
- cls=S.Binary(),
- project_id=S.ObjectId(),
- app_config_id=S.ObjectId(),
- artifact_id=S.Anything(if_missing=None))),
- Field('references', [str], index=True),
- Index('artifact_reference.project_id'), # used in ReindexCommand
-)
-ShortlinkDoc = collection(
- str('shortlink'), main_doc_session,
- Field('_id', S.ObjectId()),
- # index needed for from_artifact() and index_tasks.py:del_artifacts
- Field('ref_id', str, index=True),
- Field('project_id', S.ObjectId()),
- Field('app_config_id', S.ObjectId()),
- Field('link', str),
- Field('url', str),
- # used by from_links() More helpful to have project_id first, for other
- # queries
- Index('project_id', 'link'),
-)
+class ArtifactReference(MappedClass):
+ class __mongometa__:
+ session = main_orm_session
+ name = str('artifact_reference')
+ indexes = [
+ 'references',
+ 'artifact_reference.project_id', # used in ReindexCommand
+ ]
-# Class definitions
+ query: 'Query[ArtifactReference]'
-
-class ArtifactReference(object):
+ _id = FieldProperty(str)
+ artifact_reference = FieldProperty(dict(
+ cls=S.Binary(),
+ project_id=S.ObjectId(),
+ app_config_id=S.ObjectId(),
+ artifact_id=S.Anything(if_missing=None),
+ ))
+ references = FieldProperty([str])
@classmethod
def from_artifact(cls, artifact):
@@ -107,10 +97,29 @@ class ArtifactReference(object):
self._id, aref)
-class Shortlink(object):
-
+class Shortlink(MappedClass):
'''Collection mapping shorthand_ids for artifacts to ArtifactReferences'''
+ class __mongometa__:
+ session = main_orm_session
+ name = str('shortlink')
+ indexes = [
+ 'ref_id', # for from_artifact() and index_tasks.py:del_artifacts
+ 'project_id', 'link', # used by from_links() More helpful to have project_id first, for other queries
+ ]
+
+ query: 'Query[Shortlink]'
+
+ _id = FieldProperty(S.ObjectId())
+ ref_id: str = ForeignIdProperty(ArtifactReference)
+ ref = RelationProperty(ArtifactReference)
+ project_id = ForeignIdProperty('Project')
+ project = RelationProperty('Project')
+ app_config_id = ForeignIdProperty('AppConfig')
+ app_config = RelationProperty('AppConfig')
+ link = FieldProperty(str)
+ url = FieldProperty(str)
+
# Regexes used to find shortlinks
_core_re = r'''(\[
(?:(?P<project_id>.*?):)? # optional project ID
@@ -262,13 +271,3 @@ class Shortlink(object):
artifact=parts[0])
else:
return None
-
-# Mapper definitions
-mapper(ArtifactReference, ArtifactReferenceDoc, main_orm_session)
-mapper(Shortlink, ShortlinkDoc, main_orm_session, properties=dict(
- ref_id=ForeignIdProperty(ArtifactReference),
- project_id=ForeignIdProperty('Project'),
- app_config_id=ForeignIdProperty('AppConfig'),
- project=RelationProperty('Project'),
- app_config=RelationProperty('AppConfig'),
- ref=RelationProperty(ArtifactReference)))
diff --git a/Allura/allura/model/notification.py b/Allura/allura/model/notification.py
index 97314d4..23369bd 100644
--- a/Allura/allura/model/notification.py
+++ b/Allura/allura/model/notification.py
@@ -93,7 +93,7 @@ class Notification(MappedClass):
app_config_id = ForeignIdProperty(
'AppConfig', if_missing=lambda: c.app.config._id)
tool_name = FieldProperty(str, if_missing=lambda: c.app.config.tool_name)
- ref_id = ForeignIdProperty('ArtifactReference')
+ ref_id: str = ForeignIdProperty('ArtifactReference')
topic = FieldProperty(str)
# Notification Content
diff --git a/Allura/allura/model/repo.py b/Allura/allura/model/repo.py
index 298fcaf..f4deba1 100644
--- a/Allura/allura/model/repo.py
+++ b/Allura/allura/model/repo.py
@@ -22,11 +22,11 @@
from __future__ import unicode_literals
from .repository import SUser, SObjType
from .repository import QSIZE, README_RE, VIEWABLE_EXTENSIONS, PYPELINE_EXTENSIONS, DIFF_SIMILARITY_THRESHOLD
-from .repository import CommitDoc, TreeDoc, LastCommitDoc
+from .repository import CommitDoc, LastCommitDoc
from .repository import RepoObject, Commit, Tree, Blob, LastCommit
from .repository import ModelCache
__all__ = [
'SUser', 'SObjType', 'QSIZE', 'README_RE', 'VIEWABLE_EXTENSIONS', 'PYPELINE_EXTENSIONS',
- 'DIFF_SIMILARITY_THRESHOLD', 'CommitDoc', 'TreeDoc', 'LastCommitDoc', 'RepoObject',
+ 'DIFF_SIMILARITY_THRESHOLD', 'CommitDoc', 'LastCommitDoc', 'RepoObject',
'Commit', 'Tree', 'Blob', 'LastCommit', 'ModelCache']
diff --git a/Allura/allura/model/repo_refresh.py b/Allura/allura/model/repo_refresh.py
index fa4a9d7..5b36379 100644
--- a/Allura/allura/model/repo_refresh.py
+++ b/Allura/allura/model/repo_refresh.py
@@ -31,12 +31,12 @@ from tg import tmpl_context as c, app_globals as g
from ming.base import Object
from ming.orm import mapper, session, ThreadLocalORMSession
+from ming.odm.base import ObjectState, state
from allura.lib import utils
from allura.lib import helpers as h
-from allura.model.repository import CommitDoc
-from allura.model.repository import Commit, Tree, LastCommit, ModelCache
-from allura.model.index import ArtifactReferenceDoc, ShortlinkDoc
+from allura.model.repository import Commit, CommitDoc
+from allura.model.index import ArtifactReference, Shortlink
from allura.model.auth import User
from allura.model.timeline import TransientActor
import six
@@ -134,33 +134,46 @@ def refresh_commit_repos(all_commit_ids, repo):
oid = ci._id
ci.repo_ids.append(repo._id)
index_id = 'allura.model.repository.Commit#' + oid
- ref = ArtifactReferenceDoc(dict(
+ # TODO: use ArtifactReference.from_artifact?
+ # print(f'ref {index_id}')
+ # if '5c472' in index_id: 0/0
+ ref = ArtifactReference(
+ # ref = ArtifactReferenceDoc(dict(
_id=index_id,
artifact_reference=dict(
cls=bson.Binary(dumps(Commit, protocol=2)),
project_id=repo.app.config.project_id,
app_config_id=repo.app.config._id,
artifact_id=oid),
- references=[]))
- link0 = ShortlinkDoc(dict(
+ references=[])
+ # )
+ # TODO: use Shortlink.from_artifact?
+ link0 = Shortlink(
_id=bson.ObjectId(),
ref_id=index_id,
project_id=repo.app.config.project_id,
app_config_id=repo.app.config._id,
link=repo.shorthand_for_commit(oid)[1:-1],
- url=repo.url_for_commit(oid)))
+ url=repo.url_for_commit(oid))
# Always create a link for the full commit ID
- link1 = ShortlinkDoc(dict(
+ link1 = Shortlink(
_id=bson.ObjectId(),
ref_id=index_id,
project_id=repo.app.config.project_id,
app_config_id=repo.app.config._id,
link=oid,
- url=repo.url_for_commit(oid)))
+ url=repo.url_for_commit(oid))
ci.m.save(validate=False)
- ref.m.save(validate=False)
- link0.m.save(validate=False)
- link1.m.save(validate=False)
+ # set to 'dirty' to force save() to be used instead of insert() (which errors if doc exists in db already)
+ state(ref).status = ObjectState.dirty
+ session(ref).flush(ref)
+ session(ref).expunge(ref)
+ state(link0).status = ObjectState.dirty
+ session(link0).flush(link0)
+ session(link0).expunge(link0)
+ state(link0).status = ObjectState.dirty
+ session(link1).flush(link0)
+ session(link1).expunge(link1)
def refresh_children(ci):
diff --git a/Allura/allura/model/repository.py b/Allura/allura/model/repository.py
index 2712d5b..83a5122 100644
--- a/Allura/allura/model/repository.py
+++ b/Allura/allura/model/repository.py
@@ -48,7 +48,7 @@ import six
from ming import schema as S
from ming import Field, collection, Index
from ming.utils import LazyProperty
-from ming.orm import FieldProperty, session, Mapper, mapper
+from ming.odm import FieldProperty, session, Mapper, mapper, MappedClass
from ming.base import Object
from allura.lib import helpers as h
@@ -998,41 +998,6 @@ class MergeRequest(VersionedArtifact, ActivityObject):
self.discussion_thread.add_post(text=message, is_meta=True, ignore_security=True)
-
-# Basic commit information
-# One of these for each commit in the physical repo on disk. The _id is the
-# hexsha of the commit (for Git and Hg).
-CommitDoc = collection(
- str('repo_ci'), main_doc_session,
- Field('_id', str),
- Field('tree_id', str),
- Field('committed', SUser),
- Field('authored', SUser),
- Field('message', str),
- Field('parent_ids', [str], index=True),
- Field('child_ids', [str], index=True),
- Field('repo_ids', [S.ObjectId()], index=True))
-
-# Basic tree information
-TreeDoc = collection(
- str('repo_tree'), main_doc_session,
- Field('_id', str),
- Field('tree_ids', [dict(name=str, id=str)]),
- Field('blob_ids', [dict(name=str, id=str)]),
- Field('other_ids', [dict(name=str, id=str, type=SObjType)]))
-
-# Information about the last commit to touch a tree
-LastCommitDoc = collection(
- str('repo_last_commit'), main_doc_session,
- Field('_id', S.ObjectId()),
- Field('commit_id', str),
- Field('path', str),
- Index('commit_id', 'path'),
- Field('entries', [dict(
- name=str,
- commit_id=str)]))
-
-
class RepoObject(object):
def __repr__(self): # pragma no cover
@@ -1068,7 +1033,44 @@ class RepoObject(object):
return r, isnew
-class Commit(RepoObject, ActivityObject):
+# this is duplicative with the Commit model
+# would be nice to get rid of this "doc" based view, but it is used a lot
+CommitDoc = collection(
+ str('repo_ci'), main_doc_session,
+ Field('_id', str),
+ Field('tree_id', str),
+ Field('committed', SUser),
+ Field('authored', SUser),
+ Field('message', str),
+ Field('parent_ids', [str], index=True),
+ Field('child_ids', [str], index=True),
+ Field('repo_ids', [S.ObjectId()], index=True))
+
+
+class Commit(MappedClass, RepoObject, ActivityObject):
+ # Basic commit information
+ # One of these for each commit in the physical repo on disk
+
+ class __mongometa__:
+ session = repository_orm_session
+ name = str('repo_ci')
+ indexes = [
+ 'parent_ids',
+ 'child_ids',
+ 'repo_ids',
+ ]
+
+ query: 'Query[Commit]'
+
+ _id = FieldProperty(str) # hexsha of the commit (for Git and Hg)
+ tree_id = FieldProperty(str)
+ committed = FieldProperty(SUser)
+ authored = FieldProperty(SUser)
+ message = FieldProperty(str)
+ parent_ids = FieldProperty([str])
+ child_ids = FieldProperty([str])
+ repo_ids = FieldProperty([S.ObjectId()])
+
type_s = 'Commit'
# Ephemeral attrs
repo = None
@@ -1317,7 +1319,21 @@ class Commit(RepoObject, ActivityObject):
}
-class Tree(RepoObject):
+class Tree(MappedClass, RepoObject):
+ # Basic tree information
+ class __mongometa__:
+ session = repository_orm_session
+ name = str('repo_tree')
+ indexes = [
+ ]
+
+ query: 'Query[Tree]'
+
+ _id = FieldProperty(str)
+ tree_ids = FieldProperty([dict(name=str, id=str)])
+ blob_ids = FieldProperty([dict(name=str, id=str)])
+ other_ids = FieldProperty([dict(name=str, id=str, type=SObjType)])
+
# Ephemeral attrs
repo = None
commit = None
@@ -1559,7 +1575,37 @@ class EmptyBlob(Blob):
return False
-class LastCommit(RepoObject):
+# this is duplicative with the LastCommit model
+# would be nice to get rid of this "doc" based view, but it is used a lot
+LastCommitDoc = collection(
+ str('repo_last_commit'), main_doc_session,
+ Field('_id', S.ObjectId()),
+ Field('commit_id', str),
+ Field('path', str),
+ Index('commit_id', 'path'),
+ Field('entries', [dict(
+ name=str,
+ commit_id=str)]))
+
+
+class LastCommit(MappedClass, RepoObject):
+ # Information about the last commit to touch a tree
+ class __mongometa__:
+ session = repository_orm_session
+ name = str('repo_last_commit')
+ indexes = [
+ ('commit_id', 'path'),
+ ]
+
+ query: 'Query[LastCommit]'
+
+ _id = FieldProperty(S.ObjectId)
+ commit_id = FieldProperty(str)
+ path = FieldProperty(str)
+ entries = FieldProperty([dict(
+ name=str,
+ commit_id=str,
+ )])
def __repr__(self):
return '<LastCommit /%r %s>' % (self.path, self.commit_id)
@@ -1963,7 +2009,4 @@ def zipdir(source, zipfile, exclude=None):
"STDERR: {3}".format(command, p.returncode, stdout, stderr))
-mapper(Commit, CommitDoc, repository_orm_session)
-mapper(Tree, TreeDoc, repository_orm_session)
-mapper(LastCommit, LastCommitDoc, repository_orm_session)
Mapper.compile_all()
diff --git a/Allura/allura/scripts/refreshrepo.py b/Allura/allura/scripts/refreshrepo.py
index d117138..d57fb68 100644
--- a/Allura/allura/scripts/refreshrepo.py
+++ b/Allura/allura/scripts/refreshrepo.py
@@ -90,10 +90,6 @@ class RefreshRepo(ScriptTask):
M.repository.CommitDoc.m.remove(
{"_id": {"$in": ci_ids_chunk}})
- # we used to have a TreesDoc (plural) collection to provide a mapping of commit_id to tree_id
- # so that we could clear the relevant TreeDoc records
- # its ok though, since they are created in refresh_tree_info() and overwrite existing records
-
for ci_ids_chunk in chunked_list(ci_ids, 3000):
# delete LastCommitDocs
i = M.repository.LastCommitDoc.m.find(
diff --git a/ForgeGit/forgegit/model/git_repo.py b/ForgeGit/forgegit/model/git_repo.py
index 07662ca..ed328ee 100644
--- a/ForgeGit/forgegit/model/git_repo.py
+++ b/ForgeGit/forgegit/model/git_repo.py
@@ -36,7 +36,8 @@ from paste.deploy.converters import asbool
import six
from ming.base import Object
-from ming.orm import Mapper, session
+from ming.odm import state, Mapper, session
+from ming.odm.base import ObjectState
from ming.utils import LazyProperty
from allura.lib import helpers as h
@@ -314,15 +315,15 @@ class GitImplementation(M.RepositoryImplementation):
return True
def refresh_tree_info(self, tree, seen, lazy=True):
- from allura.model.repository import TreeDoc
+ from allura.model.repository import Tree
if lazy and tree.binsha in seen:
return
seen.add(tree.binsha)
- doc = TreeDoc(dict(
+ doc = Tree(
_id=tree.hexsha,
tree_ids=[],
blob_ids=[],
- other_ids=[]))
+ other_ids=[])
for o in tree:
if o.type == 'submodule':
continue
@@ -337,7 +338,10 @@ class GitImplementation(M.RepositoryImplementation):
else:
obj.type = o.type
doc.other_ids.append(obj)
- doc.m.save()
+ # set to 'dirty' to force save() to be used instead of insert() (which errors if doc exists in db already)
+ state(doc).status = ObjectState.dirty
+ session(doc).flush(doc)
+ session(doc).expunge(doc)
return doc
def log(self, revs=None, path=None, exclude=None, id_only=True, limit=None, **kw):
[allura] 01/04: Remove old unused OldProjectRole class
Posted by ke...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
kentontaylor pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/allura.git
commit 9e81c112422c02907ce207bf0f21d833686aa67e
Author: Dave Brondsema <db...@slashdotmedia.com>
AuthorDate: Tue Sep 28 17:52:39 2021 -0400
Remove old unused OldProjectRole class
---
Allura/allura/model/__init__.py | 4 ++--
Allura/allura/model/auth.py | 7 -------
2 files changed, 2 insertions(+), 9 deletions(-)
diff --git a/Allura/allura/model/__init__.py b/Allura/allura/model/__init__.py
index 72bab45..9572e68 100644
--- a/Allura/allura/model/__init__.py
+++ b/Allura/allura/model/__init__.py
@@ -28,7 +28,7 @@ from .artifact import Artifact, MovedArtifact, Message, VersionedArtifact, Snaps
from .artifact import VotableArtifact
from .discuss import Discussion, Thread, PostHistory, Post, DiscussionAttachment
from .attachments import BaseAttachment
-from .auth import AuthGlobals, User, ProjectRole, EmailAddress, OldProjectRole
+from .auth import AuthGlobals, User, ProjectRole, EmailAddress
from .auth import AuditLog, audit_log, AlluraUserProperty, UserLoginDetails
from .filesystem import File
from .notification import Notification, Mailbox, SiteNotification
@@ -57,7 +57,7 @@ __all__ = [
'Neighborhood', 'NeighborhoodFile', 'Project', 'ProjectCategory', 'TroveCategory', 'ProjectFile', 'AppConfig',
'ArtifactReference', 'Shortlink', 'Artifact', 'MovedArtifact', 'Message', 'VersionedArtifact', 'Snapshot', 'Feed',
'AwardFile', 'Award', 'AwardGrant', 'VotableArtifact', 'Discussion', 'Thread', 'PostHistory', 'Post',
- 'DiscussionAttachment', 'BaseAttachment', 'AuthGlobals', 'User', 'ProjectRole', 'EmailAddress', 'OldProjectRole',
+ 'DiscussionAttachment', 'BaseAttachment', 'AuthGlobals', 'User', 'ProjectRole', 'EmailAddress',
'AuditLog', 'audit_log', 'AlluraUserProperty', 'File', 'Notification', 'Mailbox', 'Repository',
'RepositoryImplementation', 'MergeRequest', 'GitLikeTree', 'Stats', 'OAuthToken', 'OAuthConsumerToken',
'OAuthRequestToken', 'OAuthAccessToken', 'MonQTask', 'Webhook', 'ACE', 'ACL', 'EVERYONE', 'ALL_PERMISSIONS',
diff --git a/Allura/allura/model/auth.py b/Allura/allura/model/auth.py
index 6fe551d..e846a81 100644
--- a/Allura/allura/model/auth.py
+++ b/Allura/allura/model/auth.py
@@ -827,13 +827,6 @@ class User(MappedClass, ActivityNode, ActivityObject, SearchIndexable):
return d
-class OldProjectRole(MappedClass):
- class __mongometa__:
- session = project_orm_session
- name = str('user')
- unique_indexes = [('user_id', 'project_id', 'name')]
-
-
class ProjectRole(MappedClass):
"""
The roles that a single user holds in a project.