All files for deployment ready and tested - further development in this repo.

This commit is contained in:
2025-09-22 10:42:52 +02:00
parent 57b738e9ce
commit 12c3181ad2
394 changed files with 89982 additions and 0 deletions

0
referenzen/__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.

16
referenzen/admin.py Normal file
View File

@@ -0,0 +1,16 @@
from django.contrib import admin
from nested_admin import NestedStackedInline, NestedModelAdmin, NestedTabularInline
from .models import *
# Register your models here.
class ReferenzerklaerungInline(NestedStackedInline):
model=Referenzerklaerung
extra=0
sortable_field_name="order"
show_change_link = True
@admin.register(Referenz)
class ReferenzAdmin(NestedModelAdmin):
inlines=[ReferenzerklaerungInline]
list_display =['Path']
search_fields=("referenz",)

6
referenzen/apps.py Normal file
View File

@@ -0,0 +1,6 @@
from django.apps import AppConfig
class ReferenzenConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'referenzen'

View File

@@ -0,0 +1,49 @@
# Generated by Django 5.2.5 on 2025-09-04 12:59
import django.db.models.deletion
import mptt.fields
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('abschnitte', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='Referenz',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('name_nummer', models.CharField(max_length=100)),
('name_text', models.CharField(blank=True, max_length=255)),
('url', models.URLField(blank=True)),
('lft', models.PositiveIntegerField(editable=False)),
('rght', models.PositiveIntegerField(editable=False)),
('tree_id', models.PositiveIntegerField(db_index=True, 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='referenzen.referenz')),
],
options={
'verbose_name_plural': 'Referenzen',
'db_table': 'standards_referenz',
},
),
migrations.CreateModel(
name='Referenzerklaerung',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('inhalt', models.TextField(blank=True, null=True)),
('order', models.PositiveIntegerField(default=0)),
('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='referenzen.referenz')),
],
options={
'verbose_name': 'Erklärung',
'db_table': 'standards_referenzerklaerung',
},
),
]

View File

@@ -0,0 +1,21 @@
# Generated by Django 5.2.5 on 2025-09-04 13:10
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('referenzen', '0001_initial'),
]
operations = [
migrations.AlterModelTable(
name='referenz',
table=None,
),
migrations.AlterModelTable(
name='referenzerklaerung',
table=None,
),
]

View File

33
referenzen/models.py Normal file
View File

@@ -0,0 +1,33 @@
from django.db import models
from mptt.models import MPTTModel, TreeForeignKey
from abschnitte.models import Textabschnitt
# Create your models here.
class Referenz(MPTTModel):
id = models.AutoField(primary_key=True)
name_nummer = models.CharField(max_length=100)
name_text=models.CharField(max_length=255, blank=True)
oberreferenz = TreeForeignKey(
'self', null=True, blank=True, on_delete=models.SET_NULL, related_name='unterreferenzen'
)
url = models.URLField(blank=True)
def Path(self):
Temp = "".join([str(x) for x in self.get_ancestors(include_self=True)])+(" (%s)"%self.name_text if self.name_text else "")
return Temp
class MPTTMeta:
parent_attr = 'oberreferenz' # optional, but safe
order_insertion_by = ['name_nummer']
def __str__(self):
return self.name_nummer
class Meta:
verbose_name_plural="Referenzen"
class Referenzerklaerung (Textabschnitt):
erklaerung = models.ForeignKey(Referenz,on_delete=models.CASCADE)
class Meta:
verbose_name="Erklärung"

View File

@@ -0,0 +1,51 @@
{% extends "base.html" %}
{% load mptt_tags %}
{% block content %}
<h1><a href="../{{ referenz.ParentID }}"></a>{{ referenz.Path }}</h1>
{% if referenz.erklaerung %}
<div class="card mb-4">
<div class="card-header d-flex justify-content-between align-items-center bg-secondary text-light">
<h3 class="h5 m-0">Beschreibung</h3>
{% if referenz.url %}
<span class="badge bg-light text-black">
<a href="{{ referenz.url }}">Link</a>
</span>{% endif %}
</div>
<div class="card-body p-2">
{% for typ, html in referenz.erklaerung %}
{% if html %}<div>{{ html|safe }}</div>{% endif %}{% endfor %}
</div>
</div>
{% endif %}
<div class="card mb-4">
<div class="card-header d-flex justify-content-between align-items-center bg-secondary text-light">
<h3 class="h5 m-0">Referenzierte Vorgaben</h3>
</div>
<div class="card-body p-2">
{% recursetree referenz.children %}
{% if not node == referenz %}
{#<a href="../{{node.id}}">#}
{{ node.Path }}
{#</a>#}
{% else %}
{{ node.Path }}
{% endif %}
<br>
{% if node.referenziertvon %}
<ul>
{% for ref in node.referenziertvon %}
<li><a href="{% url 'standard_detail' nummer=ref.dokument.nummer %}#{{ref.Vorgabennummer}}">{{ref}}</a></li>
{% endfor %}
</ul>
<br>
{% endif %}
{% if not node.is_leaf_node %}
{{ children }}
{% endif %}
{% endrecursetree %}
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,21 @@
{% extends "base.html" %}
{% block content %}
<h1>Referenzen</h1>
<div>
{% load mptt_tags %}
<ul class="tree">
{% recursetree referenzen %}
<li>
<a href="{{node.id}}">{{ node.name_nummer }}{% if node.name_text %} ({{node.name_text}}){% endif %}</a>
{% if not node.is_leaf_node %}
<ul class="children">
{{ children }}
</ul>
{% endif %}
</li>
{% endrecursetree %}
</ul>
</div>
{% endblock %}

3
referenzen/tests.py Normal file
View File

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

21
referenzen/views.py Normal file
View File

@@ -0,0 +1,21 @@
from django.shortcuts import render
from .models import Referenz
from abschnitte.utils import render_textabschnitte
# Create your views here.
def tree(request):
referenz_items = Referenz.objects.all()
return render(request, 'referenz_tree.html', {'referenzen': referenz_items})
def detail(request, refid):
referenz_item = Referenz.objects.get(id=refid)
referenz_item.erklaerung = render_textabschnitte(referenz_item.referenzerklaerung_set.order_by("order"))
referenz_item.children = list(referenz_item.get_descendants(include_self=True))
for child in referenz_item.children:
child.referenziertvon = child.vorgabe_set.all()
if not referenz_item.is_root_node():
referenz_item.ParentID = referenz_item.get_ancestors(ascending=True)[0].id
return render(request, 'referenz_detail.html', {'referenz': referenz_item})