Пользователь может выбирать из большого количества конфигураций/шаблонов, нужен способ обработки без создания Django представлений/форм для каждого из них

В настоящее время я работаю над проектом на Django, который позволит пользователю генерировать конфигурацию маршрутизатора/коммутатора в зависимости от того, какой тип сервиса/марку маршрутизатора/модель маршрутизатора он выберет.

View: config list (Список зарегистрированных конфигураций для генерации) Пользователь -> Сервис_1 для маршрутизатора X модели Y

Тогда мне нужно будет представить пользователю страницу, которая будет принимать входные данные, необходимые для генерации таких конфигураций

View: generate config (Форма, которая попросит пользователя ввести данные, необходимые для создания файла X config) Например: IP-адрес / маска подсети / нужен ли DHCP / нужны ли маршруты

Затем эти данные будут переданы в переменные, которые будут использованы для заполнения файла шаблона jinja2 для указанного сервиса/модели маршрутизатора/бренда маршрутизатора в функции

Предположим, что структура такова:

-Router Brand X
--Model Y
---Service1.j2
---Service2.j2
---Service3.j2
--Model Z
---Service1.j2
---Service2.j2
---Service3.j2
-Router Brand Y
--Model Y
---Service1.j2
---Service2.j2
---Service3.j2
--Model Z
---Service1.j2
---Service2.j2
---Service3.j2

У меня уже сделана большая часть проекта, сейчас я могу сохранять шаблоны конфигов в базу данных, показывать эти шаблоны пользователю на выбор, и я попробовал создать страницу для генерации конфигов.

Проблема, которая меня беспокоит на данный момент, заключается в том, что если я продолжу делать то, что собирался, -создавать функцию, форму и представление для каждого нового шаблона конфигурации у меня возникнут большие проблемы при попытке масштабирования в дальнейшем.

У нас около 10-12 сервисов, но есть около 5 различных марок маршрутизаторов/коммутаторов, а также множество моделей, которые мы все еще поддерживаем (этот проект для ISP)

Это процесс на данный момент:

views.py

def ar651_ftth_datavpn(request):
    if request.method == 'POST':
        form = ar651_ftth_datavpn_form(request.POST)
        if form.is_valid():
            hostname = form.cleaned_data['hostname']
            is_dhcp = form.cleaned_data['is_dhcp']
            gateway = form.cleaned_data['gateway']
            ip_rede = form.cleaned_data['ip_rede']
            excluded_ip = form.cleaned_data['excluded_ip']
            exIpList_str = form.cleaned_data['exIpList']
            exIpList = exIpList_str.split(',')
            ip_LanNet = form.cleaned_data['ip_LanNet']
            ip_LanNetSubmask = form.cleaned_data['ip_LanNetSubmask']
            localizacao = form.cleaned_data['localizacao']
            
            file_path = func_ar651_ftth_datavpn(hostname, is_dhcp, gateway, ip_rede, excluded_ip, exIpList, ip_LanNet, ip_LanNetSubmask, localizacao)
            return FileResponse(open(file_path, 'rb'), as_attachment=True)
    else:
        form = ar651_ftth_datavpn_form()

    return render(request, 'ar651_ftth_datavpn.html', {'form': form})

forms.py

class ar651_ftth_datavpn_form(forms.Form):
    
    loc_escolha = [
        ('SUL', 'Sul'),
        ('NORTE', 'Norte'),
        ('CENTRO', 'Centro'),
    ]
    
    hostname = forms.CharField(max_length=20)
    localizacao = forms.CharField(label="Localizacao", widget=forms.Select(choices=loc_escolha))
    is_dhcp = forms.BooleanField(required=False)
    gateway = forms.CharField(max_length=100, required=False)
    ip_rede = forms.CharField(max_length=100, required=False)
    excluded_ip = forms.BooleanField(required=False)
    exIpList = forms.CharField(max_length=100, required=False)
    ip_LanNet = forms.CharField(max_length=100, required=True)
    ip_LanNetSubmask = forms.CharField(max_length=100, required=True)

generate config func

def func_ar651_ftth_datavpn(hostname, is_dhcp, gateway, ip_rede, excluded_ip, exIpList, ip_LanNet, ip_LanNetSubmask, localizacao):
    
    if is_dhcp is False:
        gateway = ''
        ip_rede = ''
        
    if excluded_ip is False:
        exIpList = ''
    router_vars = {
        'hostname': hostname,
        'is_dhcp': is_dhcp,
        'gateway': gateway,
        'ip_rede': ip_rede,
        'excluded_ip': excluded_ip,
        'localizacao': localizacao,
        'exIpList': exIpList,
        'ipLanNet': ip_LanNet,
        'ip_LanNetSubmask': ip_LanNetSubmask,
    }

На данный момент я создал только форму, представление и функцию генерации для одного шаблона конфигурации.

Вернуться на верх