Fixed import
Launchpad import broke when our request-based db session merged. This switches the import script to using the db api explicitly, and adds an optional session parameter to the relevant methods. Change-Id: Iee809b53bdce2012503d2e0bf916db4e6ff67b57
This commit is contained in:
parent
4ef8732f8f
commit
77e93d15a5
@ -261,10 +261,11 @@ def _filter_non_public_fields(entity, public_list=list()):
|
|||||||
return ent_copy
|
return ent_copy
|
||||||
|
|
||||||
|
|
||||||
def entity_create(kls, values):
|
def entity_create(kls, values, session=None):
|
||||||
entity = kls()
|
entity = kls()
|
||||||
entity.update(values.copy())
|
entity.update(values.copy())
|
||||||
|
|
||||||
|
if not session:
|
||||||
session = get_session()
|
session = get_session()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -292,7 +293,8 @@ def entity_create(kls, values):
|
|||||||
return entity
|
return entity
|
||||||
|
|
||||||
|
|
||||||
def entity_update(kls, entity_id, values):
|
def entity_update(kls, entity_id, values, session=None):
|
||||||
|
if not session:
|
||||||
session = get_session()
|
session = get_session()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -53,7 +53,7 @@ def main():
|
|||||||
auto_increment = CONF.auto_increment
|
auto_increment = CONF.auto_increment
|
||||||
if auto_increment:
|
if auto_increment:
|
||||||
print 'Setting stories.AUTO_INCREMENT to %d' % (auto_increment,)
|
print 'Setting stories.AUTO_INCREMENT to %d' % (auto_increment,)
|
||||||
session = db_api.get_session()
|
session = db_api.get_session(in_request=False)
|
||||||
session.execute('ALTER TABLE stories AUTO_INCREMENT = %d;'
|
session.execute('ALTER TABLE stories AUTO_INCREMENT = %d;'
|
||||||
% (auto_increment,))
|
% (auto_increment,))
|
||||||
|
|
||||||
|
@ -22,13 +22,13 @@ from openid import cryptutil
|
|||||||
|
|
||||||
import storyboard.common.event_types as event_types
|
import storyboard.common.event_types as event_types
|
||||||
from storyboard.db.api import base as db_api
|
from storyboard.db.api import base as db_api
|
||||||
from storyboard.db.api import comments as comments_api
|
from storyboard.db.models import Comment
|
||||||
from storyboard.db.api import projects as projects_api
|
from storyboard.db.models import Project
|
||||||
from storyboard.db.api import tags as tags_api
|
|
||||||
from storyboard.db.api import users as users_api
|
|
||||||
from storyboard.db.models import Story
|
from storyboard.db.models import Story
|
||||||
|
from storyboard.db.models import StoryTag
|
||||||
from storyboard.db.models import Task
|
from storyboard.db.models import Task
|
||||||
from storyboard.db.models import TimeLineEvent
|
from storyboard.db.models import TimeLineEvent
|
||||||
|
from storyboard.db.models import User
|
||||||
|
|
||||||
|
|
||||||
class LaunchpadWriter(object):
|
class LaunchpadWriter(object):
|
||||||
@ -42,9 +42,13 @@ class LaunchpadWriter(object):
|
|||||||
self._user_map = dict()
|
self._user_map = dict()
|
||||||
# tag_name -> SB StoryTag Entity
|
# tag_name -> SB StoryTag Entity
|
||||||
self._tag_map = dict()
|
self._tag_map = dict()
|
||||||
|
# Build a session for the writer
|
||||||
|
self.session = db_api.get_session(in_request=False)
|
||||||
|
|
||||||
# SB Project Entity + Sanity check.
|
# SB Project Entity + Sanity check.
|
||||||
self.project = projects_api.project_get_by_name(project_name)
|
self.project = db_api.model_query(Project, self.session) \
|
||||||
|
.filter_by(name=project_name) \
|
||||||
|
.first()
|
||||||
if not self.project:
|
if not self.project:
|
||||||
print "Local project %s not found in storyboard, please create " \
|
print "Local project %s not found in storyboard, please create " \
|
||||||
"it first." % (project_name)
|
"it first." % (project_name)
|
||||||
@ -73,14 +77,16 @@ class LaunchpadWriter(object):
|
|||||||
if tag_name not in self._tag_map:
|
if tag_name not in self._tag_map:
|
||||||
|
|
||||||
# Does it exist in the database?
|
# Does it exist in the database?
|
||||||
tag = tags_api.tag_get_by_name(tag_name)
|
tag = db_api.model_query(StoryTag, self.session) \
|
||||||
|
.filter_by(name=tag_name) \
|
||||||
|
.first()
|
||||||
|
|
||||||
if not tag:
|
if not tag:
|
||||||
# Go ahead and create it.
|
# Go ahead and create it.
|
||||||
print "Importing tag '%s'" % (tag_name)
|
print "Importing tag '%s'" % (tag_name)
|
||||||
tag = tags_api.tag_create(dict(
|
tag = db_api.entity_create(StoryTag, {
|
||||||
name=tag_name
|
'name': tag_name
|
||||||
))
|
}, session=self.session)
|
||||||
|
|
||||||
# Add it to our memory cache
|
# Add it to our memory cache
|
||||||
self._tag_map[tag_name] = tag
|
self._tag_map[tag_name] = tag
|
||||||
@ -124,17 +130,19 @@ class LaunchpadWriter(object):
|
|||||||
if openid not in self._user_map:
|
if openid not in self._user_map:
|
||||||
|
|
||||||
# Check for the user, create if new.
|
# Check for the user, create if new.
|
||||||
user = users_api.user_get_by_openid(openid)
|
user = db_api.model_query(User, self.session) \
|
||||||
|
.filter_by(openid=openid) \
|
||||||
|
.first()
|
||||||
if not user:
|
if not user:
|
||||||
print "Importing user '%s'" % (user_link)
|
print "Importing user '%s'" % (user_link)
|
||||||
|
|
||||||
# Use a temporary email address, since LP won't give this to
|
# Use a temporary email address, since LP won't give this to
|
||||||
# us and it'll be updated on first login anyway.
|
# us and it'll be updated on first login anyway.
|
||||||
user = users_api.user_create({
|
user = db_api.entity_create(User, {
|
||||||
'openid': openid,
|
'openid': openid,
|
||||||
'full_name': display_name,
|
'full_name': display_name,
|
||||||
'email': "%s@example.com" % (display_name)
|
'email': "%s@example.com" % (display_name)
|
||||||
})
|
}, session=self.session)
|
||||||
|
|
||||||
self._user_map[openid] = user
|
self._user_map[openid] = user
|
||||||
|
|
||||||
@ -188,10 +196,11 @@ class LaunchpadWriter(object):
|
|||||||
'updated_at': updated_at,
|
'updated_at': updated_at,
|
||||||
'tags': tags
|
'tags': tags
|
||||||
}
|
}
|
||||||
duplicate = db_api.entity_get(Story, launchpad_id)
|
duplicate = db_api.entity_get(Story, launchpad_id,
|
||||||
|
session=self.session)
|
||||||
if not duplicate:
|
if not duplicate:
|
||||||
print "Importing Story: %s" % (bug.self_link,)
|
print "Importing Story: %s" % (bug.self_link,)
|
||||||
story = db_api.entity_create(Story, story)
|
story = db_api.entity_create(Story, story, session=self.session)
|
||||||
else:
|
else:
|
||||||
print "Existing Story: %s" % (bug.self_link,)
|
print "Existing Story: %s" % (bug.self_link,)
|
||||||
story = duplicate
|
story = duplicate
|
||||||
@ -200,7 +209,7 @@ class LaunchpadWriter(object):
|
|||||||
# so if we already have a project task on this story, skip it. This
|
# so if we already have a project task on this story, skip it. This
|
||||||
# is to properly replay imports in the case where errors occurred
|
# is to properly replay imports in the case where errors occurred
|
||||||
# during import.
|
# during import.
|
||||||
existing_task = db_api.model_query(Task) \
|
existing_task = db_api.model_query(Task, session=self.session) \
|
||||||
.filter(Task.story_id == launchpad_id) \
|
.filter(Task.story_id == launchpad_id) \
|
||||||
.filter(Task.project_id == self.project.id) \
|
.filter(Task.project_id == self.project.id) \
|
||||||
.first()
|
.first()
|
||||||
@ -215,7 +224,7 @@ class LaunchpadWriter(object):
|
|||||||
'updated_at': updated_at,
|
'updated_at': updated_at,
|
||||||
'priority': priority,
|
'priority': priority,
|
||||||
'status': status
|
'status': status
|
||||||
})
|
}, session=self.session)
|
||||||
else:
|
else:
|
||||||
print "- Existing task in %s" % (self.project.name,)
|
print "- Existing task in %s" % (self.project.name,)
|
||||||
task = existing_task
|
task = existing_task
|
||||||
@ -223,7 +232,8 @@ class LaunchpadWriter(object):
|
|||||||
# Duplication Check - If this story already has a creation event,
|
# Duplication Check - If this story already has a creation event,
|
||||||
# we don't need to create a new one. Otherwise, create it manually so
|
# we don't need to create a new one. Otherwise, create it manually so
|
||||||
# we don't trigger event notifications.
|
# we don't trigger event notifications.
|
||||||
story_created_event = db_api.model_query(TimeLineEvent) \
|
story_created_event = db_api \
|
||||||
|
.model_query(TimeLineEvent, session=self.session) \
|
||||||
.filter(TimeLineEvent.story_id == launchpad_id) \
|
.filter(TimeLineEvent.story_id == launchpad_id) \
|
||||||
.filter(TimeLineEvent.event_type == event_types.STORY_CREATED) \
|
.filter(TimeLineEvent.event_type == event_types.STORY_CREATED) \
|
||||||
.first()
|
.first()
|
||||||
@ -234,7 +244,7 @@ class LaunchpadWriter(object):
|
|||||||
'author_id': owner.id,
|
'author_id': owner.id,
|
||||||
'event_type': event_types.STORY_CREATED,
|
'event_type': event_types.STORY_CREATED,
|
||||||
'created_at': created_at
|
'created_at': created_at
|
||||||
})
|
}, session=self.session)
|
||||||
|
|
||||||
# Create the creation event for the task, but only if we just created
|
# Create the creation event for the task, but only if we just created
|
||||||
# a new task.
|
# a new task.
|
||||||
@ -249,10 +259,11 @@ class LaunchpadWriter(object):
|
|||||||
'task_id': task.id,
|
'task_id': task.id,
|
||||||
'task_title': title
|
'task_title': title
|
||||||
})
|
})
|
||||||
})
|
}, session=self.session)
|
||||||
|
|
||||||
# Create the discussion, loading any existing comments first.
|
# Create the discussion, loading any existing comments first.
|
||||||
current_count = db_api.model_query(TimeLineEvent) \
|
current_count = db_api \
|
||||||
|
.model_query(TimeLineEvent, session=self.session) \
|
||||||
.filter(TimeLineEvent.story_id == launchpad_id) \
|
.filter(TimeLineEvent.story_id == launchpad_id) \
|
||||||
.filter(TimeLineEvent.event_type == event_types.USER_COMMENT) \
|
.filter(TimeLineEvent.event_type == event_types.USER_COMMENT) \
|
||||||
.count()
|
.count()
|
||||||
@ -265,10 +276,10 @@ class LaunchpadWriter(object):
|
|||||||
message_created_at = message.date_created
|
message_created_at = message.date_created
|
||||||
message_owner = self.write_user(message.owner)
|
message_owner = self.write_user(message.owner)
|
||||||
|
|
||||||
comment = comments_api.comment_create({
|
comment = db_api.entity_create(Comment, {
|
||||||
'content': message.content,
|
'content': message.content,
|
||||||
'created_at': message_created_at
|
'created_at': message_created_at
|
||||||
})
|
}, session=self.session)
|
||||||
|
|
||||||
db_api.entity_create(TimeLineEvent, {
|
db_api.entity_create(TimeLineEvent, {
|
||||||
'story_id': launchpad_id,
|
'story_id': launchpad_id,
|
||||||
@ -276,4 +287,4 @@ class LaunchpadWriter(object):
|
|||||||
'event_type': event_types.USER_COMMENT,
|
'event_type': event_types.USER_COMMENT,
|
||||||
'comment_id': comment.id,
|
'comment_id': comment.id,
|
||||||
'created_at': message_created_at
|
'created_at': message_created_at
|
||||||
})
|
}, session=self.session)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user