В базе данных хранится список шаблонов форм.
Шаблон формы, это структура, которая задается уникальным набором полей, с указанием их типов.
Пример шаблона формы:
{
"name": "Form template name",
"field_name_1": "email",
"field_name_2": "phone" }
Всего должно поддерживаться четыре типа данных полей:
email
телефон
дата
текст
Все типы кроме текста должны поддерживать валидацию. Телефон передается в стандартном формате +7 xxx xxx xx xx, дата передается в формате DD.MM.YYYY или YYYY-MM-DD.
Имя шаблона формы задается в свободной форме, например MyForm или Order Form. Имена полей также задаются в свободной форме (желательно осмысленно), например user_name, order_date или lead_email.
На вход по урлу /get_form POST запросом передаются данные такого вида: f_name1=value1&f_name2=value2
В ответ нужно вернуть имя шаблона формы, если она была найдена. Чтобы найти подходящий шаблон нужно выбрать тот, поля которого совпали с полями в присланной форме. Совпадающими считаются поля, у которых совпали имя и тип значения. Полей в пришедшей форме может быть больше чем в шаблоне, в этом случае шаблон все равно будет считаться подходящим. Самое главное, чтобы все поля шаблона присутствовали в форме. Я использую Python Django. мой models.py
from django.db import models
class Template(models.Model):
name = models.CharField(max_length=256, verbose_name='Название шаблона')
def __str__(self):
return self.name
class Meta:
verbose_name = 'Шаблон'
verbose_name_plural = 'Шаблоны'
class Field(models.Model):
class Type:
choices = (
('email', "email"),
('date', "date"),
('phone', "phone"),
('text', "text"),
)
template = models.ForeignKey(Template, related_name='sample', verbose_name='Шаблон', on_delete=models.CASCADE)
name_field = models.CharField(max_length=256, verbose_name='Имя поля')
type_field = models.CharField(max_length=5, choices=Type.choices, verbose_name='Тип поля')
def __str__(self):
return self.name_field
class Meta:
verbose_name = 'Поле'
verbose_name_plural = 'Поля'
мой view.py
from .utils import type_form
import json
# Create your views here.
class Templates_views (View):
def post(self, request):
form_fields_types = form_type(request.GET)
form_search_cond = Q() # django.db.models.Q
for k, v in form_fields_types.items():
form_search_cond.add(Q(sample__name_field__contains=k, sample__type_field=v), Q.AND)
template = Template.objects.filter(form_search_cond).annotate(count=Count('id')).order_by('-count')
return JsonResponse(form_fields_types)
мой utils.py
def type_v(v):
test = {'email': r'^\S+@\w+.\w{2,4}$',
'date': r'^\d\d\.\d\d\.\d{4}$',
'phone': r'^79\s*\d{2}\s*\d{3}\s*\d{2}\s*\d{2}$',
}
for t, r in test.items():
if re.fullmatch(r, v):
return t
return 'text'
def type_form(d):
res = {}
d = d.dict()
for k, v in d.items():
res[k] = type_v(v)
retur
Из utils.py прилетает словарь вида
{
"User_name": "text",
"User_email": "email",
"date": "date",
"User_phone": "phone"
}
как правильно сделать поиск по данному словарю?
Данные хранятся в моделях таком виде:
{"name": "User",
"sample": [
{
"name_field": "User_name",
"type_field": "text"
},
{
"name_field": "User_email",
"type_field": "email"
},
{
"name_field": "User_phone",
"type_field": "phone"
}
]
}