Started addinf a search button for every selecField. now its not well automated but it works. need to make it more proper and then we can concentrate on only funtional stuff

master
Kerem Yollu 10 months ago
parent 766f850d98
commit 55b9210990

Binary file not shown.

@ -32,7 +32,7 @@ class companyForm(FlaskForm): # Defines the form class to be used for the user
submit = SubmitField() submit = SubmitField()
def populate_for_update(self, company): def populate_for_updating(self, company):
self.submit.label.text = "Update" self.submit.label.text = "Update"
self.country_id.choices = [(row.id, row.name) for row in geoUtils.queryCountryNamesWithDefault(company.country_id)] self.country_id.choices = [(row.id, row.name) for row in geoUtils.queryCountryNamesWithDefault(company.country_id)]
@ -54,6 +54,7 @@ class companyForm(FlaskForm): # Defines the form class to be used for the user
self.submit.label.text = "Add" self.submit.label.text = "Add"
del self.image_file del self.image_file
self.country_id.choices = [(row.id, row.name) for row in geoUtils.queryCountryNames()] self.country_id.choices = [(row.id, row.name) for row in geoUtils.queryCountryNames()]
# This is for the htmx implementation. please be careful how of there is data we switch the funtion needed # This is for the htmx implementation. please be careful how of there is data we switch the funtion needed

