本文整理汇总了Python中assembl.models.Post.get_instance方法的典型用法代码示例。如果您正苦于以下问题:Python Post.get_instance方法的具体用法?Python Post.get_instance怎么用?Python Post.get_instance使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类assembl.models.Post
的用法示例。
在下文中一共展示了Post.get_instance方法的13个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: get_post
# 需要导入模块: from assembl.models import Post [as 别名]
# 或者: from assembl.models.Post import get_instance [as 别名]
def get_post(request):
post_id = request.matchdict['id']
post = Post.get_instance(post_id)
view_def = request.GET.get('view') or 'default'
if not post:
raise HTTPNotFound("Post with id '%s' not found." % post_id)
discussion_id = int(request.matchdict['discussion_id'])
user_id = authenticated_userid(request) or Everyone
permissions = get_permissions(user_id, discussion_id)
return post.generic_json(view_def, user_id, permissions)
示例2: get_post
# 需要导入模块: from assembl.models import Post [as 别名]
# 或者: from assembl.models.Post import get_instance [as 别名]
def get_post(request):
post_id = request.matchdict["id"]
post = Post.get_instance(post_id)
view_def = request.GET.get("view")
if not post:
raise HTTPNotFound("Post with id '%s' not found." % post_id)
if view_def:
return post.generic_json(view_def)
else:
return post.serializable()
示例3: mark_post_read
# 需要导入模块: from assembl.models import Post [as 别名]
# 或者: from assembl.models.Post import get_instance [as 别名]
def mark_post_read(request):
discussion_id = int(request.matchdict["discussion_id"])
discussion = Discussion.get_instance(discussion_id)
post_id = request.matchdict["id"]
post = Post.get_instance(post_id)
if not post:
raise HTTPNotFound("Post with id '%s' not found." % post_id)
post_id = post.id
user_id = authenticated_userid(request)
if not user_id:
raise HTTPUnauthorized()
read_data = json.loads(request.body)
db = Discussion.db()
change = False
with transaction.manager:
if read_data.get("read", None) is False:
view = db.query(ViewPost).filter(ViewPost.post_id == post_id).filter(Action.actor_id == user_id).first()
if view:
change = True
db.delete(view)
else:
count = db.query(ViewPost).filter(ViewPost.post_id == post_id).filter(Action.actor_id == user_id).count()
if not count:
change = True
db.add(ViewPost(post=post, actor_id=user_id))
new_counts = []
if change:
new_counts = Idea.idea_counts(discussion_id, post_id, user_id)
return {
"ok": True,
"ideas": [
{
"@id": Idea.uri_generic(idea_id),
"@type": db.query(Idea).get(idea_id).external_typename(),
"num_posts": total_posts,
"num_read_posts": read_posts,
}
for (idea_id, total_posts, read_posts) in new_counts
],
}
示例4: mark_post_read
# 需要导入模块: from assembl.models import Post [as 别名]
# 或者: from assembl.models.Post import get_instance [as 别名]
def mark_post_read(request):
"""Mark this post as un/read. Return the read post count for all affected ideas."""
discussion_id = int(request.matchdict['discussion_id'])
discussion = Discussion.get_instance(discussion_id)
post_id = request.matchdict['id']
post = Post.get_instance(post_id)
if not post:
raise HTTPNotFound("Post with id '%s' not found." % post_id)
post_id = post.id
user_id = request.authenticated_userid
if not user_id:
raise HTTPUnauthorized()
read_data = json.loads(request.body)
db = discussion.db
change = False
with transaction.manager:
if read_data.get('read', None) is False:
view = db.query(ViewPost).filter_by(
post_id=post_id, actor_id=user_id,
tombstone_date=None).first()
if view:
change = True
view.is_tombstone = True
else:
count = db.query(ViewPost).filter_by(
post_id=post_id, actor_id=user_id,
tombstone_date=None).count()
if not count:
change = True
db.add(ViewPost(post=post, actor_id=user_id))
new_counts = []
if change:
new_counts = Idea.idea_read_counts(discussion_id, post_id, user_id)
return { "ok": True, "ideas": [
{"@id": Idea.uri_generic(idea_id),
"num_read_posts": read_posts
} for (idea_id, read_posts) in new_counts] }
示例5: create_post
# 需要导入模块: from assembl.models import Post [as 别名]
# 或者: from assembl.models.Post import get_instance [as 别名]
def create_post(request):
"""
We use post, not put, because we don't know the id of the post
"""
request_body = json.loads(request.body)
user_id = authenticated_userid(request)
user = Post.db.query(User).filter_by(id=user_id).one()
message = request_body.get('message', None)
html = request_body.get('html', None)
reply_id = request_body.get('reply_id', None)
subject = request_body.get('subject', None)
if not user_id:
raise HTTPUnauthorized()
if not message:
raise HTTPUnauthorized()
if reply_id:
post = Post.get_instance(reply_id)
post.content.reply(user, message)
return {"ok": True}
discussion_id = request.matchdict['discussion_id']
discussion = Discussion.get(id=int(discussion_id))
subject = subject or discussion.topic
if not discussion:
raise HTTPNotFound(
_("No discussion found with id=%s" % discussion_id)
)
for source in discussion.sources:
source.send(user, message, subject=subject, html_body=html)
return {"ok": True}
示例6: create_post
# 需要导入模块: from assembl.models import Post [as 别名]
# 或者: from assembl.models.Post import get_instance [as 别名]
def create_post(request):
"""
We use post, not put, because we don't know the id of the post
"""
localizer = request.localizer
request_body = json.loads(request.body)
user_id = authenticated_userid(request)
if not user_id:
raise HTTPUnauthorized()
user = Post.default_db.query(User).filter_by(id=user_id).one()
body = request_body.get('body', None)
html = request_body.get('html', None) # BG: Is this used now? I cannot see it.
reply_id = request_body.get('reply_id', None)
idea_id = request_body.get('idea_id', None)
subject = request_body.get('subject', None)
publishes_synthesis_id = request_body.get('publishes_synthesis_id', None)
if not body and not publishes_synthesis_id:
# Should we allow empty messages otherwise?
raise HTTPBadRequest(localizer.translate(
_("Your message is empty")))
if reply_id:
in_reply_to_post = Post.get_instance(reply_id)
else:
in_reply_to_post = None
if idea_id:
in_reply_to_idea = Idea.get_instance(idea_id)
else:
in_reply_to_idea = None
discussion_id = int(request.matchdict['discussion_id'])
discussion = Discussion.get_instance(discussion_id)
if not discussion:
raise HTTPNotFound(localizer.translate(_(
"No discussion found with id=%s")) % (discussion_id,)
)
ctx = DummyContext({Discussion: discussion})
if html:
log.warning("Still using html")
# how to guess locale in this case?
body = LangString.create(html)
elif body:
body = LangString.create_from_json(
body, context=ctx, user_id=user_id)
else:
body = LangString.EMPTY(discussion.db)
if subject:
subject = LangString.create_from_json(
subject, context=ctx, user_id=user_id)
else:
# print(in_reply_to_post.subject, discussion.topic)
if in_reply_to_post:
subject = (in_reply_to_post.get_title().first_original().value
if in_reply_to_post.get_title() else '')
elif in_reply_to_idea:
# TODO: THis should use a cascade like the frontend
subject = (in_reply_to_idea.short_title
if in_reply_to_idea.short_title else '')
else:
subject = discussion.topic if discussion.topic else ''
# print subject
if subject is not None and len(subject):
new_subject = "Re: " + restrip_pat.sub('', subject).strip()
if (in_reply_to_post and new_subject == subject and
in_reply_to_post.get_title()):
# reuse subject and translations
subject = in_reply_to_post.get_title()
else:
# how to guess locale in this case?
subject = LangString.create(new_subject)
else:
raven_client = get_raven_client()
if raven_client:
raven_client.captureMessage(
"A message is about to be written to the database with an "
"empty subject. This is not supposed to happen.")
subject = LangString.EMPTY(discussion.db)
post_constructor_args = {
'discussion': discussion,
'creator_id': user_id,
'subject': subject,
'body': body
}
if publishes_synthesis_id:
published_synthesis = Synthesis.get_instance(publishes_synthesis_id)
post_constructor_args['publishes_synthesis'] = published_synthesis
new_post = SynthesisPost(**post_constructor_args)
else:
new_post = AssemblPost(**post_constructor_args)
discussion.db.add(new_post)
#.........这里部分代码省略.........
示例7: create_post
# 需要导入模块: from assembl.models import Post [as 别名]
# 或者: from assembl.models.Post import get_instance [as 别名]
def create_post(request):
"""
We use post, not put, because we don't know the id of the post
"""
localizer = request.localizer
request_body = json.loads(request.body)
user_id = authenticated_userid(request)
if not user_id:
raise HTTPUnauthorized()
user = Post.default_db.query(User).filter_by(id=user_id).one()
message = request_body.get('message', None)
html = request_body.get('html', None)
reply_id = request_body.get('reply_id', None)
idea_id = request_body.get('idea_id', None)
subject = request_body.get('subject', None)
publishes_synthesis_id = request_body.get('publishes_synthesis_id', None)
if not message:
raise HTTPBadRequest(localizer.translate(
_("Your message is empty")))
if reply_id:
in_reply_to_post = Post.get_instance(reply_id)
else:
in_reply_to_post = None
if idea_id:
in_reply_to_idea = Idea.get_instance(idea_id)
else:
in_reply_to_idea = None
discussion_id = int(request.matchdict['discussion_id'])
discussion = Discussion.get_instance(discussion_id)
if not discussion:
raise HTTPNotFound(
localizer.translate(_("No discussion found with id=%s" % discussion_id))
)
if subject:
subject = subject
else:
#print(in_reply_to_post.subject, discussion.topic)
if in_reply_to_post:
subject = in_reply_to_post.get_title() if in_reply_to_post.get_title() else ''
elif in_reply_to_idea:
#TODO: THis should use a cascade like the frontend
subject = in_reply_to_idea.short_title if in_reply_to_idea.short_title else ''
else:
subject = discussion.topic if discussion.topic else ''
#print subject
subject = "Re: " + restrip_pat.sub('', subject)
post_constructor_args = {
'discussion': discussion,
'creator_id': user_id,
'subject': subject,
'body': html if html else message
}
if publishes_synthesis_id:
published_synthesis = Synthesis.get_instance(publishes_synthesis_id)
post_constructor_args['publishes_synthesis'] = published_synthesis
new_post = SynthesisPost(**post_constructor_args)
else:
new_post = AssemblPost(**post_constructor_args)
discussion.db.add(new_post)
discussion.db.flush()
if in_reply_to_post:
new_post.set_parent(in_reply_to_post)
if in_reply_to_idea:
idea_post_link = IdeaRelatedPostLink(
creator_id=user_id,
content=new_post,
idea=in_reply_to_idea
)
discussion.db.add(idea_post_link)
idea = in_reply_to_idea
while idea:
idea.send_to_changes()
parents = idea.get_parents()
idea = next(iter(parents)) if parents else None
else:
discussion.root_idea.send_to_changes()
for source in discussion.sources:
if 'send_post' in dir(source):
source.send_post(new_post)
permissions = get_permissions(user_id, discussion_id)
return new_post.generic_json('default', user_id, permissions)
示例8: post_extract
# 需要导入模块: from assembl.models import Post [as 别名]
# 或者: from assembl.models.Post import get_instance [as 别名]
def post_extract(request):
"""
Create a new extract.
"""
extract_data = json.loads(request.body)
discussion_id = int(request.matchdict['discussion_id'])
user_id = authenticated_userid(request)
if not user_id:
# Straight from annotator
token = request.headers.get('X-Annotator-Auth-Token')
if token:
token = decode_token(
token, request.registry.settings['session.secret'])
if token:
user_id = token['userId']
if not user_id:
user_id = Everyone
if not user_has_permission(discussion_id, user_id, P_ADD_EXTRACT):
#TODO: maparent: restore this code once it works:
#return HTTPForbidden(result=ACLDenied(permission=P_ADD_EXTRACT))
return HTTPForbidden()
if user_id == Everyone:
# TODO: Create an anonymous user.
raise HTTPServerError("Anonymous extracts are not implemeted yet.")
content = None
uri = extract_data.get('uri')
annotation_text = None
if uri:
# Straight from annotator
annotation_text = extract_data.get('text')
else:
target = extract_data.get('target')
if not (target or uri):
raise HTTPClientError("No target")
target_type = target.get('@type')
if target_type == 'email':
post_id = target.get('@id')
post = Post.get_instance(post_id)
if not post:
raise HTTPNotFound(
"Post with id '%s' not found." % post_id)
content = post
elif target_type == 'webpage':
uri = target.get('url')
if uri and not content:
content = Webpage.get_instance(uri)
if not content:
# TODO: maparent: This is actually a singleton pattern, should be
# handled by the AnnotatorSource now that it exists...
source = AnnotatorSource.db.query(AnnotatorSource).filter_by(
discussion_id=discussion_id).filter(
cast(AnnotatorSource.name, Unicode) == 'Annotator').first()
if not source:
source = AnnotatorSource(
name='Annotator', discussion_id=discussion_id,
type='source')
content = Webpage(url=uri, discussion_id=discussion_id)
extract_body = extract_data.get('quote', '')
new_extract = Extract(
creator_id=user_id,
owner_id=user_id,
discussion_id=discussion_id,
body=extract_body,
annotation_text=annotation_text,
content=content
)
Extract.db.add(new_extract)
for range_data in extract_data.get('ranges', []):
range = TextFragmentIdentifier(
extract=new_extract,
xpath_start=range_data['start'],
offset_start=range_data['startOffset'],
xpath_end=range_data['end'],
offset_end=range_data['endOffset'])
TextFragmentIdentifier.db.add(range)
Extract.db.flush()
return {'ok': True, 'id': new_extract.uri()}
示例9: create_post
# 需要导入模块: from assembl.models import Post [as 别名]
# 或者: from assembl.models.Post import get_instance [as 别名]
def create_post(request):
"""
Create a new post in this discussion.
We use post, not put, because we don't know the id of the post
"""
localizer = request.localizer
request_body = json.loads(request.body)
user_id = request.authenticated_userid
if not user_id:
raise HTTPUnauthorized()
user = Post.default_db.query(User).filter_by(id=user_id).one()
body = request_body.get('body', None)
html = request_body.get('html', None) # BG: Is this used now? I cannot see it.
reply_id = request_body.get('reply_id', None)
idea_id = request_body.get('idea_id', None)
subject = request_body.get('subject', None)
publishes_synthesis_id = request_body.get('publishes_synthesis_id', None)
message_classifier = request_body.get('message_classifier', None)
if not body and not publishes_synthesis_id:
# Should we allow empty messages otherwise?
raise HTTPBadRequest(localizer.translate(
_("Your message is empty")))
if reply_id:
in_reply_to_post = Post.get_instance(reply_id)
else:
in_reply_to_post = None
if idea_id:
in_reply_to_idea = Idea.get_instance(idea_id)
else:
in_reply_to_idea = None
discussion_id = int(request.matchdict['discussion_id'])
discussion = Discussion.get_instance(discussion_id)
if not discussion:
raise HTTPNotFound(localizer.translate(_(
"No discussion found with id=%s")) % (discussion_id,)
)
ctx = DummyContext({Discussion: discussion})
if html:
log.warning("Still using html")
# how to guess locale in this case?
body = LangString.create(sanitize_html(html))
# TODO: AssemblPosts are pure text right now.
# Allowing HTML requires changes to the model.
elif body:
# TODO: Accept HTML body.
for e in body['entries']:
e['value'] = sanitize_text(e['value'])
body = LangString.create_from_json(
body, context=ctx, user_id=user_id)
else:
body = LangString.EMPTY(discussion.db)
if subject:
for e in subject['entries']:
e['value'] = sanitize_text(e['value'])
subject = LangString.create_from_json(
subject, context=ctx, user_id=user_id)
else:
from assembl.models import Locale
locale = Locale.UNDEFINED
# print(in_reply_to_post.subject, discussion.topic)
if in_reply_to_post and in_reply_to_post.get_title():
original_subject = in_reply_to_post.get_title().first_original()
if original_subject:
locale = original_subject.locale_code
subject = (
original_subject.value or ''
if in_reply_to_post.get_title() else '')
elif in_reply_to_idea:
# TODO: THis should use a cascade like the frontend
# also, some ideas have extra langstring titles
subject = (in_reply_to_idea.short_title
if in_reply_to_idea.short_title else '')
locale = discussion.main_locale
else:
subject = discussion.topic if discussion.topic else ''
locale = discussion.main_locale
# print subject
if subject is not None and len(subject):
new_subject = "Re: " + restrip_pat.sub('', subject).strip()
if (in_reply_to_post and new_subject == subject and
in_reply_to_post.get_title()):
# reuse subject and translations
subject = in_reply_to_post.get_title().clone(discussion.db)
else:
# how to guess locale in this case?
subject = LangString.create(new_subject, locale)
else:
capture_message(
"A message is about to be written to the database with an "
"empty subject. This is not supposed to happen.")
#.........这里部分代码省略.........
示例10: post_extract
# 需要导入模块: from assembl.models import Post [as 别名]
# 或者: from assembl.models.Post import get_instance [as 别名]
def post_extract(request):
"""
Create a new extract.
"""
extract_data = json.loads(request.body)
discussion_id = int(request.matchdict['discussion_id'])
user_id = request.authenticated_userid
if not user_id:
# Straight from annotator
token = request.headers.get('X-Annotator-Auth-Token')
if token:
token = decode_token(
token, request.registry.settings['session.secret'])
if token:
user_id = token['userId']
user_id = user_id or Everyone
if not user_has_permission(discussion_id, user_id, P_ADD_EXTRACT):
#TODO: maparent: restore this code once it works:
#return HTTPForbidden(result=ACLDenied(permission=P_ADD_EXTRACT))
return HTTPForbidden()
if not user_id or user_id == Everyone:
# TODO: Create an anonymous user.
raise HTTPServerError("Anonymous extracts are not implemeted yet.")
content = None
uri = extract_data.get('uri')
important = extract_data.get('important', False)
annotation_text = None
if uri:
# Straight from annotator
annotation_text = extract_data.get('text')
else:
target = extract_data.get('target')
if not (target or uri):
raise HTTPBadRequest("No target")
target_class = sqla.get_named_class(target.get('@type'))
if issubclass(target_class, Post):
post_id = target.get('@id')
post = Post.get_instance(post_id)
if not post:
raise HTTPNotFound(
"Post with id '%s' not found." % post_id)
content = post
elif issubclass(target_class, Webpage):
uri = target.get('url')
if uri and not content:
content = Webpage.get_instance(uri)
if not content:
# TODO: maparent: This is actually a singleton pattern, should be
# handled by the AnnotatorSource now that it exists...
source = AnnotatorSource.default_db.query(AnnotatorSource).filter_by(
discussion_id=discussion_id).filter(
cast(AnnotatorSource.name, Unicode) == 'Annotator').first()
if not source:
source = AnnotatorSource(
name='Annotator', discussion_id=discussion_id)
content = Webpage(url=uri, discussion_id=discussion_id)
extract_body = extract_data.get('quote', '')
idea_id = extract_data.get('idIdea', None)
if idea_id:
idea = Idea.get_instance(idea_id)
if(idea.discussion.id != discussion_id):
raise HTTPBadRequest(
"Extract from discussion %s cannot be associated with an idea from a different discussion." % extract.get_discussion_id())
else:
idea = None
ranges = extract_data.get('ranges', [])
extract_hash = Extract.get_extract_hash(
None,
u"".join([r['start'] for r in ranges]),
u"".join([r['end'] for r in ranges]),
u"".join([r['startOffset'] for r in ranges]),
u"".join([r['endOffset'] for r in ranges]),
content.id
)
new_extract = Extract(
creator_id=user_id,
owner_id=user_id,
discussion_id=discussion_id,
body=extract_body,
idea=idea,
important=important,
annotation_text=annotation_text,
content=content,
extract_hash=extract_hash
)
Extract.default_db.add(new_extract)
for range_data in ranges:
range = TextFragmentIdentifier(
extract=new_extract,
xpath_start=range_data['start'],
offset_start=range_data['startOffset'],
xpath_end=range_data['end'],
offset_end=range_data['endOffset'])
TextFragmentIdentifier.default_db.add(range)
Extract.default_db.flush()
#.........这里部分代码省略.........
示例11: create_post
# 需要导入模块: from assembl.models import Post [as 别名]
# 或者: from assembl.models.Post import get_instance [as 别名]
def create_post(request):
"""
We use post, not put, because we don't know the id of the post
"""
localizer = get_localizer(request)
request_body = json.loads(request.body)
user_id = authenticated_userid(request)
user = Post.db.query(User).filter_by(id=user_id).one()
message = request_body.get("message", None)
html = request_body.get("html", None)
reply_id = request_body.get("reply_id", None)
idea_id = request_body.get("idea_id", None)
subject = request_body.get("subject", None)
publishes_synthesis_id = request_body.get("publishes_synthesis_id", None)
if not user_id:
raise HTTPUnauthorized()
if not message:
raise HTTPUnauthorized()
if reply_id:
in_reply_to_post = Post.get_instance(reply_id)
else:
in_reply_to_post = None
if idea_id:
in_reply_to_idea = Idea.get_instance(idea_id)
else:
in_reply_to_idea = None
discussion_id = request.matchdict["discussion_id"]
discussion = Discussion.get_instance(discussion_id)
if not discussion:
raise HTTPNotFound(localizer.translate(_("No discussion found with id=%s" % discussion_id)))
if subject:
subject = subject
elif in_reply_to_post:
subject = in_reply_to_post.subject
elif in_reply_to_idea:
subject = in_reply_to_idea.short_title
else:
subject = discussion.topic
subject = "Re: " + restrip_pat.sub("", subject)
post_constructor_args = {
"discussion": discussion,
"message_id": uuid.uuid1().urn,
"creator_id": user_id,
"subject": subject,
"body": html if html else message,
}
if publishes_synthesis_id:
published_synthesis = Synthesis.get_instance(publishes_synthesis_id)
post_constructor_args["publishes_synthesis"] = published_synthesis
new_post = SynthesisPost(**post_constructor_args)
else:
new_post = AssemblPost(**post_constructor_args)
new_post.db.add(new_post)
new_post.db.flush()
if in_reply_to_post:
new_post.set_parent(in_reply_to_post)
if in_reply_to_idea:
idea_post_link = IdeaRelatedPostLink(creator_id=user_id, content=new_post, idea=in_reply_to_idea)
IdeaRelatedPostLink.db.add(idea_post_link)
for source in discussion.sources:
source.send_post(new_post)
return {"ok": True}
示例12: test_inspiration_widget
# 需要导入模块: from assembl.models import Post [as 别名]
# 或者: from assembl.models.Post import get_instance [as 别名]
def test_inspiration_widget(
discussion, test_app, subidea_1, subidea_1_1,
participant1_user, test_session):
# Post the initial configuration
format = lambda x: x.strftime('%Y-%m-%dT%H:%M:%S')
new_widget_loc = test_app.post(
'/data/Discussion/%d/widgets' % (discussion.id,), {
'type': 'InspirationWidget',
'settings': json.dumps({
'idea': 'local:Idea/%d' % (subidea_1.id)
})
})
assert new_widget_loc.status_code == 201
# Get the widget from the db
discussion.db.flush()
widget_uri = new_widget_loc.location
new_widget = Widget.get_instance(widget_uri)
assert new_widget
assert new_widget.base_idea == subidea_1
widget_id = new_widget.id
# There should be a link
widget_link = discussion.db.query(BaseIdeaWidgetLink).filter_by(
idea_id=subidea_1.id, widget_id=widget_id).all()
assert widget_link
assert len(widget_link) == 1
# Get the widget from the api
widget_rep = test_app.get(
local_to_absolute(widget_uri),
headers={"Accept": "application/json"}
)
assert widget_rep.status_code == 200
widget_rep = widget_rep.json
print widget_rep
assert 'messages_url' in widget_rep
assert 'ideas_url' in widget_rep
assert 'user' in widget_rep
# Get the list of new ideas
# should be empty, despite the idea having a non-widget child
idea_endpoint = local_to_absolute(widget_rep['ideas_url'])
idea_hiding_endpoint = local_to_absolute(widget_rep['ideas_hiding_url'])
test = test_app.get(idea_endpoint)
assert test.status_code == 200
assert test.json == []
discussion.db.flush()
assert new_widget.base_idea == subidea_1
return
# WEIRD virtuoso crash in the tests here,
# dependent on previous tests being run.
ancestor_widgets = test_app.get(
'/data/Discussion/%d/ideas/%d/ancestor_inspiration_widgets/' % (
discussion.id, subidea_1_1.id))
assert ancestor_widgets.status_code == 200
ancestor_widgets_rep = ancestor_widgets.json
assert new_widget_loc.location in ancestor_widgets_rep
# TODO. ajouter la collection descendant_ideas.
# Comment déduire cet URL du widget????
r = test_app.post(
'/data/Discussion/%d/widgets/%d/base_idea_descendants/%d/linkedposts' %
(discussion.id, widget_id, subidea_1_1.id), {
"type": "WidgetPost",
"body": {"@type": "LangString", "entries": [{
"@type": "LangStringEntry", "value": "body",
"@language": "en"
}]}, "creator_id": participant1_user.id,
"metadata_json": {
"inspiration_url":
"https://www.youtube.com/watch?v=7E2FUSYO374"}})
assert r.ok
post_location = r.location
post = Post.get_instance(post_location)
assert post
assert post.widget
assert post.metadata_json['inspiration_url']
示例13: test_creativity_session_widget
# 需要导入模块: from assembl.models import Post [as 别名]
# 或者: from assembl.models.Post import get_instance [as 别名]
def test_creativity_session_widget(
discussion, test_app, subidea_1, subidea_1_1,
participant1_user, test_session, request):
# Post the initial configuration
format = lambda x: x.strftime('%Y-%m-%dT%H:%M:%S')
new_widget_loc = test_app.post_json(
'/data/Discussion/%d/widgets' % (discussion.id,), {
'@type': 'CreativitySessionWidget',
'settings': {
'idea': 'local:Idea/%d' % (subidea_1.id),
'notifications': [
{
'start': '2014-01-01T00:00:00',
'end': format(datetime.utcnow() + timedelta(1)),
'message': 'creativity_session'
},
{
'start': format(datetime.utcnow() + timedelta(1)),
'end': format(datetime.utcnow() + timedelta(2)),
'message': 'creativity_session'
}
]
}
})
assert new_widget_loc.status_code == 201
# Get the widget from the db
discussion.db.flush()
new_widget = Widget.get_instance(new_widget_loc.location)
assert new_widget
assert new_widget.base_idea == subidea_1
assert not new_widget.generated_ideas
widget_id = new_widget.id
# There should be a link
widget_uri = new_widget.uri()
widget_link = discussion.db.query(BaseIdeaWidgetLink).filter_by(
idea_id=subidea_1.id, widget_id=widget_id).all()
assert widget_link
assert len(widget_link) == 1
# Get the widget from the api
widget_rep = test_app.get(
local_to_absolute(widget_uri),
headers={"Accept": "application/json"}
)
assert widget_rep.status_code == 200
widget_rep = widget_rep.json
print widget_rep
assert 'messages_url' in widget_rep
assert 'ideas_url' in widget_rep
assert 'user' in widget_rep
# Get the list of new ideas
# should be empty, despite the idea having a non-widget child
idea_endpoint = local_to_absolute(widget_rep['ideas_url'])
idea_hiding_endpoint = local_to_absolute(widget_rep['ideas_hiding_url'])
test = test_app.get(idea_endpoint)
assert test.status_code == 200
assert test.json == []
discussion.db.flush()
assert new_widget.base_idea == subidea_1
ctx_url = "http://example.com/cardgame.xml#card_1"
# Create a new sub-idea
new_idea_create = test_app.post_json(idea_hiding_endpoint, {
"@type": "Idea", "short_title": "This is a brand new idea",
"context_url": ctx_url
})
assert new_idea_create.status_code == 201
# Get the sub-idea from the db
discussion.db.flush()
assert new_widget.base_idea == subidea_1
new_idea1_id = new_idea_create.location
new_idea1 = Idea.get_instance(new_idea1_id)
assert new_idea1.proposed_in_post
assert new_idea1 in new_widget.generated_ideas
assert new_idea1.hidden
assert new_idea1.proposed_in_post.hidden
assert not subidea_1.hidden
# Get the sub-idea from the api
new_idea1_rep = test_app.get(
local_to_absolute(new_idea_create.location),
headers={"Accept": "application/json"}
)
assert new_idea1_rep.status_code == 200
new_idea1_rep = new_idea1_rep.json
# It should have a link to the root idea
idea_link = discussion.db.query(IdeaLink).filter_by(
source_id=subidea_1.id, target_id=new_idea1.id).one()
assert idea_link
# It should have a link to the widget
widget_link = discussion.db.query(GeneratedIdeaWidgetLink).filter_by(
idea_id=new_idea1.id, widget_id=widget_id).all()
assert widget_link
assert len(widget_link) == 1
# It should be linked to its creating post.
content_link = discussion.db.query(IdeaContentWidgetLink).filter_by(
idea_id=new_idea1.id, content_id=new_idea1.proposed_in_post.id).first()
assert content_link
#.........这里部分代码省略.........