added user upload limits
This commit is contained in:
parent
0cdebda7fc
commit
bdd2242155
@ -75,6 +75,9 @@ theme = string()
|
|||||||
plugin_web_path = string(default="/plugin_static/")
|
plugin_web_path = string(default="/plugin_static/")
|
||||||
plugin_linked_assets_dir = string(default="%(here)s/user_dev/plugin_static/")
|
plugin_linked_assets_dir = string(default="%(here)s/user_dev/plugin_static/")
|
||||||
|
|
||||||
|
# User upload limit (in Mbs)
|
||||||
|
upload_limit = integer(default=500)
|
||||||
|
|
||||||
[jinja2]
|
[jinja2]
|
||||||
# Jinja2 supports more directives than the minimum required by mediagoblin.
|
# Jinja2 supports more directives than the minimum required by mediagoblin.
|
||||||
# This setting allows users creating custom templates to specify a list of
|
# This setting allows users creating custom templates to specify a list of
|
||||||
|
@ -460,3 +460,23 @@ def create_oauth1_tables(db):
|
|||||||
NonceTimestamp_v0.__table__.create(db.bind)
|
NonceTimestamp_v0.__table__.create(db.bind)
|
||||||
|
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
|
|
||||||
|
@RegisterMigration(15, MIGRATIONS)
|
||||||
|
def upload_limits(db):
|
||||||
|
"""Add user upload limit columns"""
|
||||||
|
metadata = MetaData(bind=db.bind)
|
||||||
|
|
||||||
|
user_table = inspect_table(metadata, 'core__users')
|
||||||
|
media_entry_table = inspect_table(metadata, 'core__media_entries')
|
||||||
|
|
||||||
|
col = Column('uploaded', Integer, default=0)
|
||||||
|
col.create(user_table)
|
||||||
|
|
||||||
|
col = Column('upload_limit', Integer)
|
||||||
|
col.create(user_table)
|
||||||
|
|
||||||
|
col = Column('file_size', Integer, default=0)
|
||||||
|
col.create(media_entry_table)
|
||||||
|
|
||||||
|
db.commit()
|
||||||
|
@ -73,6 +73,8 @@ class User(Base, UserMixin):
|
|||||||
is_admin = Column(Boolean, default=False, nullable=False)
|
is_admin = Column(Boolean, default=False, nullable=False)
|
||||||
url = Column(Unicode)
|
url = Column(Unicode)
|
||||||
bio = Column(UnicodeText) # ??
|
bio = Column(UnicodeText) # ??
|
||||||
|
uploaded = Column(Integer, default=0)
|
||||||
|
upload_limit = Column(Integer)
|
||||||
|
|
||||||
## TODO
|
## TODO
|
||||||
# plugin data would be in a separate model
|
# plugin data would be in a separate model
|
||||||
@ -189,6 +191,7 @@ class MediaEntry(Base, MediaEntryMixin):
|
|||||||
# or use sqlalchemy.types.Enum?
|
# or use sqlalchemy.types.Enum?
|
||||||
license = Column(Unicode)
|
license = Column(Unicode)
|
||||||
collected = Column(Integer, default=0)
|
collected = Column(Integer, default=0)
|
||||||
|
file_size = Column(Integer, default=0)
|
||||||
|
|
||||||
fail_error = Column(Unicode)
|
fail_error = Column(Unicode)
|
||||||
fail_metadata = Column(JSONEncoded)
|
fail_metadata = Column(JSONEncoded)
|
||||||
|
@ -191,6 +191,13 @@ class StorageInterface(object):
|
|||||||
# Copy to storage system in 4M chunks
|
# Copy to storage system in 4M chunks
|
||||||
shutil.copyfileobj(source_file, dest_file, length=4*1048576)
|
shutil.copyfileobj(source_file, dest_file, length=4*1048576)
|
||||||
|
|
||||||
|
def get_file_size(self, filepath):
|
||||||
|
"""
|
||||||
|
Return the size of the file in bytes.
|
||||||
|
"""
|
||||||
|
# Subclasses should override this method.
|
||||||
|
self.__raise_not_implemented()
|
||||||
|
|
||||||
|
|
||||||
###########
|
###########
|
||||||
# Utilities
|
# Utilities
|
||||||
|
@ -168,6 +168,12 @@ class CloudFilesStorage(StorageInterface):
|
|||||||
# Copy to storage system in 4096 byte chunks
|
# Copy to storage system in 4096 byte chunks
|
||||||
dest_file.send(source_file)
|
dest_file.send(source_file)
|
||||||
|
|
||||||
|
def get_file_size(self, filepath):
|
||||||
|
"""Returns the file size in bytes"""
|
||||||
|
obj = self.container.get_object(
|
||||||
|
self._resolve_filepath(filepath))
|
||||||
|
return obj.total_bytes
|
||||||
|
|
||||||
class CloudFilesStorageObjectWrapper():
|
class CloudFilesStorageObjectWrapper():
|
||||||
"""
|
"""
|
||||||
Wrapper for python-cloudfiles's cloudfiles.storage_object.Object
|
Wrapper for python-cloudfiles's cloudfiles.storage_object.Object
|
||||||
|
@ -111,3 +111,6 @@ class BasicFileStorage(StorageInterface):
|
|||||||
os.makedirs(directory)
|
os.makedirs(directory)
|
||||||
# This uses chunked copying of 16kb buffers (Py2.7):
|
# This uses chunked copying of 16kb buffers (Py2.7):
|
||||||
shutil.copy(filename, self.get_local_path(filepath))
|
shutil.copy(filename, self.get_local_path(filepath))
|
||||||
|
|
||||||
|
def get_file_size(self, filepath):
|
||||||
|
return os.stat(self._resolve_filepath(filepath)).st_size
|
||||||
|
@ -43,6 +43,20 @@ def submit_start(request):
|
|||||||
"""
|
"""
|
||||||
First view for submitting a file.
|
First view for submitting a file.
|
||||||
"""
|
"""
|
||||||
|
user = request.user
|
||||||
|
if user.upload_limit:
|
||||||
|
upload_limit = user.upload_limit
|
||||||
|
else:
|
||||||
|
upload_limit = mg_globals.app_config['upload_limit']
|
||||||
|
|
||||||
|
if user.uploaded >= upload_limit:
|
||||||
|
messages.add_message(
|
||||||
|
request,
|
||||||
|
messages.WARNING,
|
||||||
|
_('Sorry, you have reached your upload limit.'))
|
||||||
|
return redirect(
|
||||||
|
request, '/u/{0}'.format(user.username))
|
||||||
|
|
||||||
submit_form = submit_forms.SubmitStartForm(request.form,
|
submit_form = submit_forms.SubmitStartForm(request.form,
|
||||||
license=request.user.license_preference)
|
license=request.user.license_preference)
|
||||||
|
|
||||||
@ -86,6 +100,26 @@ def submit_start(request):
|
|||||||
with queue_file:
|
with queue_file:
|
||||||
queue_file.write(request.files['file'].stream.read())
|
queue_file.write(request.files['file'].stream.read())
|
||||||
|
|
||||||
|
# Get file size an round to 2 decimal places
|
||||||
|
file_size = request.app.queue_store.get_file_size(
|
||||||
|
entry.queued_media_file) / (1024.0 * 1024)
|
||||||
|
file_size = float('{0:.2f}'.format(file_size))
|
||||||
|
|
||||||
|
# Check if over upload limit
|
||||||
|
if (user.uploaded + file_size) >= upload_limit:
|
||||||
|
messages.add_message(
|
||||||
|
request,
|
||||||
|
messages.WARNING,
|
||||||
|
_('Sorry, uploading this file will put you over your'
|
||||||
|
' upload limit.'))
|
||||||
|
return redirect(
|
||||||
|
request, '/u/{0}'.format(user.username))
|
||||||
|
|
||||||
|
user.uploaded = user.uploaded + file_size
|
||||||
|
user.save()
|
||||||
|
|
||||||
|
entry.file_size = file_size
|
||||||
|
|
||||||
# Save now so we have this data before kicking off processing
|
# Save now so we have this data before kicking off processing
|
||||||
entry.save()
|
entry.save()
|
||||||
|
|
||||||
|
@ -296,6 +296,10 @@ def media_confirm_delete(request, media):
|
|||||||
if request.method == 'POST' and form.validate():
|
if request.method == 'POST' and form.validate():
|
||||||
if form.confirm.data is True:
|
if form.confirm.data is True:
|
||||||
username = media.get_uploader.username
|
username = media.get_uploader.username
|
||||||
|
|
||||||
|
request.user.uploaded = request.user.uploaded - media.file_size
|
||||||
|
request.user.save()
|
||||||
|
|
||||||
# Delete MediaEntry and all related files, comments etc.
|
# Delete MediaEntry and all related files, comments etc.
|
||||||
media.delete()
|
media.delete()
|
||||||
messages.add_message(
|
messages.add_message(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user