@ -1,12 +1,9 @@
from flask import render_template, url_for, flash, redirect, request, Blueprint from flask import render_template, url_for, flash, redirect, request, Blueprint
from flask_login import login_required, current_user from flask_login import login_required
import minibase.theme as theme import minibase.theme as theme
from minibase.blueprints.company.models import Companies from minibase.blueprints.company.models import Companies
from minibase.blueprints.geography.models import City
import minibase.blueprints.database.utils as dbUtils import minibase.blueprints.database.utils as dbUtils
import minibase.blueprints.main.utils as mainUtils import minibase.blueprints.main.utils as mainUtils
import minibase.blueprints.geography.utils as geoUtils
import minibase.blueprints.company.utils as companyUtils
from minibase.blueprints.company.forms import companyForm from minibase.blueprints.company.forms import companyForm
# Declaring a blueprint # Declaring a blueprint
@ -26,8 +23,7 @@ def account(companyId):
if companyId: if companyId:
company = Companies.query.get_or_404(companyId) company = Companies.query.get_or_404(companyId)
form = companyForm() form = companyForm()
form.populate_for_update(company) form.populate_for_updating(company)
_accountInfo = mainUtils.accountInfo( _accountInfo = mainUtils.accountInfo(
title=company.name, title=company.name,
description=company.legal_entity.name, description=company.legal_entity.name,
@ -55,7 +51,6 @@ def account(companyId):
return redirect(url_for('company.list')) return redirect(url_for('company.list'))
@company.route("/add", methods=['GET', 'POST']) @company.route("/add", methods=['GET', 'POST'])
@login_required @login_required
def add(): def add():

@ -1,14 +1,17 @@
from flask_wtf import FlaskForm from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileAllowed from flask_wtf.file import FileField, FileAllowed
from wtforms import StringField, PasswordField, SubmitField, BooleanField, URLField, IntegerField, DateField, SelectField from wtforms import StringField, SubmitField, BooleanField, URLField, IntegerField, DateField, SelectField
from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError from wtforms.validators import DataRequired, Length, ValidationError
from minibase.blueprints.sensor.models import nbiotDevice from minibase.blueprints.sensor.models import nbiotDevice
import minibase.blueprints.company.utils as companyUtils
import minibase.blueprints.user.utils as userUtils
import minibase.blueprints.sensor.utils as sensorUtils
from datetime import date from datetime import date
class updateNbioDeviceUpdateForm(FlaskForm): # Defines the form class to be used for the user update class nbiotDeviceForm(FlaskForm): # Defines the self class to be used for the user update
name = StringField('Device Name', validators=[DataRequired(), Length(min=3, max=50)]) name = StringField('Device Name', validators=[DataRequired(), Length(min=3, max=50)])
device_id = StringField('Device Id', validators=[DataRequired(), Length(min=3, max=50)])
serial_no = StringField('Serial Number', validators=[DataRequired(), Length(min=3, max=50)]) serial_no = StringField('Serial Number', validators=[DataRequired(), Length(min=3, max=50)])
device_id = StringField('Device Id', validators=[DataRequired(), Length(min=3, max=50)])
imsi = StringField('Imsi No', validators=[DataRequired(), Length(min=10, max=50)]) imsi = StringField('Imsi No', validators=[DataRequired(), Length(min=10, max=50)])
iccid = StringField('Iccid No', validators=[DataRequired(), Length(min=10, max=100)]) iccid = StringField('Iccid No', validators=[DataRequired(), Length(min=10, max=100)])
ip = StringField('Ip (ipv4)', validators=[DataRequired(), Length(min=7, max=15)]) ip = StringField('Ip (ipv4)', validators=[DataRequired(), Length(min=7, max=15)])
@ -21,87 +24,66 @@ class updateNbioDeviceUpdateForm(FlaskForm): # Defines the form class to be use
status_id = SelectField('Status', validators=[DataRequired()]) status_id = SelectField('Status', validators=[DataRequired()])
type_id = SelectField('Type', validators=[DataRequired()]) type_id = SelectField('Type', validators=[DataRequired()])
area_id = SelectField('Area', validators=[DataRequired()]) area_id = SelectField('Area', validators=[DataRequired()])
manufacturer_id = SelectField('Manufacturer', validators=[DataRequired()]) manufacturer_id = SelectField('Manufacturer', validators=[DataRequired()],
render_kw={
'hx-target': '#manufacturer_id', # Target div or modal for the popup
'hx-swap': 'outerHTML' # Swap the outer HTML of the target element
})
company_id = SelectField('Managed By', validators=[DataRequired()]) company_id = SelectField('Managed By', validators=[DataRequired()])
picture = FileField('Update Sensor Picture', validators=[FileAllowed(['jpg', 'png'])]) image_file = FileField('Update Sensor Picture', validators=[FileAllowed(['jpg', 'png'])])
submit = SubmitField(f'Update')
def __init__(self, current_device_id, *args, **kwargs):
super().__init__(*args, **kwargs)
self.current_device = nbiotDevice.query.get(current_device_id)
def validate_name(self, input): submit = SubmitField()
if input.data != self.current_device.name:
content = nbiotDevice.query.filter_by(name=input.data).first()
if content:
raise ValidationError('That device name is taken please choose another one')
def validate_device_id(self, input): def populate_for_updating(self, device):
if input.data != self.current_device.device_id: self.submit.label.text = "Update"
content = nbiotDevice.query.filter_by(device_id=input.data).first() self.user_id.choices = [(row.id, row.username) for row in userUtils.queryUserNamesWithDefault(device.device_user_id)]
if content: self.owner_id.choices = [(row.id, row.username) for row in userUtils.queryUserNamesWithDefault(device.device_owner_id)]
raise ValidationError('That device id is taken please choose another one') self.manufacturer_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(device.company_manufacturer_id)]
self.company_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(device.company_owner_id)]
def validate_imsi(self, input): self.status_id.choices = [(row.id, row.name) for row in sensorUtils.queryStatusNamesWithDefault(device.status_id)]
if input.data != self.current_device.imsi: self.type_id.choices = [(row.id, row.name) for row in sensorUtils.queryTypeNamesWithDefault(device.type_id)]
content = nbiotDevice.query.filter_by(imsi=input.data).first() self.area_id.choices = [(row.id, row.name) for row in sensorUtils.queryAreaNamesWithDefault(device.area_id)]
if content:
raise ValidationError('That IMSI id is taken please choose another one')
def validate_iccid(self, input):
if input.data != self.current_device.iccid:
content = nbiotDevice.query.filter_by(iccid=input.data).first()
if content:
raise ValidationError('That ICCID id is taken please choose another one')
def validate_ip(self, input): def populate_for_adding(self, device):
if input.data != self.current_device.ip: self.submit.label.text = "Add"
content = nbiotDevice.query.filter_by(ip=input.data).first()
if content:
raise ValidationError('That IP id is taken please choose another one')
class updateNbioDeviceAddForm(FlaskForm): # Defines the form class to be used for the user update if self.manufacturer_id.data:
name = StringField('Device Name', validators=[DataRequired(), Length(min=3, max=50)]) self.manufacturer_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(self.manufacturer_id.data)]
device_id = StringField('Device Id', validators=[DataRequired(), Length(min=3, max=50)])
serial_no = StringField('Serial Number', validators=[DataRequired(), Length(min=3, max=50)])
imsi = StringField('Imsi No', validators=[DataRequired(), Length(min=10, max=50)])
iccid = StringField('Iccid No', validators=[DataRequired(), Length(min=10, max=100)])
ip = StringField('Ip (ipv4)', validators=[Length(min=7, max=15)])
port = StringField('Port', validators=[Length(min=3, max=10)])
registration_date = DateField('Registration Date', format='%Y-%m-%d', default=date.today, validators=[DataRequired()])
activation_date = DateField('Activation Date', format='%Y-%m-%d', default=date.today, validators=[DataRequired()])
deactivation_date = DateField('Deactivation Date', format='%Y-%m-%d', default=date.today, validators=[DataRequired()])
user_id = SelectField('Owner', validators=[DataRequired()])
status_id = SelectField('Status', validators=[DataRequired()])
type_id = SelectField('Type', validators=[DataRequired()])
area_id = SelectField('Area', validators=[DataRequired()])
manufacturer_id = SelectField('Manufacturer', validators=[DataRequired()])
company_id = SelectField('Managed By', validators=[DataRequired()])
submit = SubmitField(f'Add') self.user_id.choices = [(row.id, row.username) for row in userUtils.queryUserNamesWithDefault(device.device_user_id)]
self.owner_id.choices = [(row.id, row.username) for row in userUtils.queryUserNamesWithDefault(device.device_owner_id)]
self.manufacturer_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(device.company_manufacturer_id)]
self.company_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(device.company_owner_id)]
self.status_id.choices = [(row.id, row.name) for row in sensorUtils.queryStatusNamesWithDefault(device.status_id)]
self.type_id.choices = [(row.id, row.name) for row in sensorUtils.queryTypeNamesWithDefault(device.type_id)]
self.area_id.choices = [(row.id, row.name) for row in sensorUtils.queryAreaNamesWithDefault(device.area_id)]
def validate_name(self, input): def validate_name(self, input):
if input.data != self.name:
content = nbiotDevice.query.filter_by(name=input.data).first() content = nbiotDevice.query.filter_by(name=input.data).first()
if content: if content:
raise ValidationError('That device name is taken please choose another one') raise ValidationError('That device name is taken please choose another one')
def validate_device_id(self, input): def validate_device_id(self, input):
if input.data != self.device_id:
content = nbiotDevice.query.filter_by(device_id=input.data).first() content = nbiotDevice.query.filter_by(device_id=input.data).first()
if content: if content:
raise ValidationError('That device id is taken please choose another one') raise ValidationError('That device id is taken please choose another one')
def validate_imsi(self, input): def validate_imsi(self, input):
if input.data != self.imsi:
content = nbiotDevice.query.filter_by(imsi=input.data).first() content = nbiotDevice.query.filter_by(imsi=input.data).first()
if content: if content:
raise ValidationError('That IMSI id is taken please choose another one') raise ValidationError('That IMSI id is taken please choose another one')
def validate_iccid(self, input): def validate_iccid(self, input):
if input.data != self.iccid:
content = nbiotDevice.query.filter_by(iccid=input.data).first() content = nbiotDevice.query.filter_by(iccid=input.data).first()
if content: if content:
raise ValidationError('That ICCID id is taken please choose another one') raise ValidationError('That ICCID id is taken please choose another one')
def validate_ip(self, input): def validate_ip(self, input):
if input.data != self.ip:
content = nbiotDevice.query.filter_by(ip=input.data).first() content = nbiotDevice.query.filter_by(ip=input.data).first()
if content: if content:
raise ValidationError('That IP id is taken please choose another one') raise ValidationError('That IP id is taken please choose another one')

