From 33c77ebb851cfd845d3d040095e5145d58e1bfd4 Mon Sep 17 00:00:00 2001 From: Vlad Utkin Date: Tue, 9 Jan 2018 20:33:31 +0300 Subject: [PATCH] Add file and admin panel --- .gitignore | 1 + app/admin.py | 23 ++++++++++++++++++++--- app/models.py | 9 +++++++++ app/tests.py | 23 ++++++++++++++++++++++- app/views.py | 13 ++++++++++++- noniko/settings.py | 9 +++++++++ noniko/urls.py | 5 ++++- 7 files changed, 77 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index d4e62cc..21712d1 100644 --- a/.gitignore +++ b/.gitignore @@ -58,3 +58,4 @@ db.sqlite3 app/migrations/* !app/migrations/__init__.py venv/ +media/* diff --git a/app/admin.py b/app/admin.py index 29eb1a0..c362801 100644 --- a/app/admin.py +++ b/app/admin.py @@ -1,8 +1,25 @@ from django.contrib import admin -from django.contrib import admin -from app.models import Setting +from app.models import Setting, File +from django.conf import settings # Register your models here. -admin.site.register(Setting) +class SettingAdmin(admin.ModelAdmin): + list_display = ('name', 'language', 'string_short') + search_fields = ('name', ) + + def string_short(self, obj): + if len(obj.string) > 70: + return obj.string[:70] + '...' + else: + return obj.string + + +class FileAdmin(admin.ModelAdmin): + list_display = ('name', ) + + +admin.site.register(Setting, SettingAdmin) +admin.site.register(File, FileAdmin) +admin.site.site_header = settings.APP_NAME + ' administration' diff --git a/app/models.py b/app/models.py index 5729752..58f92aa 100644 --- a/app/models.py +++ b/app/models.py @@ -4,6 +4,15 @@ from django.db import models class Setting(models.Model): + def __str__(self): + return 'Setting {0} - {1} ({2})'.format(self.name, self.language, self.id) name = models.CharField(max_length=100) language = models.CharField(max_length=5) string = models.TextField() + + +class File(models.Model): + def __str__(self): + return 'File {0} ({1})'.format(self.name, self.id) + name = models.CharField(max_length=100) + file = models.FileField() diff --git a/app/tests.py b/app/tests.py index 8cbdf5d..da51c90 100644 --- a/app/tests.py +++ b/app/tests.py @@ -1,6 +1,7 @@ from django.test import TestCase -from app.models import Setting +from app.models import Setting, File from django.conf import settings +from django.core.files.uploadedfile import SimpleUploadedFile # Create your tests here. @@ -23,8 +24,28 @@ class HomeTestCase(TestCase): response = self.client.get('/') self.assertContains(response, 'Строка русского текста', 1, 200) self.assertContains(response, '', 1, 200) + self.assertContains(response, 'A
correct

HTML

string', 1, 200) def test_ru_header_load(self): response = self.client.get('/', HTTP_ACCEPT_LANGUAGE='ru') self.assertContains(response, 'Строка русского текста', 1, 200) self.assertContains(response, '', 1, 200) + self.assertContains(response, 'A
correct

HTML

string', 1, 200) + + +class FileTestCase(TestCase): + """Uploaded files are correctly served""" + def setUp(self): + File.objects.create(name='sample_file', file=SimpleUploadedFile('sample.txt', b'This is sample file.')) + + def doCleanups(self): + clean = File.objects.get(name='sample_file') + clean.file.delete(save=False) + clean.delete() + + def test_file_read(self): + self.assertEqual(File.objects.get(name='sample_file').file.readline(), b'This is sample file.') + + def test_file_get_url(self): + response = self.client.get('/get_file', {'name': 'sample_file'}) + self.assertEqual(response.url, '/media/sample.txt') diff --git a/app/views.py b/app/views.py index cd0a878..964a4f5 100644 --- a/app/views.py +++ b/app/views.py @@ -1,8 +1,10 @@ -from django.shortcuts import render +from django.shortcuts import render, get_object_or_404, redirect from django.utils.translation import gettext as _ from django.conf import settings from app.settings_db import get_setting from django.utils import translation +from app.models import File +from django.http import HttpResponseBadRequest # Create your views here. @@ -15,3 +17,12 @@ def home(request): 'app_home_head_html': get_setting('app_home_head_html', language=translation.get_language()), 'app_home_body_html': get_setting('app_home_body_html', language=translation.get_language()), }) + + +def get_file(request): + if not request.GET: + return HttpResponseBadRequest() + try: + return redirect(get_object_or_404(File, name=request.GET['name']).file.url) + except KeyError: + return HttpResponseBadRequest() diff --git a/noniko/settings.py b/noniko/settings.py index 0028c09..1b3c785 100644 --- a/noniko/settings.py +++ b/noniko/settings.py @@ -126,8 +126,17 @@ STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static"), ] + +# Media files dir (For testing purposes! This is not suitable for production) +MEDIA_URL = '/media/' +MEDIA_ROOT = os.path.join(BASE_DIR, "media") + + +# App name (Used in templates) APP_NAME = 'NoNiko' + +# Try to load local setting file try: from local_settings import * except ImportError: diff --git a/noniko/urls.py b/noniko/urls.py index 045f05e..16ca860 100644 --- a/noniko/urls.py +++ b/noniko/urls.py @@ -16,8 +16,11 @@ Including another URLconf from django.contrib import admin from django.urls import path import app.views +from django.conf import settings +from django.conf.urls.static import static urlpatterns = [ path('', app.views.home, name='home'), + path('get_file', app.views.get_file, name='get_file'), path('admin/', admin.site.urls), -] +] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) # Warning! This is not suitable for production.