class Template (models.Model):
tag = models.SlugField (max_length = 16, unique = True)
title = models.CharField (max_length = 50)
def fields (self):
return TemplateField.objects.filter (template = self) .order_by ('tab')
def __unicode __ (self):
return self.title
class TemplateField (models.Model):
FieldTypes = (('T', 'Text'), ('B', 'Bool'), ('E', 'E-mail'), ('U', 'URL'), ('C', 'Choices'),)
template = models.ForeignKey (Template)
tag = models.SlugField (max_length = 32)
title = models.CharField (max_length = 50)
type = models.CharField (max_length = 1, choices = FieldTypes)
tab = models.IntegerField (default = 0)
required = models.BooleanField (default = True)
def __unicode __ (self):
return u '% s:% s'% (self.template, self.tag)
def parameters (self):
return FieldParameter.objects.filter (field = self) .order_by ('tab')
class Meta:
unique_together = ("template", "tag")
class FieldParameter (models.Model):
field = models.ForeignKey (TemplateField)
tag = models.SlugField (max_length = 32)
value = models.CharField (max_length = 255)
tab = models.IntegerField (default = 0)
def __unicode __ (self):
return u '% s:% s =% s'% (self.field, self.tag, self.value)
class Meta:
unique_together = ("field", "tag", "value")
class Record (models.Model):
template = models.ForeignKey (Template)
dt = models.DateTimeField ()
def __unicode __ (self):
return u '% s @% s'% (self.template, self.dt)
class RecordData (models.Model):
record = models.ForeignKey (Record)
field = models.ForeignKey (TemplateField)
value = models.CharField (max_length = 255)
def __unicode __ (self):
return u '% s% s'% (self.record, self.field)
class Meta:
unique_together = ("record", "field")
class CDBForm (forms.Form):
def __init __ (self, template = None, tag = None, * args, ** kwargs):
if template:
self.template = template
elif tag:
self.template = Template.objects.get (tag = tag)
fields = self.template.fields ()
for field in fields:
if field.type == "B":
self.base_fields [field.tag] = forms.BooleanField (label = field.title, required = field.required)
elif field.type == "T":
self.base_fields [field.tag] = forms.CharField (label = field.title, required = field.required)
elif field.type == "C":
choices = []
for parameter in field.parameters ():
if parameter.tag == "choice":
choices.append ((parameter.value, parameter.value))
self.base_fields [field.tag] = forms.ChoiceField (choices = choices, label = field.title, required = field.required)
elif field.type == "E":
self.base_fields [field.tag] = forms.EmailField (label = field.title, required = field.required)
elif field.type == "U":
self.base_fields [field.tag] = forms.URLField (label = field.title, required = field.required)
forms.Form .__ init __ (self, * args, ** kwargs)
def save (self, commit = True):
data = self.cleaned_data
if commit:
rec = Record (template = self.template, dt = datetime.now ())
rec.save ()
for k, v in data.iteritems ():
f = TemplateField.objects.get (template = self.template, tag = k)
d = RecordData (record = rec, field = f, value = v)
d.save ()
return data
Source: https://habr.com/ru/post/46845/
All Articles