@ -1,11 +1,10 @@
from flask import render_template, Blueprint, request, flash, redirect, url_for, jsonify from flask import render_template, Blueprint, request, flash, redirect, url_for, jsonify
import minibase.theme as theme import minibase.theme as theme
from minibase.blueprints.sensor.models import nbiotDevice from minibase.blueprints.sensor.models import nbiotDevice
from minibase.blueprints.company.models import Companies
import minibase.blueprints.sensor.utils as sensorUtils import minibase.blueprints.sensor.utils as sensorUtils
from minibase.blueprints.sensor.forms import updateNbioDeviceUpdateForm, updateNbioDeviceAddForm from minibase.blueprints.sensor.forms import nbiotDeviceForm
import minibase.blueprints.database.utils as dbUtils import minibase.blueprints.database.utils as dbUtils
import minibase.blueprints.company.utils as companyUtils
import minibase.blueprints.user.utils as userUtils
import minibase.blueprints.main.utils as mainUtils import minibase.blueprints.main.utils as mainUtils
from minibase.app import db from minibase.app import db
import json import json
@ -13,6 +12,7 @@ import os
sensor = Blueprint('sensor', __name__, template_folder='templates') sensor = Blueprint('sensor', __name__, template_folder='templates')
_form = ()
DATA_FILE = 'data.json' DATA_FILE = 'data.json'
@ -76,60 +76,32 @@ def list():
def edit(deviceId): def edit(deviceId):
if deviceId: if deviceId:
device = nbiotDevice.query.get_or_404(deviceId) device = nbiotDevice.query.get_or_404(deviceId)
form = updateNbioDeviceUpdateForm(current_device_id=device.id) form = nbiotDeviceForm()
form.user_id.choices = [(row.id, row.username) for row in userUtils.queryUserNamesWithDefault(device.device_user_id)] form.populate_for_updating(device)
form.owner_id.choices = [(row.id, row.username) for row in userUtils.queryUserNamesWithDefault(device.device_owner_id)] _accountInfo = mainUtils.accountInfo(
form.manufacturer_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(device.company_manufacturer_id)] title=device.name,
form.company_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(device.company_owner_id)] description=device.legal_entity.name,
form.status_id.choices = [(row.id, row.name) for row in sensorUtils.queryStatusNamesWithDefault(device.status_id)] short=device.website,
form.type_id.choices = [(row.id, row.name) for row in sensorUtils.queryTypeNamesWithDefault(device.type_id)] status=device.type.name,
form.area_id.choices = [(row.id, row.name) for row in sensorUtils.queryAreaNamesWithDefault(device.area_id)] image_file=mainUtils.imageFileLink(device.image_file)
)
if form.validate_on_submit(): if form.validate_on_submit():
if form.picture.data: if form.picture.data:
picture_file = mainUtils.save_picture(form.picture.data) picture_file = mainUtils.save_picture(form.picture.data)
device.image_file = picture_file device.image_file = picture_file
device.name=form.name.data
device.serial_no = form.serial_no.data mainUtils.fill_model(device, form)
device.device_id=form.device_id.data
device.imsi=form.imsi.data
device.iccid=form.iccid.data
device.ip=form.ip.data
device.port=form.port.data
device.registration_date=form.registration_date.data
device.activation_date=form.activation_date.data
device.deactivation_date=form.deactivation_date.data
device.device_owner_id=form.owner_id.data
device.device_user_id=form.user_id.data
device.status_id=form.status_id.data
device.type_id=form.type_id.data
device.area_id=form.area_id.data
device.company_manufacturer_id = form.manufacturer_id.data
device.company_owner_id = form.company_id.data
db.session.commit() db.session.commit()
flash('Device has been successfully updated', 'success') flash('Device has been successfully updated', 'success')
return redirect(url_for('sensor.edit', deviceId=deviceId)) return redirect(url_for('sensor.edit', deviceId=deviceId))
elif request.method == 'GET': elif request.method == 'GET':
form.name.data = device.name mainUtils.populate_form(form, device)
form.serial_no.data = device.serial_no
form.device_id.data = device.device_id return render_template('account.html',
form.imsi.data = device.imsi
form.iccid.data = device.iccid
form.ip.data = device.ip
form.port.data = device.port
form.registration_date.data = device.registration_date
form.activation_date.data = device.activation_date
form.deactivation_date.data = device.deactivation_date
form.user_id.data = device.device_user.username
form.owner_id.data = device.device_owner.username
form.manufacturer_id.data = device.company_manufacturer.name
form.company_id.data = device.company_owner.name
form.status_id.data = device.status.name
form.type_id.data = device.type.name
form.area_id.data = device.area.name
image_file = url_for('static', filename='pics/' + sensorUtils.queryImageById(deviceId))
return render_template('sensor/account.html',
theme=theme, theme=theme,
image_file=image_file, accountInfo=_accountInfo,
form=form) form=form)
else: else:
flash('You need to select a Device id', 'alarm') flash('You need to select a Device id', 'alarm')
@ -138,29 +110,39 @@ def edit(deviceId):
@sensor.route('/add', methods=['GET', 'POST']) @sensor.route('/add', methods=['GET', 'POST'])
def add(): def add():
form = updateNbioDeviceAddForm() device = nbiotDevice()
form.user_id.choices = [(row.id, row.username) for row in userUtils.queryUserChoices(1)] form = nbiotDeviceForm()
form.status_id.choices = [(row.id, row.name) for row in sensorUtils.queryStatusChoices(1)] print(f"Route : manufacturer_id : { form.manufacturer_id.data }")
form.type_id.choices = [(row.id, row.name) for row in sensorUtils.queryTypeChoices(1)] form.populate_for_adding(device)
form.area_id.choices = [(row.id, row.name) for row in sensorUtils.queryAreaChoices(1)]
if request.method == 'GET':
form.populate_for_adding(device)
if form.validate_on_submit(): if form.validate_on_submit():
dev = nbiotDevice( mainUtils.fill_model(device, form)
name=form.name.data, #dbUtils.dbAddAndCommit(device)
device_id=form.device_id.data,
imsi=form.imsi.data,
iccid=form.iccid.data,
ip=form.ip.data,
port=form.port.data,
registration_date=form.registration_date.data,
activation_date=form.activation_date.data,
deactivation_date=form.deactivation_date.data,
user_id=form.user_id.data,
status_id=form.status_id.data,
type_id=form.type_id.data,
area_id=form.area_id.data)
dbUtils.dbAddAndCommit(dev)
flash('Device has been successfully added', 'success') flash('Device has been successfully added', 'success')
return render_template('sensor/account.html', return render_template('edit.html',
theme=theme, theme=theme,
form=form) form=form)
@sensor.route('/search/<field_name>', methods=['GET'])
def search_field(field_name):
query = request.args.get('modalQueryArg', '')
# Assuming field_name corresponds to a model field, you would add conditional logic here to query the correct model.
if field_name == 'manufacturer_id':
results = Companies.query.filter(Companies.name.ilike(f'%{query}%')).all()
# Add more conditions for other fields as needed
return render_template('sensor/manufacturer_search_results.html', results=results, field_name=field_name)
@sensor.route('/select/<field_name>/<int:result_id>', methods=['GET'])
def select_field(field_name, result_id):
# Return the selected option
# This is a simplified example, you'll need to adapt this to your specific model fields and logic.
if field_name == 'manufacturer_id':
selected = Companies.query.get(result_id)
return render_template("sensor/manufacturer_options.html", selected=selected)

