Compare commits

...

2 Commits

Author SHA1 Message Date
ducoterra
6610c2896b add visitor model and api 2020-04-26 12:05:03 -04:00
ducoterra
15c5f5293a position fixed, overflow auto 2020-04-25 19:41:55 -04:00
10 changed files with 109 additions and 62 deletions

View File

@@ -0,0 +1,25 @@
# Generated by Django 3.0.5 on 2020-04-26 15:17
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('api', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='Visitor',
fields=[
('name', models.CharField(max_length=255, primary_key=True, serialize=False)),
('clicked', models.IntegerField(blank=True, default=0)),
('first_pressed', models.DateTimeField(auto_now_add=True)),
('last_pressed', models.DateTimeField(auto_now=True)),
],
),
migrations.DeleteModel(
name='Snippet',
),
]

View File

@@ -0,0 +1,23 @@
# Generated by Django 3.0.5 on 2020-04-26 15:26
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('api', '0002_auto_20200426_1517'),
]
operations = [
migrations.AlterField(
model_name='visitor',
name='first_pressed',
field=models.DateTimeField(blank=True, null=True),
),
migrations.AlterField(
model_name='visitor',
name='last_pressed',
field=models.DateTimeField(blank=True, null=True),
),
]

View File

@@ -1,19 +1,11 @@
from django.db import models from django.db import models
from pygments.lexers import get_all_lexers from datetime import datetime
from pygments.styles import get_all_styles
LEXERS = [item for item in get_all_lexers() if item[1]] class Visitor(models.Model):
LANGUAGE_CHOICES = sorted([(item[1][0], item[0]) for item in LEXERS]) name = models.CharField(
STYLE_CHOICES = sorted([(item, item) for item in get_all_styles()]) primary_key=True,
max_length = 255
)
class Snippet(models.Model): clicked = models.IntegerField(default = 0, blank=True)
created = models.DateTimeField(auto_now_add=True) first_pressed = models.DateTimeField(blank=True, null=True)
title = models.CharField(max_length=100, blank=True, default='') last_pressed = models.DateTimeField(blank=True, null=True)
code = models.TextField()
linenos = models.BooleanField(default=False)
language = models.CharField(choices=LANGUAGE_CHOICES, default='python', max_length=100)
style = models.CharField(choices=STYLE_CHOICES, default='friendly', max_length=100)
class Meta:
ordering = ['created']

View File

@@ -1,29 +1,23 @@
from rest_framework import serializers from rest_framework import serializers
from .models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES from .models import *
class SnippetSerializer(serializers.Serializer): class VisitorSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True) name = serializers.CharField(required=True)
title = serializers.CharField(required=False, allow_blank=True, max_length=100) clicked = serializers.IntegerField(read_only=True)
code = serializers.CharField(style={'base_template': 'textarea.html'}) first_pressed = serializers.DateTimeField(read_only=True)
linenos = serializers.BooleanField(required=False) last_pressed = serializers.DateTimeField(read_only=True)
language = serializers.ChoiceField(choices=LANGUAGE_CHOICES, default='python')
style = serializers.ChoiceField(choices=STYLE_CHOICES, default='friendly')
def create(self, validated_data): def create(self, validated_data):
""" """
Create and return a new `Snippet` instance, given the validated data. Create and return a new `Visitor` instance, given the validated data.
""" """
return Snippet.objects.create(**validated_data) return Visitor.objects.create(**validated_data)
def update(self, instance, validated_data): def update(self, instance, validated_data):
""" """
Update and return an existing `Snippet` instance, given the validated data. Update and return an existing `Snippet` instance, given the validated data.
""" """
instance.title = validated_data.get('title', instance.title) instance.name = validated_data.get('name', instance.name)
instance.code = validated_data.get('code', instance.code)
instance.linenos = validated_data.get('linenos', instance.linenos)
instance.language = validated_data.get('language', instance.language)
instance.style = validated_data.get('style', instance.style)
instance.save() instance.save()
return instance return instance

View File

