Collection changes and migration for federation

- Adds a "type" column to the Collection object and allows the
CollectionItem model to contain any object.
- Changes "items" to "num_items" as per TODO
- Renames "uploader", "creator" and "user" to a common "actor" in most places
This commit is contained in:
Jessica Tallon
2015-09-17 13:47:56 +02:00
parent 80ba8ad1d1
commit 0f3bf8d4b1
48 changed files with 437 additions and 250 deletions

View File

@@ -38,11 +38,11 @@ def send_comment_email(user, comment, media, request):
comment_url = request.urlgen(
'mediagoblin.user_pages.media_home.view_comment',
comment=comment.id,
user=media.get_uploader.username,
user=media.get_actor.username,
media=media.slug_or_id,
qualified=True) + '#comment'
comment_author = comment.get_author.username
comment_author = comment.get_actor.username
rendered_email = render_template(
request, 'mediagoblin/user_pages/comment_email.txt',
@@ -64,12 +64,12 @@ def send_comment_email(user, comment, media, request):
def add_media_to_collection(collection, media, note=None, commit=True):
collection_item = CollectionItem()
collection_item.collection = collection.id
collection_item.media_entry = media.id
collection_item.get_object = media
if note:
collection_item.note = note
Session.add(collection_item)
collection.items = collection.items + 1
collection.num_items = collection.num_items + 1
Session.add(collection)
Session.add(media)
@@ -106,12 +106,12 @@ def build_report_object(report_form, media_entry=None, comment=None):
report_object = CommentReport()
report_object.comment_id = comment.id
report_object.reported_user_id = MediaComment.query.get(
comment.id).get_author.id
comment.id).get_actor.id
elif report_form.validate() and media_entry is not None:
report_object = MediaReport()
report_object.media_entry_id = media_entry.id
report_object.reported_user_id = MediaEntry.query.get(
media_entry.id).get_uploader.id
media_entry.id).get_actor.id
else:
return None

View File

