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

@ -0,0 +1,20 @@
from django.contrib import admin
from .models import Dienstleistertyp, Subunternehmer, SubunternehmerZuordnung
@admin.register(Dienstleistertyp)
class DienstleistertypAdmin(admin.ModelAdmin):
list_display = ['name']
@admin.register(Subunternehmer)
class SubunternehmerAdmin(admin.ModelAdmin):
list_display = ['name', 'dienstleistertyp', 'praeferenz', 'ort']
list_filter = ['praeferenz', 'dienstleistertyp']
search_fields = ['name', 'ort']
@admin.register(SubunternehmerZuordnung)
class SubunternehmerZuordnungAdmin(admin.ModelAdmin):
list_display = ['subunternehmer', 'ausschreibung', 'los', 'zusage_vorhanden', 'nachweis_eingegangen']

View file

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

View file

@ -0,0 +1,86 @@
# Generated by Django 6.0.5 on 2026-05-08 10:33
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('ausschreibungen', '0001_initial'),
('lose', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='Dienstleistertyp',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=200)),
('beschreibung', models.TextField(blank=True)),
('typische_leistungen', models.TextField(blank=True)),
('typische_nachweise', models.TextField(blank=True)),
('relevante_standards', models.TextField(blank=True)),
('typische_preisbestandteile', models.TextField(blank=True)),
('bemerkungen', models.TextField(blank=True)),
],
options={
'verbose_name': 'Dienstleistertyp',
'verbose_name_plural': 'Dienstleistertypen',
'ordering': ['name'],
},
),
migrations.CreateModel(
name='Subunternehmer',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=300)),
('kurzname', models.CharField(blank=True, max_length=100)),
('praeferenz', models.CharField(choices=[('bevorzugt', 'Bevorzugt'), ('zugelassen', 'Zugelassen'), ('gesperrt', 'Gesperrt')], default='zugelassen', max_length=20)),
('strasse', models.CharField(blank=True, max_length=200)),
('plz', models.CharField(blank=True, max_length=10)),
('ort', models.CharField(blank=True, max_length=100)),
('land', models.CharField(default='Deutschland', max_length=100)),
('telefon', models.CharField(blank=True, max_length=50)),
('mobilnummer', models.CharField(blank=True, max_length=50)),
('email', models.EmailField(blank=True, max_length=254)),
('website', models.URLField(blank=True)),
('ansprechpartner', models.CharField(blank=True, max_length=200)),
('ansprechpartner_email', models.EmailField(blank=True, max_length=254)),
('ansprechpartner_telefon', models.CharField(blank=True, max_length=50)),
('leistungsprofil', models.TextField(blank=True)),
('bewertung', models.TextField(blank=True)),
('dienstleistertyp', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='subunternehmer', to='partner.dienstleistertyp')),
],
options={
'verbose_name': 'Subunternehmer',
'verbose_name_plural': 'Subunternehmer',
'ordering': ['name'],
},
),
migrations.CreateModel(
name='SubunternehmerZuordnung',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('konkrete_leistung', models.CharField(blank=True, max_length=300)),
('zusage_vorhanden', models.BooleanField(default=False)),
('nachweis_eingegangen', models.BooleanField(default=False)),
('preis_vorhanden', models.BooleanField(default=False)),
('kommentar', models.TextField(blank=True)),
('ausschreibung', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ausschreibungen.ausschreibung')),
('los', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='lose.los')),
('subunternehmer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='zuordnungen', to='partner.subunternehmer')),
],
options={
'verbose_name': 'Subunternehmer-Zuordnung',
'verbose_name_plural': 'Subunternehmer-Zuordnungen',
},
),
migrations.AddField(
model_name='subunternehmer',
name='bisherige_ausschreibungen',
field=models.ManyToManyField(blank=True, related_name='subunternehmer', through='partner.SubunternehmerZuordnung', to='ausschreibungen.ausschreibung'),
),
]

View file

@ -0,0 +1,88 @@
from django.db import models
from vergabe_teilnahme.apps.core.models import FlexibleModel
class Dienstleistertyp(FlexibleModel):
name = models.CharField(max_length=200)
beschreibung = models.TextField(blank=True)
typische_leistungen = models.TextField(blank=True)
typische_nachweise = models.TextField(blank=True)
relevante_standards = models.TextField(blank=True)
typische_preisbestandteile = models.TextField(blank=True)
bemerkungen = models.TextField(blank=True)
class Meta:
verbose_name = 'Dienstleistertyp'
verbose_name_plural = 'Dienstleistertypen'
ordering = ['name']
def __str__(self):
return self.name
class Subunternehmer(FlexibleModel):
PRAEFERENZ_CHOICES = [
('bevorzugt', 'Bevorzugt'),
('zugelassen', 'Zugelassen'),
('gesperrt', 'Gesperrt'),
]
name = models.CharField(max_length=300)
kurzname = models.CharField(max_length=100, blank=True)
dienstleistertyp = models.ForeignKey(
Dienstleistertyp, on_delete=models.SET_NULL,
null=True, blank=True, related_name='subunternehmer'
)
praeferenz = models.CharField(max_length=20, choices=PRAEFERENZ_CHOICES, default='zugelassen')
strasse = models.CharField(max_length=200, blank=True)
plz = models.CharField(max_length=10, blank=True)
ort = models.CharField(max_length=100, blank=True)
land = models.CharField(max_length=100, default='Deutschland')
telefon = models.CharField(max_length=50, blank=True)
mobilnummer = models.CharField(max_length=50, blank=True)
email = models.EmailField(blank=True)
website = models.URLField(blank=True)
ansprechpartner = models.CharField(max_length=200, blank=True)
ansprechpartner_email = models.EmailField(blank=True)
ansprechpartner_telefon = models.CharField(max_length=50, blank=True)
leistungsprofil = models.TextField(blank=True)
bewertung = models.TextField(blank=True)
bisherige_ausschreibungen = models.ManyToManyField(
'ausschreibungen.Ausschreibung',
blank=True,
through='SubunternehmerZuordnung',
related_name='subunternehmer',
)
class Meta:
verbose_name = 'Subunternehmer'
verbose_name_plural = 'Subunternehmer'
ordering = ['name']
def __str__(self):
return self.name
class SubunternehmerZuordnung(models.Model):
subunternehmer = models.ForeignKey(
Subunternehmer, on_delete=models.CASCADE, related_name='zuordnungen'
)
ausschreibung = models.ForeignKey(
'ausschreibungen.Ausschreibung', on_delete=models.CASCADE
)
los = models.ForeignKey(
'lose.Los', on_delete=models.SET_NULL, null=True, blank=True
)
konkrete_leistung = models.CharField(max_length=300, blank=True)
zusage_vorhanden = models.BooleanField(default=False)
nachweis_eingegangen = models.BooleanField(default=False)
preis_vorhanden = models.BooleanField(default=False)
kommentar = models.TextField(blank=True)
class Meta:
verbose_name = 'Subunternehmer-Zuordnung'
verbose_name_plural = 'Subunternehmer-Zuordnungen'
def __str__(self):
return f'{self.subunternehmer}{self.ausschreibung}'

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.