Try to use words.

This commit is contained in:
Julien Palard 2020-05-31 17:50:04 +02:00 committed by Pasteque
parent 5585af65a6
commit 3a0b346e3a
6 changed files with 4269 additions and 95 deletions

View File

@ -51,3 +51,10 @@ If you're in production collect static files:
Run it:
./manage.py runserver
## Words generation
To generate the french dict I used
$ unmunch <(grep po:adj /usr/share/hunspell/fr_FR.dic) /usr/share/hunspell/fr_FR.aff | LC_ALL=C grep '^[a-z]*$' | grep '^[a-z]\{2,7\}$' | uniq > dict/french

4140
dict/french Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,3 +1,6 @@
from webtools import settings
from django.contrib.sessions.middleware import (
SessionMiddleware as DjangoSessionMiddleware,
)

View File

@ -2,12 +2,44 @@ import string
import random
import shortuuid
import os
import re
from webtools import settings
from functools import lru_cache
from .models import Paste
@lru_cache()
def find_words():
if not settings.DICT:
return None
short_words = []
try:
with open(settings.DICT) as dictionary:
for line in dictionary:
line = line.strip()
if re.match("[a-z]{2,5}$", line):
short_words.append(line)
return short_words
except FileNotFoundError:
return None
def random_id(model):
"""Returns a short uuid for the slug of the given model."""
"""Returns a short uuid for the slug of the given model.
If a DICT is given in the settings, try to use it to generate nicer URLS like:
"""
short_words = find_words()
if short_words:
slug = (
random.choice(string.digits)
+ random.choice(string.ascii_uppercase)
+ "-"
+ random.choice(short_words)
)
if not model.objects.filter(slug=slug):
return slug
# else, fallback to the shortuuid strategy:
uuid = random.choice("0123456789") + shortuuid.uuid()
for i in range(3, len(uuid)):
potential_uuid = uuid[:i]

View File

@ -9,9 +9,9 @@ urlpatterns = [
url(r"^history$", views.history, name="history"),
url(r"^static/(?P<path>.*)", serve, {"document_root": settings.STATIC_ROOT}),
url(
r"^paste/(?P<slug>[a-zA-Z0-9]+)/(?P<renderer>[a-z]+)?$",
r"^paste/(?P<slug>[a-zA-Z0-9-]+)/(?P<renderer>[a-z]+)?$",
views.show,
name="paste",
),
url(r"^(?P<slug>[0-9][a-zA-Z0-9]+)$", views.show, name="short_paste"),
url(r"^(?P<slug>[0-9][a-zA-Z0-9-]+)$", views.show, name="short_paste"),
]

View File

