Settings and Configuration

When dpaste is installed as a standalone service or integrated into an existing project there are various settings you can override to adjust dpaste’s behavior.

To do so, you need to override dpaste’s AppConfig. This is a feature introduced in Django 1.9 and allows you to set settings more programmatically.

See Current AppConfig with default values for a full list of settings and functions you can override.

Example for your custom AppConfig:

# settings.py
from dpaste.apps import dpasteAppConfig

class MyBetterDpasteAppConfig(dpasteAppConfig):
    SLUG_LENGTH = 8
    LEXER_DEFAULT = 'js'

# ...

INSTALLED_APPS = [
    'myproject.settings.MyBetterDpasteAppConfig',
]

Current AppConfig with default values

This is the file content of dpaste/apps.py:

from django.apps import AppConfig, apps
from django.utils.translation import ugettext_lazy as _


class dpasteAppConfig(AppConfig):
    name = 'dpaste'
    verbose_name = 'dpaste'

    # Integer. Length of the random slug for each new snippet. In the rare
    # case an existing slug is generated again, the length will increase by
    # one more character.
    SLUG_LENGTH = 4

    # String. A string of characters which are used to create the random slug.
    # This is intentionally missing l and I as they look too similar with
    # sans-serif fonts.
    SLUG_CHOICES = 'abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ1234567890'

    # String. The lexer key that is pre-selected in the dropdown. Note that
    # this is only used if the user has not saved a snippet before, otherwise
    LEXER_DEFAULT = 'python'

    # Integer. Maximum number of bytes per snippet.
    MAX_CONTENT_LENGTH = 250 * 1024 * 1024

    # A tuple of seconds and a descriptive string used in the lexer
    # expiration dropdown. Example::
    #
    #     from django.utils.translation import ugettext_lazy as _
    #     DPASTE_EXPIRE_CHOICES = (
    #         (3600, _('In one hour')),
    #         (3600 * 24 * 7, _('In one week')),
    #         (3600 * 24 * 30, _('In one month')),
    #         (3600 * 24 * 30 * 12 * 100, _('100 Years')),
    #     )
    #
    # **Infinite snippets** are supported. You can keep snippets forever when
    # you set the choice key to ``never``. The management command will ignore
    # these snippets::
    #
    #     from django.utils.translation import ugettext_lazy as _
    #     DPASTE_EXPIRE_CHOICES = (
    #         (3600, _('In one hour')),
    #         ('never', _('Never')),
    #     )
    EXPIRE_CHOICES = (
        ('onetime', _('One-Time snippet')),
        (3600, _('In one hour')),
        (3600 * 24 * 7, _('In one week')),
        (3600 * 24 * 30, _('In one month')),
        ('never', _('Never')),
    )

    # Default value for ``EXPIRE_CHOICES``
    EXPIRE_DEFAULT = 3600 * 24 * 7

    # **One-Time snippets** are supported. One-Time snippets are automatically
    # deleted once a defined view count has reached (Default: ``2``). To
    # enable one-time snippets you have to add a choice ``onetime`` to the
    # expire choices::
    #
    #     from django.utils.translation import ugettext_lazy as _
    #     DPASTE_EXPIRE_CHOICES = (
    #         ('onetime', _('One-Time snippet')),
    #         (3600, _('In one hour')),
    #         (3600 * 24 * 7, _('In one week')),
    #         (3600 * 24 * 30, _('In one month')),
    #     )
    #
    # You can also set the maximum view count after what the snippet gets
    # deleted. The default is ``2``. One view is from the author, one view
    # is from another user.
    ONETIME_LIMIT = 2

    # Lexers which have wordwrap enabled by default
    LEXER_WORDWRAP = ('rst',)

    # Key names of the default text and code lexer.
    PLAIN_TEXT_SYMBOL = '_text'
    PLAIN_CODE_SYMBOL = '_code'

    @property
    def TEXT_FORMATTER(self):
        """
        Choices list with all "Text" lexer. Prepend keys with an underscore
        so they don't accidentally clash with a Pygments Lexer name.

        Each list contains a lexer tuple of:

           (Lexer key,
            Lexer Display Name,
            Lexer Highlight Class)

        If the Highlight Class is not given, PygmentsHighlighter is used.
        """
        from dpaste.highlight import (
            PlainTextHighlighter,
            MarkdownHighlighter,
            RestructuredTextHighlighter,
        )

        return [
            (self.PLAIN_TEXT_SYMBOL, 'Plain Text', PlainTextHighlighter),
            ('_markdown', 'Markdown', MarkdownHighlighter),
            ('_rst', 'reStructuredText', RestructuredTextHighlighter),
        ]

    @property
    def CODE_FORMATTER(self):
        """
        Choices list with all "Code" Lexer. Each list
        contains a lexer tuple of:

           (Lexer key,
            Lexer Display Name,
            Lexer Highlight Class)

        If the Highlight Class is not given, PygmentsHighlighter is used.
        """
        from dpaste.highlight import PlainCodeHighlighter, SolidityHighlighter

        return [
            (self.PLAIN_CODE_SYMBOL, 'Plain Code', PlainCodeHighlighter),
            ('abap', 'ABAP'),
            ('apacheconf', 'ApacheConf'),
            ('applescript', 'AppleScript'),
            ('as', 'ActionScript'),
            ('bash', 'Bash'),
            ('bbcode', 'BBCode'),
            ('c', 'C'),
            ('cpp', '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'),
            ('objc', 'Obj-C'),
            ('ocaml', 'OCaml'),
            ('perl', 'Perl'),
            ('php', 'PHP'),
            ('postscript', 'PostScript'),
            ('powershell', 'PowerShell'),
            ('prolog', 'Prolog'),
            ('properties', 'Properties'),
            ('puppet', 'Puppet'),
            ('python', 'Python'),  # Default lexer
            ('r', 'R'),
            ('rb', 'Ruby'),
            ('rst', 'reStructuredText'),
            ('rust', 'Rust'),
            ('sass', 'Sass'),
            ('scala', 'Scala'),
            ('scheme', 'Scheme'),
            ('scilab', 'Scilab'),
            ('scss', 'SCSS'),
            ('smalltalk', 'Smalltalk'),
            ('smarty', 'Smarty'),
            ('solidity', 'Solidity', SolidityHighlighter),
            ('sql', 'SQL'),
            ('tcl', 'Tcl'),
            ('tcsh', 'Tcsh'),
            ('tex', 'TeX'),
            ('vb.net', 'VB.net'),
            ('vim', 'VimL'),
            ('xml', 'XML'),
            ('xquery', 'XQuery'),
            ('xslt', 'XSLT'),
            ('yaml', 'YAML'),
        ]

    @staticmethod
    def get_base_url(request=None):
        """
        String. The full qualified hostname and path to the dpaste instance.
        This is used to generate a link in the API response. If the "Sites"
        framework is installed, it uses the current Site domain. Otherwise
        it falls back to 'https://dpaste.de'
        """
        if apps.is_installed('django.contrib.sites'):
            from django.contrib.sites.shortcuts import get_current_site

            site = get_current_site(request)
            if site:
                return 'https://{0}'.format(site.domain)
        return 'https://dpaste.de'