views.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. # GNU MediaGoblin -- federated, autonomous media hosting
  2. # Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
  3. #
  4. # This program is free software: you can redistribute it and/or modify
  5. # it under the terms of the GNU Affero General Public License as published by
  6. # the Free Software Foundation, either version 3 of the License, or
  7. # (at your option) any later version.
  8. #
  9. # This program is distributed in the hope that it will be useful,
  10. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. # GNU Affero General Public License for more details.
  13. #
  14. # You should have received a copy of the GNU Affero General Public License
  15. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. import six
  17. from mediagoblin import messages
  18. import mediagoblin.mg_globals as mg_globals
  19. import logging
  20. _log = logging.getLogger(__name__)
  21. from mediagoblin.db.models import Collection
  22. from mediagoblin.tools.federation import create_activity
  23. from mediagoblin.tools.translate import pass_to_ugettext as _
  24. from mediagoblin.tools.response import render_to_response, redirect
  25. from mediagoblin.decorators import require_active_login, user_has_privilege
  26. from mediagoblin.submit import forms as submit_forms
  27. from mediagoblin.messages import add_message, SUCCESS
  28. from mediagoblin.media_types import FileTypeNotSupported
  29. from mediagoblin.submit.lib import \
  30. check_file_field, submit_media, get_upload_file_limits, \
  31. FileUploadLimit, UserUploadLimit, UserPastUploadLimit
  32. from mediagoblin.user_pages.lib import add_media_to_collection
  33. @require_active_login
  34. @user_has_privilege(u'uploader')
  35. def submit_start(request):
  36. """
  37. First view for submitting a file.
  38. """
  39. upload_limit, max_file_size = get_upload_file_limits(request.user)
  40. submit_form = submit_forms.get_submit_start_form(
  41. request.form,
  42. license=request.user.license_preference,
  43. max_file_size=max_file_size,
  44. upload_limit=upload_limit,
  45. uploaded=request.user.uploaded)
  46. users_collections = Collection.query.filter_by(
  47. actor=request.user.id,
  48. type=Collection.USER_DEFINED_TYPE
  49. ).order_by(Collection.title)
  50. # Only show the Collections dropdown if the user has some
  51. # collections set up
  52. if users_collections.count() > 0:
  53. submit_form.collection.query = users_collections
  54. else:
  55. del submit_form.collection
  56. if request.method == 'POST' and submit_form.validate():
  57. if not check_file_field(request, 'file'):
  58. submit_form.file.errors.append(
  59. _(u'You must provide a file.'))
  60. else:
  61. try:
  62. media = submit_media(
  63. mg_app=request.app, user=request.user,
  64. submitted_file=request.files['file'],
  65. filename=request.files['file'].filename,
  66. title=six.text_type(submit_form.title.data),
  67. description=six.text_type(submit_form.description.data),
  68. license=six.text_type(submit_form.license.data) or None,
  69. tags_string=submit_form.tags.data,
  70. upload_limit=upload_limit, max_file_size=max_file_size,
  71. urlgen=request.urlgen)
  72. if submit_form.collection and submit_form.collection.data:
  73. add_media_to_collection(
  74. submit_form.collection.data, media)
  75. create_activity(
  76. "add", media, request.user,
  77. target=submit_form.collection.data)
  78. add_message(request, SUCCESS, _('Woohoo! Submitted!'))
  79. return redirect(request, "mediagoblin.user_pages.user_home",
  80. user=request.user.username)
  81. # Handle upload limit issues
  82. except FileUploadLimit:
  83. submit_form.file.errors.append(
  84. _(u'Sorry, the file size is too big.'))
  85. except UserUploadLimit:
  86. submit_form.file.errors.append(
  87. _('Sorry, uploading this file will put you over your'
  88. ' upload limit.'))
  89. except UserPastUploadLimit:
  90. messages.add_message(
  91. request,
  92. messages.WARNING,
  93. _('Sorry, you have reached your upload limit.'))
  94. return redirect(request, "mediagoblin.user_pages.user_home",
  95. user=request.user.username)
  96. except FileTypeNotSupported as e:
  97. submit_form.file.errors.append(e)
  98. except Exception as e:
  99. raise
  100. return render_to_response(
  101. request,
  102. 'mediagoblin/submit/start.html',
  103. {'submit_form': submit_form,
  104. 'app_config': mg_globals.app_config})
  105. @require_active_login
  106. def add_collection(request, media=None):
  107. """
  108. View to create a new collection
  109. """
  110. submit_form = submit_forms.AddCollectionForm(request.form)
  111. if request.method == 'POST' and submit_form.validate():
  112. collection = request.db.Collection()
  113. collection.title = six.text_type(submit_form.title.data)
  114. collection.description = six.text_type(submit_form.description.data)
  115. collection.actor = request.user.id
  116. collection.type = request.db.Collection.USER_DEFINED_TYPE
  117. collection.generate_slug()
  118. # Make sure this user isn't duplicating an existing collection
  119. existing_collection = request.db.Collection.query.filter_by(
  120. actor=request.user.id,
  121. type=request.db.Collection.USER_DEFINED_TYPE,
  122. title=collection.title).first()
  123. if existing_collection:
  124. add_message(request, messages.ERROR,
  125. _('You already have a collection called "%s"!') \
  126. % collection.title)
  127. else:
  128. collection.save()
  129. add_message(request, SUCCESS,
  130. _('Collection "%s" added!') % collection.title)
  131. return redirect(request, "mediagoblin.user_pages.user_home",
  132. user=request.user.username)
  133. return render_to_response(
  134. request,
  135. 'mediagoblin/submit/collection.html',
  136. {'submit_form': submit_form,
  137. 'app_config': mg_globals.app_config})