first commit

This commit is contained in:
jens 2020-11-06 21:24:29 +00:00
commit 15363572ff
588 changed files with 78384 additions and 0 deletions

119
.gitignore vendored Normal file
View File

@ -0,0 +1,119 @@
nfs/etc/nginx/nginx.conf
nfs/media-files/media/ADS1115.jpg
nfs/media-files/media/biofuge-pico.jpg
nfs/media-files/media/ECL_Solution
nfs/media-files/media/ErgebnisExp43
nfs/media-files/media/essig_ph_100ml_50yl.jpg
nfs/media-files/media/essig_ph.jpg
nfs/media-files/media/exp_d2
nfs/media-files/media/exp22_191.jpeg
nfs/media-files/media/exp22_194.jpeg
nfs/media-files/media/exp22_195.jpeg
nfs/media-files/media/exp51
nfs/media-files/media/exp51_cps
nfs/media-files/media/exp51_hw
nfs/media-files/media/exp51_int
nfs/media-files/media/exp51_peaks
nfs/media-files/media/exp51_sta
nfs/media-files/media/exp52_d1
nfs/media-files/media/exp52_d2
nfs/media-files/media/exp52_d3
nfs/media-files/media/exp52_d4
nfs/media-files/media/exp52_d4_TKwej7q
nfs/media-files/media/exp52_tab
nfs/media-files/media/exp53_d3
nfs/media-files/media/frequenz_191_194_195.jpeg
nfs/media-files/media/hplc_iodo
nfs/media-files/media/HPLC_Iodophenol
nfs/media-files/media/hplc_tab1.png
nfs/media-files/media/HPLC_TEST_A.jpg
nfs/media-files/media/HPLC_TEST_B.jpg
nfs/media-files/media/jfstest.txt
nfs/media-files/media/Kinetik_NaNoCo.jpg
nfs/media-files/media/koffein_1.jpg
nfs/media-files/media/koffein_2.jpg
nfs/media-files/media/koffein_10_90.jpg
nfs/media-files/media/koffein_10_90.png
nfs/media-files/media/Koffein_2020_1.jpg
nfs/media-files/media/Koffein_HPLC_Standart.jpg
nfs/media-files/media/Koffein_Test_Ads.jpg
nfs/media-files/media/koffein_theophyllin_1.jpg
nfs/media-files/media/koffein_theophyllin_2.jpg
nfs/media-files/media/LuMi1_a
nfs/media-files/media/LuMi1_b
nfs/media-files/media/Marathon1
nfs/media-files/media/marathon2
nfs/media-files/media/marathon2_2.jpg
nfs/media-files/media/marathon2_x5kEgJZ
nfs/media-files/media/marathon2.jpg
nfs/media-files/media/NaOH_H2SO4.jpg
nfs/media-files/media/neolab.jpg
nfs/media-files/media/p-idodophenol_purification
nfs/media-files/media/p-iodophenol_recrystalisation
nfs/media-files/media/ph1.jpg
nfs/media-files/media/ph2.jpg
nfs/media-files/media/ph3.jpg
nfs/media-files/media/relais.jpg
nfs/media-files/media/stirrer
nfs/media-files/media/test
nfs/media-files/media/Test_Koffein_B6.jpg
nfs/media-files/media/Test_Koffein.jpg
nfs/media-files/media/test_Koofein_2020
nfs/media-files/media/Theo_005Au.jpg
nfs/media-files/media/theophyllin_1.jpg
nfs/media-files/media/theophyllin_2.jpg
nfs/media-files/media/VdW.jpg
nfs/media-files/media/books/44-12462dts_spcm_aqrh.pdf
nfs/media-files/media/books/74hc590.pdf
nfs/media-files/media/books/a606506f.pdf
nfs/media-files/media/books/Ai-thinker_ESP-07_WIFI_Module-EN.pdf
nfs/media-files/media/books/Anleitung_Injectomat_C-CP.pdf
nfs/media-files/media/books/biofuge-pico.pdf
nfs/media-files/media/books/Bischoff-HPLC_CompactPump_Model2250.pdf
nfs/media-files/media/books/c6re00210b.pdf
nfs/media-files/media/books/c7an01926b.pdf
nfs/media-files/media/books/caplcintro.pdf
nfs/media-files/media/books/ChemOsz.pdf
nfs/media-files/media/books/CL_KIN_Oscillating.pdf
nfs/media-files/media/books/CL_KIN_Sattar_Epstein.pdf
nfs/media-files/media/books/Coffein_b1_b6_fluoreszenzdetektor.pdf
nfs/media-files/media/books/coffein_theobromin_theophylline.pdf
nfs/media-files/media/books/exp_oszillierende_chemolumineszenz_mit_luminol.pdf
nfs/media-files/media/books/FY6600_Series_Users_Manual.pdf
nfs/media-files/media/books/GPEScientific-37498.pdf
nfs/media-files/media/books/Handbuch_Mettler_Toledo_AE100_Anleitung.pdf
nfs/media-files/media/books/Handbuch_UVVIS_PC-Software_de.pdf
nfs/media-files/media/books/Handbuch_Vacuubrand.pdf
nfs/media-files/media/books/Handbuch_VISUVVIS_de.pdf
nfs/media-files/media/books/HPLC_ANA_Coffein_innerer_Standart.pdf
nfs/media-files/media/books/HPLC_Coffein_innerer_Standart.pdf
nfs/media-files/media/books/HPLC_fuer_Neueinsteiger.pdf
nfs/media-files/media/books/HPLC_Koffein_2.pdf
nfs/media-files/media/books/HPLC_PHWert_dKMmnEM.pdf
nfs/media-files/media/books/HPLC_PHWert.pdf
nfs/media-files/media/books/IAII_09_Fluoreszenz.pdf
nfs/media-files/media/books/jasco_821.pdf
nfs/media-files/media/books/Jasco_Floe_cell_patent.pdf
nfs/media-files/media/books/jasco-fp920-manual-1995-eng.pdf
nfs/media-files/media/books/Knauer-2600.pdf
nfs/media-files/media/books/LaborJournal_2013.pdf
nfs/media-files/media/books/Marathron_Kurz_Manual.pdf
nfs/media-files/media/books/Marathron_Manual.pdf
nfs/media-files/media/books/Marconi2438.pdf
nfs/media-files/media/books/Photobleaching_Fluoreszein.pdf
nfs/media-files/media/books/Quantifizierung_Koffein_Ausbildungssystem.pdf
nfs/media-files/media/books/säulenRegeneration.pdf
nfs/media-files/media/books/SB0071-074_Genekam_DNA_isolation.pdf
nfs/media-files/media/books/Skript_HPLC_Mobile_Phase_Optimization_Strategies_for_Reversed_Phase_PUUN1l2.pdf
nfs/media-files/media/books/Skript_HPLC_Mobile_Phase_Optimization_Strategies_for_Reversed_Phase.pdf
nfs/media-files/media/books/SpectrFlow_501.pdf
nfs/media-files/media/books/ug106-cebo-Stick.pdf
nfs/media-files/media/books/ug111-cebo-programming-reference-1.pdf
nfs/media-files/media/books/WIFI_Kit_32.pdf
nfs/media-files/media/books/WTW_LF_TetraCon96.pdf
nfs/media-files/media/books/WTW_LF537.pdf
nfs/media-files/media/books/XDS3000.pdf
nfs/media-files/media/video/ChemPlayer_music_EP_1_-_YouTube.mp4
nfs/media-files/media/video/gendnaiso.mp4
nfs/media-files/media/video/Virtuelles_Labor_-_Fraktionierte_Destillation.flv
nfs/media-files/media/video/Virtuelles_Labor_-_Rotationsverdampfer.flv

