Compare commits

...

15 Commits

Author SHA1 Message Date
e84f25ca1d New DB 2025-10-24 00:37:40 +02:00
dfb8eeef97 Deploy 931 (with diagram branch in container) - readiness probes off temporarily 2025-10-24 00:30:22 +02:00
0225fb3396 Deploy 931 (with diagram branch in container) - 2nd attempt 2025-10-24 00:27:07 +02:00
7377ddaea3 Deploy 931 (with diagram branch in container) 2025-10-24 00:20:34 +02:00
4d1232b764 Tests - not runnable yet. 2025-10-23 16:35:31 +02:00
fe2e02934a README added, first try at signing commits. 2025-10-23 09:27:25 +02:00
add1a88ce4 README added, first try at signing commits. 2025-10-23 09:26:44 +02:00
3c23918e1f No-clobber back on for database in ArgoCD 2025-10-23 09:01:45 +02:00
fa0a2a9df9 new data structure due to renaming - clobbering database temporarily in init-container 2025-10-23 08:25:12 +00:00
Adrian A. Baumann
9feaf6686f Deploy 930 2025-10-23 09:42:41 +02:00
7087be672a Added "Geltungsbereich" back into search function and corrected it; Changed "standards" page to "dokumente" internally 2025-10-23 09:35:23 +02:00
Adrian A. Baumann
969141601d Merge branch 'rename_standards' into development 2025-10-22 15:14:48 +02:00
Adrian A. Baumann
b391ab0ef6 >Renamed app "standards" to "dokumente" - finally working as expected. 2025-10-22 15:08:42 +02:00
4de2ad38c5 Readme added 2025-10-21 23:46:17 +02:00
d46d937e93 Geltungsbereich removed from search scope for now. Maybe check Haystack or other dedicated search engines 2025-10-21 16:16:42 +02:00
31 changed files with 59 additions and 65 deletions

View File

@@ -1 +1,6 @@
# VDeployment2 # vgui-cicd
There are examples for importing text in the "Documentation"-directory. Actual documentation follows.
Documentation on Confluence so far.
This commit should be signed.

View File

