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( __version__ = "{major}.{minor}{rest}".format(
major=VERSION[0], 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.safestring import mark_safe
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from .types import DjangoChoicesType
class dpasteAppConfig(AppConfig): class dpasteAppConfig(AppConfig):
name = "dpaste" name: str = "dpaste"
verbose_name = "dpaste" verbose_name: str = "dpaste"
# The application title used throughout the user interface. # 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. # This content is loaded in the <head> section of each template.
# You can use it to add any HTML tags, specifically custom CSS styles. # 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; } # .btn { background-color: blue; border: 3px solid yellow; }
# </style> # </style>
# """ # """
EXTRA_HEAD_HTML = "" EXTRA_HEAD_HTML: str = ""
# HTML content injected in the About page # HTML content injected in the About page
EXTRA_POST_ABOUT = "" EXTRA_POST_ABOUT: str = ""
# HTML content injeted after the "New snippet" form # HTML content injeted after the "New snippet" form
EXTRA_POST_NEW = "" EXTRA_POST_NEW: str = ""
# HTML content injected at the end of every form # 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 # 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 # case an existing slug is generated again, the length will increase by
# one more character. # one more character.
SLUG_LENGTH = 4 SLUG_LENGTH: int = 4
# String. A string of characters which are used to create the random slug. # 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 # This is intentionally missing l and I as they look too similar with
# sans-serif fonts. # sans-serif fonts.
SLUG_CHOICES = ( SLUG_CHOICES: str = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ1234567890"
"abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ1234567890"
)
# String. The lexer key that is pre-selected in the dropdown. Note that # 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 # 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. # 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 # A tuple of seconds and a descriptive string used in the lexer
# expiration dropdown. Example:: # expiration dropdown. Example::
@ -77,7 +77,7 @@ class dpasteAppConfig(AppConfig):
# (3600, _('In one hour')), # (3600, _('In one hour')),
# ('never', _('Never')), # ('never', _('Never')),
# ) # )
EXPIRE_CHOICES = ( EXPIRE_CHOICES: DjangoChoicesType = (
("onetime", _("One-Time snippet")), ("onetime", _("One-Time snippet")),
(3600, _("Expire in one hour")), (3600, _("Expire in one hour")),
(3600 * 24 * 7, _("Expire in one week")), (3600 * 24 * 7, _("Expire in one week")),
@ -86,7 +86,7 @@ class dpasteAppConfig(AppConfig):
) )
# Default value for ``EXPIRE_CHOICES`` # 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 # **One-Time snippets** are supported. One-Time snippets are automatically
# deleted once a defined view count has reached (Default: ``2``). To # 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 # 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 # deleted. The default is ``2``. One view is from the author, one view
# is from another user. # is from another user.
ONETIME_LIMIT = 2 ONETIME_LIMIT: int = 2
# Disable "view Raw" mode. # 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 # If enabled, the "raw View" mode will display the snippet content as
# plain text rather rendered in a template. # 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 # Lexers which have wordwrap enabled by default
LEXER_WORDWRAP = ("rst",) LEXER_WORDWRAP: Tuple[str] = ("rst",)
# Key names of the default text and code lexer. # Key names of the default text and code lexer.
PLAIN_TEXT_SYMBOL = "_text" PLAIN_TEXT_SYMBOL: str = "_text"
PLAIN_CODE_SYMBOL = "_code" PLAIN_CODE_SYMBOL: str = "_code"
@property @property
def TEXT_FORMATTER(self,) -> List[Tuple[str, str, Type[object]]]: def TEXT_FORMATTER(self,) -> List[Tuple[str, str, Type[object]]]:

View file

@ -1,5 +1,5 @@
from datetime import datetime, timedelta 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 import forms
from django.apps import apps from django.apps import apps

View file

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

View file

@ -96,7 +96,9 @@ class SnippetDetailView(DetailView, FormView):
always expire. always expire.
""" """
if "delete" in self.request.POST: 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() snippet.delete()
# Append `#` so #delete goes away in Firefox # Append `#` so #delete goes away in Firefox
@ -243,7 +245,9 @@ class SnippetHistory(TemplateView):
add_never_cache_headers(response) add_never_cache_headers(response)
return 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. Delete all user snippets at once.
""" """
@ -344,11 +348,16 @@ class APIView(View):
) )
expires, expire_type = get_expire_values(expires) expires, expire_type = get_expire_values(expires)
else: 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 expire_type = Snippet.EXPIRE_TIME
snippet = Snippet.objects.create( 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 # Custom formatter for the API response