7
Dockerfile Normal file
View File

@ -0,0 +1,7 @@
FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip3 install -r requirements.txt
COPY . /code/

0
chemie/__init__.py Normal file
View File

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

7
chemie/admin.py Normal file
View File

@ -0,0 +1,7 @@
from django.contrib import admin
from .models import Book, Video, Keller
from import_export.admin import ImportExportModelAdmin
@admin.register(Book,Video,Keller)
class ViewAdmin(ImportExportModelAdmin):
exclude = ('id', )

5
chemie/apps.py Normal file
View File

@ -0,0 +1,5 @@
from django.apps import AppConfig
class ChemieConfig(AppConfig):
name = 'chemie'

27
chemie/forms.py Normal file
View File

@ -0,0 +1,27 @@
from django import forms
from .models import Book, Video, Keller
class KellerModelForm(forms.ModelForm):
class Meta:
model = Keller
fields =('name','menge','einheit','kiste','nr','info')
class BookForm(forms.ModelForm):
title = forms.CharField(label='ok')
pdf = forms.FileField(widget= forms.ClearableFileInput(
attrs={"class":"form-control-file"}
))
class Meta:
model = Book
fields = ('title','author','pdf')
class VideoForm(forms.ModelForm):
title = forms.CharField(label='ok')
media = forms.FileField(widget= forms.ClearableFileInput(
attrs={"class":"form-control-file"}
))
class Meta:
model = Video
fields = ('title','tags','media')

View File