@@ -64,7 +64,7 @@ def user_home(request, page):
{'user': user})
cursor = MediaEntry.query.\
filter_by(uploader = user.id,
filter_by(actor = user.id,
state = u'processed').order_by(MediaEntry.created.desc())
pagination = Pagination(page, cursor)
@@ -93,7 +93,7 @@ def user_gallery(request, page, url_user=None):
"""'Gallery' of a LocalUser()"""
tag = request.matchdict.get('tag', None)
cursor = MediaEntry.query.filter_by(
uploader=url_user.id,
actor=url_user.id,
state=u'processed').order_by(MediaEntry.created.desc())
# Filter potentially by tag too:
@@ -180,7 +180,7 @@ def media_post_comment(request, media):
comment = request.db.MediaComment()
comment.media_entry = media.id
comment.author = request.user.id
comment.actor = request.user.id
comment.content = six.text_type(request.form['comment_content'])
# Show error message if commenting is disabled.
@@ -195,7 +195,7 @@ def media_post_comment(request, media):
messages.ERROR,
_("Oops, your comment was empty."))
else:
create_activity("post", comment, comment.author, target=media)
create_activity("post", comment, comment.actor, target=media)
add_comment_subscription(request.user, media)
comment.save()
@@ -228,7 +228,9 @@ def media_collect(request, media):
form = user_forms.MediaCollectForm(request.form)
# A user's own collections:
form.collection.query = Collection.query.filter_by(
creator = request.user.id).order_by(Collection.title)
actor=request.user.id,
type=Collection.USER_DEFINED_TYPE
).order_by(Collection.title)
if request.method != 'POST' or not form.validate():
# No POST submission, or invalid form
@@ -247,44 +249,50 @@ def media_collect(request, media):
if form.collection_title.data:
# Make sure this user isn't duplicating an existing collection
existing_collection = Collection.query.filter_by(
creator=request.user.id,
title=form.collection_title.data).first()
actor=request.user.id,
title=form.collection_title.data,
type=Collection.USER_DEFINED_TYPE
).first()
if existing_collection:
messages.add_message(request, messages.ERROR,
_('You already have a collection called "%s"!')
% existing_collection.title)
return redirect(request, "mediagoblin.user_pages.media_home",
user=media.get_uploader.username,
user=media.get_actor.username,
media=media.slug_or_id)
collection = Collection()
collection.title = form.collection_title.data
collection.description = form.collection_description.data
collection.creator = request.user.id
collection.actor = request.user.id
collection.type = Collection.USER_DEFINED_TYPE
collection.generate_slug()
create_activity("create", collection, collection.creator)
create_activity("create", collection, collection.actor)
collection.save()
# Otherwise, use the collection selected from the drop-down
else:
collection = form.collection.data
if collection and collection.creator != request.user.id:
if collection and collection.actor != request.user.id:
collection = None
# Make sure the user actually selected a collection
item = CollectionItem.query.filter_by(collection=collection.id)
item = item.join(CollectionItem.object_helper).filter_by(
model_type=media.__tablename__,
obj_pk=media.id
).first()
if not collection:
messages.add_message(
request, messages.ERROR,
_('You have to select or add a collection'))
return redirect(request, "mediagoblin.user_pages.media_collect",
user=media.get_uploader.username,
user=media.get_actor.username,
media_id=media.id)
# Check whether media already exists in collection
elif CollectionItem.query.filter_by(
media_entry=media.id,
collection=collection.id).first():
elif item is not None:
messages.add_message(request, messages.ERROR,
_('"%s" already in collection "%s"')
% (media.title, collection.title))
@@ -308,11 +316,11 @@ def media_confirm_delete(request, media):
if request.method == 'POST' and form.validate():
if form.confirm.data is True:
username = media.get_uploader.username
username = media.get_actor.username
media.get_uploader.uploaded = media.get_uploader.uploaded - \
media.get_actor.uploaded = media.get_actor.uploaded - \
media.file_size
media.get_uploader.save()
media.get_actor.save()
# Delete MediaEntry and all related files, comments etc.
media.delete()
@@ -333,7 +341,7 @@ def media_confirm_delete(request, media):
return redirect_obj(request, media)
if ((request.user.has_privilege(u'admin') and
request.user.id != media.uploader)):
request.user.id != media.actor)):
messages.add_message(
request, messages.WARNING,
_("You are about to delete another user's media. "
@@ -351,7 +359,7 @@ def media_confirm_delete(request, media):
def user_collection(request, page, url_user=None):
"""A User-defined Collection"""
collection = Collection.query.filter_by(
get_creator=url_user,
get_actor=url_user,
slug=request.matchdict['collection']).first()
if not collection:
@@ -380,7 +388,7 @@ def user_collection(request, page, url_user=None):
def collection_list(request, url_user=None):
"""A User-defined Collection"""
collections = Collection.query.filter_by(
get_creator=url_user)
get_actor=url_user)
return render_to_response(
request,
@@ -397,15 +405,15 @@ def collection_item_confirm_remove(request, collection_item):
form = user_forms.ConfirmCollectionItemRemoveForm(request.form)
if request.method == 'POST' and form.validate():
username = collection_item.in_collection.get_creator.username
username = collection_item.in_collection.get_actor.username
collection = collection_item.in_collection
if form.confirm.data is True:
entry = collection_item.get_media_entry
entry.save()
obj = collection_item.get_object()
obj.save()
collection_item.delete()
collection.items = collection.items - 1
collection.num_items = collection.num_items - 1
collection.save()
messages.add_message(
@@ -418,7 +426,7 @@ def collection_item_confirm_remove(request, collection_item):
return redirect_obj(request, collection)
if ((request.user.has_privilege(u'admin') and
request.user.id != collection_item.in_collection.creator)):
request.user.id != collection_item.in_collection.actor)):
messages.add_message(
request, messages.WARNING,
_("You are about to delete an item from another user's collection. "
@@ -440,15 +448,15 @@ def collection_confirm_delete(request, collection):
if request.method == 'POST' and form.validate():
username = collection.get_creator.username
username = collection.get_actor.username
if form.confirm.data is True:
collection_title = collection.title
# Delete all the associated collection items
for item in collection.get_collection_items():
entry = item.get_media_entry
entry.save()
obj = item.get_object()
obj.save()
item.delete()
collection.delete()
@@ -465,7 +473,7 @@ def collection_confirm_delete(request, collection):
return redirect_obj(request, collection)
if ((request.user.has_privilege(u'admin') and
request.user.id != collection.creator)):
request.user.id != collection.actor)):
messages.add_message(
request, messages.WARNING,
_("You are about to delete another user's collection. "
@@ -491,7 +499,7 @@ def atom_feed(request):
return render_404(request)
cursor = MediaEntry.query.filter_by(
uploader = user.id,
actor = user.id,
state = u'processed').\
order_by(MediaEntry.created.desc()).\
limit(ATOM_DEFAULT_NR_OF_UPDATED_ITEMS)
@@ -523,15 +531,16 @@ def atom_feed(request):
links=atomlinks)
for entry in cursor:
feed.add(entry.get('title'),
feed.add(
entry.get('title'),
entry.description_html,
id=entry.url_for_self(request.urlgen, qualified=True),
content_type='html',
author={
'name': entry.get_uploader.username,
'name': entry.get_actor.username,
'uri': request.urlgen(
'mediagoblin.user_pages.user_home',
qualified=True, user=entry.get_uploader.username)},
qualified=True, user=entry.get_actor.username)},
updated=entry.get('created'),
links=[{
'href': entry.url_for_self(
@@ -553,7 +562,7 @@ def collection_atom_feed(request):
return render_404(request)
collection = Collection.query.filter_by(
creator=user.id,
actor=user.id,
slug=request.matchdict['collection']).first()
if not collection:
return render_404(request)
@@ -591,19 +600,20 @@ def collection_atom_feed(request):
links=atomlinks)
for item in cursor:
entry = item.get_media_entry
feed.add(entry.get('title'),
obj = item.get_object()
feed.add(
obj.get('title'),
item.note_html,
id=entry.url_for_self(request.urlgen, qualified=True),
id=obj.url_for_self(request.urlgen, qualified=True),
content_type='html',
author={
'name': entry.get_uploader.username,
'name': obj.get_actor().username,
'uri': request.urlgen(
'mediagoblin.user_pages.user_home',
qualified=True, user=entry.get_uploader.username)},
qualified=True, user=obj.get_actor().username)},
updated=item.get('added'),
links=[{
'href': entry.url_for_self(
'href': obj.url_for_self(
request.urlgen,
qualified=True),
'rel': 'alternate',
@@ -630,18 +640,18 @@ def processing_panel(request):
# Get media entries which are in-processing
processing_entries = MediaEntry.query.\
filter_by(uploader = user.id,
filter_by(actor = user.id,
state = u'processing').\
order_by(MediaEntry.created.desc())
# Get media entries which have failed to process
failed_entries = MediaEntry.query.\
filter_by(uploader = user.id,
filter_by(actor = user.id,
state = u'failed').\
order_by(MediaEntry.created.desc())
processed_entries = MediaEntry.query.\
filter_by(uploader = user.id,
filter_by(actor = user.id,
state = u'processed').\
order_by(MediaEntry.created.desc()).\
limit(10)
@@ -725,4 +735,3 @@ def activity_view(request):
"mediagoblin/api/activity.html",
{"activity": activity}
)