@ -0,0 +1,3 @@
<select class="btn btn-lg form-select" hx-get="/sensor/company_options" hx-swap="outerHTML" hx-target="#manufacturer_id" hx-trigger="click" id="manufacturer_id" name="manufacturer_id" required style="color:#191717; font-size: 14pt; background-color: #f1f1f1;" type="">
<option value="{{ selected.id }}" selected>{{ selected.name }}</option>
</select>

@ -0,0 +1,7 @@
<ul class="list-group">
{% for result in results %}
<li class="list-group-item">
<a href="#" hx-get="select/{{ field_name }}/{{ result.id }}" hx-target="#{{ field_name }}" hx-swap="outerHTML" class="text-decoration-none">{{ result.name }}</a>
</li>
{% endfor %}
</ul>

@ -5,7 +5,7 @@
<h1 class="account-heading" style="color: {{ theme.orange }};">{{ title }}</h1> <h1 class="account-heading" style="color: {{ theme.orange }};">{{ title }}</h1>
</div> </div>
<div class="container rounded-3 " style="{{ theme.form.div_style }};"> <div class="container rounded-3 " style="{{ theme.form.div_style }};">
{% include 'form.html' %} {% include 'formModal.html' %}
{% if extraButtons %} {% if extraButtons %}
</div> </div>
<div class="container text-left rounded-3 mt-2 mb-2" style="{{ theme.form.div_style }};"> <div class="container text-left rounded-3 mt-2 mb-2" style="{{ theme.form.div_style }};">
@ -18,5 +18,4 @@
</div> </div>
{% endif %} {% endif %}
</div> </div>
{% endblock content %} {% endblock content %}

