mirror of
https://github.com/DarrenOfficial/dpaste.git
synced 2024-11-15 08:02:54 +11:00
Switch to django-appconf.
This makes it much easier to view the list of settings, and avoids repeated calls to ``getattr(settings, 'FOO', default)`` that lead to inconsistent default values.
This commit is contained in:
parent
0469d425ab
commit
63b6380a83
10 changed files with 167 additions and 114 deletions
38
dpaste/conf.py
Normal file
38
dpaste/conf.py
Normal file
|
@ -0,0 +1,38 @@
|
|||
"""Default settings for dpaste."""
|
||||
|
||||
from django.conf import settings
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
import appconf
|
||||
from . import enums
|
||||
|
||||
|
||||
class DPasteConf(appconf.AppConf):
|
||||
class Meta:
|
||||
prefix = 'dpaste'
|
||||
|
||||
BASE_URL = 'https://dpaste.de'
|
||||
|
||||
# Expiry
|
||||
EXPIRE_CHOICES = (
|
||||
(enums.EXPIRE_ONETIME, _(u'One Time Snippet')),
|
||||
(enums.EXPIRE_ONE_HOUR, _(u'In one hour')),
|
||||
(enums.EXPIRE_ONE_WEEK, _(u'In one week')),
|
||||
(enums.EXPIRE_ONE_MONTH, _(u'In one month')),
|
||||
# ('never', _(u'Never')),
|
||||
)
|
||||
EXPIRE_DEFAULT = enums.EXPIRE_ONE_MONTH
|
||||
|
||||
# Lexer
|
||||
LEXER_DEFAULT = 'python'
|
||||
LEXER_LIST = enums.DEFAULT_LEXER_LIST
|
||||
LEXER_WORDWRAP = ('text', 'rst')
|
||||
|
||||
# Snippets
|
||||
SLUG_LENGTH = 4
|
||||
SLUG_CHOICES = 'abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ1234567890'
|
||||
MAX_CONTENT_LENGTH = 250 * 1024 * 1024
|
||||
|
||||
# Users
|
||||
MAX_SNIPPETS_PER_USER = 15
|
||||
ONETIME_LIMIT = 2
|
95
dpaste/enums.py
Normal file
95
dpaste/enums.py
Normal file
|
@ -0,0 +1,95 @@
|
|||
EXPIRE_ONETIME = 'onetime'
|
||||
EXPIRE_ONE_HOUR = 3600
|
||||
EXPIRE_ONE_WEEK = 3600 * 24 * 7
|
||||
EXPIRE_ONE_MONTH = 3600 * 24 * 30
|
||||
|
||||
|
||||
# Get a list of all lexer, and then remove all lexer which have '-' or '+'
|
||||
# or 'with' in the name. Those are too specific and never used. This produces a
|
||||
# tuple list of [(lexer, Lexer Display Name) ...] lexers.
|
||||
# >>> from pygments.lexers import get_all_lexers
|
||||
# >>> ALL_LEXER = set([(i[1][0], i[0]) for i in get_all_lexers()])
|
||||
# >>> LEXER_LIST = [l for l in ALL_LEXER if not (
|
||||
# >>> '-' in l[0]
|
||||
# >>> or '+' in l[0]
|
||||
# >>> or '+' in l[1]
|
||||
# >>> or 'with' in l[1].lower()
|
||||
# >>> or ' ' in l[1]
|
||||
# >>> or l[0] in IGNORE_LEXER
|
||||
# >>> )]
|
||||
# >>> LEXER_LIST = sorted(LEXER_LIST)
|
||||
|
||||
# The list of lexers. Its not worth to autogenerate this. See above how to
|
||||
# retrieve this.
|
||||
DEFAULT_LEXER_LIST = (
|
||||
('text', 'Text'),
|
||||
('text', '----------'),
|
||||
('abap', 'ABAP'),
|
||||
('apacheconf', 'ApacheConf'),
|
||||
('applescript', 'AppleScript'),
|
||||
('as', 'ActionScript'),
|
||||
('bash', 'Bash'),
|
||||
('bbcode', 'BBCode'),
|
||||
('c', 'C'),
|
||||
('clojure', 'Clojure'),
|
||||
('cobol', 'COBOL'),
|
||||
('css', 'CSS'),
|
||||
('cuda', 'CUDA'),
|
||||
('dart', 'Dart'),
|
||||
('delphi', 'Delphi'),
|
||||
('diff', 'Diff'),
|
||||
('django', 'Django'),
|
||||
('erlang', 'Erlang'),
|
||||
('fortran', 'Fortran'),
|
||||
('go', 'Go'),
|
||||
('groovy', 'Groovy'),
|
||||
('haml', 'Haml'),
|
||||
('haskell', 'Haskell'),
|
||||
('html', 'HTML'),
|
||||
('http', 'HTTP'),
|
||||
('ini', 'INI'),
|
||||
('irc', 'IRC'),
|
||||
('java', 'Java'),
|
||||
('js', 'JavaScript'),
|
||||
('json', 'JSON'),
|
||||
('lua', 'Lua'),
|
||||
('make', 'Makefile'),
|
||||
('mako', 'Mako'),
|
||||
('mason', 'Mason'),
|
||||
('matlab', 'Matlab'),
|
||||
('modula2', 'Modula'),
|
||||
('monkey', 'Monkey'),
|
||||
('mysql', 'MySQL'),
|
||||
('numpy', 'NumPy'),
|
||||
('ocaml', 'OCaml'),
|
||||
('perl', 'Perl'),
|
||||
('php', 'PHP'),
|
||||
('postscript', 'PostScript'),
|
||||
('powershell', 'PowerShell'),
|
||||
('prolog', 'Prolog'),
|
||||
('properties', 'Properties'),
|
||||
('puppet', 'Puppet'),
|
||||
('python', 'Python'),
|
||||
('rb', 'Ruby'),
|
||||
('rst', 'reStructuredText'),
|
||||
('rust', 'Rust'),
|
||||
('sass', 'Sass'),
|
||||
('scala', 'Scala'),
|
||||
('scheme', 'Scheme'),
|
||||
('scilab', 'Scilab'),
|
||||
('scss', 'SCSS'),
|
||||
('smalltalk', 'Smalltalk'),
|
||||
('smarty', 'Smarty'),
|
||||
('sql', 'SQL'),
|
||||
('tcl', 'Tcl'),
|
||||
('tcsh', 'Tcsh'),
|
||||
('tex', 'TeX'),
|
||||
('text', 'Text'),
|
||||
('vb.net', 'VB.net'),
|
||||
('vim', 'VimL'),
|
||||
('xml', 'XML'),
|
||||
('xquery', 'XQuery'),
|
||||
('xslt', 'XSLT'),
|
||||
('yaml', 'YAML'),
|
||||
)
|
||||
|
|
@ -1,27 +1,18 @@
|
|||
import datetime
|
||||
|
||||
from django import forms
|
||||
from django.conf import settings
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from dpaste.conf import settings
|
||||
from dpaste.models import Snippet
|
||||
from dpaste.highlight import LEXER_LIST, LEXER_DEFAULT, LEXER_KEYS
|
||||
|
||||
EXPIRE_CHOICES = getattr(settings, 'DPASTE_EXPIRE_CHOICES', (
|
||||
('onetime', _(u'One Time Snippet')),
|
||||
(3600, _(u'In one hour')),
|
||||
(3600 * 24 * 7, _(u'In one week')),
|
||||
(3600 * 24 * 30, _(u'In one month')),
|
||||
# ('never', _(u'Never')),
|
||||
))
|
||||
EXPIRE_DEFAULT = getattr(settings, 'DPASTE_EXPIRE_DEFAULT', EXPIRE_CHOICES[3][0])
|
||||
MAX_CONTENT_LENGTH = getattr(settings, 'DPASTE_MAX_CONTENT_LENGTH', 250*1024*1024)
|
||||
|
||||
class SnippetForm(forms.ModelForm):
|
||||
content = forms.CharField(
|
||||
label=_('Content'),
|
||||
widget=forms.Textarea(attrs={'placeholder': _('Awesome code goes here...')}),
|
||||
max_length=MAX_CONTENT_LENGTH,
|
||||
max_length=settings.DPASTE_MAX_CONTENT_LENGTH,
|
||||
)
|
||||
|
||||
lexer = forms.ChoiceField(
|
||||
|
@ -32,8 +23,8 @@ class SnippetForm(forms.ModelForm):
|
|||
|
||||
expires = forms.ChoiceField(
|
||||
label=_(u'Expires'),
|
||||
choices=EXPIRE_CHOICES,
|
||||
initial=EXPIRE_DEFAULT,
|
||||
choices=settings.DPASTE_EXPIRE_CHOICES,
|
||||
initial=settings.DPASTE_EXPIRE_DEFAULT,
|
||||
)
|
||||
|
||||
# Honeypot field
|
||||
|
@ -91,8 +82,6 @@ class SnippetForm(forms.ModelForm):
|
|||
return expires
|
||||
|
||||
def save(self, parent=None, *args, **kwargs):
|
||||
MAX_SNIPPETS_PER_USER = getattr(settings, 'DPASTE_MAX_SNIPPETS_PER_USER', 15)
|
||||
|
||||
# Set parent snippet
|
||||
if parent:
|
||||
self.instance.parent = parent
|
||||
|
@ -111,7 +100,7 @@ class SnippetForm(forms.ModelForm):
|
|||
|
||||
# Add the snippet to the user session list
|
||||
if self.request.session.get('snippet_list', False):
|
||||
if len(self.request.session['snippet_list']) >= MAX_SNIPPETS_PER_USER:
|
||||
if len(self.request.session['snippet_list']) >= settings.DPASTE_MAX_SNIPPETS_PER_USER:
|
||||
self.request.session['snippet_list'].pop(0)
|
||||
self.request.session['snippet_list'] += [self.instance.pk]
|
||||
else:
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
from pygments import highlight
|
||||
from pygments.lexers import *
|
||||
from pygments.formatters import HtmlFormatter
|
||||
from django.conf import settings
|
||||
|
||||
from dpaste.conf import settings
|
||||
|
||||
"""
|
||||
# Get a list of all lexer, and then remove all lexer which have '-' or '+'
|
||||
|
@ -22,85 +23,15 @@ LEXER_LIST = sorted(LEXER_LIST)
|
|||
|
||||
# The list of lexers. Its not worth to autogenerate this. See above how to
|
||||
# retrieve this.
|
||||
LEXER_LIST = getattr(settings, 'DPASTE_LEXER_LIST', (
|
||||
('text', 'Text'),
|
||||
('text', '----------'),
|
||||
('abap', 'ABAP'),
|
||||
('apacheconf', 'ApacheConf'),
|
||||
('applescript', 'AppleScript'),
|
||||
('as', 'ActionScript'),
|
||||
('bash', 'Bash'),
|
||||
('bbcode', 'BBCode'),
|
||||
('c', 'C'),
|
||||
('clojure', 'Clojure'),
|
||||
('cobol', 'COBOL'),
|
||||
('css', 'CSS'),
|
||||
('cuda', 'CUDA'),
|
||||
('dart', 'Dart'),
|
||||
('delphi', 'Delphi'),
|
||||
('diff', 'Diff'),
|
||||
('django', 'Django'),
|
||||
('erlang', 'Erlang'),
|
||||
('fortran', 'Fortran'),
|
||||
('go', 'Go'),
|
||||
('groovy', 'Groovy'),
|
||||
('haml', 'Haml'),
|
||||
('haskell', 'Haskell'),
|
||||
('html', 'HTML'),
|
||||
('http', 'HTTP'),
|
||||
('ini', 'INI'),
|
||||
('irc', 'IRC'),
|
||||
('java', 'Java'),
|
||||
('js', 'JavaScript'),
|
||||
('json', 'JSON'),
|
||||
('lua', 'Lua'),
|
||||
('make', 'Makefile'),
|
||||
('mako', 'Mako'),
|
||||
('mason', 'Mason'),
|
||||
('matlab', 'Matlab'),
|
||||
('modula2', 'Modula'),
|
||||
('monkey', 'Monkey'),
|
||||
('mysql', 'MySQL'),
|
||||
('numpy', 'NumPy'),
|
||||
('ocaml', 'OCaml'),
|
||||
('perl', 'Perl'),
|
||||
('php', 'PHP'),
|
||||
('postscript', 'PostScript'),
|
||||
('powershell', 'PowerShell'),
|
||||
('prolog', 'Prolog'),
|
||||
('properties', 'Properties'),
|
||||
('puppet', 'Puppet'),
|
||||
('python', 'Python'),
|
||||
('rb', 'Ruby'),
|
||||
('rst', 'reStructuredText'),
|
||||
('rust', 'Rust'),
|
||||
('sass', 'Sass'),
|
||||
('scala', 'Scala'),
|
||||
('scheme', 'Scheme'),
|
||||
('scilab', 'Scilab'),
|
||||
('scss', 'SCSS'),
|
||||
('smalltalk', 'Smalltalk'),
|
||||
('smarty', 'Smarty'),
|
||||
('sql', 'SQL'),
|
||||
('tcl', 'Tcl'),
|
||||
('tcsh', 'Tcsh'),
|
||||
('tex', 'TeX'),
|
||||
('text', 'Text'),
|
||||
('vb.net', 'VB.net'),
|
||||
('vim', 'VimL'),
|
||||
('xml', 'XML'),
|
||||
('xquery', 'XQuery'),
|
||||
('xslt', 'XSLT'),
|
||||
('yaml', 'YAML'),
|
||||
))
|
||||
LEXER_LIST = settings.DPASTE_LEXER_LIST
|
||||
|
||||
LEXER_KEYS = dict(LEXER_LIST).keys()
|
||||
|
||||
# The default lexer is python
|
||||
LEXER_DEFAULT = getattr(settings, 'DPASTE_LEXER_DEFAULT', 'python')
|
||||
LEXER_DEFAULT = settings.DPASTE_LEXER_DEFAULT
|
||||
|
||||
# Lexers which have wordwrap enabled by default
|
||||
LEXER_WORDWRAP = getattr(settings, 'DPASTE_LEXER_WORDWRAP', ('text', 'rst'))
|
||||
LEXER_WORDWRAP = settings.DPASTE_LEXER_WORDWRAP
|
||||
|
||||
|
||||
class NakedHtmlFormatter(HtmlFormatter):
|
||||
|
|
|
@ -2,20 +2,15 @@ from random import SystemRandom
|
|||
|
||||
from django.db import models
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.conf import settings
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
import mptt
|
||||
|
||||
from dpaste.conf import settings
|
||||
from dpaste.highlight import LEXER_DEFAULT
|
||||
|
||||
R = SystemRandom()
|
||||
L = getattr(settings, 'DPASTE_SLUG_LENGTH', 4)
|
||||
T = getattr(settings, 'DPASTE_SLUG_CHOICES',
|
||||
'abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ1234567890')
|
||||
|
||||
ONETIME_LIMIT = getattr(settings, 'DPASTE_ONETIME_LIMIT', 2)
|
||||
|
||||
def generate_secret_id(length=L, alphabet=T):
|
||||
def generate_secret_id(length=settings.DPASTE_SLUG_LENGTH, alphabet=settings.DPASTE_SLUG_CHOICES):
|
||||
return ''.join([R.choice(alphabet) for i in range(length)])
|
||||
|
||||
class Snippet(models.Model):
|
||||
|
@ -48,7 +43,7 @@ class Snippet(models.Model):
|
|||
@property
|
||||
def remaining_views(self):
|
||||
if self.expire_type == self.EXPIRE_ONETIME:
|
||||
remaining = ONETIME_LIMIT - self.view_count
|
||||
remaining = settings.DPASTE_ONETIME_LIMIT - self.view_count
|
||||
return remaining > 0 and remaining or 0
|
||||
return None
|
||||
|
||||
|
|
|
@ -8,9 +8,9 @@ from django.test.client import Client
|
|||
from django.test import TestCase
|
||||
from django.test.utils import override_settings
|
||||
|
||||
from dpaste.conf import settings
|
||||
|
||||
from ..models import Snippet
|
||||
from ..forms import EXPIRE_DEFAULT
|
||||
from ..highlight import LEXER_DEFAULT
|
||||
|
||||
|
||||
class SnippetTestCase(TestCase):
|
||||
|
@ -22,8 +22,8 @@ class SnippetTestCase(TestCase):
|
|||
def valid_form_data(self):
|
||||
return {
|
||||
'content': u"Hello Wörld.\n\tGood Bye",
|
||||
'lexer': LEXER_DEFAULT,
|
||||
'expires': EXPIRE_DEFAULT,
|
||||
'lexer': settings.DPASTE_LEXER_DEFAULT,
|
||||
'expires': settings.DPASTE_EXPIRE_DEFAULT,
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
from __future__ import absolute_import
|
||||
|
||||
from django.conf.urls import url, patterns, include
|
||||
|
||||
urlpatterns = patterns(
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
from django.conf.urls import url, patterns
|
||||
from django.conf import settings
|
||||
from __future__ import absolute_import
|
||||
|
||||
L = getattr(settings, 'DPASTE_SLUG_LENGTH', 4)
|
||||
from django.conf.urls import url, patterns
|
||||
|
||||
from dpaste.conf import settings
|
||||
|
||||
L = settings.DPASTE_SLUG_LENGTH
|
||||
|
||||
urlpatterns = patterns('dpaste.views',
|
||||
url(r'^about/$', 'about', name='dpaste_about'),
|
||||
|
|
|
@ -7,7 +7,6 @@ from django.shortcuts import (render_to_response, get_object_or_404)
|
|||
from django.template.context import RequestContext
|
||||
from django.http import (Http404, HttpResponseRedirect, HttpResponseBadRequest,
|
||||
HttpResponse)
|
||||
from django.conf import settings
|
||||
from django.core.exceptions import ObjectDoesNotExist
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from django.core.urlresolvers import reverse
|
||||
|
@ -16,8 +15,9 @@ from django.views.defaults import (page_not_found as django_page_not_found,
|
|||
server_error as django_server_error)
|
||||
from django.views.decorators.csrf import csrf_exempt
|
||||
|
||||
from dpaste.conf import settings
|
||||
from dpaste.forms import SnippetForm
|
||||
from dpaste.models import Snippet, ONETIME_LIMIT
|
||||
from dpaste.models import Snippet
|
||||
from dpaste.highlight import LEXER_WORDWRAP, LEXER_LIST
|
||||
from dpaste.highlight import LEXER_DEFAULT, LEXER_KEYS
|
||||
|
||||
|
@ -60,7 +60,7 @@ def snippet_details(request, snippet_id, template_name='dpaste/snippet_details.h
|
|||
|
||||
# One time snippet get deleted if the view count matches our limit
|
||||
if snippet.expire_type == Snippet.EXPIRE_ONETIME \
|
||||
and snippet.view_count >= ONETIME_LIMIT:
|
||||
and snippet.view_count >= settings.DPASTE_ONETIME_LIMIT:
|
||||
snippet.delete()
|
||||
raise Http404()
|
||||
|
||||
|
@ -145,7 +145,7 @@ def snippet_history(request, template_name='dpaste/snippet_list.html'):
|
|||
return HttpResponseRedirect(reverse('snippet_history'))
|
||||
|
||||
template_context = {
|
||||
'snippets_max': getattr(settings, 'DPASTE_MAX_SNIPPETS_PER_USER', 10),
|
||||
'snippets_max': settings.DPASTE_MAX_SNIPPETS_PER_USER,
|
||||
'snippet_list': snippet_list,
|
||||
}
|
||||
|
||||
|
@ -259,21 +259,20 @@ def about(request, template_name='dpaste/about.html'):
|
|||
|
||||
def _format_default(s):
|
||||
"""The default response is the snippet URL wrapped in quotes."""
|
||||
return u'"%s%s"' % (BASE_URL, s.get_absolute_url())
|
||||
return u'"%s%s"' % (settings.DPASTE_BASE_URL, s.get_absolute_url())
|
||||
|
||||
def _format_url(s):
|
||||
"""The `url` format returns the snippet URL, no quotes, but a linebreak after."""
|
||||
return u'%s%s\n' % (BASE_URL, s.get_absolute_url())
|
||||
return u'%s%s\n' % (settings.DPASTE_BASE_URL, s.get_absolute_url())
|
||||
|
||||
def _format_json(s):
|
||||
"""The `json` format export."""
|
||||
return json.dumps({
|
||||
'url': u'%s%s' % (BASE_URL, s.get_absolute_url()),
|
||||
'url': u'%s%s' % (settings.DPASTE_BASE_URL, s.get_absolute_url()),
|
||||
'content': s.content,
|
||||
'lexer': s.lexer,
|
||||
})
|
||||
|
||||
BASE_URL = getattr(settings, 'DPASTE_BASE_URL', 'https://dpaste.de')
|
||||
|
||||
FORMAT_MAPPING = {
|
||||
'default': _format_default,
|
||||
|
@ -297,7 +296,7 @@ def snippet_api(request):
|
|||
s = Snippet.objects.create(
|
||||
content=content,
|
||||
lexer=lexer,
|
||||
expires=datetime.datetime.now()+datetime.timedelta(seconds=60*60*24*30)
|
||||
expires=datetime.datetime.now() + datetime.timedelta(seconds=60*60*24*30)
|
||||
)
|
||||
s.save()
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@ django==1.6.1
|
|||
django-mptt==0.6.0
|
||||
pygments==1.6
|
||||
requests==2.0.0
|
||||
django-appconf==0.6
|
||||
|
||||
# Testing
|
||||
python-coveralls==2.4.0
|
||||
|
|
Loading…
Reference in a new issue