More Monkeytyping

This commit is contained in:
Martin Mahner 2020-06-20 16:50:56 +02:00
parent 4fec267cbe
commit cb3ad997ac
5 changed files with 39 additions and 28 deletions

View file

@ -1,4 +1,6 @@
VERSION = (3, 4)
from .types import VersionType
VERSION: VersionType = (3, 4)
__version__ = "{major}.{minor}{rest}".format(
major=VERSION[0],

View file

@ -5,13 +5,15 @@ from django.core.handlers.wsgi import WSGIRequest
from django.utils.safestring import mark_safe
from django.utils.translation import gettext_lazy as _
from .types import DjangoChoicesType
class dpasteAppConfig(AppConfig):
name = "dpaste"
verbose_name = "dpaste"
name: str = "dpaste"
verbose_name: str = "dpaste"
# The application title used throughout the user interface.
APPLICATION_NAME = "dpaste"
APPLICATION_NAME: str = "dpaste"
# This content is loaded in the <head> section of each template.
# You can use it to add any HTML tags, specifically custom CSS styles.
@ -27,35 +29,33 @@ class dpasteAppConfig(AppConfig):
# .btn { background-color: blue; border: 3px solid yellow; }
# </style>
# """
EXTRA_HEAD_HTML = ""
EXTRA_HEAD_HTML: str = ""
# HTML content injected in the About page
EXTRA_POST_ABOUT = ""
EXTRA_POST_ABOUT: str = ""
# HTML content injeted after the "New snippet" form
EXTRA_POST_NEW = ""
EXTRA_POST_NEW: str = ""
# HTML content injected at the end of every form
EXTRA_POST_FORM = ""
EXTRA_POST_FORM: str = ""
# 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
SLUG_LENGTH: int = 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"
)
SLUG_CHOICES: str = "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"
LEXER_DEFAULT: str = "python"
# Integer. Maximum number of bytes per snippet.
MAX_CONTENT_LENGTH = 250 * 1024 * 1024
MAX_CONTENT_LENGTH: int = 250 * 1024 * 1024
# A tuple of seconds and a descriptive string used in the lexer
# expiration dropdown. Example::
@ -77,7 +77,7 @@ class dpasteAppConfig(AppConfig):
# (3600, _('In one hour')),
# ('never', _('Never')),
# )
EXPIRE_CHOICES = (
EXPIRE_CHOICES: DjangoChoicesType = (
("onetime", _("One-Time snippet")),
(3600, _("Expire in one hour")),
(3600 * 24 * 7, _("Expire in one week")),
@ -86,7 +86,7 @@ class dpasteAppConfig(AppConfig):
)
# Default value for ``EXPIRE_CHOICES``
EXPIRE_DEFAULT = 3600 * 24 * 7
EXPIRE_DEFAULT: int = 3600 * 24 * 7
# **One-Time snippets** are supported. One-Time snippets are automatically
# deleted once a defined view count has reached (Default: ``2``). To
@ -104,21 +104,21 @@ class dpasteAppConfig(AppConfig):
# 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
ONETIME_LIMIT: int = 2
# Disable "view Raw" mode.
RAW_MODE_ENABLED = True
RAW_MODE_ENABLED: bool = True
# If enabled, the "raw View" mode will display the snippet content as
# plain text rather rendered in a template.
RAW_MODE_PLAIN_TEXT = True
RAW_MODE_PLAIN_TEXT: bool = True
# Lexers which have wordwrap enabled by default
LEXER_WORDWRAP = ("rst",)
LEXER_WORDWRAP: Tuple[str] = ("rst",)
# Key names of the default text and code lexer.
PLAIN_TEXT_SYMBOL = "_text"
PLAIN_CODE_SYMBOL = "_code"
PLAIN_TEXT_SYMBOL: str = "_text"
PLAIN_CODE_SYMBOL: str = "_code"
@property
def TEXT_FORMATTER(self,) -> List[Tuple[str, str, Type[object]]]:

View file

@ -1,5 +1,5 @@
from datetime import datetime, timedelta
from typing import Any, Dict, Optional, Tuple, Type, Union
from typing import Any, Dict, Optional, Tuple, Union
from django import forms
from django.apps import apps

View file

@ -42,7 +42,7 @@ class Highlighter(object):
lexer_name: str,
direction: Optional[str] = None,
**kwargs
) -> SafeString:
) -> str:
highlighted_string = self.highlight(code_string, lexer_name=lexer_name)
context = {
"highlighted": highlighted_string,

View file

@ -96,7 +96,9 @@ class SnippetDetailView(DetailView, FormView):
always expire.
"""
if "delete" in self.request.POST:
snippet = get_object_or_404(Snippet, secret_id=self.kwargs["snippet_id"])
snippet = get_object_or_404(
Snippet, secret_id=self.kwargs["snippet_id"]
)
snippet.delete()
# Append `#` so #delete goes away in Firefox
@ -243,7 +245,9 @@ class SnippetHistory(TemplateView):
add_never_cache_headers(response)
return response
def post(self, request: WSGIRequest, *args, **kwargs) -> HttpResponseRedirect:
def post(
self, request: WSGIRequest, *args, **kwargs
) -> HttpResponseRedirect:
"""
Delete all user snippets at once.
"""
@ -344,11 +348,16 @@ class APIView(View):
)
expires, expire_type = get_expire_values(expires)
else:
expires = datetime.datetime.now() + datetime.timedelta(seconds=60 * 60 * 24)
expires = datetime.datetime.now() + datetime.timedelta(
seconds=60 * 60 * 24
)
expire_type = Snippet.EXPIRE_TIME
snippet = Snippet.objects.create(
content=content, lexer=lexer, expires=expires, expire_type=expire_type,
content=content,
lexer=lexer,
expires=expires,
expire_type=expire_type,
)
# Custom formatter for the API response