Added custom fields dropdown, checkbox and number

remotes/origin/4.0rc
Daniel García 2018-10-23 14:45:49 +02:00 committed by Alex Hermida
parent 523d9dfad8
commit c60ba12414
6 changed files with 121 additions and 9 deletions

View File

@ -24,11 +24,17 @@ MULTILINE_TYPE = "multiline"
RICHTEXT_TYPE = "richtext" RICHTEXT_TYPE = "richtext"
DATE_TYPE = "date" DATE_TYPE = "date"
URL_TYPE = "url" URL_TYPE = "url"
DROPDOWN_TYPE = "dropdown"
CHECKBOX_TYPE = "checkbox"
NUMBER_TYPE = "number"
TYPES_CHOICES = ( TYPES_CHOICES = (
(TEXT_TYPE, _("Text")), (TEXT_TYPE, _("Text")),
(MULTILINE_TYPE, _("Multi-Line Text")), (MULTILINE_TYPE, _("Multi-Line Text")),
(RICHTEXT_TYPE, _("Rich text")), (RICHTEXT_TYPE, _("Rich text")),
(DATE_TYPE, _("Date")), (DATE_TYPE, _("Date")),
(URL_TYPE, _("Url")) (URL_TYPE, _("Url")),
(DROPDOWN_TYPE, _("Dropdown")),
(CHECKBOX_TYPE, _("Checkbox")),
(NUMBER_TYPE, _("Number")),
) )

View File

@ -0,0 +1,57 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.2 on 2018-10-22 16:24
from __future__ import unicode_literals
import django.core.serializers.json
from django.db import migrations, models
import taiga.base.db.models.fields.json
class Migration(migrations.Migration):
dependencies = [
('custom_attributes', '0012_auto_20161201_1628'),
]
operations = [
migrations.AddField(
model_name='epiccustomattribute',
name='extra',
field=taiga.base.db.models.fields.json.JSONField(blank=True, default=None, encoder=django.core.serializers.json.DjangoJSONEncoder, null=True),
),
migrations.AddField(
model_name='issuecustomattribute',
name='extra',
field=taiga.base.db.models.fields.json.JSONField(blank=True, default=None, encoder=django.core.serializers.json.DjangoJSONEncoder, null=True),
),
migrations.AddField(
model_name='taskcustomattribute',
name='extra',
field=taiga.base.db.models.fields.json.JSONField(blank=True, default=None, encoder=django.core.serializers.json.DjangoJSONEncoder, null=True),
),
migrations.AddField(
model_name='userstorycustomattribute',
name='extra',
field=taiga.base.db.models.fields.json.JSONField(blank=True, default=None, encoder=django.core.serializers.json.DjangoJSONEncoder, null=True),
),
migrations.AlterField(
model_name='epiccustomattribute',
name='type',
field=models.CharField(choices=[('text', 'Text'), ('multiline', 'Multi-Line Text'), ('richtext', 'Rich text'), ('date', 'Date'), ('url', 'Url'), ('dropdown', 'Dropdown')], default='text', max_length=16, verbose_name='type'),
),
migrations.AlterField(
model_name='issuecustomattribute',
name='type',
field=models.CharField(choices=[('text', 'Text'), ('multiline', 'Multi-Line Text'), ('richtext', 'Rich text'), ('date', 'Date'), ('url', 'Url'), ('dropdown', 'Dropdown')], default='text', max_length=16, verbose_name='type'),
),
migrations.AlterField(
model_name='taskcustomattribute',
name='type',
field=models.CharField(choices=[('text', 'Text'), ('multiline', 'Multi-Line Text'), ('richtext', 'Rich text'), ('date', 'Date'), ('url', 'Url'), ('dropdown', 'Dropdown')], default='text', max_length=16, verbose_name='type'),
),
migrations.AlterField(
model_name='userstorycustomattribute',
name='type',
field=models.CharField(choices=[('text', 'Text'), ('multiline', 'Multi-Line Text'), ('richtext', 'Rich text'), ('date', 'Date'), ('url', 'Url'), ('dropdown', 'Dropdown')], default='text', max_length=16, verbose_name='type'),
),
]

View File

@ -0,0 +1,35 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.2 on 2018-10-25 07:11
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('custom_attributes', '0013_auto_20181022_1624'),
]
operations = [
migrations.AlterField(
model_name='epiccustomattribute',
name='type',
field=models.CharField(choices=[('text', 'Text'), ('multiline', 'Multi-Line Text'), ('richtext', 'Rich text'), ('date', 'Date'), ('url', 'Url'), ('dropdown', 'Dropdown'), ('checkbox', 'Checkbox'), ('number', 'Number')], default='text', max_length=16, verbose_name='type'),
),
migrations.AlterField(
model_name='issuecustomattribute',
name='type',
field=models.CharField(choices=[('text', 'Text'), ('multiline', 'Multi-Line Text'), ('richtext', 'Rich text'), ('date', 'Date'), ('url', 'Url'), ('dropdown', 'Dropdown'), ('checkbox', 'Checkbox'), ('number', 'Number')], default='text', max_length=16, verbose_name='type'),
),
migrations.AlterField(
model_name='taskcustomattribute',
name='type',
field=models.CharField(choices=[('text', 'Text'), ('multiline', 'Multi-Line Text'), ('richtext', 'Rich text'), ('date', 'Date'), ('url', 'Url'), ('dropdown', 'Dropdown'), ('checkbox', 'Checkbox'), ('number', 'Number')], default='text', max_length=16, verbose_name='type'),
),
migrations.AlterField(
model_name='userstorycustomattribute',
name='type',
field=models.CharField(choices=[('text', 'Text'), ('multiline', 'Multi-Line Text'), ('richtext', 'Rich text'), ('date', 'Date'), ('url', 'Url'), ('dropdown', 'Dropdown'), ('checkbox', 'Checkbox'), ('number', 'Number')], default='text', max_length=16, verbose_name='type'),
),
]

