Task #26 (id 77): Added to all updated emails the changes to the fields
parent
75af27e812
commit
79e6fd8ec0
|
@ -52,17 +52,17 @@ class Issue(WatchedMixin):
|
||||||
attachments = generic.GenericRelation("projects.Attachment")
|
attachments = generic.GenericRelation("projects.Attachment")
|
||||||
|
|
||||||
notifiable_fields = [
|
notifiable_fields = [
|
||||||
|
"subject",
|
||||||
|
"milestone",
|
||||||
"owner",
|
"owner",
|
||||||
|
"assigned_to",
|
||||||
|
"finished_date",
|
||||||
|
"type",
|
||||||
"status",
|
"status",
|
||||||
"severity",
|
"severity",
|
||||||
"priority",
|
"priority",
|
||||||
"type",
|
|
||||||
"milestone",
|
|
||||||
"finished_date",
|
|
||||||
"subject",
|
|
||||||
"description",
|
|
||||||
"assigned_to",
|
|
||||||
"tags",
|
"tags",
|
||||||
|
"description",
|
||||||
]
|
]
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -81,6 +81,16 @@ class Issue(WatchedMixin):
|
||||||
def is_closed(self):
|
def is_closed(self):
|
||||||
return self.status.is_closed
|
return self.status.is_closed
|
||||||
|
|
||||||
|
def get_notifiable_assigned_to_display(self, value):
|
||||||
|
if not value:
|
||||||
|
return _("Unassigned")
|
||||||
|
return value.get_full_name()
|
||||||
|
|
||||||
|
def get_notifiable_tags_display(self, value):
|
||||||
|
if type(value) is list:
|
||||||
|
return ", ".join(value)
|
||||||
|
return value
|
||||||
|
|
||||||
def _get_watchers_by_role(self):
|
def _get_watchers_by_role(self):
|
||||||
return {
|
return {
|
||||||
"owner": self.owner,
|
"owner": self.owner,
|
||||||
|
|
|
@ -11,24 +11,23 @@
|
||||||
<h2>Issue #{{ object.ref }}: {{ object.subject }}</h2>
|
<h2>Issue #{{ object.ref }}: {{ object.subject }}</h2>
|
||||||
<p>Updated by <b>{{ changer.get_full_name() }}</b>.</p>
|
<p>Updated by <b>{{ changer.get_full_name() }}</b>.</p>
|
||||||
<p>Updated fields:
|
<p>Updated fields:
|
||||||
{% for field in changed_fields_dict.values() %}
|
<dl>
|
||||||
<b>{{ field.verbose_name }}</b>{% if not loop.last %},{% endif %}
|
{% for field in changed_fields %}
|
||||||
|
<dt style="background: #669933; padding: 5px 15px; color: #fff">
|
||||||
|
<b>{{ field.verbose_name}}</b>
|
||||||
|
</dt>
|
||||||
|
{% if field.new_value %}
|
||||||
|
<dd style="background: #eee; padding: 5px 15px; color: #444">
|
||||||
|
<b>to:</b> <i>{{ field.new_value|linebreaksbr }}</i>
|
||||||
|
</dd>
|
||||||
|
{% endif %}
|
||||||
|
{% if field.old_value %}
|
||||||
|
<dd style="padding: 5px 15px; color: #bbb">
|
||||||
|
<b>from:</b> <i>{{ field.old_value|linebreaksbr }}</i>
|
||||||
|
</dd>
|
||||||
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</p>
|
</dl>
|
||||||
|
|
||||||
{# TODO: Improvemments in some methods to use that: #}
|
|
||||||
{# - WatchedMixin._get_changed_field_old_value() #}
|
|
||||||
{# - WatchedMixin._get_changed_field_new_value() #}
|
|
||||||
{#
|
|
||||||
<ul>
|
|
||||||
{% for field in changed_fields_dict.values() %}
|
|
||||||
<li>
|
|
||||||
<b>{{ field.verbose_name}}</b>: from <i>{{ field.old_value}}</i>
|
|
||||||
to <i>{{ field.new_value}}</i>.
|
|
||||||
</li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
#}
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
|
@ -5,17 +5,8 @@
|
||||||
- Issue #{{ object.ref }}: {{ object.subject }}
|
- Issue #{{ object.ref }}: {{ object.subject }}
|
||||||
- Updated by {{ changer.get_full_name() }}
|
- Updated by {{ changer.get_full_name() }}
|
||||||
- Updated fields:
|
- Updated fields:
|
||||||
{% for field in changed_fields_dict.values() %}
|
{% for field in changed_fields %}
|
||||||
{{ field.verbose_name }}{% if not loop.last %}, {% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
{# TODO: Improvemments in some methods to use that: #}
|
|
||||||
{# - WatchedMixin._get_changed_field_old_value() #}
|
|
||||||
{# - WatchedMixin._get_changed_field_new_value() #}
|
|
||||||
{#
|
|
||||||
{% for field in changed_fields_dict.values() %}
|
|
||||||
* {{ field.verbose_name}}</b>: from '{{ field.old_value}}' to '{{ field.new_value }}'.
|
* {{ field.verbose_name}}</b>: from '{{ field.old_value}}' to '{{ field.new_value }}'.
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
#}
|
|
||||||
|
|
||||||
** More info at {{ final_url_name }} ({{ final_url }}) **
|
** More info at {{ final_url_name }} ({{ final_url }}) **
|
||||||
|
|
|
@ -42,10 +42,10 @@ class Milestone(WatchedMixin):
|
||||||
notifiable_fields = [
|
notifiable_fields = [
|
||||||
"name",
|
"name",
|
||||||
"owner",
|
"owner",
|
||||||
|
"disponibility",
|
||||||
|
"closed",
|
||||||
"estimated_start",
|
"estimated_start",
|
||||||
"estimated_finish",
|
"estimated_finish",
|
||||||
"closed",
|
|
||||||
"disponibility",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|
|
@ -11,24 +11,23 @@
|
||||||
<h2>Milestone #{{ object.slug }}: {{ object.name }}</h2>
|
<h2>Milestone #{{ object.slug }}: {{ object.name }}</h2>
|
||||||
<p>Updated by <b>{{ changer.get_full_name() }}</b>.</p>
|
<p>Updated by <b>{{ changer.get_full_name() }}</b>.</p>
|
||||||
<p>Updated fields:
|
<p>Updated fields:
|
||||||
{% for field in changed_fields_dict.values() %}
|
<dl>
|
||||||
<b>{{ field.verbose_name }}</b>{% if not loop.last %},{% endif %}
|
{% for field in changed_fields %}
|
||||||
|
<dt style="background: #669933; padding: 5px 15px; color: #fff">
|
||||||
|
<b>{{ field.verbose_name}}</b>
|
||||||
|
</dt>
|
||||||
|
{% if field.new_value %}
|
||||||
|
<dd style="background: #eee; padding: 5px 15px; color: #444">
|
||||||
|
<b>to:</b> <i>{{ field.new_value|linebreaksbr }}</i>
|
||||||
|
</dd>
|
||||||
|
{% endif %}
|
||||||
|
{% if field.old_value %}
|
||||||
|
<dd style="padding: 5px 15px; color: #bbb">
|
||||||
|
<b>from:</b> <i>{{ field.old_value|linebreaksbr }}</i>
|
||||||
|
</dd>
|
||||||
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</p>
|
</dl>
|
||||||
|
|
||||||
{# TODO: Improvemments in some methods to use that: #}
|
|
||||||
{# - WatchedMixin._get_changed_field_old_value() #}
|
|
||||||
{# - WatchedMixin._get_changed_field_new_value() #}
|
|
||||||
{#
|
|
||||||
<ul>
|
|
||||||
{% for field in changed_fields_dict.values() %}
|
|
||||||
<li>
|
|
||||||
<b>{{ field.verbose_name}}</b>: from <i>{{ field.old_value}}</i>
|
|
||||||
to <i>{{ field.new_value}}</i>.
|
|
||||||
</li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
#}
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
|
@ -5,17 +5,8 @@
|
||||||
- Milestone #{{ object.slug }}: {{ object.name }}
|
- Milestone #{{ object.slug }}: {{ object.name }}
|
||||||
- Updated by {{ changer.get_full_name() }}
|
- Updated by {{ changer.get_full_name() }}
|
||||||
- Updated fields:
|
- Updated fields:
|
||||||
{% for field in changed_fields_dict.values() %}
|
{% for field in changed_fields %}
|
||||||
{{ field.verbose_name }}{% if not loop.last %}, {% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
{# TODO: Improvemments in some methods to use that: #}
|
|
||||||
{# - WatchedMixin._get_changed_field_old_value() #}
|
|
||||||
{# - WatchedMixin._get_changed_field_new_value() #}
|
|
||||||
{#
|
|
||||||
{% for field in changed_fields_dict.values() %}
|
|
||||||
* {{ field.verbose_name}}</b>: from '{{ field.old_value}}' to '{{ field.new_value }}'.
|
* {{ field.verbose_name}}</b>: from '{{ field.old_value}}' to '{{ field.new_value }}'.
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
#}
|
|
||||||
|
|
||||||
** More info at {{ final_url_name }} ({{ final_url }}) **
|
** More info at {{ final_url_name }} ({{ final_url }}) **
|
||||||
|
|
|
@ -137,6 +137,21 @@ class Project(models.Model):
|
||||||
verbose_name=_("default questions "
|
verbose_name=_("default questions "
|
||||||
"status"))
|
"status"))
|
||||||
|
|
||||||
|
notifiable_fields = [
|
||||||
|
"name",
|
||||||
|
"total_milestones",
|
||||||
|
"total_story_points",
|
||||||
|
"default_points",
|
||||||
|
"default_us_status",
|
||||||
|
"default_task_status",
|
||||||
|
"default_priority",
|
||||||
|
"default_severity",
|
||||||
|
"default_issue_status",
|
||||||
|
"default_issue_type",
|
||||||
|
"default_question_status",
|
||||||
|
"description"
|
||||||
|
]
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = "project"
|
verbose_name = "project"
|
||||||
verbose_name_plural = "projects"
|
verbose_name_plural = "projects"
|
||||||
|
|
|
@ -49,14 +49,14 @@ class Task(WatchedMixin):
|
||||||
verbose_name=_("is iocaine"))
|
verbose_name=_("is iocaine"))
|
||||||
|
|
||||||
notifiable_fields = [
|
notifiable_fields = [
|
||||||
"owner",
|
|
||||||
"status",
|
|
||||||
"finished_date",
|
|
||||||
"subject",
|
"subject",
|
||||||
"description",
|
"owner",
|
||||||
"assigned_to",
|
"assigned_to",
|
||||||
"tags",
|
"finished_date",
|
||||||
"is_iocaine",
|
"is_iocaine",
|
||||||
|
"status",
|
||||||
|
"description",
|
||||||
|
"tags",
|
||||||
]
|
]
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -71,6 +71,16 @@ class Task(WatchedMixin):
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "({1}) {0}".format(self.ref, self.subject)
|
return "({1}) {0}".format(self.ref, self.subject)
|
||||||
|
|
||||||
|
def get_notifiable_assigned_to_display(self, value):
|
||||||
|
if not value:
|
||||||
|
return _("Unassigned")
|
||||||
|
return value.get_full_name()
|
||||||
|
|
||||||
|
def get_notifiable_tags_display(self, value):
|
||||||
|
if type(value) is list:
|
||||||
|
return ", ".join(value)
|
||||||
|
return value
|
||||||
|
|
||||||
def _get_watchers_by_role(self):
|
def _get_watchers_by_role(self):
|
||||||
return {
|
return {
|
||||||
"owner": self.owner,
|
"owner": self.owner,
|
||||||
|
|
|
@ -11,24 +11,23 @@
|
||||||
<h2>Task #{{ object.ref }}: {{ object.subject }}</h2>
|
<h2>Task #{{ object.ref }}: {{ object.subject }}</h2>
|
||||||
<p>Updated by <b>{{ changer.get_full_name() }}</b>.</p>
|
<p>Updated by <b>{{ changer.get_full_name() }}</b>.</p>
|
||||||
<p>Updated fields:
|
<p>Updated fields:
|
||||||
{% for field in changed_fields_dict.values() %}
|
<dl>
|
||||||
<b>{{ field.verbose_name }}</b>{% if not loop.last %},{% endif %}
|
{% for field in changed_fields %}
|
||||||
|
<dt style="background: #669933; padding: 5px 15px; color: #fff">
|
||||||
|
<b>{{ field.verbose_name}}</b>
|
||||||
|
</dt>
|
||||||
|
{% if field.new_value %}
|
||||||
|
<dd style="background: #eee; padding: 5px 15px; color: #444">
|
||||||
|
<b>to:</b> <i>{{ field.new_value|linebreaksbr }}</i>
|
||||||
|
</dd>
|
||||||
|
{% endif %}
|
||||||
|
{% if field.old_value %}
|
||||||
|
<dd style="padding: 5px 15px; color: #bbb">
|
||||||
|
<b>from:</b> <i>{{ field.old_value|linebreaksbr }}</i>
|
||||||
|
</dd>
|
||||||
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</p>
|
</dl>
|
||||||
|
|
||||||
{# TODO: Improvemments in some methods to use that: #}
|
|
||||||
{# - WatchedMixin._get_changed_field_old_value() #}
|
|
||||||
{# - WatchedMixin._get_changed_field_new_value() #}
|
|
||||||
{#
|
|
||||||
<ul>
|
|
||||||
{% for field in changed_fields_dict.values() %}
|
|
||||||
<li>
|
|
||||||
<b>{{ field.verbose_name}}</b>: from <i>{{ field.old_value}}</i>
|
|
||||||
to <i>{{ field.new_value}}</i>.
|
|
||||||
</li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
#}
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
|
@ -5,17 +5,8 @@
|
||||||
- Task #{{ object.ref }}: {{ object.subject }}
|
- Task #{{ object.ref }}: {{ object.subject }}
|
||||||
- Updated by {{ changer.get_full_name() }}
|
- Updated by {{ changer.get_full_name() }}
|
||||||
- Updated fields:
|
- Updated fields:
|
||||||
{% for field in changed_fields_dict.values() %}
|
{% for field in changed_fields %}
|
||||||
{{ field.verbose_name }}{% if not loop.last %}, {% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
{# TODO: Improvemments in some methods to use that: #}
|
|
||||||
{# - WatchedMixin._get_changed_field_old_value() #}
|
|
||||||
{# - WatchedMixin._get_changed_field_new_value() #}
|
|
||||||
{#
|
|
||||||
{% for field in changed_fields_dict.values() %}
|
|
||||||
* {{ field.verbose_name}}</b>: from '{{ field.old_value}}' to '{{ field.new_value }}'.
|
* {{ field.verbose_name}}</b>: from '{{ field.old_value}}' to '{{ field.new_value }}'.
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
#}
|
|
||||||
|
|
||||||
** More info at {{ final_url_name }} ({{ final_url }}) **
|
** More info at {{ final_url_name }} ({{ final_url }}) **
|
||||||
|
|
|
@ -10,24 +10,23 @@
|
||||||
<h2>Project #{{ object.slug }}: {{ object.name }}</h2>
|
<h2>Project #{{ object.slug }}: {{ object.name }}</h2>
|
||||||
<p>Updated by <b>{{ changer.get_full_name() }}</b>.</p>
|
<p>Updated by <b>{{ changer.get_full_name() }}</b>.</p>
|
||||||
<p>Updated fields:
|
<p>Updated fields:
|
||||||
{% for field in changed_fields_dict.values() %}
|
<dl>
|
||||||
<b>{{ field.verbose_name }}</b>{% if not loop.last %},{% endif %}
|
{% for field in changed_fields %}
|
||||||
|
<dt style="background: #669933; padding: 5px 15px; color: #fff">
|
||||||
|
<b>{{ field.verbose_name}}</b>
|
||||||
|
</dt>
|
||||||
|
{% if field.new_value %}
|
||||||
|
<dd style="background: #eee; padding: 5px 15px; color: #444">
|
||||||
|
<b>to:</b> <i>{{ field.new_value|linebreaksbr }}</i>
|
||||||
|
</dd>
|
||||||
|
{% endif %}
|
||||||
|
{% if field.old_value %}
|
||||||
|
<dd style="padding: 5px 15px; color: #bbb">
|
||||||
|
<b>from:</b> <i>{{ field.old_value|linebreaksbr }}</i>
|
||||||
|
</dd>
|
||||||
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</p>
|
</dl>
|
||||||
|
|
||||||
{# TODO: Improvemments in some methods to use that: #}
|
|
||||||
{# - WatchedMixin._get_changed_field_old_value() #}
|
|
||||||
{# - WatchedMixin._get_changed_field_new_value() #}
|
|
||||||
{#
|
|
||||||
<ul>
|
|
||||||
{% for field in changed_fields_dict.values() %}
|
|
||||||
<li>
|
|
||||||
<b>{{ field.verbose_name}}</b>: from <i>{{ field.old_value}}</i>
|
|
||||||
to <i>{{ field.new_value}}</i>.
|
|
||||||
</li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
#}
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
|
@ -4,17 +4,8 @@
|
||||||
- Project #{{ object.slug }}: {{ object.name }}
|
- Project #{{ object.slug }}: {{ object.name }}
|
||||||
- Updated by {{ changer.get_full_name() }}
|
- Updated by {{ changer.get_full_name() }}
|
||||||
- Updated fields:
|
- Updated fields:
|
||||||
{% for field in changed_fields_dict.values() %}
|
{% for field in changed_fields %}
|
||||||
{{ field.verbose_name }}{% if not loop.last %}, {% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
{# TODO: Improvemments in some methods to use that: #}
|
|
||||||
{# - WatchedMixin._get_changed_field_old_value() #}
|
|
||||||
{# - WatchedMixin._get_changed_field_new_value() #}
|
|
||||||
{#
|
|
||||||
{% for field in changed_fields_dict.values() %}
|
|
||||||
* {{ field.verbose_name}}</b>: from '{{ field.old_value}}' to '{{ field.new_value }}'.
|
* {{ field.verbose_name}}</b>: from '{{ field.old_value}}' to '{{ field.new_value }}'.
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
#}
|
|
||||||
|
|
||||||
** More info at {{ final_url_name }} ({{ final_url }}) **
|
** More info at {{ final_url_name }} ({{ final_url }}) **
|
||||||
|
|
|
@ -33,6 +33,8 @@ class RolePoints(models.Model):
|
||||||
permissions = (
|
permissions = (
|
||||||
("view_rolepoints", "Can view role points"),
|
("view_rolepoints", "Can view role points"),
|
||||||
)
|
)
|
||||||
|
def __str__(self):
|
||||||
|
return "{}: {}".format(role.name, point.name)
|
||||||
|
|
||||||
|
|
||||||
class UserStory(WatchedMixin):
|
class UserStory(WatchedMixin):
|
||||||
|
@ -74,16 +76,16 @@ class UserStory(WatchedMixin):
|
||||||
attachments = generic.GenericRelation("projects.Attachment")
|
attachments = generic.GenericRelation("projects.Attachment")
|
||||||
|
|
||||||
notifiable_fields = [
|
notifiable_fields = [
|
||||||
|
"subject",
|
||||||
"milestone",
|
"milestone",
|
||||||
"owner",
|
"owner",
|
||||||
"status",
|
|
||||||
"points",
|
|
||||||
"finish_date",
|
"finish_date",
|
||||||
"subject",
|
|
||||||
"description",
|
|
||||||
"client_requirement",
|
"client_requirement",
|
||||||
"team_requirement",
|
"team_requirement",
|
||||||
|
"status",
|
||||||
|
"points",
|
||||||
"tags",
|
"tags",
|
||||||
|
"description",
|
||||||
]
|
]
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -116,6 +118,11 @@ class UserStory(WatchedMixin):
|
||||||
|
|
||||||
return total
|
return total
|
||||||
|
|
||||||
|
def get_notifiable_tags_display(self, value):
|
||||||
|
if type(value) is list:
|
||||||
|
return ", ".join(value)
|
||||||
|
return value
|
||||||
|
|
||||||
def _get_watchers_by_role(self):
|
def _get_watchers_by_role(self):
|
||||||
return {
|
return {
|
||||||
"owner": self.owner,
|
"owner": self.owner,
|
||||||
|
|
|
@ -11,24 +11,23 @@
|
||||||
<h2>US #{{ object.ref }}: {{ object.subject }}</h2>
|
<h2>US #{{ object.ref }}: {{ object.subject }}</h2>
|
||||||
<p>Updated by <b>{{ changer.get_full_name() }}</b>.</p>
|
<p>Updated by <b>{{ changer.get_full_name() }}</b>.</p>
|
||||||
<p>Updated fields:
|
<p>Updated fields:
|
||||||
{% for field in changed_fields_dict.values() %}
|
<dl>
|
||||||
<b>{{ field.verbose_name }}</b>{% if not loop.last %},{% endif %}
|
{% for field in changed_fields %}
|
||||||
|
<dt style="background: #669933; padding: 5px 15px; color: #fff">
|
||||||
|
<b>{{ field.verbose_name}}</b>
|
||||||
|
</dt>
|
||||||
|
{% if field.new_value %}
|
||||||
|
<dd style="background: #eee; padding: 5px 15px; color: #444">
|
||||||
|
<b>to:</b> <i>{{ field.new_value|linebreaksbr }}</i>
|
||||||
|
</dd>
|
||||||
|
{% endif %}
|
||||||
|
{% if field.old_value %}
|
||||||
|
<dd style="padding: 5px 15px; color: #bbb">
|
||||||
|
<b>from:</b> <i>{{ field.old_value|linebreaksbr }}</i>
|
||||||
|
</dd>
|
||||||
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</p>
|
</dl>
|
||||||
|
|
||||||
{# TODO: Improvemments in some methods to use that: #}
|
|
||||||
{# - WatchedMixin._get_changed_field_old_value() #}
|
|
||||||
{# - WatchedMixin._get_changed_field_new_value() #}
|
|
||||||
{#
|
|
||||||
<ul>
|
|
||||||
{% for field in changed_fields_dict.values() %}
|
|
||||||
<li>
|
|
||||||
<b>{{ field.verbose_name}}</b>: from <i>{{ field.old_value}}</i>
|
|
||||||
to <i>{{ field.new_value}}</i>.
|
|
||||||
</li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
#}
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
|
@ -5,17 +5,8 @@
|
||||||
- US #{{ object.ref }}: {{ object.subject }}
|
- US #{{ object.ref }}: {{ object.subject }}
|
||||||
- Updated by {{ changer.get_full_name() }}
|
- Updated by {{ changer.get_full_name() }}
|
||||||
- Updated fields:
|
- Updated fields:
|
||||||
{% for field in changed_fields_dict.values() %}
|
{% for field in changed_fields %}
|
||||||
{{ field.verbose_name }}{% if not loop.last %}, {% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
{# TODO: Improvemments in some methods to use that: #}
|
|
||||||
{# - WatchedMixin._get_changed_field_old_value() #}
|
|
||||||
{# - WatchedMixin._get_changed_field_new_value() #}
|
|
||||||
{#
|
|
||||||
{% for field in changed_fields_dict.values() %}
|
|
||||||
* {{ field.verbose_name}}</b>: from '{{ field.old_value}}' to '{{ field.new_value }}'.
|
* {{ field.verbose_name}}</b>: from '{{ field.old_value}}' to '{{ field.new_value }}'.
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
#}
|
|
||||||
|
|
||||||
** More info at {{ final_url_name }} ({{ final_url }}) **
|
** More info at {{ final_url_name }} ({{ final_url }}) **
|
||||||
|
|
Loading…
Reference in New Issue