@@ -38,7 +38,7 @@ INSTALLED_APPS = [
'django.contrib.sessions', 'django.contrib.sessions',
'django.contrib.messages', 'django.contrib.messages',
'django.contrib.staticfiles', 'django.contrib.staticfiles',
'standards', 'dokumente',
'abschnitte', 'abschnitte',
'stichworte', 'stichworte',
'mptt', 'mptt',

View File

@@ -43,7 +43,7 @@ INSTALLED_APPS = [
'django.contrib.sessions', 'django.contrib.sessions',
'django.contrib.messages', 'django.contrib.messages',
'django.contrib.staticfiles', 'django.contrib.staticfiles',
'standards', 'dokumente',
'abschnitte', 'abschnitte',
'stichworte', 'stichworte',
'referenzen', 'referenzen',

View File

@@ -19,7 +19,7 @@ from django.urls import include, path, re_path
from django.conf import settings from django.conf import settings
from django.conf.urls.static import static from django.conf.urls.static import static
from diagramm_proxy.views import DiagrammProxyView from diagramm_proxy.views import DiagrammProxyView
import standards.views import dokumente.views
import pages.views import pages.views
import referenzen.views import referenzen.views
@@ -28,7 +28,7 @@ admin.site.site_header="Autorenumgebung"
urlpatterns = [ urlpatterns = [
path('',pages.views.startseite), path('',pages.views.startseite),
path('search/',pages.views.search), path('search/',pages.views.search),
path('standards/', include("standards.urls")), path('dokumente/', include("dokumente.urls")),
path('autorenumgebung/', admin.site.urls), path('autorenumgebung/', admin.site.urls),
path('stichworte/', include("stichworte.urls")), path('stichworte/', include("stichworte.urls")),
path('referenzen/', referenzen.views.tree, name="referenz_tree"), path('referenzen/', referenzen.views.tree, name="referenz_tree"),

View File

@@ -18,36 +18,20 @@ spec:
fsGroupChangePolicy: "OnRootMismatch" fsGroupChangePolicy: "OnRootMismatch"
initContainers: initContainers:
- name: loader - name: loader
image: git.baumann.gr/adebaumann/vgui-data-loader:0.5 image: git.baumann.gr/adebaumann/vui-data-loader:0.7
command: [ "sh","-c","cp -n preload/preload.sqlite3 /data/db.sqlite3; chown -R 999:999 /data; ls -la /data; sleep 10; exit 0" ] command: [ "sh","-c","cp preload/preload.sqlite3 /data/db.sqlite3; chown -R 999:999 /data; ls -la /data; sleep 10; exit 0" ]
volumeMounts: volumeMounts:
- name: data - name: data
mountPath: /data mountPath: /data
containers: containers:
- name: web - name: web
image: git.baumann.gr/adebaumann/vui:0.929 image: git.baumann.gr/adebaumann/vui:0.931
imagePullPolicy: Always imagePullPolicy: Always
ports: ports:
- containerPort: 8000 - containerPort: 8000
volumeMounts: volumeMounts:
- name: data - name: data
mountPath: /app/data mountPath: /app/data
readinessProbe:
httpGet:
path: /
port: 8000
initialDelaySeconds: 5
periodSeconds: 10
timeoutSeconds: 2
failureThreshold: 6
livenessProbe:
httpGet:
path: /
port: 8000
initialDelaySeconds: 20
periodSeconds: 20
timeoutSeconds: 2
failureThreshold: 3
volumes: volumes:
- name: data - name: data
persistentVolumeClaim: persistentVolumeClaim:

Binary file not shown.

Binary file not shown.

View File

@@ -3,4 +3,4 @@ from django.apps import AppConfig
class standardsConfig(AppConfig): class standardsConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField' default_auto_field = 'django.db.models.BigAutoField'
name = 'standards' name = 'dokumente'

View File

@@ -4,7 +4,7 @@ from pathlib import Path
from django.core.management.base import BaseCommand, CommandError from django.core.management.base import BaseCommand, CommandError
from django.utils import timezone from django.utils import timezone
from standards.models import ( from dokumente.models import (
Dokument, Dokument,
Dokumententyp, Dokumententyp,
Thema, Thema,

View File

@@ -53,7 +53,7 @@ class Migration(migrations.Migration):
('rght', models.PositiveIntegerField(editable=False)), ('rght', models.PositiveIntegerField(editable=False)),
('tree_id', models.PositiveIntegerField(db_index=True, editable=False)), ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)),
('level', models.PositiveIntegerField(editable=False)), ('level', models.PositiveIntegerField(editable=False)),
('oberreferenz', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='unterreferenzen', to='standards.referenz')), ('oberreferenz', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='unterreferenzen', to='dokumente.referenz')),
], ],
options={ options={
'verbose_name_plural': 'Referenzen', 'verbose_name_plural': 'Referenzen',
@@ -65,7 +65,7 @@ class Migration(migrations.Migration):
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('inhalt', models.TextField(blank=True, null=True)), ('inhalt', models.TextField(blank=True, null=True)),
('abschnitttyp', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='abschnitte.abschnitttyp')), ('abschnitttyp', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='abschnitte.abschnitttyp')),
('erklaerung', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='standards.referenz')), ('erklaerung', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='dokumente.referenz')),
], ],
options={ options={
'verbose_name': 'Erklärung', 'verbose_name': 'Erklärung',
@@ -80,9 +80,9 @@ class Migration(migrations.Migration):
('gueltigkeit_bis', models.DateField(blank=True, null=True)), ('gueltigkeit_bis', models.DateField(blank=True, null=True)),
('signatur_cso', models.CharField(blank=True, max_length=255)), ('signatur_cso', models.CharField(blank=True, max_length=255)),
('anhaenge', models.TextField(blank=True)), ('anhaenge', models.TextField(blank=True)),
('autoren', models.ManyToManyField(related_name='verfasste_dokumente', to='standards.person')), ('autoren', models.ManyToManyField(related_name='verfasste_dokumente', to='dokumente.person')),
('dokumententyp', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='standards.dokumententyp')), ('dokumententyp', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='dokumente.dokumententyp')),
('pruefende', models.ManyToManyField(related_name='gepruefte_dokumente', to='standards.person')), ('pruefende', models.ManyToManyField(related_name='gepruefte_dokumente', to='dokumente.person')),
], ],
options={ options={
'verbose_name': 'Standard', 'verbose_name': 'Standard',
@@ -95,7 +95,7 @@ class Migration(migrations.Migration):
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('inhalt', models.TextField(blank=True, null=True)), ('inhalt', models.TextField(blank=True, null=True)),
('abschnitttyp', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='abschnitte.abschnitttyp')), ('abschnitttyp', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='abschnitte.abschnitttyp')),
('geltungsbereich', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='standards.standard')), ('geltungsbereich', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='dokumente.standard')),
], ],
options={ options={
'verbose_name': 'Geltungsbereichs-Abschnitt', 'verbose_name': 'Geltungsbereichs-Abschnitt',
@@ -108,8 +108,8 @@ class Migration(migrations.Migration):
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('datum', models.DateField()), ('datum', models.DateField()),
('aenderung', models.TextField()), ('aenderung', models.TextField()),
('autoren', models.ManyToManyField(to='standards.person')), ('autoren', models.ManyToManyField(to='dokumente.person')),
('dokument', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='changelog', to='standards.standard')), ('dokument', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='changelog', to='dokumente.standard')),
], ],
), ),
migrations.CreateModel( migrations.CreateModel(
@@ -120,10 +120,10 @@ class Migration(migrations.Migration):
('titel', models.CharField(max_length=255)), ('titel', models.CharField(max_length=255)),
('gueltigkeit_von', models.DateField()), ('gueltigkeit_von', models.DateField()),
('gueltigkeit_bis', models.DateField(blank=True, null=True)), ('gueltigkeit_bis', models.DateField(blank=True, null=True)),
('dokument', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='vorgaben', to='standards.standard')), ('dokument', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='vorgaben', to='dokumente.standard')),
('referenzen', models.ManyToManyField(blank=True, to='standards.referenz')), ('referenzen', models.ManyToManyField(blank=True, to='dokumente.referenz')),
('stichworte', models.ManyToManyField(blank=True, to='stichworte.stichwort')), ('stichworte', models.ManyToManyField(blank=True, to='stichworte.stichwort')),
('thema', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='standards.thema')), ('thema', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='dokumente.thema')),
], ],
options={ options={
'verbose_name_plural': 'Vorgaben', 'verbose_name_plural': 'Vorgaben',
@@ -134,7 +134,7 @@ class Migration(migrations.Migration):
fields=[ fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('frage', models.CharField(max_length=255)), ('frage', models.CharField(max_length=255)),
('vorgabe', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='checklistenfragen', to='standards.vorgabe')), ('vorgabe', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='checklistenfragen', to='dokumente.vorgabe')),
], ],
options={ options={
'verbose_name_plural': 'Fragen für Checkliste', 'verbose_name_plural': 'Fragen für Checkliste',
@@ -145,7 +145,7 @@ class Migration(migrations.Migration):
fields=[ fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('inhalt', models.TextField(blank=True, null=True)), ('inhalt', models.TextField(blank=True, null=True)),
('abschnitt', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='standards.vorgabe')), ('abschnitt', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='dokumente.vorgabe')),
('abschnitttyp', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='abschnitte.abschnitttyp')), ('abschnitttyp', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='abschnitte.abschnitttyp')),
], ],
options={ options={
@@ -158,7 +158,7 @@ class Migration(migrations.Migration):
fields=[ fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('inhalt', models.TextField(blank=True, null=True)), ('inhalt', models.TextField(blank=True, null=True)),
('abschnitt', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='standards.vorgabe')), ('abschnitt', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='dokumente.vorgabe')),
('abschnitttyp', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='abschnitte.abschnitttyp')), ('abschnitttyp', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='abschnitte.abschnitttyp')),
], ],
options={ options={

View File

@@ -8,7 +8,7 @@ class Migration(migrations.Migration):
dependencies = [ dependencies = [
('abschnitte', '0001_initial'), ('abschnitte', '0001_initial'),
('standards', '0001_initial'), ('dokumente', '0001_initial'),
] ]
operations = [ operations = [
@@ -18,7 +18,7 @@ class Migration(migrations.Migration):
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('inhalt', models.TextField(blank=True, null=True)), ('inhalt', models.TextField(blank=True, null=True)),
('abschnitttyp', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='abschnitte.abschnitttyp')), ('abschnitttyp', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='abschnitte.abschnitttyp')),
('einleitung', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='standards.standard')), ('einleitung', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='dokumente.standard')),
], ],
options={ options={
'verbose_name': 'Einleitungs-Abschnitt', 'verbose_name': 'Einleitungs-Abschnitt',

View File

@@ -6,7 +6,7 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('standards', '0002_einleitung'), ('dokumente', '0002_einleitung'),
] ]
operations = [ operations = [

View File

@@ -7,7 +7,7 @@ class Migration(migrations.Migration):
dependencies = [ dependencies = [
('referenzen', '0001_initial'), ('referenzen', '0001_initial'),
('standards', '0003_einleitung_order_geltungsbereich_order_and_more'), ('dokumente', '0003_einleitung_order_geltungsbereich_order_and_more'),
] ]
operations = [ operations = [

View File

@@ -7,7 +7,7 @@ class Migration(migrations.Migration):
dependencies = [ dependencies = [
('rollen', '0001_initial'), ('rollen', '0001_initial'),
('standards', '0004_remove_referenzerklaerung_erklaerung_and_more'), ('dokumente', '0004_remove_referenzerklaerung_erklaerung_and_more'),
] ]
operations = [ operations = [

View File

@@ -6,7 +6,7 @@ from django.db import migrations
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('standards', '0005_vorgabe_relevanz'), ('dokumente', '0005_vorgabe_relevanz'),
] ]
operations = [ operations = [

View File

@@ -6,7 +6,7 @@ from django.db import migrations
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('standards', '0006_rename_standard_dokument_alter_dokument_options'), ('dokumente', '0006_rename_standard_dokument_alter_dokument_options'),
] ]
operations = [ operations = [

View File

@@ -2,10 +2,10 @@
{% block content %} {% block content %}
<h1>Standards Informatiksicherheit</h1> <h1>Standards Informatiksicherheit</h1>
<ul> <ul>
{% for standard in standards %} {% for dokument in dokumente %}
<li> <li>
<a href="{% url 'standard_detail' nummer=standard.nummer %}"> <a href="{% url 'standard_detail' nummer=dokument.nummer %}">
{{ standard.nummer }} {{ standard.name }} {{ dokument.nummer }} {{ dokument.name }}
</a> </a>
</li> </li>
{% endfor %} {% endfor %}

8
dokumente/tests.py Normal file
View File

@@ -0,0 +1,8 @@
from django.test import TestCase
from myapp.models import Dokument
# Create your tests here.
class DokumentTestCase (TestCase):
def setUp(self):
Document.objects.create(name)

View File

@@ -9,9 +9,9 @@ calendar=parsedatetime.Calendar()
def standard_list(request): def standard_list(request):
standards = Dokument.objects.all() dokumente = Dokument.objects.all()
return render(request, 'standards/standard_list.html', return render(request, 'standards/standard_list.html',
{'standards': standards} {'dokumente': dokumente}
) )

View File

@@ -16,7 +16,7 @@
</button> </button>
<div class="collapse navbar-collapse" id="navbarNavAltMarkup"> <div class="collapse navbar-collapse" id="navbarNavAltMarkup">
<div class="navbar-nav"> <div class="navbar-nav">
<a class="nav-item nav-link active" href="/standards">Standards</a> <a class="nav-item nav-link active" href="/dokumente">Standards</a>
<a class="nav-item nav-link" href="/referenzen">Referenzen</a> <a class="nav-item nav-link" href="/referenzen">Referenzen</a>
<a class="nav-item nav-link" href="/stichworte">Stichworte</a> <a class="nav-item nav-link" href="/stichworte">Stichworte</a>
<a class="nav-item nav-link" href="/search">Suche</a> <a class="nav-item nav-link" href="/search">Suche</a>
@@ -28,6 +28,6 @@
<div class="flex-fill">{% block content %}Main Content{% endblock %}</div> <div class="flex-fill">{% block content %}Main Content{% endblock %}</div>
<div class="col-md-2">{% block sidebar_right %}{% endblock %}</div> <div class="col-md-2">{% block sidebar_right %}{% endblock %}</div>
</div> </div>
<div>VorgabenUI v0.930</div> <div>VorgabenUI v0.931</div>
</body> </body>
</html> </html>

View File

@@ -3,7 +3,7 @@
<h1>Vorgaben Informatiksicherheit BIT</h1> <h1>Vorgaben Informatiksicherheit BIT</h1>
<h2>Aktuell erfasste Standards</h2> <h2>Aktuell erfasste Standards</h2>
<ul> <ul>
{% for standard in standards %} {% for standard in dokumente %}
<li><a href="{% url 'standard_detail' nummer=standard.nummer %}">{{ standard }}</a></li> <li><a href="{% url 'standard_detail' nummer=standard.nummer %}">{{ standard }}</a></li>
{% endfor %} {% endfor %}
</ul> </ul>

View File

@@ -1,31 +1,31 @@
from django.shortcuts import render from django.shortcuts import render
from abschnitte.utils import render_textabschnitte from abschnitte.utils import render_textabschnitte
from standards.models import Dokument, VorgabeLangtext, VorgabeKurztext, Geltungsbereich from dokumente.models import Dokument, VorgabeLangtext, VorgabeKurztext, Geltungsbereich
from itertools import groupby from itertools import groupby
import datetime import datetime
import pprint
def startseite(request): def startseite(request):
standards=list(Dokument.objects.all()) standards=list(Dokument.objects.all())
return render(request, 'startseite.html', {"standards":standards,}) return render(request, 'startseite.html', {"dokumente":standards,})
def search(request): def search(request):
if request.method == "GET": if request.method == "GET":
return render(request, 'search.html') return render(request, 'search.html')
elif request.method == "POST": elif request.method == "POST":
suchbegriff=request.POST.get("q") suchbegriff=request.POST.get("q")
areas=request.POST.getlist("suchbereich[]")
result= {"all": {}} result= {"all": {}}
qs = VorgabeKurztext.objects.filter(inhalt__contains=suchbegriff).exclude(abschnitt__gueltigkeit_bis__lt=datetime.date.today()) qs = VorgabeKurztext.objects.filter(inhalt__contains=suchbegriff).exclude(abschnitt__gueltigkeit_bis__lt=datetime.date.today())
result["kurztext"] = {k: [o.abschnitt for o in g] for k, g in groupby(qs, key=lambda o: o.abschnitt.dokument)} result["kurztext"] = {k: [o.abschnitt for o in g] for k, g in groupby(qs, key=lambda o: o.abschnitt.dokument)}
qs = VorgabeLangtext.objects.filter(inhalt__contains=suchbegriff).exclude(abschnitt__gueltigkeit_bis__lt=datetime.date.today()) qs = VorgabeLangtext.objects.filter(inhalt__contains=suchbegriff).exclude(abschnitt__gueltigkeit_bis__lt=datetime.date.today())
result['langtext']= {k: [o.abschnitt for o in g] for k, g in groupby(qs, key=lambda o: o.abschnitt.dokument)} result['langtext']= {k: [o.abschnitt for o in g] for k, g in groupby(qs, key=lambda o: o.abschnitt.dokument)}
for r in result.keys():
for s in result[r].keys():
result["all"][s] = set(result[r][s])
result["geltungsbereich"]={} result["geltungsbereich"]={}
geltungsbereich=set(list([x.geltungsbereich for x in Geltungsbereich.objects.filter(inhalt__contains=suchbegriff)])) geltungsbereich=set(list([x.geltungsbereich for x in Geltungsbereich.objects.filter(inhalt__contains=suchbegriff)]))
for s in geltungsbereich: for s in geltungsbereich:
result["geltungsbereich"][s]=render_textabschnitte(s.geltungsbereich_set.order_by("order")) result["geltungsbereich"][s]=render_textabschnitte(s.geltungsbereich_set.order_by("order"))
for r in result.keys(): pprint.pp (result)
for s in result[r].keys():
result["all"][s] = set(result[r][s])
print (result)
return render(request,"results.html",{"suchbegriff":suchbegriff,"resultat":result}) return render(request,"results.html",{"suchbegriff":suchbegriff,"resultat":result})

View File

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