adds class based views and starts html code highlights
This commit is contained in:
parent
58a7cbb133
commit
f35f8b77ea
|
@ -1,7 +1,11 @@
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
||||||
from pygments.lexers import get_all_lexers
|
from pygments.lexers import get_all_lexers, get_lexer_by_name
|
||||||
from pygments.styles import get_all_styles
|
from pygments.styles import get_all_styles
|
||||||
|
from pygments.formatters.html import HtmlFormatter
|
||||||
|
from pygments import highlight
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
LEXERS = [item for item in get_all_lexers() if item[1]]
|
LEXERS = [item for item in get_all_lexers() if item[1]]
|
||||||
LANG_CHOICES = sorted([(item[1][0], item[0]) for item in LEXERS])
|
LANG_CHOICES = sorted([(item[1][0], item[0]) for item in LEXERS])
|
||||||
|
@ -14,7 +18,17 @@ class Snippet(models.Model):
|
||||||
line_numbers = models.BooleanField(default=False)
|
line_numbers = models.BooleanField(default=False)
|
||||||
language = models.CharField(choices=LANG_CHOICES, default="python", max_length=100)
|
language = models.CharField(choices=LANG_CHOICES, default="python", max_length=100)
|
||||||
style = models.CharField(choices=STYLE_CHOICES, default="friendly", max_length=100)
|
style = models.CharField(choices=STYLE_CHOICES, default="friendly", max_length=100)
|
||||||
|
owner = models.ForeignKey("auth.User", related_name="snippets", on_delete=models.CASCADE)
|
||||||
|
highlighted = models.TextField()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
ordering = ["created_at"]
|
ordering = ["created_at"]
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
lexer = get_lexer_by_name(self.language)
|
||||||
|
line_nums = "table" if self.line_numbers else False
|
||||||
|
options = {"title": self.title} if self.title else {}
|
||||||
|
formatter = HtmlFormatter(style=self.style, linenos=line_nums, full=True, **options)
|
||||||
|
self.highlighted = highlight(self.code, lexer, formatter)
|
||||||
|
super().save(*args, **kwargs)
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,6 @@ from django.urls import path
|
||||||
from snippets import views
|
from snippets import views
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path("snippets/", views.snippet_list),
|
path("snippets/", views.SnippetList.as_view()),
|
||||||
path("snippets/<int:pk>/", views.snippet_detail)
|
path("snippets/<int:pk>/", views.SnippetDetail.as_view())
|
||||||
]
|
]
|
|
@ -1,47 +1,92 @@
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
from rest_framework.decorators import api_view
|
from rest_framework.decorators import api_view
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
|
from rest_framework.views import APIView
|
||||||
|
from django.http import Http404
|
||||||
|
|
||||||
from snippets.models import Snippet
|
from snippets.models import Snippet
|
||||||
from snippets.serializers import SnippetSerializer
|
from snippets.serializers import SnippetSerializer
|
||||||
|
|
||||||
@api_view(["GET", "POST"])
|
# @api_view(["GET", "POST"])
|
||||||
def snippet_list(request):
|
# def snippet_list(request):
|
||||||
|
|
||||||
if request.method == "GET":
|
# if request.method == "GET":
|
||||||
|
# snippets = Snippet.objects.all()
|
||||||
|
# serializer = SnippetSerializer(snippets, many=True)
|
||||||
|
# return Response(serializer.data)
|
||||||
|
|
||||||
|
# elif request.method == "POST":
|
||||||
|
# data = JSONParser().parse(request)
|
||||||
|
# serializer = SnippetSerializer(data=data)
|
||||||
|
# if serializer.is_valid():
|
||||||
|
# serializer.save()
|
||||||
|
# return Response(serializer.data, status=status.HTTP_201_CREATED)
|
||||||
|
# return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
|
class SnippetList(APIView):
|
||||||
|
|
||||||
|
def get(self, request, format=None):
|
||||||
snippets = Snippet.objects.all()
|
snippets = Snippet.objects.all()
|
||||||
serializer = SnippetSerializer(snippets, many=True)
|
serializer = SnippetSerializer(snippets, many=True)
|
||||||
return Response(serializer.data)
|
return Response(serializer.data)
|
||||||
|
|
||||||
elif request.method == "POST":
|
def post(self, request, format=None):
|
||||||
data = JSONParser().parse(request)
|
serializer = SnippetSerializer(data=request.data)
|
||||||
serializer = SnippetSerializer(data=data)
|
|
||||||
if serializer.is_valid():
|
if serializer.is_valid():
|
||||||
serializer.save()
|
serializer.save()
|
||||||
return Response(serializer.data, status=status.HTTP_201_CREATED)
|
return Response(serializer.data, status=status.HTTP_201_CREATED)
|
||||||
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
@api_view(["GET", "PUT", "DELETE"])
|
# @api_view(["GET", "PUT", "DELETE"])
|
||||||
def snippet_detail(request, pk):
|
# def snippet_detail(request, pk):
|
||||||
|
|
||||||
try:
|
# try:
|
||||||
snippet = Snippet.objects.get(pk=pk)
|
# snippet = Snippet.objects.get(pk=pk)
|
||||||
except Snippet.DoesNotExist:
|
# except Snippet.DoesNotExist:
|
||||||
return Response(status=status.HTTP_404_NOT_FOUND)
|
# return Response(status=status.HTTP_404_NOT_FOUND)
|
||||||
|
|
||||||
if request.method == "GET":
|
# if request.method == "GET":
|
||||||
|
# serializer = SnippetSerializer(snippet)
|
||||||
|
# return Response(serializer.data)
|
||||||
|
|
||||||
|
# elif request.method == "PUT":
|
||||||
|
# data = JSONParser().parse(request)
|
||||||
|
# serializer = SnippetSerializer(snippet, data=data)
|
||||||
|
# if serializer.is_valid():
|
||||||
|
# serializer.save()
|
||||||
|
# return Response(serializer.data)
|
||||||
|
# return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
# elif request.method == "DELETE":
|
||||||
|
# snippet.delete()
|
||||||
|
# return Response(status=status.HTTP_204_NO_CONTENT)
|
||||||
|
|
||||||
|
class SnippetDetail(APIView):
|
||||||
|
|
||||||
|
def get_object(self, pk):
|
||||||
|
try:
|
||||||
|
return Snippet.objects.get(pk=pk)
|
||||||
|
except Snippet.DoesNotExist:
|
||||||
|
raise Http404
|
||||||
|
|
||||||
|
def get(self, request, pk, format=None):
|
||||||
|
snippet = self.get_object(pk)
|
||||||
serializer = SnippetSerializer(snippet)
|
serializer = SnippetSerializer(snippet)
|
||||||
return Response(serializer.data)
|
return Response(serializer.data)
|
||||||
|
|
||||||
elif request.method == "PUT":
|
def put(self, request, pk):
|
||||||
data = JSONParser().parse(request)
|
snippet = self.get_object(pk)
|
||||||
serializer = SnippetSerializer(snippet, data=data)
|
serializer = SnippetSerializer(snippet, data=request.data)
|
||||||
if serializer.is_valid():
|
if serializer.is_valid():
|
||||||
serializer.save()
|
serializer.save()
|
||||||
return Response(serializer.data)
|
return Response(serializer.data, status=status.HTTP_201_CREATED)
|
||||||
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
elif request.method == "DELETE":
|
def delete(self, request, pk):
|
||||||
|
snippet = self.get_object(pk)
|
||||||
snippet.delete()
|
snippet.delete()
|
||||||
return Response(status=status.HTTP_204_NO_CONTENT)
|
return Response(status=status.HTTP_204_NO_CONTENT)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,14 @@
|
||||||
{
|
{
|
||||||
"selected_items":
|
"selected_items":
|
||||||
[
|
[
|
||||||
|
[
|
||||||
|
"JSON",
|
||||||
|
"JSONParser"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"pars",
|
||||||
|
"parsers"
|
||||||
|
]
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"build_system": "",
|
"build_system": "",
|
||||||
|
@ -16,14 +24,14 @@
|
||||||
"last_filter": "",
|
"last_filter": "",
|
||||||
"selected_items":
|
"selected_items":
|
||||||
[
|
[
|
||||||
[
|
|
||||||
"index",
|
|
||||||
"Help: Indexing Status"
|
|
||||||
],
|
|
||||||
[
|
[
|
||||||
"settings",
|
"settings",
|
||||||
"Preferences: Settings"
|
"Preferences: Settings"
|
||||||
],
|
],
|
||||||
|
[
|
||||||
|
"index",
|
||||||
|
"Help: Indexing Status"
|
||||||
|
],
|
||||||
[
|
[
|
||||||
"theme",
|
"theme",
|
||||||
"UI: Select Theme"
|
"UI: Select Theme"
|
||||||
|
@ -81,7 +89,7 @@
|
||||||
],
|
],
|
||||||
"find":
|
"find":
|
||||||
{
|
{
|
||||||
"height": 32.0
|
"height": 29.0
|
||||||
},
|
},
|
||||||
"find_in_files":
|
"find_in_files":
|
||||||
{
|
{
|
||||||
|
@ -95,6 +103,7 @@
|
||||||
"case_sensitive": false,
|
"case_sensitive": false,
|
||||||
"find_history":
|
"find_history":
|
||||||
[
|
[
|
||||||
|
"data"
|
||||||
],
|
],
|
||||||
"highlight": true,
|
"highlight": true,
|
||||||
"in_selection": false,
|
"in_selection": false,
|
||||||
|
@ -113,7 +122,7 @@
|
||||||
},
|
},
|
||||||
"incremental_find":
|
"incremental_find":
|
||||||
{
|
{
|
||||||
"height": 32.0
|
"height": 29.0
|
||||||
},
|
},
|
||||||
"input":
|
"input":
|
||||||
{
|
{
|
||||||
|
@ -127,7 +136,7 @@
|
||||||
"pinned_build_system": "",
|
"pinned_build_system": "",
|
||||||
"replace":
|
"replace":
|
||||||
{
|
{
|
||||||
"height": 60.8
|
"height": 54.0
|
||||||
},
|
},
|
||||||
"save_all_on_build": true,
|
"save_all_on_build": true,
|
||||||
"select_file":
|
"select_file":
|
||||||
|
@ -137,13 +146,25 @@
|
||||||
"selected_items":
|
"selected_items":
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
"gitig",
|
"views",
|
||||||
".gitignore"
|
"snippets\\views.py"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"urls",
|
||||||
|
"tutorial\\urls.py"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"model",
|
||||||
|
"snippets\\models.py"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"seria",
|
"seria",
|
||||||
"snippets\\serializers.py"
|
"snippets\\serializers.py"
|
||||||
],
|
],
|
||||||
|
[
|
||||||
|
"gitig",
|
||||||
|
".gitignore"
|
||||||
|
],
|
||||||
[
|
[
|
||||||
"mdoel",
|
"mdoel",
|
||||||
"snippets\\models.py"
|
"snippets\\models.py"
|
||||||
|
@ -176,7 +197,7 @@
|
||||||
"show_open_files": false,
|
"show_open_files": false,
|
||||||
"show_tabs": true,
|
"show_tabs": true,
|
||||||
"side_bar_visible": true,
|
"side_bar_visible": true,
|
||||||
"side_bar_width": 183.0,
|
"side_bar_width": 170.0,
|
||||||
"status_bar_visible": true,
|
"status_bar_visible": true,
|
||||||
"template_settings":
|
"template_settings":
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue