WIP: applications: add possibility to define parameters (#76463) #32

Closed
fpeters wants to merge 1 commits from wip/76453-application-parameters into main
8 changed files with 187 additions and 1 deletions

View File

@ -0,0 +1,38 @@
# Generated by Django 3.2.16 on 2023-04-10 08:12
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('applications', '0011_element_type'),
]
operations = [
migrations.CreateModel(
name='Parameter',
fields=[
(
'id',
models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
('label', models.CharField(max_length=100, verbose_name='Label')),
(
'name',
models.CharField(
help_text='Variable name, it is useful to prefix it with an unique application identifier.',
max_length=100,
verbose_name='Identifier',
),
),
('default_value', models.CharField(blank=True, max_length=100, verbose_name='Default value')),
(
'application',
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to='applications.application'
),
),
],
),
]

View File

@ -181,6 +181,20 @@ class Application(models.Model):
return elements
class Parameter(models.Model):
application = models.ForeignKey(Application, on_delete=models.CASCADE)
label = models.CharField(max_length=100, verbose_name=_('Label'))
name = models.CharField(
max_length=100,
verbose_name=_('Identifier'),
help_text=_('Variable name, it is useful to prefix it with an unique application identifier.'),
)
default_value = models.CharField(max_length=100, verbose_name=_('Default value'), blank=True)
def as_dict(self):
return {'label': self.label, 'name': self.name, 'default_value': self.default_value}
class Element(models.Model):
type = models.CharField(max_length=100, verbose_name=_('Type'))
slug = models.SlugField(max_length=500, verbose_name=_('Slug'))
@ -255,6 +269,7 @@ class Version(models.Model):
'version_number': self.number,
'version_notes': self.notes,
'elements': [],
'parameters': [x.as_dict() for x in self.application.parameter_set.all()],
}
for element, relation in elements.values():

View File

@ -75,6 +75,22 @@
<a class="button button-paragraph" rel="popup" href="{% url 'application-add-element' app_slug=app.slug type=type.id %}">{{ type.text }}</a>
{% endfor %}
{% endfor %}
<h3>{% trans "Parameters" %}
{% if app.editable %}
<a rel="popup" href="{% url 'application-add-parameter' app_slug=app.slug %}">({% trans "add" %})</a>
{% endif %}
</h3>
{% if app.parameter_set.exists %}
<ul class="objects-list single-links">
{% for parameter in app.parameter_set.all %}
<li><a rel="popup" href="{% url 'application-edit-parameter' app_slug=app.slug pk=parameter.id %}">{{ parameter.label }}</a>
<a rel="popup" class="delete" href="{% url 'application-delete-parameter' app_slug=app.slug pk=parameter.id %}">{% trans "remove" %}</a>
</li>
{% endfor %}
</ul>
{% else %}
<p>{% trans "No parameters defined." %}</p>
{% endif %}
{% endif %}
</aside>
{% endblock %}

View File

@ -0,0 +1,17 @@
{% extends "hobo/applications/home.html" %}
{% load gadjo i18n %}
{% block appbar %}
<h2>{% trans "New Parameter" %}</h2>
{% endblock %}
{% block content %}
<form method="post">
{% csrf_token %}
{{ form|with_template }}
<div class="buttons">
<button class="submit-button">{% trans "Add" %}</button>
<a class="cancel" href="..">{% trans "Cancel" %}</a>
</div>
</form>
{% endblock %}

View File

@ -0,0 +1,20 @@
{% extends "hobo/applications/home.html" %}
{% load gadjo i18n %}
{% block appbar %}
<h2>{% trans "Delete Parameter" %}</h2>
{% endblock %}
{% block content %}
<form method="post">
{% csrf_token %}
<p>
{% trans 'Are you sure you want to remove this parameter?' %}
</p>
<div class="buttons">
<button class="delete-button">{% trans "Delete" %}</button>
<a class="cancel" href="..">{% trans "Cancel" %}</a>
</div>
</form>
{% endblock %}

View File

@ -0,0 +1,17 @@
{% extends "hobo/applications/home.html" %}
{% load gadjo i18n %}
{% block appbar %}
<h2>{% trans "Edit Parameter" %}</h2>
{% endblock %}
{% block content %}
<form method="post">
{% csrf_token %}
{{ form|with_template }}
<div class="buttons">
<button class="submit-button">{% trans "Save" %}</button>
<a class="cancel" href="..">{% trans "Cancel" %}</a>
</div>
</form>
{% endblock %}

View File

@ -45,6 +45,21 @@ urlpatterns = [
views.delete_element,
name='application-delete-element',
),
re_path(
r'^manifest/(?P<app_slug>[\w-]+)/add-parameter/$',
views.add_parameter,
name='application-add-parameter',
),
re_path(
r'^manifest/(?P<app_slug>[\w-]+)/edit-parameter/(?P<pk>\d+)/$',
views.edit_parameter,
name='application-edit-parameter',
),
re_path(
r'^manifest/(?P<app_slug>[\w-]+)/delete-parameter/(?P<pk>\d+)/$',
views.delete_parameter,
name='application-delete-parameter',
),
re_path(
r'^manifest/(?P<app_slug>[\w-]+)/job/(?P<pk>\d+)/$',
views.async_job,

View File

@ -31,7 +31,16 @@ from django.views.generic import DetailView, FormView, ListView, TemplateView
from django.views.generic.edit import CreateView, DeleteView, UpdateView
from .forms import GenerateForm, InstallForm, MetadataForm
from .models import STATUS_CHOICES, Application, AsyncJob, Element, Relation, Version, get_object_types
from .models import (
STATUS_CHOICES,
Application,
AsyncJob,
Element,
Parameter,
Relation,
Version,
get_object_types,
)
from .utils import Requests
requests = Requests()
@ -428,3 +437,42 @@ class AsyncJobView(DetailView):
async_job = AsyncJobView.as_view()
class AddParameterView(CreateView):
template_name = 'hobo/applications/parameter-add.html'
model = Parameter
fields = ['label', 'name', 'default_value']
def form_valid(self, form):
form.instance.application = Application.objects.get(slug=self.kwargs['app_slug'])
return super().form_valid(form)
def get_success_url(self):
return reverse('application-manifest', kwargs={'app_slug': self.kwargs['app_slug']})
add_parameter = AddParameterView.as_view()
class EditParameterView(UpdateView):
template_name = 'hobo/applications/parameter-edit.html'
model = Parameter
fields = ['label', 'name', 'default_value']
def get_success_url(self):
return reverse('application-manifest', kwargs={'app_slug': self.kwargs['app_slug']})
edit_parameter = EditParameterView.as_view()
class DeleteParameterView(DeleteView):
template_name = 'hobo/applications/parameter-confirm-delete.html'
model = Parameter
def get_success_url(self):
return reverse('application-manifest', kwargs={'app_slug': self.kwargs['app_slug']})
delete_parameter = DeleteParameterView.as_view()