@@ -1,42 +1,53 @@
from django.contrib.auth.models import AnonymousUser, User from django.contrib.auth.models import AnonymousUser, User
from django.test import RequestFactory, TestCase from django.test import RequestFactory, TestCase
from django.db.utils import IntegrityError
from .views import SnippetList, SnippetDetail from .views import *
class SimpleTest(TestCase): class SimpleTest(TestCase):
def setUp(self): def setUp(self):
# Every test needs access to the request factory. # Every test needs access to the request factory.
self.factory = RequestFactory() self.factory = RequestFactory()
self.user = User.objects.create_user( # self.user = User.objects.create_user(
username='testuser', email='test@test.test', password='testpass') # username='testuser', email='test@test.test', password='testpass')
def test_snippets(self): def test_list_visitors(self):
# Create an instance of a GET request. # Create an instance of a GET request.
request = self.factory.get('/snippets') request = self.factory.get('/visitors')
# Recall that middleware are not supported. You can simulate a # Recall that middleware are not supported. You can simulate a
# logged-in user by setting request.user manually. # logged-in user by setting request.user manually.
request.user = self.user # request.user = self.user
# Or you can simulate an anonymous user by setting request.user to # Or you can simulate an anonymous user by setting request.user to
# an AnonymousUser instance. # an AnonymousUser instance.
# request.user = AnonymousUser() # request.user = AnonymousUser()
# Test my_view() as if it were deployed at /customer/details # Test my_view() as if it were deployed at /customer/details
response = SnippetList.as_view()(request) response = VisitorList.as_view()(request)
# Use this syntax for class-based views. # Use this syntax for class-based views.
# response = MyView.as_view()(request) # response = MyView.as_view()(request)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
request = self.factory.post('/snippets', data={ def test_add_visitor(self):
'title': 'test1', request = self.factory.post('/visitors', data={
'code': '() => {console.log("hello")};', 'name': 'test',
'lineos': False,
'language': 'js',
'style': 'abap'
}, },
content_type='application/json' content_type='application/json'
) )
response = SnippetList.as_view()(request) response = VisitorList.as_view()(request)
self.assertEqual(response.status_code, 201) self.assertEqual(response.status_code, 201)
vis = Visitor.objects.get(name='test')
self.assertEqual(vis.clicked, 0)
self.assertIsNone(vis.first_pressed)
self.assertIsNone(vis.last_pressed)
with self.assertRaises(IntegrityError):
request = self.factory.post('/visitors', data={
'name': 'test',
},
content_type='application/json'
)
response = VisitorList.as_view()(request)

View File

@@ -3,8 +3,8 @@ from rest_framework.urlpatterns import format_suffix_patterns
from . import views from . import views
urlpatterns = [ urlpatterns = [
path('snippets/', views.SnippetList.as_view()), path('visitor/', views.VisitorList.as_view()),
path('snippets/<int:pk>/', views.SnippetDetail.as_view()), path('visitor/<str:pk>/', views.VisitorDetail.as_view()),
] ]
urlpatterns = format_suffix_patterns(urlpatterns) urlpatterns = format_suffix_patterns(urlpatterns)

View File

@@ -1,15 +1,15 @@
from .models import Snippet from .models import *
from .serializers import SnippetSerializer from .serializers import *
from rest_framework import generics from rest_framework import generics
class SnippetList(generics.ListCreateAPIView): class VisitorList(generics.ListCreateAPIView):
# Add comments here # Add comments here
queryset = Snippet.objects.all() queryset = Visitor.objects.all()
serializer_class = SnippetSerializer serializer_class = VisitorSerializer
class SnippetDetail(generics.RetrieveUpdateDestroyAPIView): class VisitorDetail(generics.RetrieveUpdateDestroyAPIView):
# Add comments here # Add comments here
queryset = Snippet.objects.all() queryset = Visitor.objects.all()
serializer_class = SnippetSerializer serializer_class = VisitorSerializer

View File

@@ -18,7 +18,7 @@ from django.urls import path, include
from django.http import JsonResponse from django.http import JsonResponse
urlpatterns = [ urlpatterns = [
# path('api/', include('api.urls')), path('api/', include('api.urls')),
path('', include('ui.urls')), path('', include('ui.urls')),
# path('admin/', admin.site.urls), # path('admin/', admin.site.urls),
] ]

View File

@@ -1,7 +1,8 @@
html, body { html, body {
height: 100%; height: 100%;
width: 100%; width: 100%;
overflow: auto; position: fixed;
overflow: hidden;
} }
.section, .container { .section, .container {

View File

@@ -11,13 +11,13 @@ class SimpleTest(TestCase):
username='testuser', email='test@test.test', password='testpass') username='testuser', email='test@test.test', password='testpass')
def test_button(self): def test_button(self):
# Create an instance of a GET request. # Test button page returns 200
request = self.factory.get('/snippets') request = self.factory.get('/button')
request.user = self.user
request.session = self.client.session request.session = self.client.session
response = button(request) response = button(request)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
# Test button post returns 200 and increments button to 1
request = self.factory.post( request = self.factory.post(
'/button', '/button',
data={}, data={},
@@ -28,6 +28,7 @@ class SimpleTest(TestCase):
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertEqual(request.session.get('pressed'), 1) self.assertEqual(request.session.get('pressed'), 1)
# Test second click increments button to 2
response = button(request) response = button(request)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertEqual(request.session.get('pressed'), 2) self.assertEqual(request.session.get('pressed'), 2)