@ -0,0 +1,21 @@
{% extends "base.html" %}
{% block title %}{{ title }}{% endblock %}
{% block content %}
<div class="container text-center rounded-3 mt-2 mb-2" style="{{ theme.form.div_style }};">
<h1 class="account-heading" style="color: {{ theme.orange }};">{{ title }}</h1>
</div>
<div class="container rounded-3 " style="{{ theme.form.div_style }};">
{% include 'form.html' %}
{% if extraButtons %}
</div>
<div class="container text-left rounded-3 mt-2 mb-2" style="{{ theme.form.div_style }};">
<div class="btn-group">
<br>
{% for button in extraButtons %}
<li><a href ="{{ button.link }}" class="{{ theme.form.submit_class }}" style="{{ theme.form.submit_style }}">{{ button.name }}<a>
{% endfor %}
<br>
</div>
{% endif %}
</div>
{% endblock content %}

@ -0,0 +1,7 @@
{% include 'form/stringField.html' %}
{% include 'form/selectFieldModal.html' %}
{% include 'form/dateField.html' %}
{% include 'form/boolField.html' %}
{% include 'form/fileField.html' %}
{% include 'form/urlField.html' %}
{% include 'form/integerField.html' %}

@ -3,4 +3,4 @@
{{ item.label(class=theme.form.select_label_class, style=theme.form.select_label_style) }} {{ item.label(class=theme.form.select_label_class, style=theme.form.select_label_style) }}
<br> <br>
{{ item(class=theme.form.select_class, type=theme.form.select_type, style=theme.form.select_style)}} {{ item(class=theme.form.select_class, type=theme.form.select_type, style=theme.form.select_style)}}
{% endif %} {% endif %}