@ -0,0 +1,23 @@
# Generated by Django 2.2.4 on 2019-09-09 15:26
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Book',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=100)),
('author', models.CharField(max_length=100)),
('pdf', models.FileField(upload_to='books/pdfs')),
],
),
]

View File

@ -0,0 +1,27 @@
# Generated by Django 2.2.4 on 2019-09-20 11:16
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('chemie', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='Video',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=100)),
('tags', models.CharField(max_length=255)),
('media', models.FileField(upload_to='video')),
],
),
migrations.AlterField(
model_name='book',
name='pdf',
field=models.FileField(upload_to='books'),
),
]

View File

@ -0,0 +1,24 @@
# Generated by Django 2.2.4 on 2019-09-24 16:35
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('chemie', '0002_auto_20190920_1116'),
]
operations = [
migrations.CreateModel(
name='Keller',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=100)),
('menge', models.FloatField()),
('einheit', models.CharField(max_length=10)),
('kiste', models.IntegerField()),
('nr', models.IntegerField()),
],
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 2.2.4 on 2019-09-26 19:14
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('chemie', '0003_keller'),
]
operations = [
migrations.AddField(
model_name='keller',
name='info',
field=models.TextField(default=''),
),
]

View File

Binary file not shown.

Binary file not shown.

Binary file not shown.

42
chemie/models.py Normal file
View File

@ -0,0 +1,42 @@
from django.db import models
from django.conf import settings
from django.urls import reverse
class Keller(models.Model):
name = models.CharField(max_length=100)
menge = models.FloatField()
einheit = models.CharField(max_length=10)
kiste = models.IntegerField()
nr = models.IntegerField()
info = models.TextField(default='')
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse("keller-detail", kwargs={"id": self.id})
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=100)
pdf = models.FileField(upload_to='books')
def __str__(self):
return self.title
def delete(self, *args, **kwargs):
self.pdf.delete()
super().delete(*args, **kwargs)
class Video(models.Model):
title = models.CharField(max_length=100)
tags = models.CharField(max_length=255)
media = models.FileField(upload_to='video')
def __str__(self):
return self.title
def delete(self, *args, **kwargs):
self.media.delete()
super().delete(*args, **kwargs)

3
chemie/tests.py Normal file
View File

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

21
chemie/urls.py Normal file
View File

@ -0,0 +1,21 @@
from django.urls import path
from . import views
urlpatterns = [
path('', views.upload, name='chemie-upload'),
path('books/',views.book_list,name='chemie-book-list'),
path('books/upload/',views.upload_book,name='chemie-book-upload'),
path('books/<int:pk>/',views.delete_book,name='chemie-book-delete'),
path('books/list/',views.gallery,name='chemie-gallery'),
path('books/list/<str:name>/',views.gallery_delete,name='chemie-gallery-delete'),
path('videos/',views.video_list,name='chemie-video-list'),
path('videos/upload/',views.upload_video,name='chemie-video-upload'),
path('videos/<int:pk>/',views.delete_video,name='chemie-video-delete'),
path('upload/',views.keller_upload,name='keller-upload'),
path('keller/',views.KellerListView.as_view(),name='keller-list'),
path('keller/<int:id>',views.KellerDetailView.as_view(),name='keller-detail'),
path('keller/new',views.KellerCreateView.as_view(),name='keller-new'),
path('keller/update/<int:id>',views.KellerUpdateView.as_view(),name='keller-update'),
path('keller/kill/<int:id>',views.KellerDeleteView.as_view(),name='keller-kill'),
]

170
chemie/views.py Normal file
View File

