Prototype implementation

This commit is contained in:
tegwick 2026-05-08 14:26:48 +02:00
parent 315143a6fc
commit 14b0bc6d01
160 changed files with 5731 additions and 42 deletions

View file

View file

@ -0,0 +1,15 @@
from django.contrib import admin
from .models import Anforderung, Los
@admin.register(Los)
class LosAdmin(admin.ModelAdmin):
list_display = ['losnummer', 'lostitel', 'ausschreibung', 'teilnahme', 'zustaendiger']
list_filter = ['teilnahme']
@admin.register(Anforderung)
class AnforderungAdmin(admin.ModelAdmin):
list_display = ['titel', 'verbindlichkeit', 'kategorie', 'erfuellungsstatus', 'ausschlusskriterium']
list_filter = ['verbindlichkeit', 'kategorie', 'erfuellungsstatus', 'ausschlusskriterium']

View file

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

View file

@ -0,0 +1,63 @@
# Generated by Django 6.0.5 on 2026-05-08 10:33
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('ausschreibungen', '0001_initial'),
('bibliothek', '0001_initial'),
('dokumente', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Los',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('losnummer', models.CharField(max_length=50)),
('lostitel', models.CharField(max_length=300)),
('beschreibung', models.TextField(blank=True)),
('abgrenzung', models.TextField(blank=True)),
('teilnahme', models.BooleanField(null=True)),
('status', models.CharField(blank=True, max_length=50)),
('ausschreibung', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='lose', to='ausschreibungen.ausschreibung')),
('zustaendiger', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name': 'Los',
'verbose_name_plural': 'Lose',
'ordering': ['losnummer'],
},
),
migrations.CreateModel(
name='Anforderung',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('titel', models.CharField(max_length=400)),
('beschreibung', models.TextField(blank=True)),
('quelle_im_dokument', models.CharField(blank=True, max_length=300)),
('kategorie', models.CharField(blank=True, choices=[('fachlich', 'Fachlich'), ('rechtlich', 'Rechtlich'), ('kaufmaennisch', 'Kaufmännisch'), ('technisch', 'Technisch'), ('zertifizierung', 'Zertifizierung'), ('referenz', 'Referenz'), ('sonstiges', 'Sonstiges')], max_length=30)),
('verbindlichkeit', models.CharField(choices=[('muss', 'Muss-Kriterium'), ('soll', 'Soll-Kriterium'), ('kann', 'Kann-Kriterium'), ('info', 'Information')], default='muss', max_length=10)),
('ausschlusskriterium', models.BooleanField(default=False)),
('bewertungskriterium', models.BooleanField(default=False)),
('erfuellungsstatus', models.CharField(choices=[('offen', 'Offen'), ('erfuellt', 'Erfüllt'), ('teilweise', 'Teilweise erfüllt'), ('nicht_erfuellt', 'Nicht erfüllt'), ('entfaellt', 'Entfällt')], default='offen', max_length=20)),
('nachweis_erforderlich', models.BooleanField(default=False)),
('ausschreibung', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='anforderungen', to='ausschreibungen.ausschreibung')),
('dokumente', models.ManyToManyField(blank=True, to='dokumente.dokument')),
('nachweise', models.ManyToManyField(blank=True, to='bibliothek.nachweis')),
('zustaendiger', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
('los', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='anforderungen', to='lose.los')),
],
options={
'verbose_name': 'Anforderung',
'verbose_name_plural': 'Anforderungen',
},
),
]

View file

@ -0,0 +1,81 @@
from django.db import models
from vergabe_teilnahme.apps.core.models import FlexibleModel
class Los(FlexibleModel):
ausschreibung = models.ForeignKey(
'ausschreibungen.Ausschreibung', on_delete=models.CASCADE, related_name='lose'
)
losnummer = models.CharField(max_length=50)
lostitel = models.CharField(max_length=300)
beschreibung = models.TextField(blank=True)
abgrenzung = models.TextField(blank=True)
zustaendiger = models.ForeignKey(
'accounts.Mitarbeiter', on_delete=models.SET_NULL, null=True, blank=True
)
teilnahme = models.BooleanField(null=True)
status = models.CharField(max_length=50, blank=True)
class Meta:
ordering = ['losnummer']
verbose_name = 'Los'
verbose_name_plural = 'Lose'
def __str__(self):
return f'Los {self.losnummer}: {self.lostitel}'
class Anforderung(FlexibleModel):
VERBINDLICHKEIT_CHOICES = [
('muss', 'Muss-Kriterium'),
('soll', 'Soll-Kriterium'),
('kann', 'Kann-Kriterium'),
('info', 'Information'),
]
KATEGORIE_CHOICES = [
('fachlich', 'Fachlich'),
('rechtlich', 'Rechtlich'),
('kaufmaennisch', 'Kaufmännisch'),
('technisch', 'Technisch'),
('zertifizierung', 'Zertifizierung'),
('referenz', 'Referenz'),
('sonstiges', 'Sonstiges'),
]
ERFUELLUNG_CHOICES = [
('offen', 'Offen'),
('erfuellt', 'Erfüllt'),
('teilweise', 'Teilweise erfüllt'),
('nicht_erfuellt', 'Nicht erfüllt'),
('entfaellt', 'Entfällt'),
]
ausschreibung = models.ForeignKey(
'ausschreibungen.Ausschreibung', on_delete=models.CASCADE, related_name='anforderungen'
)
los = models.ForeignKey(
Los, on_delete=models.SET_NULL, null=True, blank=True, related_name='anforderungen'
)
titel = models.CharField(max_length=400)
beschreibung = models.TextField(blank=True)
quelle_im_dokument = models.CharField(max_length=300, blank=True)
kategorie = models.CharField(max_length=30, choices=KATEGORIE_CHOICES, blank=True)
verbindlichkeit = models.CharField(max_length=10, choices=VERBINDLICHKEIT_CHOICES, default='muss')
ausschlusskriterium = models.BooleanField(default=False)
bewertungskriterium = models.BooleanField(default=False)
zustaendiger = models.ForeignKey(
'accounts.Mitarbeiter', on_delete=models.SET_NULL, null=True, blank=True
)
erfuellungsstatus = models.CharField(
max_length=20, choices=ERFUELLUNG_CHOICES, default='offen'
)
nachweis_erforderlich = models.BooleanField(default=False)
dokumente = models.ManyToManyField('dokumente.Dokument', blank=True)
nachweise = models.ManyToManyField('bibliothek.Nachweis', blank=True)
class Meta:
verbose_name = 'Anforderung'
verbose_name_plural = 'Anforderungen'
def __str__(self):
return self.titel

View file

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

View file

@ -0,0 +1,2 @@
from django.urls import path
urlpatterns = []

View file

@ -0,0 +1,3 @@
from django.shortcuts import render
# Create your views here.