##// END OF EJS Templates
Autodetect only a white list of mimetypes
Autodetect only a white list of mimetypes

File last commit:

r1372:cab9c599 default
r1372:cab9c599 default
Show More
utils.py
144 lines | 3.8 KiB | text/x-python | PythonLexer
Ilyas
Added django-simple-capthca support...
r78 """
This module contains helper functions and helper classes.
"""
neko259
Deduplicated file hash calculation method
r1305 import hashlib
neko259
Deduplicated upload_to method for images and file attachments
r1368 from random import random
neko259
Moved imageboard settings to the boards settings module. Added setting to disable archive
r716 import time
neko259
Added centrifuge (websocket) support for thread autoupdate. Only websocket version is supported for now
r853 import hmac
neko259
Added ability to cache method result with additional arguments. Cache thread...
r1106
neko259
Started work on the method caching decorator (BB-57)
r957 from django.core.cache import cache
from django.db.models import Model
neko259
Download webm videos from youtube
r1328 from django import forms
neko259
Rewriting views to class-based
r542 from django.utils import timezone
neko259
Download webm videos from youtube
r1328 from django.utils.translation import ugettext_lazy as _
neko259
Get mimetype for file in the form and use it for both images and attachments
r1371 import magic
neko259
Deduplicated upload_to method for images and file attachments
r1368 from portage import os
neko259
Added anonymous mode in which the board does not save poster IP addresses
r1362
neko259
Download webm videos from youtube
r1328 import boards
neko259
Added anonymous mode in which the board does not save poster IP addresses
r1362 from boards.settings import get_bool
neko259
Fixed captcha design. Added setting to enable or disable captcha. This refs #39
r81 from neboard import settings
Ilyas
Added django-simple-capthca support...
r78
neko259
Added ability to cache method result with additional arguments. Cache thread...
r1106 CACHE_KEY_DELIMITER = '_'
neko259
Show moderator controls when downloading a single post over API. Removed duplicate code from get_post_data
r1109 PERMISSION_MODERATE = 'moderation'
wnc_21
Added captcha support
r95
neko259
Added anonymous mode in which the board does not save poster IP addresses
r1362 HTTP_FORWARDED = 'HTTP_X_FORWARDED_FOR'
META_REMOTE_ADDR = 'REMOTE_ADDR'
SETTING_MESSAGES = 'Messages'
SETTING_ANON_MODE = 'AnonymousMode'
ANON_IP = '127.0.0.1'
neko259
Deduplicated upload_to method for images and file attachments
r1368 UPLOAD_DIRS ={
'PostImage': 'images/',
'Attachment': 'files/',
}
FILE_EXTENSION_DELIMITER = '.'
neko259
Added anonymous mode in which the board does not save poster IP addresses
r1362
def is_anonymous_mode():
return get_bool(SETTING_MESSAGES, SETTING_ANON_MODE)
neko259
Added ban middleware. Now banned user's won't cause load to the server.
r210 def get_client_ip(request):
neko259
Added anonymous mode in which the board does not save poster IP addresses
r1362 if is_anonymous_mode():
ip = ANON_IP
neko259
Added ban middleware. Now banned user's won't cause load to the server.
r210 else:
neko259
Added anonymous mode in which the board does not save poster IP addresses
r1362 x_forwarded_for = request.META.get(HTTP_FORWARDED)
if x_forwarded_for:
ip = x_forwarded_for.split(',')[-1].strip()
else:
ip = request.META.get(META_REMOTE_ADDR)
neko259
Rewriting views to class-based
r542 return ip
neko259
User notifications (BB-59)
r990 # TODO The output format is not epoch because it includes microseconds
neko259
Rewriting views to class-based
r542 def datetime_to_epoch(datetime):
return int(time.mktime(timezone.localtime(
datetime,timezone.get_current_timezone()).timetuple())
neko259
Moving neboard to python3 support (no python2 for now until we figure out how...
r765 * 1000000 + datetime.microsecond)
neko259
Added centrifuge (websocket) support for thread autoupdate. Only websocket version is supported for now
r853
def get_websocket_token(user_id='', timestamp=''):
"""
Create token to validate information provided by new connection.
"""
sign = hmac.new(settings.CENTRIFUGE_PROJECT_SECRET.encode())
sign.update(settings.CENTRIFUGE_PROJECT_ID.encode())
sign.update(user_id.encode())
sign.update(timestamp.encode())
token = sign.hexdigest()
neko259
Started work on the method caching decorator (BB-57)
r957 return token
neko259
Added ability to cache method result with additional arguments. Cache thread...
r1106 def cached_result(key_method=None):
neko259
Started work on the method caching decorator (BB-57)
r957 """
Caches method result in the Django's cache system, persisted by object name,
object name and model id if object is a Django model.
"""
neko259
Added ability to cache method result with additional arguments. Cache thread...
r1106 def _cached_result(function):
def inner_func(obj, *args, **kwargs):
# TODO Include method arguments to the cache key
cache_key_params = [obj.__class__.__name__, function.__name__]
if isinstance(obj, Model):
cache_key_params.append(str(obj.id))
if key_method is not None:
cache_key_params += [str(arg) for arg in key_method(obj)]
cache_key = CACHE_KEY_DELIMITER.join(cache_key_params)
neko259
Started work on the method caching decorator (BB-57)
r957
neko259
Added ability to cache method result with additional arguments. Cache thread...
r1106 persisted_result = cache.get(cache_key)
if persisted_result is not None:
result = persisted_result
else:
result = function(obj, *args, **kwargs)
cache.set(cache_key, result)
neko259
Started work on the method caching decorator (BB-57)
r957
neko259
Added ability to cache method result with additional arguments. Cache thread...
r1106 return result
neko259
Started work on the method caching decorator (BB-57)
r957
neko259
Added ability to cache method result with additional arguments. Cache thread...
r1106 return inner_func
return _cached_result
neko259
Show moderator controls when downloading a single post over API. Removed duplicate code from get_post_data
r1109
def is_moderator(request):
try:
moderate = request.user.has_perm(PERMISSION_MODERATE)
except AttributeError:
moderate = False
neko259
Deduplicated file hash calculation method
r1305 return moderate
def get_file_hash(file) -> str:
md5 = hashlib.md5()
for chunk in file.chunks():
md5.update(chunk)
return md5.hexdigest()
neko259
Download webm videos from youtube
r1328
def validate_file_size(size: int):
max_size = boards.settings.get_int('Forms', 'MaxFileSize')
if size > max_size:
raise forms.ValidationError(
_('File must be less than %s bytes')
% str(max_size))
neko259
Deduplicated upload_to method for images and file attachments
r1368
def get_upload_filename(model_instance, old_filename):
# TODO Use something other than random number in file name
neko259
Autodetect only a white list of mimetypes
r1372 extension = old_filename.split(FILE_EXTENSION_DELIMITER)[-1:][0]
neko259
Deduplicated upload_to method for images and file attachments
r1368 new_name = '{}{}.{}'.format(
str(int(time.mktime(time.gmtime()))),
str(int(random() * 1000)),
neko259
Use python-magic to get file types
r1369 extension)
neko259
Deduplicated upload_to method for images and file attachments
r1368
directory = UPLOAD_DIRS[type(model_instance).__name__]
return os.path.join(directory, new_name)
neko259
Get mimetype for file in the form and use it for both images and attachments
r1371
def get_file_mimetype(file) -> str:
neko259
Autodetect only a white list of mimetypes
r1372 return magic.from_buffer(file.chunks().__next__(), mime=True).decode()