# HG changeset patch # User Sylvain Beucler # Date 1282992892 -7200 # Node ID 85fa60bc06d426502e7140d339e0d3dad66f4ff2 # Parent bd527a3a0c689d84e0ea5abb1951460a5428b3ea Tracker: import and display history (including comments) diff --git a/migrate_old_savane.sql b/migrate_old_savane.sql --- a/migrate_old_savane.sql +++ b/migrate_old_savane.sql @@ -669,3 +669,30 @@ FROM savane_old.trackers_msgid JOIN tracker_item ON (savane_old.trackers_msgid.item_id = tracker_item.public_bugs_id AND savane_old.trackers_msgid.artifact = tracker_item.tracker_id); + +-- Comments +TRUNCATE tracker_comment; +INSERT INTO tracker_comment + (item_id, message, posted_by_id, date, comment_type, spamscore, ip) + SELECT internal_id, old_value, mod_by, FROM_UNIXTIME(savane_old.bugs_history.date), + type, savane_old.bugs_history.spamscore, savane_old.bugs_history.ip + FROM savane_old.bugs_history JOIN tracker_item + ON (savane_old.bugs_history.bug_id = tracker_item.public_bugs_id) + WHERE field_name='details'; +-- TODO: import 'patch' +-- TODO: import 'support' +-- TODO: import 'task' + +-- Field history +TRUNCATE tracker_itemhistory; +INSERT INTO tracker_itemhistory + (item_id, date, mod_by_id, field, old_value, new_value) + SELECT internal_id, FROM_UNIXTIME(savane_old.bugs_history.date), + mod_by, field_name, old_value, new_value + FROM savane_old.bugs_history JOIN tracker_item + ON (savane_old.bugs_history.bug_id = tracker_item.public_bugs_id) + WHERE field_name <> 'details'; +-- TODO: import 'patch' +-- TODO: import 'support' +-- TODO: import 'task' + diff --git a/savane/svmain/templatetags/svmarkup.py b/savane/svmain/templatetags/svmarkup.py --- a/savane/svmain/templatetags/svmarkup.py +++ b/savane/svmain/templatetags/svmarkup.py @@ -26,3 +26,11 @@ @register.filter def svmarkup_full(text): return mark_safe(markup.full(escape(text))) + +@register.filter +def svmarkup_rich(text): + return mark_safe(markup.rich(escape(text))) + +@register.filter +def svmarkup_basic(text): + return mark_safe(markup.basic(escape(text))) diff --git a/savane/tracker/models.py b/savane/tracker/models.py --- a/savane/tracker/models.py +++ b/savane/tracker/models.py @@ -618,14 +618,34 @@ item = models.ForeignKey('Item') msg_id = models.CharField(max_length=255) +class Comment(models.Model): + """ + Item comments (field='details') + """ + class Meta: + ordering = ('item','date',) + item = models.ForeignKey('Item') + date = models.DateTimeField(default=datetime.date.today) + posted_by = models.ForeignKey(auth_models.User) + message = models.TextField(blank=True, null=True) + comment_type = models.IntegerField(_("comment type"), blank=True, null=True) + # Should be: + # type = models.ForeignKey('FieldChoice', to_field='value_id') + # + constraint(same group or NULL) + constraint(field='comment_type_id') + # The purpose is to add [$comment_type] when + # displaying an item comment. + spamscore = models.IntegerField(_("total spamscore for this comment")) + ip = models.IPAddressField(blank=True, null=True) class ItemHistory(models.Model): """ - This stores 2 kinds of values: - - item comments (field='details') - - value changes, for fields that have history tracking enabled + Value changes, for fields that have history tracking enabled """ + class Meta: + ordering = ('item','date','id',) item = models.ForeignKey('Item') + date = models.DateTimeField(default=datetime.date.today) + mod_by = models.ForeignKey(auth_models.User) field = models.CharField(max_length=32) # Should be: field = models.ForeignKey('Field', to_field='name') # + constraint (item.tracker=field.tracker) @@ -633,31 +653,19 @@ # But as it's a history field, adding constraints might be just bad. old_value= models.TextField(blank=True, null=True) new_value= models.TextField() - mod_by = models.ForeignKey(auth_models.User) - date = models.DateTimeField(default=datetime.date.today) - ip = models.IPAddressField(blank=True, null=True) - - # Specific (bad!) field for 'details' - # I guess 'details' could be stored separately. - type = models.IntegerField(_("comment type"), blank=True, null=True) - # Should be: - # type = models.ForeignKey('FieldChoice', to_field='value_id') - # + constraint(same group or 100) + constraint(field='comment_type_id') - # The purpose is to add [$comment_type] when - # displaying an item comment. - spamscore = models.IntegerField(_("total spamscore for this comment")) class ItemCc(models.Model): """ Item carbon copies for mail notifications """ item = models.ForeignKey('Item') - email = models.EmailField(max_length=255) + contact = models.CharField(max_length=255) added_by = models.ForeignKey(auth_models.User) comment = models.TextField() date = models.DateTimeField(default=datetime.date.today) #class ItemDependencies: +# TODO: import # => cf. Item.dependencies class ItemFile(models.Model): @@ -673,17 +681,17 @@ filetype = models.TextField() # /!\ `file` longblob NOT NULL - if not savane-cleanup -class ItemSpamScore(models.Model): - """ - Spam reports - - Score is summed in ItemHistory.spamscore. - """ - score = models.IntegerField(default=1) - affected_user = models.ForeignKey(auth_models.User, related_name='itemspamscore_affected_set') - reporter_user = models.ForeignKey(auth_models.User, related_name='itemspamscore_reported_set') - item = models.ForeignKey('Item') - comment_id = models.ForeignKey('ItemHistory', null=True) +#class CommentSpamScore(models.Model): +# """ +# Spam reports +# +# Score is summed in ItemHistory.spamscore. +# """ +# score = models.IntegerField(default=1) +# affected = models.ForeignKey(auth_models.User, related_name='commentspamscore_affected_set') +# reporter = models.ForeignKey(auth_models.User, related_name='commentspamscore_reported_set') +# item = models.ForeignKey('Item') +# comment_id = models.ForeignKey('ItemComment', null=True) # TODO: diff --git a/static_media/savane/css/tracker.css b/static_media/savane/css/tracker.css --- a/static_media/savane/css/tracker.css +++ b/static_media/savane/css/tracker.css @@ -47,6 +47,30 @@ border-left: thin #b5b5b5 solid; } +table.comments { + width: 98%; + margin-left: 1%; + margin-right: 1%; + margin-bottom: 15px; + vertical-align: top; + border-spacing: 1px; + border: 0; +} +table.comments p { + padding-left:0.2em; + padding-right:0.2em; +} +table.comments td { + vertical-align: top; +} + +table.history td { + text-align: center; +} +table.history td.old_value { + text-align: right; +} + /********************************************************************** * * Priorities diff --git a/templates/tracker/item_form.html b/templates/tracker/item_form.html --- a/templates/tracker/item_form.html +++ b/templates/tracker/item_form.html @@ -1,5 +1,6 @@ {% extends "base.html" %} {% load i18n %} +{% load svmarkup %} {% block title %} {{object.group.name}} - {{object.get_tracker_name}}{% trans ": " %} @@ -67,7 +68,7 @@

{% trans "Add a new comment" %}{% trans ": " %}

-

{% trans "Comment type & canned response" %}{% trans ": " %}
+

{% filter force_escape %}{% trans "Comment type & canned response" %}{% endfilter %}{% trans ": " %}