adds class based views and starts html code highlights

This commit is contained in:
Emanuel Rodriguez 2022-08-08 23:18:59 -07:00
parent 58a7cbb133
commit f35f8b77ea
4 changed files with 112 additions and 32 deletions

View File

@ -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)

View File

@ -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())
] ]

View File

@ -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)

View File

@ -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":
{ {