add publication dates, last change date
authorRadek Czajka <radoslaw.czajka@nowoczesnapolska.org.pl>
Thu, 4 Oct 2012 11:00:33 +0000 (13:00 +0200)
committerRadek Czajka <radoslaw.czajka@nowoczesnapolska.org.pl>
Thu, 4 Oct 2012 11:00:33 +0000 (13:00 +0200)
migdal/admin.py
migdal/api.py
migdal/feeds.py
migdal/locale/pl/LC_MESSAGES/django.mo
migdal/locale/pl/LC_MESSAGES/django.po
migdal/migrations/0005_auto__add_field_entry_changed_at__add_field_entry_published_at_pl__add.py [new file with mode: 0644]
migdal/models.py
migdal/templates/migdal/entry/entry_begin.html

index 920f29c..d93a782 100644 (file)
@@ -17,11 +17,13 @@ class AttachmentInline(admin.TabularInline):
 
 class EntryAdmin(admin.ModelAdmin):
     date_hierarchy = 'date'
+    readonly_fields = ('date', 'changed_at') + translated_fields(('published_at',))
     fieldsets = (
-        (None, {'fields': (('type', 'promo'), 'author', 'author_email', 'image', 'date')}),
+        (None, {'fields': (('type', 'promo'), 'author', 'author_email', 'image', 'date', 'changed_at')}),
     ) + tuple(
         (ln, {'fields': (
             ('published_%s' % lc),
+            'published_at_%s' % lc,
             'title_%s' % lc,
             'slug_%s' % lc,
             'lead_%s' % lc,
@@ -31,6 +33,7 @@ class EntryAdmin(admin.ModelAdmin):
     ) + tuple(
         (ln, {'fields': (
             ('needed_%s' % lc, 'published_%s' % lc),
+            'published_at_%s' % lc,
             'title_%s' % lc,
             'slug_%s' % lc,
             'lead_%s' % lc,
index 7fd6fe3..6f81a4d 100644 (file)
@@ -10,7 +10,8 @@ from django.utils.translation import get_language
 
 def entry_list(entry_type=None, category=None, promobox=False):
     lang = get_language()
-    object_list = Entry.objects.filter(**{"published_%s" % lang: True})
+    object_list = Entry.objects.filter(**{"published_%s" % lang: True}
+        ).order_by('-published_at_%s' % lang)
     if entry_type:
         object_list = object_list.filter(type=entry_type.db)
     else:
index 8203735..53145c5 100644 (file)
@@ -53,4 +53,4 @@ class EntriesFeed(Feed):
         return string_concat("<img src='%s'/>" % image, item.lead)
 
     def item_pubdate(self, item):
-        return item.date
+        return item.published_at
index e1b0148..f222f82 100644 (file)
Binary files a/migdal/locale/pl/LC_MESSAGES/django.mo and b/migdal/locale/pl/LC_MESSAGES/django.mo differ
index f15f991..8347953 100644 (file)
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: django-migdal 0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-08-30 15:59+0200\n"
-"PO-Revision-Date: 2012-08-30 16:00+0100\n"
+"POT-Creation-Date: 2012-10-04 12:58+0200\n"
+"PO-Revision-Date: 2012-10-04 12:58+0100\n"
 "Last-Translator: Radek Czajka <radoslaw.czajka@nowoczesnapolska.org.pl>\n"
 "Language-Team: FNP <fundacja@nowoczesnapolska.org.pl>\n"
 "Language: Polish\n"
@@ -38,7 +38,7 @@ msgstr "tematy"
 msgid "types"
 msgstr "rodzaje"
 
-#: admin.py:41
+#: admin.py:44
 msgid "Categories"
 msgstr "Kategorie"
 
@@ -47,7 +47,7 @@ msgid "latest"
 msgstr "ostatnie"
 
 #: feeds.py:32
-#: models.py:54
+#: models.py:56
 msgid "entries"
 msgstr "wpisy"
 
@@ -63,97 +63,109 @@ msgstr "Tytuł"
 msgid "Content"
 msgstr "Treść"
 
-#: models.py:19
+#: models.py:20
 msgid "taxonomy"
 msgstr "taksonomia"
 
-#: models.py:23
+#: models.py:24
 msgid "category"
 msgstr "kategoria"
 
-#: models.py:24
-#: models.py:50
+#: models.py:25
+#: models.py:52
 #: urls.py:41
 #: urls.py:43
 msgid "categories"
 msgstr "kategorie"
 
 #: models.py:45
+msgid "created at"
+msgstr "data utworzenia"
+
+#: models.py:46
+msgid "changed at"
+msgstr "data ostatniej zmiany"
+
+#: models.py:47
 msgid "author"
 msgstr "autor"
 
-#: models.py:46
+#: models.py:48
 msgid "author email"
 msgstr "e-mail autora"
 
-#: models.py:47
+#: models.py:49
 msgid "Used only to display gravatar and send notifications."
 msgstr "Używany tylko do wyświetlenia gravatara i wysyłania powiadomień."
 
-#: models.py:48
+#: models.py:50
 msgid "image"
 msgstr "obrazek"
 
-#: models.py:49
+#: models.py:51
 msgid "promoted"
 msgstr "promowane"
 
-#: models.py:53
+#: models.py:55
 msgid "entry"
 msgstr "wpis"
 
-#: models.py:77
+#: models.py:80
 #, python-format
 msgid "Published entry should have a slug in relevant language (%s)."
 msgstr "Opublikowany wpis powinien mieć slug w odpowiednim języku (%s)."
 
-#: models.py:96
+#: models.py:99
 #, python-format
 msgid "Your story has been published at %s."
 msgstr "Twój wpis został opublikowany na stronie %s."
 
-#: models.py:104
+#: models.py:105
 msgid "needed"
 msgstr "potrzebne"
 
-#: models.py:105
+#: models.py:106
 msgid "Unneeded"
 msgstr "Niepotrzebne"
 
-#: models.py:105
+#: models.py:106
 msgid "Needed"
 msgstr "Potrzebne"
 
-#: models.py:105
+#: models.py:106
 msgid "Done"
 msgstr "Ukończone"
 
-#: models.py:111
+#: models.py:112
 msgid "title"
 msgstr "tytuł"
 
-#: models.py:112
+#: models.py:113
 msgid "lead"
 msgstr "lead"
 
-#: models.py:113
-#: models.py:115
+#: models.py:114
+#: models.py:116
 msgid "Use <a href=\"http://textile.thresholdstate.com/\">Textile</a> syntax."
 msgstr "Włączona składnia <a href=\"http://textile.thresholdstate.com/\">Textile</a>."
 
-#: models.py:114
+#: models.py:115
 msgid "body"
 msgstr "treść"
 
-#: models.py:116
+#: models.py:117
 msgid "published"
 msgstr "opublikowane"
 
-#: models.py:121
+#: models.py:118
+msgid "published at"
+msgstr "data publikacji"
+
+#: models.py:123
 msgid "file"
 msgstr "plik"
 
-#: models.py:139
+#: models.py:141
 #, python-format
 msgid "New comment under your story at %s."
 msgstr "Nowy komentarz pod Twoim wpisem na stronie %s."
diff --git a/migdal/migrations/0005_auto__add_field_entry_changed_at__add_field_entry_published_at_pl__add.py b/migdal/migrations/0005_auto__add_field_entry_changed_at__add_field_entry_published_at_pl__add.py
new file mode 100644 (file)
index 0000000..2110ee4
--- /dev/null
@@ -0,0 +1,97 @@
+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        # Adding field 'Entry.changed_at'
+        db.add_column('migdal_entry', 'changed_at',
+                      self.gf('django.db.models.fields.DateTimeField')(auto_now=True, default=datetime.datetime(2000, 1, 1, 0, 0), db_index=True, blank=True),
+                      keep_default=False)
+
+        # Adding field 'Entry.published_at_pl'
+        db.add_column('migdal_entry', 'published_at_pl',
+                      self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True),
+                      keep_default=False)
+
+        # Adding field 'Entry.published_at_en'
+        db.add_column('migdal_entry', 'published_at_en',
+                      self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True),
+                      keep_default=False)
+
+        if not db.dry_run:
+            for entry in orm['migdal.Entry'].objects.all():
+                if entry.published_pl:
+                    entry.published_at_pl = entry.date
+                if entry.published_en:
+                    entry.published_at_en = entry.date
+                entry.save()
+
+
+    def backwards(self, orm):
+        # Deleting field 'Entry.changed_at'
+        db.delete_column('migdal_entry', 'changed_at')
+
+        # Deleting field 'Entry.published_at_pl'
+        db.delete_column('migdal_entry', 'published_at_pl')
+
+        # Deleting field 'Entry.published_at_en'
+        db.delete_column('migdal_entry', 'published_at_en')
+
+
+    models = {
+        'migdal.attachment': {
+            'Meta': {'object_name': 'Attachment'},
+            'entry': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['migdal.Entry']"}),
+            'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
+        },
+        'migdal.category': {
+            'Meta': {'object_name': 'Category'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'slug_en': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}),
+            'slug_pl': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}),
+            'taxonomy': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
+            'title_en': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '64', 'db_index': 'True'}),
+            'title_pl': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '64', 'db_index': 'True'})
+        },
+        'migdal.entry': {
+            'Meta': {'ordering': "['-date']", 'object_name': 'Entry'},
+            '_body_en_rendered': ('django.db.models.fields.TextField', [], {}),
+            '_body_pl_rendered': ('django.db.models.fields.TextField', [], {}),
+            '_lead_en_rendered': ('django.db.models.fields.TextField', [], {}),
+            '_lead_pl_rendered': ('django.db.models.fields.TextField', [], {}),
+            'author': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'author_email': ('django.db.models.fields.EmailField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),
+            'body_en': ('markupfield.fields.MarkupField', [], {'null': 'True', 'rendered_field': 'True', 'blank': 'True'}),
+            'body_en_markup_type': ('django.db.models.fields.CharField', [], {'default': "'textile_pl'", 'max_length': '30', 'blank': 'True'}),
+            'body_pl': ('markupfield.fields.MarkupField', [], {'null': 'True', 'rendered_field': 'True', 'blank': 'True'}),
+            'body_pl_markup_type': ('django.db.models.fields.CharField', [], {'default': "'textile_pl'", 'max_length': '30', 'blank': 'True'}),
+            'categories': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['migdal.Category']", 'null': 'True', 'blank': 'True'}),
+            'changed_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
+            'date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'lead_en': ('markupfield.fields.MarkupField', [], {'null': 'True', 'rendered_field': 'True', 'blank': 'True'}),
+            'lead_en_markup_type': ('django.db.models.fields.CharField', [], {'default': "'textile_pl'", 'max_length': '30', 'blank': 'True'}),
+            'lead_pl': ('markupfield.fields.MarkupField', [], {'null': 'True', 'rendered_field': 'True', 'blank': 'True'}),
+            'lead_pl_markup_type': ('django.db.models.fields.CharField', [], {'default': "'textile_pl'", 'max_length': '30', 'blank': 'True'}),
+            'needed_en': ('django.db.models.fields.CharField', [], {'default': "'n'", 'max_length': '1', 'db_index': 'True'}),
+            'promo': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'published_at_en': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'published_at_pl': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'published_en': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'published_pl': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'slug_en': ('migdal.fields.SlugNullField', [], {'max_length': '50', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'slug_pl': ('migdal.fields.SlugNullField', [], {'max_length': '50', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'title_en': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'title_pl': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '16', 'db_index': 'True'})
+        }
+    }
+
+    complete_apps = ['migdal']
\ No newline at end of file
index e3f7819..028350c 100644 (file)
@@ -2,6 +2,7 @@
 # This file is part of PrawoKultury, licensed under GNU Affero GPLv3 or later.
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
+from datetime import datetime
 from django.conf import settings
 from django.contrib.sites.models import Site
 from django.core.exceptions import ValidationError
@@ -41,7 +42,8 @@ class Entry(models.Model):
     type = models.CharField(max_length=16,
             choices=((t.db, t.slug) for t in app_settings.TYPES),
             db_index=True)
-    date = models.DateTimeField(auto_now_add=True, db_index=True, editable=True)
+    date = models.DateTimeField(_('created at'), auto_now_add=True, db_index=True)
+    changed_at = models.DateTimeField(_('changed at'), auto_now=True, db_index=True)
     author = models.CharField(_('author'), max_length=128)
     author_email = models.EmailField(_('author email'), max_length=128, null=True, blank=True,
             help_text=_('Used only to display gravatar and send notifications.'))
@@ -62,8 +64,9 @@ class Entry(models.Model):
             orig = type(self).objects.get(pk=self.pk)
             published_now = False
             for lc, ln in settings.LANGUAGES:
-                if (not getattr(orig, "published_%s" % lc) and
-                        getattr(self, "published_%s" % lc)):
+                if (getattr(self, "published_%s" % lc)
+                        and getattr(self, "published_at_%s" % lc) is None):
+                    setattr(self, "published_at_%s" % lc, datetime.now())
                     published_now = True
             if published_now:
                 self.notify_author_published()
@@ -96,9 +99,7 @@ class Entry(models.Model):
             ugettext(u'Your story has been published at %s.') % site.domain,
             mail_text, settings.SERVER_EMAIL, [self.author_email]
         )
-            
-        
-        
+
 
 add_translatable(Entry, languages=app_settings.OPTIONAL_LANGUAGES, fields={
     'needed': models.CharField(_('needed'), max_length=1, db_index=True, choices=(
@@ -114,6 +115,7 @@ add_translatable(Entry, {
     'body': MarkupField(_('body'), markup_type='textile_pl', null=True, blank=True,
                 help_text=_('Use <a href="http://textile.thresholdstate.com/">Textile</a> syntax.')),
     'published': models.BooleanField(_('published'), default=False),
+    'published_at': models.DateTimeField(_('published at'), null=True, blank=True),
 })
 
 
index 9f07e0d..12f49ae 100755 (executable)
@@ -9,7 +9,7 @@
 {% endif %}
 
 <div class="entry-data">
-<div class="date">{{ object.date }}</div>
+<div class="date">{{ object.published_at }}</div>
 <div class="author">{{ object.author }}</div>
 
 {% comment %}