From a628220e3da94ba71bf895e729c0c76d7113c087 Mon Sep 17 00:00:00 2001 From: Iacopo Spalletti Date: Fri, 8 Apr 2016 18:53:08 +0200 Subject: [PATCH 1/2] Change the default value of date_published to null --- HISTORY.rst | 3 +- README.rst | 4 + djangocms_blog/managers.py | 11 +- .../migrations/0015_auto_20160408_1849.py | 20 ++ djangocms_blog/models.py | 21 +- ..._full__chg_field_post_date_published__c.py | 231 ++++++++++++++++++ tests/test_models.py | 1 + tests/test_views.py | 18 +- 8 files changed, 290 insertions(+), 19 deletions(-) create mode 100644 djangocms_blog/migrations/0015_auto_20160408_1849.py create mode 100644 djangocms_blog/south_migrations/0017_auto__chg_field_post_main_image_full__chg_field_post_date_published__c.py diff --git a/HISTORY.rst b/HISTORY.rst index 98dcaad..04020c4 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -3,10 +3,11 @@ History ------- -0.7.1 (unreleased) +0.8.0 (unreleased) ++++++++++++++++++ * Add django-knocker integration +* Change the default value of date_published to null 0.7.0 (2016-03-19) ++++++++++++++++++ diff --git a/README.rst b/README.rst index 38671f3..9c11bcd 100644 --- a/README.rst +++ b/README.rst @@ -42,6 +42,10 @@ Supported django CMS versions: * django CMS 3.x +.. warning:: Starting from version 0.8, date_published is not set anymore + when creating a post but rather when publishing. + This does not change the overall behavior, but be warned if you + expect it to be not null in custom code. .. warning:: Version 0.6 changes the field of LatestPostsPlugin.tags field. A datamigration is in place to migrate the data, but check that diff --git a/djangocms_blog/managers.py b/djangocms_blog/managers.py index ecd1900..8cf5a73 100644 --- a/djangocms_blog/managers.py +++ b/djangocms_blog/managers.py @@ -80,6 +80,7 @@ class TaggedFilterItem(object): class GenericDateQuerySet(AppHookConfigTranslatableQueryset): start_date_field = 'date_published' + fallback_date_field = 'date_modified' end_date_field = 'date_published_end' publish_field = 'publish' @@ -158,8 +159,14 @@ class GenericDateTaggedManager(TaggedFilterItem, AppHookConfigTranslatableManage if queryset is None: queryset = self.get_queryset() queryset = queryset.on_site() - dates = queryset.values_list(queryset.start_date_field, flat=True) - dates = [(x.year, x.month) for x in dates] + dates_qs = queryset.values_list(queryset.start_date_field, queryset.fallback_date_field) + dates = [] + for blog_dates in dates_qs: + if blog_dates[0]: + current_date = blog_dates[0] + else: + current_date = blog_dates[1] + dates.append((current_date.year, current_date.month,)) date_counter = Counter(dates) dates = set(dates) dates = sorted(dates, reverse=True) diff --git a/djangocms_blog/migrations/0015_auto_20160408_1849.py b/djangocms_blog/migrations/0015_auto_20160408_1849.py new file mode 100644 index 0000000..4a705a5 --- /dev/null +++ b/djangocms_blog/migrations/0015_auto_20160408_1849.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.5 on 2016-04-08 16:49 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('djangocms_blog', '0014_auto_20160215_1331'), + ] + + operations = [ + migrations.AlterField( + model_name='post', + name='date_published', + field=models.DateTimeField(blank=True, null=True, verbose_name='published since'), + ), + ] diff --git a/djangocms_blog/models.py b/djangocms_blog/models.py index 8c6be7b..3989bf4 100644 --- a/djangocms_blog/models.py +++ b/djangocms_blog/models.py @@ -111,10 +111,8 @@ class Post(KnockerModel, ModelMeta, TranslatableModel): date_created = models.DateTimeField(_('created'), auto_now_add=True) date_modified = models.DateTimeField(_('last modified'), auto_now=True) - date_published = models.DateTimeField(_('published since'), - default=timezone.now) - date_published_end = models.DateTimeField(_('published until'), null=True, - blank=True) + date_published = models.DateTimeField(_('published since'), null=True, blank=True) + date_published_end = models.DateTimeField(_('published until'), null=True, blank=True) publish = models.BooleanField(_('publish'), default=False) categories = models.ManyToManyField('djangocms_blog.BlogCategory', verbose_name=_('category'), related_name='blog_posts', blank=True) @@ -198,6 +196,11 @@ class Post(KnockerModel, ModelMeta, TranslatableModel): def __str__(self): return self.safe_translation_getter('title') + def save(self, *args, **kwargs): + if self.publish and self.date_published is None: + self.date_published = timezone.now() + super(Post, self).save(*args, **kwargs) + def save_translation(self, translation, *args, **kwargs): if not translation.slug and translation.title: translation.slug = slugify(translation.title) @@ -211,13 +214,17 @@ class Post(KnockerModel, ModelMeta, TranslatableModel): with switch_language(self, lang): category = self.categories.first() kwargs = {} + if self.date_published: + current_date = self.date_published + else: + current_date = self.date_created urlconf = get_setting('PERMALINK_URLS')[self.app_config.url_patterns] if '' in urlconf: - kwargs['year'] = self.date_published.year + kwargs['year'] = current_date.year if '' in urlconf: - kwargs['month'] = '%02d' % self.date_published.month + kwargs['month'] = '%02d' % current_date.month if '' in urlconf: - kwargs['day'] = '%02d' % self.date_published.day + kwargs['day'] = '%02d' % current_date.day if '' in urlconf: kwargs['slug'] = self.safe_translation_getter('slug', language_code=lang, any_language=True) # NOQA if '' in urlconf: diff --git a/djangocms_blog/south_migrations/0017_auto__chg_field_post_main_image_full__chg_field_post_date_published__c.py b/djangocms_blog/south_migrations/0017_auto__chg_field_post_main_image_full__chg_field_post_date_published__c.py new file mode 100644 index 0000000..0527af0 --- /dev/null +++ b/djangocms_blog/south_migrations/0017_auto__chg_field_post_main_image_full__chg_field_post_date_published__c.py @@ -0,0 +1,231 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Changing field 'Post.main_image_full' + db.alter_column(u'djangocms_blog_post', 'main_image_full_id', self.gf('django.db.models.fields.related.ForeignKey')(null=True, on_delete=models.SET_NULL, to=orm['cmsplugin_filer_image.ThumbnailOption'])) + + # Changing field 'Post.date_published' + db.alter_column(u'djangocms_blog_post', 'date_published', self.gf('django.db.models.fields.DateTimeField')(null=True)) + + # Changing field 'Post.main_image_thumbnail' + db.alter_column(u'djangocms_blog_post', 'main_image_thumbnail_id', self.gf('django.db.models.fields.related.ForeignKey')(null=True, on_delete=models.SET_NULL, to=orm['cmsplugin_filer_image.ThumbnailOption'])) + + def backwards(self, orm): + + # Changing field 'Post.main_image_full' + db.alter_column(u'djangocms_blog_post', 'main_image_full_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm[thumbnail_model], null=True, on_delete=models.SET_NULL)) + + # Changing field 'Post.date_published' + db.alter_column(u'djangocms_blog_post', 'date_published', self.gf('django.db.models.fields.DateTimeField')()) + + # Changing field 'Post.main_image_thumbnail' + db.alter_column(u'djangocms_blog_post', 'main_image_thumbnail_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm[thumbnail_model], null=True, on_delete=models.SET_NULL)) + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'cms.cmsplugin': { + 'Meta': {'object_name': 'CMSPlugin'}, + 'changed_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'depth': ('django.db.models.fields.PositiveIntegerField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + 'numchild': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}), + 'path': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}), + 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}) + }, + 'cms.placeholder': { + 'Meta': {'object_name': 'Placeholder'}, + 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'slot': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}) + }, + u'cmsplugin_filer_image.thumbnailoption': { + 'Meta': {'ordering': "(u'width', u'height')", 'object_name': 'ThumbnailOption'}, + 'crop': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'height': ('django.db.models.fields.IntegerField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'upscale': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'width': ('django.db.models.fields.IntegerField', [], {}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'djangocms_blog.authorentriesplugin': { + 'Meta': {'object_name': 'AuthorEntriesPlugin'}, + 'app_config': ('aldryn_apphooks_config.fields.AppHookConfigField', [], {'to': u"orm['djangocms_blog.BlogConfig']", 'null': 'True', 'blank': 'True'}), + 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.User']", 'symmetrical': 'False'}), + u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}), + 'latest_posts': ('django.db.models.fields.IntegerField', [], {'default': '5'}) + }, + u'djangocms_blog.blogcategory': { + 'Meta': {'object_name': 'BlogCategory'}, + 'app_config': ('aldryn_apphooks_config.fields.AppHookConfigField', [], {'to': u"orm['djangocms_blog.BlogConfig']", 'null': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['djangocms_blog.BlogCategory']", 'null': 'True', 'blank': 'True'}) + }, + u'djangocms_blog.blogcategorytranslation': { + 'Meta': {'unique_together': "[(u'language_code', u'slug'), (u'language_code', u'master')]", 'object_name': 'BlogCategoryTranslation', 'db_table': "u'djangocms_blog_blogcategory_translation'"}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + u'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['djangocms_blog.BlogCategory']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'blank': 'True'}) + }, + u'djangocms_blog.blogconfig': { + 'Meta': {'object_name': 'BlogConfig'}, + 'app_data': ('app_data.fields.AppDataField', [], {'default': "'{}'"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'namespace': ('django.db.models.fields.CharField', [], {'default': 'None', 'unique': 'True', 'max_length': '100'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'djangocms_blog.blogconfigtranslation': { + 'Meta': {'unique_together': "[(u'language_code', u'master')]", 'object_name': 'BlogConfigTranslation', 'db_table': "u'djangocms_blog_blogconfig_translation'"}, + 'app_title': ('django.db.models.fields.CharField', [], {'max_length': '234'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + u'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['djangocms_blog.BlogConfig']"}), + 'object_name': ('django.db.models.fields.CharField', [], {'default': "u'Article'", 'max_length': '234'}) + }, + u'djangocms_blog.genericblogplugin': { + 'Meta': {'object_name': 'GenericBlogPlugin'}, + 'app_config': ('aldryn_apphooks_config.fields.AppHookConfigField', [], {'to': u"orm['djangocms_blog.BlogConfig']", 'null': 'True', 'blank': 'True'}), + u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}) + }, + u'djangocms_blog.latestpostsplugin': { + 'Meta': {'object_name': 'LatestPostsPlugin'}, + 'app_config': ('aldryn_apphooks_config.fields.AppHookConfigField', [], {'to': u"orm['djangocms_blog.BlogConfig']", 'null': 'True', 'blank': 'True'}), + 'categories': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['djangocms_blog.BlogCategory']", 'symmetrical': 'False', 'blank': 'True'}), + u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}), + 'latest_posts': ('django.db.models.fields.IntegerField', [], {'default': '5'}) + }, + u'djangocms_blog.post': { + 'Meta': {'ordering': "(u'-date_published', u'-date_created')", 'object_name': 'Post'}, + 'app_config': ('aldryn_apphooks_config.fields.AppHookConfigField', [], {'to': u"orm['djangocms_blog.BlogConfig']", 'null': 'True'}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'djangocms_blog_post_author'", 'null': 'True', 'to': u"orm['auth.User']"}), + 'categories': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'blog_posts'", 'blank': 'True', 'to': u"orm['djangocms_blog.BlogCategory']"}), + 'content': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'post_content'", 'null': 'True', 'to': "orm['cms.Placeholder']"}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'date_published': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'date_published_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'enable_comments': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'main_image': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'djangocms_blog_post_image'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['filer.Image']"}), + 'main_image_full': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'djangocms_blog_post_full'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['cmsplugin_filer_image.ThumbnailOption']"}), + 'main_image_thumbnail': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'djangocms_blog_post_thumbnail'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['cmsplugin_filer_image.ThumbnailOption']"}), + 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['sites.Site']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'djangocms_blog.posttranslation': { + 'Meta': {'unique_together': "[(u'language_code', u'slug'), (u'language_code', u'master')]", 'object_name': 'PostTranslation', 'db_table': "u'djangocms_blog_post_translation'"}, + 'abstract': ('djangocms_text_ckeditor.fields.HTMLField', [], {'default': "u''", 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + u'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['djangocms_blog.Post']"}), + 'meta_description': ('django.db.models.fields.TextField', [], {'default': "u''", 'blank': 'True'}), + 'meta_keywords': ('django.db.models.fields.TextField', [], {'default': "u''", 'blank': 'True'}), + 'meta_title': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}), + 'post_text': ('djangocms_text_ckeditor.fields.HTMLField', [], {'default': "u''", 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'filer.file': { + 'Meta': {'object_name': 'File'}, + '_file_size': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'folder': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'all_files'", 'null': 'True', 'to': u"orm['filer.Folder']"}), + 'has_all_mandatory_data': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}), + 'original_filename': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'owned_files'", 'null': 'True', 'to': u"orm['auth.User']"}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'polymorphic_filer.file_set+'", 'null': 'True', 'to': u"orm['contenttypes.ContentType']"}), + 'sha1': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '40', 'blank': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + u'filer.folder': { + 'Meta': {'ordering': "(u'name',)", 'unique_together': "((u'parent', u'name'),)", 'object_name': 'Folder'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + u'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + u'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'filer_owned_folders'", 'null': 'True', 'to': u"orm['auth.User']"}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'children'", 'null': 'True', 'to': u"orm['filer.Folder']"}), + u'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + u'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.image': { + 'Meta': {'object_name': 'Image'}, + '_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + '_width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'date_taken': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'default_alt_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'default_caption': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + u'file_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['filer.File']", 'unique': 'True', 'primary_key': 'True'}), + 'must_always_publish_author_credit': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'must_always_publish_copyright': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'subject_location': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '64', 'null': 'True', 'blank': 'True'}) + }, + u'sites.site': { + 'Meta': {'ordering': "(u'domain',)", 'object_name': 'Site', 'db_table': "u'django_site'"}, + 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + } + } + + complete_apps = ['djangocms_blog'] \ No newline at end of file diff --git a/tests/test_models.py b/tests/test_models.py index 71baae4..1de94cb 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -275,6 +275,7 @@ class ModelsTest(BaseTest): post = self._get_post(self._post_data[0]['en']) post = self._get_post(self._post_data[0]['it'], post, 'it') post.main_image = self.create_filer_image_object() + post.publish = True post.save() post.set_current_language('en') meta_en = post.as_meta() diff --git a/tests/test_views.py b/tests/test_views.py index 351e7fe..8c84c4c 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -63,9 +63,9 @@ class ViewTest(BaseTest): view_obj.paginate_by = 1 context = view_obj.get_context_data(object_list=view_obj.object_list) self.assertTrue(context['is_paginated']) - self.assertEqual(list(context['post_list']), [posts[2]]) + self.assertEqual(list(context['post_list']), [posts[0]]) self.assertEqual(context['paginator'].count, 3) - self.assertEqual(context['post_list'][0].title, 'Third post') + self.assertEqual(context['post_list'][0].title, 'First post') response = view_obj.render_to_response(context) self.assertContains(response, context['post_list'][0].get_absolute_url()) self.assertEqual(getattr(request, BLOG_CURRENT_NAMESPACE), self.app_config_1) @@ -79,7 +79,7 @@ class ViewTest(BaseTest): view_obj.kwargs = {} view_obj.object_list = view_obj.get_queryset() context = view_obj.get_context_data(object_list=view_obj.object_list) - self.assertEqual(context['post_list'][0].title, 'Terzo post') + self.assertEqual(context['post_list'][0].title, 'Primo post') response = view_obj.render_to_response(context) self.assertContains(response, context['post_list'][0].get_absolute_url()) blog_menu = request.toolbar.get_or_create_menu('djangocms_blog', _('Blog')) @@ -244,9 +244,9 @@ class ViewTest(BaseTest): self.assertTrue(context['category']) self.assertEqual(context['category'], self.category_1) self.assertTrue(context['is_paginated']) - self.assertEqual(list(context['post_list']), [posts[2]]) + self.assertEqual(list(context['post_list']), [posts[0]]) self.assertEqual(context['paginator'].count, 3) - self.assertEqual(context['post_list'][0].title, 'Third post') + self.assertEqual(context['post_list'][0].title, 'First post') request = self.get_page_request(pages[1], self.user, edit=False) view_obj.request = request @@ -273,9 +273,9 @@ class ViewTest(BaseTest): self.assertTrue(context['author']) self.assertEqual(context['author'], self.user) self.assertTrue(context['is_paginated']) - self.assertEqual(list(context['post_list']), [posts[2]]) + self.assertEqual(list(context['post_list']), [posts[0]]) self.assertEqual(context['paginator'].count, 3) - self.assertEqual(context['post_list'][0].title, 'Third post') + self.assertEqual(context['post_list'][0].title, 'First post') request = self.get_page_request(pages[1], self.user, edit=False) view_obj.request = request @@ -305,9 +305,9 @@ class ViewTest(BaseTest): context = view_obj.get_context_data(object_list=view_obj.object_list) self.assertTrue(context['tagged_entries'], 'tag-2') self.assertTrue(context['is_paginated']) - self.assertEqual(list(context['post_list']), [posts[1]]) + self.assertEqual(list(context['post_list']), [posts[0]]) self.assertEqual(context['paginator'].count, 2) - self.assertEqual(context['post_list'][0].title, 'Second post') + self.assertEqual(context['post_list'][0].title, 'First post') def test_feed(self): posts = self.get_posts() From fa340fe1a96e8415a5bebadf476cdfa77ca3bd17 Mon Sep 17 00:00:00 2001 From: Iacopo Spalletti Date: Fri, 8 Apr 2016 19:19:02 +0200 Subject: [PATCH 2/2] Add docstring --- djangocms_blog/models.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/djangocms_blog/models.py b/djangocms_blog/models.py index 3989bf4..4ca525a 100644 --- a/djangocms_blog/models.py +++ b/djangocms_blog/models.py @@ -197,11 +197,17 @@ class Post(KnockerModel, ModelMeta, TranslatableModel): return self.safe_translation_getter('title') def save(self, *args, **kwargs): + """ + Handle some auto configuration during save + """ if self.publish and self.date_published is None: self.date_published = timezone.now() super(Post, self).save(*args, **kwargs) def save_translation(self, translation, *args, **kwargs): + """ + Handle some auto configuration during save + """ if not translation.slug and translation.title: translation.slug = slugify(translation.title) super(Post, self).save_translation(translation, *args, **kwargs)