@ -8,136 +8,128 @@ SITE_ROOT = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
### Customize/configure Pasteque
DISPLAY_NAME = 'Pasteque'
DISPLAY_NAME = "Pasteque"
COMPRESS_ENABLED = False
SECRET_KEY = 'change_me'
ALLOWED_HOSTS = ['localhost','127.0.0.1']
TIME_ZONE = 'Europe/Brussels'
LANGUAGE_CODE = 'fr-FR'
DEBUG = False
SECRET_KEY = "change_me"
ALLOWED_HOSTS = ["localhost", "127.0.0.1"]
TIME_ZONE = "Europe/Brussels"
LANGUAGE_CODE = "fr-FR"
DICT = os.path.join(SITE_ROOT, "dict", "french")
DEBUG = True
TEMPLATE_DEBUG = DEBUG
ADMINS = (
('user', 'user@hostname.domain'),
)
ADMINS = (("user", "user@hostname.domain"),)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': os.path.join(SITE_ROOT, 'var', 'db', 'webtools.sqlite3'),
"default": {
"ENGINE": "django.db.backends.sqlite3", # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
"NAME": os.path.join(SITE_ROOT, "var", "db", "webtools.sqlite3"),
# The following settings are not used with sqlite3:
'USER': '',
'PASSWORD': '',
'HOST': '', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
'PORT': '', # Set to empty string for default.
"USER": "",
"PASSWORD": "",
"HOST": "", # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
"PORT": "", # Set to empty string for default.
}
}
### End of customisation
APP_NAME = 'Pasteque'
APP_VERSION = 'v0.1'
APP_NAME = "Pasteque"
APP_VERSION = "v0.1"
SITE_ID = 1
MANAGERS = ADMINS
USE_I18N = True
USE_L10N = True
USE_TZ = True
MEDIA_URL = ''
CACHE_PATH = os.path.join(SITE_ROOT, 'var', 'pygments-static')
COMPRESS_ROOT = os.path.join(SITE_ROOT, 'static')
MEDIA_ROOT = os.path.join(SITE_ROOT, 'assets')
STATIC_ROOT = os.path.join(SITE_ROOT, 'static')
STATIC_URL = '/static/'
MEDIA_URL = ""
CACHE_PATH = os.path.join(SITE_ROOT, "var", "pygments-static")
COMPRESS_ROOT = os.path.join(SITE_ROOT, "static")
MEDIA_ROOT = os.path.join(SITE_ROOT, "assets")
STATIC_ROOT = os.path.join(SITE_ROOT, "static")
STATIC_URL = "/static/"
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'compressor.finders.CompressorFinder',
"django.contrib.staticfiles.finders.FileSystemFinder",
"django.contrib.staticfiles.finders.AppDirectoriesFinder",
"compressor.finders.CompressorFinder",
)
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
"django.template.loaders.filesystem.Loader",
"django.template.loaders.app_directories.Loader",
)
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'django.template.context_processors.debug',
'django.template.context_processors.request',
'paste.context_processors.app_details',
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [],
"APP_DIRS": True,
"OPTIONS": {
"context_processors": [
"django.contrib.auth.context_processors.auth",
"django.contrib.messages.context_processors.messages",
"django.template.context_processors.debug",
"django.template.context_processors.request",
"paste.context_processors.app_details",
],
},
},
]
MIDDLEWARE = [
'paste.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
"paste.middleware.SessionMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
]
ROOT_URLCONF = 'webtools.urls'
WSGI_APPLICATION = 'webtools.wsgi.application'
ROOT_URLCONF = "webtools.urls"
WSGI_APPLICATION = "webtools.wsgi.application"
INSTALLED_APPS = (
'django.contrib.staticfiles',
'django.contrib.contenttypes',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.messages',
'django.contrib.sessions',
'compressor',
'paste',
"django.contrib.staticfiles",
"django.contrib.contenttypes",
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.messages",
"django.contrib.sessions",
"compressor",
"paste",
)
PASTE = {
'has_title': False,
'has_expire_by_views': False,
'has_meta_table': False,
'show_char_left': False,
'private_by_default': True,
'enabled_renderers': ['pygments', 'raw'],
'default_renderer': 'pygments',
'max_characters': 100000,
'default_lifetime': 60 * 24 * 7 * 365,
'default_language': 'Python',
"has_title": False,
"has_expire_by_views": False,
"has_meta_table": False,
"show_char_left": False,
"private_by_default": True,
"enabled_renderers": ["pygments", "raw"],
"default_renderer": "pygments",
"max_characters": 100000,
"default_lifetime": 60 * 24 * 7 * 365,
"default_language": "Python",
}
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler'
"version": 1,
"disable_existing_loggers": False,
"filters": {"require_debug_false": {"()": "django.utils.log.RequireDebugFalse"}},
"handlers": {
"mail_admins": {
"level": "ERROR",
"filters": ["require_debug_false"],
"class": "django.utils.log.AdminEmailHandler",
},
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
},
'logfile': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(SITE_ROOT, 'var', 'logs', 'error.log'),
'maxBytes': 50000,
'backupCount': 2,
"console": {"level": "DEBUG", "class": "logging.StreamHandler",},
"logfile": {
"level": "DEBUG",
"class": "logging.handlers.RotatingFileHandler",
"filename": os.path.join(SITE_ROOT, "var", "logs", "error.log"),
"maxBytes": 50000,
"backupCount": 2,
},
},
'loggers': {
'django.request': {
'handlers': ['console','logfile'],
'level': 'ERROR',
'propagate': True,
"loggers": {
"django.request": {
"handlers": ["console", "logfile"],
"level": "ERROR",
"propagate": True,
},
}
},
}