@ -0,0 +1,170 @@
from django.shortcuts import render, redirect, get_object_or_404
from django.urls import reverse
from django.views.generic import TemplateView
from django.core.files.storage import FileSystemStorage
from django.contrib import messages
from django.conf import settings
from django.views.generic import CreateView,DetailView,ListView,UpdateView,DeleteView
import os, csv, io, datetime
from django.contrib.messages.views import SuccessMessageMixin
from django.db.models import Q
from .forms import BookForm, VideoForm, KellerModelForm
from .models import Book, Video, Keller
class KellerListView(ListView):
template_name = 'chemie/keller_list.html' # <app>/modelname_list.html
queryset = Keller.objects.all().order_by('name')
def get_queryset(self):
query = self.request.GET.get('q')
if query == '' or query == None :
list = Keller.objects.all().order_by('name')
else :
if query[0].isdigit():
list = Keller.objects.filter(Q(kiste__exact=query)) # startswith| endswith | <blog>_id
else:
list = Keller.objects.filter(Q(name__icontains=query)) # not case-sensitive
return list
class KellerDetailView(DetailView):
template_name = 'chemie/keller_detail.html' # <app>/modelname_list.html
#queryset = Keller.objects.all()
def get_object(self):
id_ = self.kwargs.get("id")
return get_object_or_404(Keller,id=id_)
class KellerCreateView(SuccessMessageMixin,CreateView):
template_name = 'chemie/keller_create.html'
form_class = KellerModelForm
queryset = Keller.objects.all()
success_message = "%(name)s was created"
class KellerUpdateView(UpdateView):
template_name = 'chemie/keller_create.html'
form_class = KellerModelForm
queryset = Keller.objects.all()
def get_object(self):
id_ = self.kwargs.get("id")
return get_object_or_404(Keller,id=id_)
class KellerDeleteView(DeleteView):
template_name = 'chemie/keller_delete.html' # <app>/modelname_list.html
queryset = Keller.objects.all()
def get_object(self):
id_ = self.kwargs.get("id")
return get_object_or_404(Keller,id=id_)
def get_success_url(self):
return reverse('keller-list')
def keller_upload(request):
template = "chemie/csv_upload.html"
prompt ={
'order': ' Order im csv file "Name","Menge","Einheit","Kiste","Nr" '
}
if request.method == 'GET':
return render(request, template, prompt)
csv_file = request.FILES['upfile']
if not csv_file.name.endswith('.csv'):
messages.error(request,'This is not a csv-file')
data_set = csv_file.read().decode('UTF-8')
io_string = io.StringIO(data_set)
next(io_string)
for col in csv.reader(io_string, delimiter=','):
print(col)
_, created = Keller.objects.update_or_create(
name=col[0],
menge=col[1],
einheit=col[2],
kiste=col[3],
nr=col[4]
)
context= {}
return render(request, template,context)
def gallery(request):
included_extensions = ['jpg','jpeg', 'bmp', 'png', 'gif','JPG','PNG','GIF','JPEG','BMP']
print(settings.MEDIA_ROOT)
img_list = [fn for fn in os.listdir(settings.MEDIA_ROOT)
if any(fn.endswith(ext) for ext in included_extensions)]
return render(request,'chemie/gallery.html', {'images': img_list})
def gallery_delete(request,name):
if request.method == 'POST':
name = settings.MEDIA_ROOT + name
os.remove(name);
messages.info(request, f"Removed{name}")
return redirect('chemie-gallery')
def upload(request):
context = {}
if request.method == 'POST':
uploaded_file = request.FILES['document']
filename = request.POST.get("nfilename","")
if len(filename) < 4:
filename = uploaded_file.name
messages.success(request, f"filename: {filename}")
fs = FileSystemStorage()
name=fs.save(filename,uploaded_file)
url = fs.url(name)
context ={'url': url}
messages.info(request, f"Uploaded {url}")
return render(request, 'chemie/upload.html',context)
def delete_book(request,pk):
if request.method == 'POST':
book = Book.objects.get(pk=pk)
book.delete()
return redirect('chemie-book-list')
def book_list(request):
books = Book.objects.all()
return render(request,'chemie/book_list.html',{
'books':books
})
def upload_book(request):
if request.method == 'POST':
form = BookForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('chemie-book-list')
else:
form = BookForm()
return render(request,'chemie/upload_book.html',{
'form': form
})
def delete_video(request,pk):
if request.method == 'POST':
video = Video.objects.get(pk=pk)
video.delete()
return redirect('chemie-video-list')
def video_list(request):
videos = Video.objects.all()
return render(request,'chemie/video_list.html',{
'videos':videos
})
def upload_video(request):
if request.method == 'POST':
form = VideoForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('chemie-video-list')
else:
form = VideoForm()
return render(request,'chemie/upload_video.html',{
'form': form
})

1
db.json Normal file

File diff suppressed because one or more lines are too long

16
docker-compose.yml Normal file
View File

@ -0,0 +1,16 @@
version: '3'
services:
db:
image: postgres
ports:
- "5432:5432"
web:
build: .
command: python3 manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db

0
main/__init__.py Normal file
View File

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

22
main/admin.py Normal file
View File

@ -0,0 +1,22 @@
from django.contrib import admin
from .models import Tutorial, TutorialSeries, TutorialCategory
from tinymce.widgets import TinyMCE
from django.db import models
class TutorialAdmin(admin.ModelAdmin):
fieldsets = [
("Title/date", {'fields': ["tutorial_title", "tutorial_published"]}),
("URL", {'fields': ["tutorial_slug"]}),
("Series", {'fields': ["tutorial_series"]}),
("Content", {"fields": ["tutorial_content"]})
]
formfield_overrides = {
models.TextField: {'widget': TinyMCE(attrs={'cols': 80, 'rows': 30})},
}
admin.site.register(TutorialSeries)
admin.site.register(TutorialCategory)
admin.site.register(Tutorial,TutorialAdmin)

