added user upload limits

This commit is contained in:
Rodney Ewing 2013-06-12 12:02:11 -07:00
parent 0cdebda7fc
commit bdd2242155
8 changed files with 82 additions and 2 deletions

View File

@ -75,6 +75,9 @@ theme = string()
plugin_web_path = string(default="/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 supports more directives than the minimum required by mediagoblin.
# This setting allows users creating custom templates to specify a list of

View File

@ -425,7 +425,7 @@ class RequestToken_v0(declarative_base()):
callback = Column(Unicode, nullable=False, default=u"oob")
created = Column(DateTime, nullable=False, default=datetime.datetime.now)
updated = Column(DateTime, nullable=False, default=datetime.datetime.now)
class AccessToken_v0(declarative_base()):
"""
Model for representing the access tokens
@ -438,7 +438,7 @@ class AccessToken_v0(declarative_base()):
request_token = Column(Unicode, ForeignKey(RequestToken_v0.token))
created = Column(DateTime, nullable=False, default=datetime.datetime.now)
updated = Column(DateTime, nullable=False, default=datetime.datetime.now)
class NonceTimestamp_v0(declarative_base()):
"""
@ -460,3 +460,23 @@ def create_oauth1_tables(db):
NonceTimestamp_v0.__table__.create(db.bind)
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()

View File

@ -73,6 +73,8 @@ class User(Base, UserMixin):
is_admin = Column(Boolean, default=False, nullable=False)
url = Column(Unicode)
bio = Column(UnicodeText) # ??
uploaded = Column(Integer, default=0)
upload_limit = Column(Integer)
## TODO
# plugin data would be in a separate model
@ -189,6 +191,7 @@ class MediaEntry(Base, MediaEntryMixin):
# or use sqlalchemy.types.Enum?
license = Column(Unicode)
collected = Column(Integer, default=0)
file_size = Column(Integer, default=0)
fail_error = Column(Unicode)
fail_metadata = Column(JSONEncoded)

View File

@ -191,6 +191,13 @@ class StorageInterface(object):
# Copy to storage system in 4M chunks
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

View File

@ -168,6 +168,12 @@ class CloudFilesStorage(StorageInterface):
# Copy to storage system in 4096 byte chunks
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():
"""
Wrapper for python-cloudfiles's cloudfiles.storage_object.Object

View File

@ -111,3 +111,6 @@ class BasicFileStorage(StorageInterface):
os.makedirs(directory)
# This uses chunked copying of 16kb buffers (Py2.7):
shutil.copy(filename, self.get_local_path(filepath))
def get_file_size(self, filepath):
return os.stat(self._resolve_filepath(filepath)).st_size

View File

@ -43,6 +43,20 @@ def submit_start(request):
"""
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,
license=request.user.license_preference)
@ -86,6 +100,26 @@ def submit_start(request):
with queue_file:
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
entry.save()

View File

@ -296,6 +296,10 @@ def media_confirm_delete(request, media):
if request.method == 'POST' and form.validate():
if form.confirm.data is True:
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.
media.delete()
messages.add_message(