View File

@ -41,7 +41,7 @@ class AbstractCustomAttribute(models.Model):
order = models.BigIntegerField(null=False, blank=False, default=timestamp_ms, verbose_name=_("order")) order = models.BigIntegerField(null=False, blank=False, default=timestamp_ms, verbose_name=_("order"))
project = models.ForeignKey("projects.Project", null=False, blank=False, related_name="%(class)ss", project = models.ForeignKey("projects.Project", null=False, blank=False, related_name="%(class)ss",
verbose_name=_("project")) verbose_name=_("project"))
extra = JSONField(blank=True, default=None, null=True)
created_date = models.DateTimeField(null=False, blank=False, default=timezone.now, created_date = models.DateTimeField(null=False, blank=False, default=timezone.now,
verbose_name=_("created date")) verbose_name=_("created date"))
modified_date = models.DateTimeField(null=False, blank=False, modified_date = models.DateTimeField(null=False, blank=False,

View File

@ -32,6 +32,7 @@ class BaseCustomAttributeSerializer(serializers.LightSerializer):
type = Field() type = Field()
order = Field() order = Field()
project = Field(attr="project_id") project = Field(attr="project_id")
extra = Field()
created_date = Field() created_date = Field()
modified_date = Field() modified_date = Field()

View File

@ -30,7 +30,7 @@ from .choices import HistoryType
from .choices import HISTORY_TYPE_CHOICES from .choices import HISTORY_TYPE_CHOICES
from taiga.base.utils.diff import make_diff as make_diff_from_dicts from taiga.base.utils.diff import make_diff as make_diff_from_dicts
from taiga.projects.custom_attributes.choices import TEXT_TYPE from taiga.projects.custom_attributes.choices import CHECKBOX_TYPE, NUMBER_TYPE, TEXT_TYPE
# This keys has been removed from freeze_impl so we can have objects where the # This keys has been removed from freeze_impl so we can have objects where the
# previous diff has value for the attribute and we want to prevent their propagation # previous diff has value for the attribute and we want to prevent their propagation
@ -262,13 +262,19 @@ class HistoryEntry(models.Model):
if aid in oldcustattrs and aid in newcustattrs: if aid in oldcustattrs and aid in newcustattrs:
changes = make_diff_from_dicts(oldcustattrs[aid], newcustattrs[aid], changes = make_diff_from_dicts(oldcustattrs[aid], newcustattrs[aid],
excluded_keys=("name")) excluded_keys=("name"))
newcustattr = newcustattrs.get(aid, {}) newcustattr = newcustattrs.get(aid, {})
if changes: if changes:
change_type = newcustattr.get("type", TEXT_TYPE) change_type = newcustattr.get("type", TEXT_TYPE)
if change_type in [NUMBER_TYPE, CHECKBOX_TYPE]:
old_value = oldcustattrs[aid].get("value")
new_value = newcustattrs[aid].get("value")
value_diff = [old_value, new_value]
else:
old_value = oldcustattrs[aid].get("value", "") old_value = oldcustattrs[aid].get("value", "")
new_value = newcustattrs[aid].get("value", "") new_value = newcustattrs[aid].get("value", "")
value_diff = get_diff_of_htmls(old_value, new_value) value_diff = get_diff_of_htmls(old_value,
new_value)
change = { change = {
"name": newcustattr.get("name", ""), "name": newcustattr.get("name", ""),
"changes": changes, "changes": changes,
@ -279,6 +285,13 @@ class HistoryEntry(models.Model):
elif aid in oldcustattrs and aid not in newcustattrs: elif aid in oldcustattrs and aid not in newcustattrs:
custom_attributes["deleted"].append(oldcustattrs[aid]) custom_attributes["deleted"].append(oldcustattrs[aid])
elif aid not in oldcustattrs and aid in newcustattrs: elif aid not in oldcustattrs and aid in newcustattrs:
newcustattr = newcustattrs.get(aid, {})
change_type = newcustattr.get("type", TEXT_TYPE)
if change_type in [NUMBER_TYPE, CHECKBOX_TYPE]:
old_value = None
new_value = newcustattrs[aid].get("value")
value_diff = [old_value, new_value]
else:
new_value = newcustattrs[aid].get("value", "") new_value = newcustattrs[aid].get("value", "")
value_diff = get_diff_of_htmls("", new_value) value_diff = get_diff_of_htmls("", new_value)
newcustattrs[aid]["value_diff"] = value_diff newcustattrs[aid]["value_diff"] = value_diff