first commit
This commit is contained in:
commit
15363572ff
119
.gitignore
vendored
Normal file
119
.gitignore
vendored
Normal 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
7
Dockerfile
Normal 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
0
chemie/__init__.py
Normal file
BIN
chemie/__pycache__/__init__.cpython-37.pyc
Normal file
BIN
chemie/__pycache__/__init__.cpython-37.pyc
Normal file
Binary file not shown.
BIN
chemie/__pycache__/__init__.cpython-38.pyc
Normal file
BIN
chemie/__pycache__/__init__.cpython-38.pyc
Normal file
Binary file not shown.
BIN
chemie/__pycache__/__init__.cpython-39.pyc
Normal file
BIN
chemie/__pycache__/__init__.cpython-39.pyc
Normal file
Binary file not shown.
BIN
chemie/__pycache__/admin.cpython-37.pyc
Normal file
BIN
chemie/__pycache__/admin.cpython-37.pyc
Normal file
Binary file not shown.
BIN
chemie/__pycache__/admin.cpython-38.pyc
Normal file
BIN
chemie/__pycache__/admin.cpython-38.pyc
Normal file
Binary file not shown.
BIN
chemie/__pycache__/admin.cpython-39.pyc
Normal file
BIN
chemie/__pycache__/admin.cpython-39.pyc
Normal file
Binary file not shown.
BIN
chemie/__pycache__/apps.cpython-37.pyc
Normal file
BIN
chemie/__pycache__/apps.cpython-37.pyc
Normal file
Binary file not shown.
BIN
chemie/__pycache__/apps.cpython-38.pyc
Normal file
BIN
chemie/__pycache__/apps.cpython-38.pyc
Normal file
Binary file not shown.
BIN
chemie/__pycache__/apps.cpython-39.pyc
Normal file
BIN
chemie/__pycache__/apps.cpython-39.pyc
Normal file
Binary file not shown.
BIN
chemie/__pycache__/forms.cpython-37.pyc
Normal file
BIN
chemie/__pycache__/forms.cpython-37.pyc
Normal file
Binary file not shown.
BIN
chemie/__pycache__/forms.cpython-38.pyc
Normal file
BIN
chemie/__pycache__/forms.cpython-38.pyc
Normal file
Binary file not shown.
BIN
chemie/__pycache__/forms.cpython-39.pyc
Normal file
BIN
chemie/__pycache__/forms.cpython-39.pyc
Normal file
Binary file not shown.
BIN
chemie/__pycache__/models.cpython-37.pyc
Normal file
BIN
chemie/__pycache__/models.cpython-37.pyc
Normal file
Binary file not shown.
BIN
chemie/__pycache__/models.cpython-38.pyc
Normal file
BIN
chemie/__pycache__/models.cpython-38.pyc
Normal file
Binary file not shown.
BIN
chemie/__pycache__/models.cpython-39.pyc
Normal file
BIN
chemie/__pycache__/models.cpython-39.pyc
Normal file
Binary file not shown.
BIN
chemie/__pycache__/urls.cpython-37.pyc
Normal file
BIN
chemie/__pycache__/urls.cpython-37.pyc
Normal file
Binary file not shown.
BIN
chemie/__pycache__/urls.cpython-38.pyc
Normal file
BIN
chemie/__pycache__/urls.cpython-38.pyc
Normal file
Binary file not shown.
BIN
chemie/__pycache__/urls.cpython-39.pyc
Normal file
BIN
chemie/__pycache__/urls.cpython-39.pyc
Normal file
Binary file not shown.
BIN
chemie/__pycache__/views.cpython-37.pyc
Normal file
BIN
chemie/__pycache__/views.cpython-37.pyc
Normal file
Binary file not shown.
BIN
chemie/__pycache__/views.cpython-38.pyc
Normal file
BIN
chemie/__pycache__/views.cpython-38.pyc
Normal file
Binary file not shown.
BIN
chemie/__pycache__/views.cpython-39.pyc
Normal file
BIN
chemie/__pycache__/views.cpython-39.pyc
Normal file
Binary file not shown.
7
chemie/admin.py
Normal file
7
chemie/admin.py
Normal 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
5
chemie/apps.py
Normal file
@ -0,0 +1,5 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class ChemieConfig(AppConfig):
|
||||
name = 'chemie'
|
||||
27
chemie/forms.py
Normal file
27
chemie/forms.py
Normal 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')
|
||||
23
chemie/migrations/0001_initial.py
Normal file
23
chemie/migrations/0001_initial.py
Normal 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')),
|
||||
],
|
||||
),
|
||||
]
|
||||
27
chemie/migrations/0002_auto_20190920_1116.py
Normal file
27
chemie/migrations/0002_auto_20190920_1116.py
Normal 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'),
|
||||
),
|
||||
]
|
||||
24
chemie/migrations/0003_keller.py
Normal file
24
chemie/migrations/0003_keller.py
Normal 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()),
|
||||
],
|
||||
),
|
||||
]
|
||||
18
chemie/migrations/0004_keller_info.py
Normal file
18
chemie/migrations/0004_keller_info.py
Normal 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=''),
|
||||
),
|
||||
]
|
||||
0
chemie/migrations/__init__.py
Normal file
0
chemie/migrations/__init__.py
Normal file
BIN
chemie/migrations/__pycache__/0001_initial.cpython-37.pyc
Normal file
BIN
chemie/migrations/__pycache__/0001_initial.cpython-37.pyc
Normal file
Binary file not shown.
BIN
chemie/migrations/__pycache__/0001_initial.cpython-38.pyc
Normal file
BIN
chemie/migrations/__pycache__/0001_initial.cpython-38.pyc
Normal file
Binary file not shown.
BIN
chemie/migrations/__pycache__/0001_initial.cpython-39.pyc
Normal file
BIN
chemie/migrations/__pycache__/0001_initial.cpython-39.pyc
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
chemie/migrations/__pycache__/0003_keller.cpython-37.pyc
Normal file
BIN
chemie/migrations/__pycache__/0003_keller.cpython-37.pyc
Normal file
Binary file not shown.
BIN
chemie/migrations/__pycache__/0003_keller.cpython-38.pyc
Normal file
BIN
chemie/migrations/__pycache__/0003_keller.cpython-38.pyc
Normal file
Binary file not shown.
BIN
chemie/migrations/__pycache__/0003_keller.cpython-39.pyc
Normal file
BIN
chemie/migrations/__pycache__/0003_keller.cpython-39.pyc
Normal file
Binary file not shown.
BIN
chemie/migrations/__pycache__/0004_keller_info.cpython-37.pyc
Normal file
BIN
chemie/migrations/__pycache__/0004_keller_info.cpython-37.pyc
Normal file
Binary file not shown.
BIN
chemie/migrations/__pycache__/0004_keller_info.cpython-38.pyc
Normal file
BIN
chemie/migrations/__pycache__/0004_keller_info.cpython-38.pyc
Normal file
Binary file not shown.
BIN
chemie/migrations/__pycache__/0004_keller_info.cpython-39.pyc
Normal file
BIN
chemie/migrations/__pycache__/0004_keller_info.cpython-39.pyc
Normal file
Binary file not shown.
BIN
chemie/migrations/__pycache__/__init__.cpython-37.pyc
Normal file
BIN
chemie/migrations/__pycache__/__init__.cpython-37.pyc
Normal file
Binary file not shown.
BIN
chemie/migrations/__pycache__/__init__.cpython-38.pyc
Normal file
BIN
chemie/migrations/__pycache__/__init__.cpython-38.pyc
Normal file
Binary file not shown.
BIN
chemie/migrations/__pycache__/__init__.cpython-39.pyc
Normal file
BIN
chemie/migrations/__pycache__/__init__.cpython-39.pyc
Normal file
Binary file not shown.
42
chemie/models.py
Normal file
42
chemie/models.py
Normal 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
3
chemie/tests.py
Normal file
@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
21
chemie/urls.py
Normal file
21
chemie/urls.py
Normal 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
170
chemie/views.py
Normal 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
|
||||
})
|
||||
16
docker-compose.yml
Normal file
16
docker-compose.yml
Normal 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
0
main/__init__.py
Normal file
BIN
main/__pycache__/__init__.cpython-37.pyc
Normal file
BIN
main/__pycache__/__init__.cpython-37.pyc
Normal file
Binary file not shown.
BIN
main/__pycache__/__init__.cpython-38.pyc
Normal file
BIN
main/__pycache__/__init__.cpython-38.pyc
Normal file
Binary file not shown.
BIN
main/__pycache__/__init__.cpython-39.pyc
Normal file
BIN
main/__pycache__/__init__.cpython-39.pyc
Normal file
Binary file not shown.
BIN
main/__pycache__/admin.cpython-37.pyc
Normal file
BIN
main/__pycache__/admin.cpython-37.pyc
Normal file
Binary file not shown.
BIN
main/__pycache__/admin.cpython-38.pyc
Normal file
BIN
main/__pycache__/admin.cpython-38.pyc
Normal file
Binary file not shown.
BIN
main/__pycache__/admin.cpython-39.pyc
Normal file
BIN
main/__pycache__/admin.cpython-39.pyc
Normal file
Binary file not shown.
BIN
main/__pycache__/apps.cpython-37.pyc
Normal file
BIN
main/__pycache__/apps.cpython-37.pyc
Normal file
Binary file not shown.
BIN
main/__pycache__/apps.cpython-38.pyc
Normal file
BIN
main/__pycache__/apps.cpython-38.pyc
Normal file
Binary file not shown.
BIN
main/__pycache__/apps.cpython-39.pyc
Normal file
BIN
main/__pycache__/apps.cpython-39.pyc
Normal file
Binary file not shown.
BIN
main/__pycache__/forms.cpython-37.pyc
Normal file
BIN
main/__pycache__/forms.cpython-37.pyc
Normal file
Binary file not shown.
BIN
main/__pycache__/forms.cpython-38.pyc
Normal file
BIN
main/__pycache__/forms.cpython-38.pyc
Normal file
Binary file not shown.
BIN
main/__pycache__/forms.cpython-39.pyc
Normal file
BIN
main/__pycache__/forms.cpython-39.pyc
Normal file
Binary file not shown.
BIN
main/__pycache__/models.cpython-37.pyc
Normal file
BIN
main/__pycache__/models.cpython-37.pyc
Normal file
Binary file not shown.
BIN
main/__pycache__/models.cpython-38.pyc
Normal file
BIN
main/__pycache__/models.cpython-38.pyc
Normal file
Binary file not shown.
BIN
main/__pycache__/models.cpython-39.pyc
Normal file
BIN
main/__pycache__/models.cpython-39.pyc
Normal file
Binary file not shown.
BIN
main/__pycache__/urls.cpython-37.pyc
Normal file
BIN
main/__pycache__/urls.cpython-37.pyc
Normal file
Binary file not shown.
BIN
main/__pycache__/urls.cpython-38.pyc
Normal file
BIN
main/__pycache__/urls.cpython-38.pyc
Normal file
Binary file not shown.
BIN
main/__pycache__/urls.cpython-39.pyc
Normal file
BIN
main/__pycache__/urls.cpython-39.pyc
Normal file
Binary file not shown.
BIN
main/__pycache__/views.cpython-37.pyc
Normal file
BIN
main/__pycache__/views.cpython-37.pyc
Normal file
Binary file not shown.
BIN
main/__pycache__/views.cpython-38.pyc
Normal file
BIN
main/__pycache__/views.cpython-38.pyc
Normal file
Binary file not shown.
BIN
main/__pycache__/views.cpython-39.pyc
Normal file
BIN
main/__pycache__/views.cpython-39.pyc
Normal file
Binary file not shown.
22
main/admin.py
Normal file
22
main/admin.py
Normal 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
5
main/apps.py
Normal file
@ -0,0 +1,5 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class MainConfig(AppConfig):
|
||||
name = 'main'
|
||||
17
main/forms.py
Normal file
17
main/forms.py
Normal 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
|
||||
23
main/migrations/0001_initial.py
Normal file
23
main/migrations/0001_initial.py
Normal 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')),
|
||||
],
|
||||
),
|
||||
]
|
||||
48
main/migrations/0002_auto_20190830_1216.py
Normal file
48
main/migrations/0002_auto_20190830_1216.py
Normal 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'),
|
||||
),
|
||||
]
|
||||
21
main/migrations/0003_auto_20190830_1249.py
Normal file
21
main/migrations/0003_auto_20190830_1249.py
Normal 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',
|
||||
),
|
||||
]
|
||||
24
main/migrations/0004_auto_20190830_1251.py
Normal file
24
main/migrations/0004_auto_20190830_1251.py
Normal 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),
|
||||
),
|
||||
]
|
||||
0
main/migrations/__init__.py
Normal file
0
main/migrations/__init__.py
Normal file
BIN
main/migrations/__pycache__/0001_initial.cpython-37.pyc
Normal file
BIN
main/migrations/__pycache__/0001_initial.cpython-37.pyc
Normal file
Binary file not shown.
BIN
main/migrations/__pycache__/0001_initial.cpython-38.pyc
Normal file
BIN
main/migrations/__pycache__/0001_initial.cpython-38.pyc
Normal file
Binary file not shown.
BIN
main/migrations/__pycache__/0001_initial.cpython-39.pyc
Normal file
BIN
main/migrations/__pycache__/0001_initial.cpython-39.pyc
Normal 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.
BIN
main/migrations/__pycache__/__init__.cpython-37.pyc
Normal file
BIN
main/migrations/__pycache__/__init__.cpython-37.pyc
Normal file
Binary file not shown.
BIN
main/migrations/__pycache__/__init__.cpython-38.pyc
Normal file
BIN
main/migrations/__pycache__/__init__.cpython-38.pyc
Normal file
Binary file not shown.
BIN
main/migrations/__pycache__/__init__.cpython-39.pyc
Normal file
BIN
main/migrations/__pycache__/__init__.cpython-39.pyc
Normal file
Binary file not shown.
39
main/models.py
Normal file
39
main/models.py
Normal 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
3
main/tests.py
Normal 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
Loading…
Reference in New Issue
Block a user