Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 86 additions & 0 deletions djgentelella/forms/forms.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
from djgentelella.widgets import core as genwidgets
from django import forms
from django.forms import BaseFormSet, HiddenInput
from django.forms import BaseModelFormSet
from django.forms.formsets import DELETION_FIELD_NAME
from django.utils.safestring import mark_safe

from djgentelella.models import GTDbForm, GTDbField, GTStatus, GTActionsStep, GTStep, \
GTFlow, GTSkipCondition


class GTForm(forms.Form):
"""
Expand Down Expand Up @@ -202,3 +206,85 @@ def add_fields(self, form, index):
if self.can_delete:
form.fields[DELETION_FIELD_NAME].widget.attrs['class'] = 'invisible'
form.fields[DELETION_FIELD_NAME].label = ''


class GTDbFormSet(forms.ModelForm):
class Meta:
model = GTDbForm
fields = ['token', 'prefix', 'representation_list', 'template_name']
widgets = {
'token': genwidgets.TextInput,
'prefix': genwidgets.TextInput,
'representation_list': genwidgets.Select,
'template_name': genwidgets.TextInput,
}

class GTDbFieldForm(forms.ModelForm):
class Meta:
model = GTDbField
fields = ['form', 'name', 'label', 'required', 'label_suffix', 'help_text', 'disabled', 'extra_attr', 'extra_kwarg', 'order']
widgets = {
'form': genwidgets.Select,
'name': genwidgets.TextInput,
'label': genwidgets.TextInput,
'label_suffix': genwidgets.TextInput,
'help_text': genwidgets.TextInput,
'disabled': genwidgets.CheckboxInput,
'extra_attr': genwidgets.Textarea,
'extra_kwarg': genwidgets.Textarea,
'order': genwidgets.NumberInput,
}

class GTStatusForm(forms.ModelForm):
class Meta:
model = GTStatus
fields = ['name', 'description']
widgets = {
'name': genwidgets.TextInput,
'description': genwidgets.Textarea,
}

class GTActionsStepForm(forms.ModelForm):
class Meta:
model = GTActionsStep
fields = ['name', 'description', 'content_type', 'object_id']
widgets = {
'name': genwidgets.TextInput,
'description': genwidgets.Textarea,
'content_type': genwidgets.Select,
'object_id': genwidgets.NumberInput,
}

class GTStepForm(forms.ModelForm):
class Meta:
model = GTStep
fields = ['name', 'order', 'status_id', 'form', 'post_action', 'pre_action']
widgets = {
'name': genwidgets.TextInput,
'status_id': genwidgets.SelectMultiple,
'order': genwidgets.NumberInput,
'form': genwidgets.SelectMultiple,
'post_action': genwidgets.Select,
'pre_action': genwidgets.Select,
}

class GTFlowForm(forms.ModelForm):
class Meta:
model = GTFlow
fields = ['name', 'description', 'step']
widgets = {
'name': genwidgets.TextInput,
'description': genwidgets.Textarea,
'step': genwidgets.Select,
}

class GTSkipConditionForm(forms.ModelForm):
class Meta:
model = GTSkipCondition
fields = ['step_id', 'condition_field', 'condition_value', 'skip_to_step']
widgets = {
'step_id': genwidgets.Select,
'condition_field': genwidgets.TextInput,
'condition_value': genwidgets.TextInput,
'skip_to_step': genwidgets.Select,
}
92 changes: 92 additions & 0 deletions djgentelella/models.py
Copy link
Contributor

@marcelagz marcelagz Oct 16, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Falta la migración de estos modelos.

Además el dato blank=False no es necesario definirlo en modelos, adjunto los valores por defecto de la herencia de la clase Field que trae django.

imagen

Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
import importlib

from django.conf import settings
from django.contrib.auth.models import Permission, User
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.utils.translation import gettext as _
from django.utils.translation import gettext_lazy as _
from tree_queries.models import TreeNode

Expand Down Expand Up @@ -123,3 +128,90 @@ class ChunkedUpload(AbstractChunkedUpload):
null=DEFAULT_MODEL_USER_FIELD_NULL,
blank=DEFAULT_MODEL_USER_FIELD_BLANK
)


REPRESENTATION_LIST = [
('as_table', 'As Table'),
('as_p', 'As P'),
('as_ul', 'As ul'),
('as_inline', 'As Inline'),
('as_horizontal', 'As Horizontal'),
('as_plain', 'As Plain'),
('as_grid', _("As grid"))

]

class GTDbForm(models.Model):
token = models.CharField(max_length=50, unique=True, verbose_name=_("Token"))
prefix = models.CharField(max_length=50, null=True, blank=True, verbose_name=_("Prefix"))
representation_list = models.CharField(choices=REPRESENTATION_LIST, max_length=50, default='as_table', verbose_name=_("Representation List"))
template_name = models.CharField(max_length=100, default='default', verbose_name=_("Template Name"))
def __str__(self):
return self.token

class GTDbField(models.Model):
form = models.ForeignKey(GTDbForm, on_delete=models.CASCADE, verbose_name=_("Form"))
name = models.CharField(max_length=100, verbose_name=_("Name"))
label = models.CharField(max_length=100, null=True, blank=True, verbose_name=_("Label"))
required = models.BooleanField(default=True, verbose_name=_("Required"))
label_suffix = models.CharField(max_length=100, null=True, blank=True, verbose_name=_("Label Suffix"))
help_text = models.CharField(max_length=500, null=True, blank=True, verbose_name=_("Help Text"))
disabled = models.BooleanField(default=False, verbose_name=_("Disable"))
extra_attr = models.JSONField(blank=True, null=True, verbose_name=_("Extra Attr"))
extra_kwarg = models.JSONField(blank=True, null=True, verbose_name=_("EXtra Kwarg"))
order = models.IntegerField(default=0, verbose_name=_("Order"))

def __str__(self):
return self.name

class GTStatus(models.Model):

name = models.CharField(max_length=100, blank=False, null=False, verbose_name=_("Name"))
description = models.TextField(blank=False, null=False, verbose_name=_("Description"))
def __str__(self):
return self.name

class GTActionsStep(models.Model):
name = models.CharField(max_length=100, blank=False, null=False, verbose_name=_("Name"))
description = models.TextField(blank=False, null=False, verbose_name=_("Description"))

content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')

def __str__(self):
return self.name

class GTStep(models.Model):
name = models.CharField(max_length=100, blank=False, null=False, verbose_name=_("Name"))
order = models.PositiveIntegerField(blank=False, null=False, verbose_name=_("Order"))
status_id = models.ForeignKey(GTStatus, on_delete=models.CASCADE, blank=False, null=False, verbose_name=_("Status"))
form = models.ManyToManyField(GTDbForm, related_name='forms', verbose_name=_("Form"))
post_action = models.ManyToManyField(GTActionsStep, related_name='post_steps', verbose_name=_("Post Action"))
pre_action = models.ManyToManyField(GTActionsStep, related_name='pre_steps', verbose_name=_("Pre Action"))

def __str__(self):
return self.name

class GTFlow(models.Model):
name = models.CharField(max_length=100, blank=False, null=False, verbose_name=_("Name"))
description = models.TextField(blank=False, null=False, verbose_name=_("Description"))
step = models.ManyToManyField(GTStep, related_name='steps', verbose_name=_("Step"))
def __str__(self):
return self.name


class GTSkipCondition(models.Model):
step_id = models.ForeignKey(GTStep, on_delete=models.CASCADE, verbose_name=_("Step"))
condition_field = models.CharField(max_length=100, blank=True, null=True, verbose_name=_("Condition Field"))
condition_value = models.CharField(max_length=100, blank=True, null=True, verbose_name=_("Condition Value"))
skip_to_step = models.ForeignKey(GTStep, on_delete=models.CASCADE, related_name='target_step', verbose_name=_("Skip To Step"))

def execute_condition(self, context):
module, function = self.condition_field.rsplit('.', 1)
mod = importlib.import_module(module)
func = getattr(mod, function)
return func(context)