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")
|
||||
|
||||
notifiable_fields = [
|
||||
"subject",
|
||||
"milestone",
|
||||
"owner",
|
||||
"assigned_to",
|
||||
"finished_date",
|
||||
"type",
|
||||
"status",
|
||||
"severity",
|
||||
"priority",
|
||||
"type",
|
||||
"milestone",
|
||||
"finished_date",
|
||||
"subject",
|
||||
"description",
|
||||
"assigned_to",
|
||||
"tags",
|
||||
"description",
|
||||
]
|
||||
|
||||
class Meta:
|
||||
|
@ -81,6 +81,16 @@ class Issue(WatchedMixin):
|
|||
def is_closed(self):
|
||||
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):
|
||||
return {
|
||||
"owner": self.owner,
|
||||
|
|
|
@ -11,24 +11,23 @@
|
|||
<h2>Issue #{{ object.ref }}: {{ object.subject }}</h2>
|
||||
<p>Updated by <b>{{ changer.get_full_name() }}</b>.</p>
|
||||
<p>Updated fields:
|
||||
{% for field in changed_fields_dict.values() %}
|
||||
<b>{{ field.verbose_name }}</b>{% if not loop.last %},{% endif %}
|
||||
<dl>
|
||||
{% 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 %}
|
||||
</p>
|
||||
|
||||
{# 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>
|
||||
#}
|
||||
</dl>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -5,17 +5,8 @@
|
|||
- Issue #{{ object.ref }}: {{ object.subject }}
|
||||
- Updated by {{ changer.get_full_name() }}
|
||||
- Updated fields:
|
||||
{% for field in changed_fields_dict.values() %}
|
||||
{{ 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() %}
|
||||
{% for field in changed_fields %}
|
||||
* {{ field.verbose_name}}</b>: from '{{ field.old_value}}' to '{{ field.new_value }}'.
|
||||
{% endfor %}
|
||||
#}
|
||||
|
||||
** More info at {{ final_url_name }} ({{ final_url }}) **
|
||||
|
|
|
@ -42,10 +42,10 @@ class Milestone(WatchedMixin):
|
|||
notifiable_fields = [
|
||||
"name",
|
||||
"owner",
|
||||
"disponibility",
|
||||
"closed",
|
||||
"estimated_start",
|
||||
"estimated_finish",
|
||||
"closed",
|
||||
"disponibility",
|
||||
]
|
||||
|
||||
class Meta:
|
||||
|
|
|
@ -11,24 +11,23 @@
|
|||
<h2>Milestone #{{ object.slug }}: {{ object.name }}</h2>
|
||||
<p>Updated by <b>{{ changer.get_full_name() }}</b>.</p>
|
||||
<p>Updated fields:
|
||||
{% for field in changed_fields_dict.values() %}
|
||||
<b>{{ field.verbose_name }}</b>{% if not loop.last %},{% endif %}
|
||||
<dl>
|
||||
{% 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 %}
|
||||
</p>
|
||||
|
||||
{# 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>
|
||||
#}
|
||||
</dl>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -5,17 +5,8 @@
|
|||
- Milestone #{{ object.slug }}: {{ object.name }}
|
||||
- Updated by {{ changer.get_full_name() }}
|
||||
- Updated fields:
|
||||
{% for field in changed_fields_dict.values() %}
|
||||
{{ 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() %}
|
||||
{% for field in changed_fields %}
|
||||
* {{ field.verbose_name}}</b>: from '{{ field.old_value}}' to '{{ field.new_value }}'.
|
||||
{% endfor %}
|
||||
#}
|
||||
|
||||
** More info at {{ final_url_name }} ({{ final_url }}) **
|
||||
|
|
|
@ -137,6 +137,21 @@ class Project(models.Model):
|
|||
verbose_name=_("default questions "
|
||||
"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:
|
||||
verbose_name = "project"
|
||||
verbose_name_plural = "projects"
|
||||
|
|
|
@ -49,14 +49,14 @@ class Task(WatchedMixin):
|
|||
verbose_name=_("is iocaine"))
|
||||
|
||||
notifiable_fields = [
|
||||
"owner",
|
||||
"status",
|
||||
"finished_date",
|
||||
"subject",
|
||||
"description",
|
||||
"owner",
|
||||
"assigned_to",
|
||||
"tags",
|
||||
"finished_date",
|
||||
"is_iocaine",
|
||||
"status",
|
||||
"description",
|
||||
"tags",
|
||||
]
|
||||
|
||||
class Meta:
|
||||
|
@ -71,6 +71,16 @@ class Task(WatchedMixin):
|
|||
def __str__(self):
|
||||
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):
|
||||
return {
|
||||
"owner": self.owner,
|
||||
|
|
|
@ -11,24 +11,23 @@
|
|||
<h2>Task #{{ object.ref }}: {{ object.subject }}</h2>
|
||||
<p>Updated by <b>{{ changer.get_full_name() }}</b>.</p>
|
||||
<p>Updated fields:
|
||||
{% for field in changed_fields_dict.values() %}
|
||||
<b>{{ field.verbose_name }}</b>{% if not loop.last %},{% endif %}
|
||||
<dl>
|
||||
{% 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 %}
|
||||
</p>
|
||||
|
||||
{# 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>
|
||||
#}
|
||||
</dl>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -5,17 +5,8 @@
|
|||
- Task #{{ object.ref }}: {{ object.subject }}
|
||||
- Updated by {{ changer.get_full_name() }}
|
||||
- Updated fields:
|
||||
{% for field in changed_fields_dict.values() %}
|
||||
{{ 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() %}
|
||||
{% for field in changed_fields %}
|
||||
* {{ field.verbose_name}}</b>: from '{{ field.old_value}}' to '{{ field.new_value }}'.
|
||||
{% endfor %}
|
||||
#}
|
||||
|
||||
** More info at {{ final_url_name }} ({{ final_url }}) **
|
||||
|
|
|
@ -10,24 +10,23 @@
|
|||
<h2>Project #{{ object.slug }}: {{ object.name }}</h2>
|
||||
<p>Updated by <b>{{ changer.get_full_name() }}</b>.</p>
|
||||
<p>Updated fields:
|
||||
{% for field in changed_fields_dict.values() %}
|
||||
<b>{{ field.verbose_name }}</b>{% if not loop.last %},{% endif %}
|
||||
<dl>
|
||||
{% 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 %}
|
||||
</p>
|
||||
|
||||
{# 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>
|
||||
#}
|
||||
</dl>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -4,17 +4,8 @@
|
|||
- Project #{{ object.slug }}: {{ object.name }}
|
||||
- Updated by {{ changer.get_full_name() }}
|
||||
- Updated fields:
|
||||
{% for field in changed_fields_dict.values() %}
|
||||
{{ 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() %}
|
||||
{% for field in changed_fields %}
|
||||
* {{ field.verbose_name}}</b>: from '{{ field.old_value}}' to '{{ field.new_value }}'.
|
||||
{% endfor %}
|
||||
#}
|
||||
|
||||
** More info at {{ final_url_name }} ({{ final_url }}) **
|
||||
|
|
|
@ -33,6 +33,8 @@ class RolePoints(models.Model):
|
|||
permissions = (
|
||||
("view_rolepoints", "Can view role points"),
|
||||
)
|
||||
def __str__(self):
|
||||
return "{}: {}".format(role.name, point.name)
|
||||
|
||||
|
||||
class UserStory(WatchedMixin):
|
||||
|
@ -74,16 +76,16 @@ class UserStory(WatchedMixin):
|
|||
attachments = generic.GenericRelation("projects.Attachment")
|
||||
|
||||
notifiable_fields = [
|
||||
"subject",
|
||||
"milestone",
|
||||
"owner",
|
||||
"status",
|
||||
"points",
|
||||
"finish_date",
|
||||
"subject",
|
||||
"description",
|
||||
"client_requirement",
|
||||
"team_requirement",
|
||||
"status",
|
||||
"points",
|
||||
"tags",
|
||||
"description",
|
||||
]
|
||||
|
||||
class Meta:
|
||||
|
@ -116,6 +118,11 @@ class UserStory(WatchedMixin):
|
|||
|
||||
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):
|
||||
return {
|
||||
"owner": self.owner,
|
||||
|
|
|
@ -11,24 +11,23 @@
|
|||
<h2>US #{{ object.ref }}: {{ object.subject }}</h2>
|
||||
<p>Updated by <b>{{ changer.get_full_name() }}</b>.</p>
|
||||
<p>Updated fields:
|
||||
{% for field in changed_fields_dict.values() %}
|
||||
<b>{{ field.verbose_name }}</b>{% if not loop.last %},{% endif %}
|
||||
<dl>
|
||||
{% 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 %}
|
||||
</p>
|
||||
|
||||
{# 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>
|
||||
#}
|
||||
</dl>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -5,17 +5,8 @@
|
|||
- US #{{ object.ref }}: {{ object.subject }}
|
||||
- Updated by {{ changer.get_full_name() }}
|
||||
- Updated fields:
|
||||
{% for field in changed_fields_dict.values() %}
|
||||
{{ 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() %}
|
||||
{% for field in changed_fields %}
|
||||
* {{ field.verbose_name}}</b>: from '{{ field.old_value}}' to '{{ field.new_value }}'.
|
||||
{% endfor %}
|
||||
#}
|
||||
|
||||
** More info at {{ final_url_name }} ({{ final_url }}) **
|
||||
|
|
Loading…
Reference in New Issue