All files for deployment ready and tested - further development in this repo.
This commit is contained in:
0
referenzen/__init__.py
Normal file
0
referenzen/__init__.py
Normal file
BIN
referenzen/__pycache__/__init__.cpython-312.pyc
Normal file
BIN
referenzen/__pycache__/__init__.cpython-312.pyc
Normal file
Binary file not shown.
BIN
referenzen/__pycache__/admin.cpython-312.pyc
Normal file
BIN
referenzen/__pycache__/admin.cpython-312.pyc
Normal file
Binary file not shown.
BIN
referenzen/__pycache__/apps.cpython-312.pyc
Normal file
BIN
referenzen/__pycache__/apps.cpython-312.pyc
Normal file
Binary file not shown.
BIN
referenzen/__pycache__/models.cpython-312.pyc
Normal file
BIN
referenzen/__pycache__/models.cpython-312.pyc
Normal file
Binary file not shown.
BIN
referenzen/__pycache__/views.cpython-312.pyc
Normal file
BIN
referenzen/__pycache__/views.cpython-312.pyc
Normal file
Binary file not shown.
16
referenzen/admin.py
Normal file
16
referenzen/admin.py
Normal 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
6
referenzen/apps.py
Normal file
@@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class ReferenzenConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'referenzen'
|
||||
49
referenzen/migrations/0001_initial.py
Normal file
49
referenzen/migrations/0001_initial.py
Normal 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',
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -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,
|
||||
),
|
||||
]
|
||||
0
referenzen/migrations/__init__.py
Normal file
0
referenzen/migrations/__init__.py
Normal file
BIN
referenzen/migrations/__pycache__/0001_initial.cpython-312.pyc
Normal file
BIN
referenzen/migrations/__pycache__/0001_initial.cpython-312.pyc
Normal file
Binary file not shown.
Binary file not shown.
BIN
referenzen/migrations/__pycache__/__init__.cpython-312.pyc
Normal file
BIN
referenzen/migrations/__pycache__/__init__.cpython-312.pyc
Normal file
Binary file not shown.
33
referenzen/models.py
Normal file
33
referenzen/models.py
Normal 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"
|
||||
51
referenzen/templates/referenz_detail.html
Normal file
51
referenzen/templates/referenz_detail.html
Normal 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 %}
|
||||
21
referenzen/templates/referenz_tree.html
Normal file
21
referenzen/templates/referenz_tree.html
Normal 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
3
referenzen/tests.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
21
referenzen/views.py
Normal file
21
referenzen/views.py
Normal 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})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user