5
main/apps.py Normal file
View File

@ -0,0 +1,5 @@
from django.apps import AppConfig
class MainConfig(AppConfig):
name = 'main'

17
main/forms.py Normal file
View File

@ -0,0 +1,17 @@
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
class NewUserForm(UserCreationForm):
email = forms.EmailField(required=True)
class Meta:
model = User
fields = ("username", "email", "password1", "password2")
def save(self, commit=True):
user = super(NewUserForm, self).save(commit=False)
user.email = self.cleaned_data["email"]
if commit:
user.save()
return user

View File

@ -0,0 +1,23 @@
# Generated by Django 2.2.4 on 2019-08-27 17:21
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Tutorial',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('tutorial_title', models.CharField(max_length=200)),
('tutorial_content', models.TextField()),
('tutorial_published', models.DateTimeField(verbose_name='date published')),
],
),
]

View File

@ -0,0 +1,48 @@
# Generated by Django 2.2.4 on 2019-08-30 12:16
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('main', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='TutorialCategory',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('tutorial_category', models.CharField(max_length=200)),
('category_summary', models.CharField(max_length=200)),
('category_slug', models.CharField(default=1, max_length=200)),
],
options={
'verbose_name_plural': 'Categories',
},
),
migrations.AddField(
model_name='tutorial',
name='tutorial_slug',
field=models.CharField(default=1, max_length=200),
),
migrations.CreateModel(
name='TutorialSeries',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('tutorial_series', models.CharField(max_length=200)),
('series_summary', models.CharField(max_length=200)),
('tutorial_category', models.ForeignKey(default=1, on_delete=django.db.models.deletion.SET_DEFAULT, to='main.TutorialCategory', verbose_name='Category')),
],
options={
'verbose_name_plural': 'Series',
},
),
migrations.AddField(
model_name='tutorial',
name='tutorial_series',
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.SET_DEFAULT, to='main.TutorialSeries', verbose_name='Series'),
),
]

View File

@ -0,0 +1,21 @@
# Generated by Django 2.2.4 on 2019-08-30 12:49
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('main', '0002_auto_20190830_1216'),
]
operations = [
migrations.RemoveField(
model_name='tutorial',
name='tutorial_series',
),
migrations.RemoveField(
model_name='tutorial',
name='tutorial_slug',
),
]

View File

@ -0,0 +1,24 @@
# Generated by Django 2.2.4 on 2019-08-30 12:51
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('main', '0003_auto_20190830_1249'),
]
operations = [
migrations.AddField(
model_name='tutorial',
name='tutorial_series',
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.SET_DEFAULT, to='main.TutorialSeries', verbose_name='Series'),
),
migrations.AddField(
model_name='tutorial',
name='tutorial_slug',
field=models.CharField(default=1, max_length=200),
),
]

View File

Binary file not shown.

Binary file not shown.

Binary file not shown.

39
main/models.py Normal file
View File

@ -0,0 +1,39 @@
from django.db import models
from django.utils import timezone
class TutorialCategory(models.Model):
tutorial_category = models.CharField(max_length=200)
category_summary = models.CharField(max_length=200)
category_slug = models.CharField(max_length=200, default=1)
class Meta:
# Gives the proper plural name for admin
verbose_name_plural = "Categories"
def __str__(self):
return self.tutorial_category
class TutorialSeries(models.Model):
tutorial_series = models.CharField(max_length=200)
tutorial_category = models.ForeignKey(TutorialCategory, default=1, verbose_name="Category", on_delete=models.SET_DEFAULT)
series_summary = models.CharField(max_length=200)
class Meta:
# otherwise we get "Tutorial Seriess in admin"
verbose_name_plural = "Series"
def __str__(self):
return self.tutorial_series
class Tutorial(models.Model):
tutorial_title = models.CharField(max_length=200)
tutorial_content = models.TextField()
tutorial_published = models.DateTimeField('date published')
#https://docs.djangoproject.com/en/2.1/ref/models/fields/#django.db.models.ForeignKey.on_delete
tutorial_series = models.ForeignKey(TutorialSeries, default=1, verbose_name="Series", on_delete=models.SET_DEFAULT)
tutorial_slug = models.CharField(max_length=200, default=1)
def __str__(self):
return self.tutorial_title

3
main/tests.py Normal file
View File

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

Some files were not shown because too many files have changed in this diff Show More