@ -0,0 +1,33 @@
{% if item.type in ['SelectField'] %}
<br>
{{ item.label(class=theme.form.select_label_class, style=theme.form.select_label_style) }}
<br>
<div class="input-group mb-3">
{{ item(class=theme.form.select_class, type=theme.form.select_type, style=theme.form.select_style)}}
<button class="btn btn-outline-secondary" type="button" data-bs-toggle="modal" data-bs-target="#{{ item.name }}SearchModal">Search</button>
</div>
<div class="modal fade" id="{{ item.name }}SearchModal" tabindex="-1" aria-labelledby="{{ item.name }}SearchLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="{{ item.name }}SearchLabel">Search {{ item.label.text }}</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<input type="text"
name="modalReqArg"
id="searchInput{{ item.name }}"
class="form-control"
placeholder="Search for {{ item.label.text }}..."
hx-get="search/{{ item.name }}"
hx-trigger="keyup changed delay:500ms"
hx-target="#{{ item.name }}Results">
<div id="{{ item.name }}Results"></div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
{% endif %}

@ -0,0 +1,18 @@
<form method="POST" action="" enctype="multipart/form-data">
{{ form.hidden_tag() }}
<fieldset class="form-group">
{% for item in form %}
{% if item.id == 'submit' %}
{% elif item.id == 'csrf_token' %}
{% else %}
{% include 'form/allFieldsModal.html' %}
{% if item.errors %}
{% include 'form/formError.html' %}
{% endif %}
{% endif %}
{% endfor %}
</fieldset>
<div>
{% include 'form/submitField.html' %}
</div>
</form>
Loading…
Cancel
Save