diff --git a/snippets/models.py b/snippets/models.py index f4fac63..425b2f3 100644 --- a/snippets/models.py +++ b/snippets/models.py @@ -1,7 +1,11 @@ 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.formatters.html import HtmlFormatter +from pygments import highlight + + LEXERS = [item for item in get_all_lexers() if item[1]] 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) language = models.CharField(choices=LANG_CHOICES, default="python", 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: 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) + diff --git a/snippets/urls.py b/snippets/urls.py index 5a360d7..de7fa97 100644 --- a/snippets/urls.py +++ b/snippets/urls.py @@ -2,6 +2,6 @@ from django.urls import path from snippets import views urlpatterns = [ - path("snippets/", views.snippet_list), - path("snippets//", views.snippet_detail) + path("snippets/", views.SnippetList.as_view()), + path("snippets//", views.SnippetDetail.as_view()) ] \ No newline at end of file diff --git a/snippets/views.py b/snippets/views.py index bedcd68..b766a35 100644 --- a/snippets/views.py +++ b/snippets/views.py @@ -1,47 +1,92 @@ from rest_framework import status from rest_framework.decorators import api_view from rest_framework.response import Response +from rest_framework.views import APIView +from django.http import Http404 from snippets.models import Snippet from snippets.serializers import SnippetSerializer -@api_view(["GET", "POST"]) -def snippet_list(request): +# @api_view(["GET", "POST"]) +# 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() serializer = SnippetSerializer(snippets, many=True) return Response(serializer.data) - elif request.method == "POST": - data = JSONParser().parse(request) - serializer = SnippetSerializer(data=data) + def post(self, request, format=None): + serializer = SnippetSerializer(data=request.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) -@api_view(["GET", "PUT", "DELETE"]) -def snippet_detail(request, pk): +# @api_view(["GET", "PUT", "DELETE"]) +# def snippet_detail(request, pk): - try: - snippet = Snippet.objects.get(pk=pk) - except Snippet.DoesNotExist: - return Response(status=status.HTTP_404_NOT_FOUND) +# try: +# snippet = Snippet.objects.get(pk=pk) +# except Snippet.DoesNotExist: +# 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) return Response(serializer.data) - elif request.method == "PUT": - data = JSONParser().parse(request) - serializer = SnippetSerializer(snippet, data=data) + def put(self, request, pk): + snippet = self.get_object(pk) + serializer = SnippetSerializer(snippet, data=request.data) if serializer.is_valid(): 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) - elif request.method == "DELETE": + def delete(self, request, pk): + snippet = self.get_object(pk) snippet.delete() - return Response(status=status.HTTP_204_NO_CONTENT) + return Response(status=status.HTTP_204_NO_CONTENT) + + diff --git a/subl-proj.sublime-workspace b/subl-proj.sublime-workspace index d329588..1fe758e 100644 --- a/subl-proj.sublime-workspace +++ b/subl-proj.sublime-workspace @@ -3,6 +3,14 @@ { "selected_items": [ + [ + "JSON", + "JSONParser" + ], + [ + "pars", + "parsers" + ] ] }, "build_system": "", @@ -16,14 +24,14 @@ "last_filter": "", "selected_items": [ - [ - "index", - "Help: Indexing Status" - ], [ "settings", "Preferences: Settings" ], + [ + "index", + "Help: Indexing Status" + ], [ "theme", "UI: Select Theme" @@ -81,7 +89,7 @@ ], "find": { - "height": 32.0 + "height": 29.0 }, "find_in_files": { @@ -95,6 +103,7 @@ "case_sensitive": false, "find_history": [ + "data" ], "highlight": true, "in_selection": false, @@ -113,7 +122,7 @@ }, "incremental_find": { - "height": 32.0 + "height": 29.0 }, "input": { @@ -127,7 +136,7 @@ "pinned_build_system": "", "replace": { - "height": 60.8 + "height": 54.0 }, "save_all_on_build": true, "select_file": @@ -137,13 +146,25 @@ "selected_items": [ [ - "gitig", - ".gitignore" + "views", + "snippets\\views.py" + ], + [ + "urls", + "tutorial\\urls.py" + ], + [ + "model", + "snippets\\models.py" ], [ "seria", "snippets\\serializers.py" ], + [ + "gitig", + ".gitignore" + ], [ "mdoel", "snippets\\models.py" @@ -176,7 +197,7 @@ "show_open_files": false, "show_tabs": true, "side_bar_visible": true, - "side_bar_width": 183.0, + "side_bar_width": 170.0, "status_bar_visible": true, "template_settings": {