From bd0522f79a78cd9d48519a22334404aa5afb5213 Mon Sep 17 00:00:00 2001 From: Ilkka Oksanen Date: Wed, 7 Jun 2017 18:38:04 +0300 Subject: [PATCH] Rework webapp models and add translation framework --- requirements.txt | 1 + sikweb/settings-sample.py | 3 +- webapp/__init__.py | 1 + webapp/admin.py | 7 +- webapp/apps.py | 3 + webapp/migrations/0002_auto_20170601_1919.py | 71 +++++++++++++++++++ webapp/migrations/0003_auto_20170607_1643.py | 45 ++++++++++++ webapp/migrations/0004_auto_20170607_1712.py | 20 ++++++ webapp/migrations/0005_auto_20170607_1717.py | 25 +++++++ .../0006_delete_deprecated_models.py | 23 ++++++ webapp/migrations/0007_auto_20170607_1815.py | 61 ++++++++++++++++ webapp/migrations/0008_auto_20170607_1828.py | 55 ++++++++++++++ webapp/models.py | 47 ++++++------ webapp/translation.py | 19 +++++ webapp/utils.py | 6 ++ 15 files changed, 359 insertions(+), 28 deletions(-) create mode 100644 webapp/migrations/0002_auto_20170601_1919.py create mode 100644 webapp/migrations/0003_auto_20170607_1643.py create mode 100644 webapp/migrations/0004_auto_20170607_1712.py create mode 100644 webapp/migrations/0005_auto_20170607_1717.py create mode 100644 webapp/migrations/0006_delete_deprecated_models.py create mode 100644 webapp/migrations/0007_auto_20170607_1815.py create mode 100644 webapp/migrations/0008_auto_20170607_1828.py create mode 100644 webapp/translation.py create mode 100644 webapp/utils.py diff --git a/requirements.txt b/requirements.txt index 2fa49fb..f9329ef 100644 --- a/requirements.txt +++ b/requirements.txt @@ -23,3 +23,4 @@ django-bootstrap3==8.2.3 django-tables2==1.6.1 pep8==1.7.0 dealer==2.0.5 +django-modeltranslation==0.12.1 diff --git a/sikweb/settings-sample.py b/sikweb/settings-sample.py index 755f6c4..40ec433 100644 --- a/sikweb/settings-sample.py +++ b/sikweb/settings-sample.py @@ -35,6 +35,7 @@ ALLOWED_HOSTS = [] # Application definition INSTALLED_APPS = [ + 'modeltranslation', # has to be before admin for translation admin stuff to work 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', @@ -175,8 +176,8 @@ LOGPATH = "logs/debug.log" # https://docs.djangoproject.com/en/1.9/topics/i18n/ LANGUAGES = ( - ('en', _('English')), ('fi', _('Finnish')), + ('en', _('English')), ) LANGUAGE_CODE = 'fi' diff --git a/webapp/__init__.py b/webapp/__init__.py index e69de29..8b13789 100644 --- a/webapp/__init__.py +++ b/webapp/__init__.py @@ -0,0 +1 @@ + diff --git a/webapp/admin.py b/webapp/admin.py index 8c38f3f..a128874 100644 --- a/webapp/admin.py +++ b/webapp/admin.py @@ -1,3 +1,8 @@ from django.contrib import admin +from webapp.models import Feed, Tag, BaseFeed, Event +from modeltranslation.admin import TranslationAdmin -# Register your models here. + +admin.site.register(Feed, TranslationAdmin) +admin.site.register(Tag, TranslationAdmin) +admin.site.register(Event, TranslationAdmin) diff --git a/webapp/apps.py b/webapp/apps.py index fcacfff..55fa92c 100644 --- a/webapp/apps.py +++ b/webapp/apps.py @@ -3,3 +3,6 @@ from django.apps import AppConfig class WebappConfig(AppConfig): name = 'webapp' + + def ready(self): + import webapp.translations diff --git a/webapp/migrations/0002_auto_20170601_1919.py b/webapp/migrations/0002_auto_20170601_1919.py new file mode 100644 index 0000000..b34cbf9 --- /dev/null +++ b/webapp/migrations/0002_auto_20170601_1919.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2017-06-01 16:19 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.utils.timezone +import webapp.utils + + +class Migration(migrations.Migration): + + dependencies = [ + ('webapp', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Feed', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('publish_time', models.DateTimeField(default=django.utils.timezone.now)), + ('autohide', models.BooleanField(default=False)), + ('autohide_time', models.DateTimeField(default=webapp.utils.month_from_now)), + ('topic', models.CharField(max_length=255)), + ('description', models.CharField(max_length=255)), + ('content', models.TextField()), + ], + ), + migrations.RemoveField( + model_name='info', + name='tags', + ), + migrations.RemoveField( + model_name='infotr', + name='translation_for', + ), + migrations.RemoveField( + model_name='tagtr', + name='translation_for', + ), + migrations.RemoveField( + model_name='tag', + name='dummyname', + ), + migrations.AddField( + model_name='tag', + name='name', + field=models.CharField(default='', max_length=127), + preserve_default=False, + ), + migrations.AddField( + model_name='tag', + name='slug', + field=models.SlugField(default=''), + preserve_default=False, + ), + migrations.DeleteModel( + name='Info', + ), + migrations.DeleteModel( + name='InfoTr', + ), + migrations.DeleteModel( + name='TagTr', + ), + migrations.AddField( + model_name='feed', + name='tags', + field=models.ManyToManyField(related_name='news', to='webapp.Tag'), + ), + ] diff --git a/webapp/migrations/0003_auto_20170607_1643.py b/webapp/migrations/0003_auto_20170607_1643.py new file mode 100644 index 0000000..004423e --- /dev/null +++ b/webapp/migrations/0003_auto_20170607_1643.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2017-06-07 13:43 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('webapp', '0002_auto_20170601_1919'), + ] + + operations = [ + migrations.AddField( + model_name='feed', + name='content_en', + field=models.TextField(null=True), + ), + migrations.AddField( + model_name='feed', + name='content_fi', + field=models.TextField(null=True), + ), + migrations.AddField( + model_name='feed', + name='description_en', + field=models.CharField(max_length=255, null=True), + ), + migrations.AddField( + model_name='feed', + name='description_fi', + field=models.CharField(max_length=255, null=True), + ), + migrations.AddField( + model_name='feed', + name='topic_en', + field=models.CharField(max_length=255, null=True), + ), + migrations.AddField( + model_name='feed', + name='topic_fi', + field=models.CharField(max_length=255, null=True), + ), + ] diff --git a/webapp/migrations/0004_auto_20170607_1712.py b/webapp/migrations/0004_auto_20170607_1712.py new file mode 100644 index 0000000..12688ce --- /dev/null +++ b/webapp/migrations/0004_auto_20170607_1712.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2017-06-07 14:12 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('webapp', '0003_auto_20170607_1643'), + ] + + operations = [ + migrations.AlterField( + model_name='feed', + name='tags', + field=models.ManyToManyField(blank=True, related_name='news', to='webapp.Tag'), + ), + ] diff --git a/webapp/migrations/0005_auto_20170607_1717.py b/webapp/migrations/0005_auto_20170607_1717.py new file mode 100644 index 0000000..1d77c2a --- /dev/null +++ b/webapp/migrations/0005_auto_20170607_1717.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2017-06-07 14:17 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('webapp', '0004_auto_20170607_1712'), + ] + + operations = [ + migrations.AddField( + model_name='tag', + name='name_en', + field=models.CharField(max_length=127, null=True), + ), + migrations.AddField( + model_name='tag', + name='name_fi', + field=models.CharField(max_length=127, null=True), + ), + ] diff --git a/webapp/migrations/0006_delete_deprecated_models.py b/webapp/migrations/0006_delete_deprecated_models.py new file mode 100644 index 0000000..81d1d82 --- /dev/null +++ b/webapp/migrations/0006_delete_deprecated_models.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2017-06-01 16:19 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.utils.timezone +import webapp.utils + + +class Migration(migrations.Migration): + + dependencies = [ + ('webapp', '0005_auto_20170607_1717'), + ] + + operations = [ + migrations.DeleteModel( + name='Tag', + ), + migrations.DeleteModel( + name='Feed', + ), + ] diff --git a/webapp/migrations/0007_auto_20170607_1815.py b/webapp/migrations/0007_auto_20170607_1815.py new file mode 100644 index 0000000..71660fd --- /dev/null +++ b/webapp/migrations/0007_auto_20170607_1815.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2017-06-07 15:15 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone +import webapp.utils + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('webapp', '0006_delete_deprecated_models'), + ] + + operations = [ + migrations.CreateModel( + name='BaseFeed', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('visible', models.BooleanField(default=True)), + ('title', models.CharField(max_length=255)), + ('description', models.CharField(max_length=255)), + ('content', models.TextField()), + ], + ), + migrations.CreateModel( + name='Tag', + fields=[ + ('slug', models.SlugField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=127)), + ('icon', models.ImageField(upload_to='')), + ], + ), + migrations.CreateModel( + name='Event', + fields=[ + ('basefeed_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.BaseFeed')), + ('start_time', models.DateTimeField(default=django.utils.timezone.now)), + ('end_time', models.DateTimeField(default=django.utils.timezone.now)), + ], + bases=('webapp.basefeed',), + ), + migrations.CreateModel( + name='Feed', + fields=[ + ('basefeed_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.BaseFeed')), + ('publish_time', models.DateTimeField(default=django.utils.timezone.now)), + ('autohide', models.DateTimeField(default=webapp.utils.month_from_now)), + ], + bases=('webapp.basefeed',), + ), + migrations.AddField( + model_name='basefeed', + name='tags', + field=models.ManyToManyField(blank=True, related_name='feeds', to='webapp.Tag'), + ), + ] diff --git a/webapp/migrations/0008_auto_20170607_1828.py b/webapp/migrations/0008_auto_20170607_1828.py new file mode 100644 index 0000000..6940792 --- /dev/null +++ b/webapp/migrations/0008_auto_20170607_1828.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2017-06-07 15:28 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('webapp', '0007_auto_20170607_1815'), + ] + + operations = [ + migrations.AddField( + model_name='basefeed', + name='content_en', + field=models.TextField(null=True), + ), + migrations.AddField( + model_name='basefeed', + name='content_fi', + field=models.TextField(null=True), + ), + migrations.AddField( + model_name='basefeed', + name='description_en', + field=models.CharField(max_length=255, null=True), + ), + migrations.AddField( + model_name='basefeed', + name='description_fi', + field=models.CharField(max_length=255, null=True), + ), + migrations.AddField( + model_name='basefeed', + name='title_en', + field=models.CharField(max_length=255, null=True), + ), + migrations.AddField( + model_name='basefeed', + name='title_fi', + field=models.CharField(max_length=255, null=True), + ), + migrations.AddField( + model_name='tag', + name='name_en', + field=models.CharField(max_length=127, null=True), + ), + migrations.AddField( + model_name='tag', + name='name_fi', + field=models.CharField(max_length=127, null=True), + ), + ] diff --git a/webapp/models.py b/webapp/models.py index ccf5014..8678d45 100644 --- a/webapp/models.py +++ b/webapp/models.py @@ -1,37 +1,32 @@ from django.db import models from django.utils import timezone - +from datetime import timedelta +from django.contrib.auth.models import User +from webapp.utils import month_from_now class Tag(models.Model): - # ALWAYS USE TRANSLATED NAME!!! - dummyname = models.CharField(max_length=127) - - -class TagTr(models.Model): - ''' - Model containing translations for tags - ''' - lang = models.CharField(max_length=2, default='fi') + slug = models.SlugField(primary_key=True) name = models.CharField(max_length=127) - translation_for = models.ForeignKey('Tag', related_name='translations') + icon = models.ImageField() -class Info(models.Model): +class BaseFeed(models.Model): ''' model containing something showing on some info feed ''' - publish_time = models.DateTimeField(default=timezone.now) - - # published_by = models.Foreignkey(User) #<-- TODO create usermodel - tags = models.ManyToManyField(Tag, related_name="news") - - -class InfoTr(models.Model): - ''' - Model containing translations for news - ''' - lang = models.CharField(max_length=2, default='fi') - - topic = models.CharField(max_length=255) + tags = models.ManyToManyField(Tag, related_name="feeds", blank=True) + visible = models.BooleanField(default=True) + title = models.CharField(max_length=255) + description = models.CharField(max_length=255) content = models.TextField() - translation_for = models.ForeignKey('Info', related_name='translations') + + +class Feed(BaseFeed): + + publish_time = models.DateTimeField(default=timezone.now) + autohide = models.DateTimeField(default=month_from_now) + + +class Event(BaseFeed): + start_time = models.DateTimeField(default=timezone.now) + end_time = models.DateTimeField(default=timezone.now) diff --git a/webapp/translation.py b/webapp/translation.py new file mode 100644 index 0000000..fb69587 --- /dev/null +++ b/webapp/translation.py @@ -0,0 +1,19 @@ +from modeltranslation.translator import register, TranslationOptions +from webapp.models import BaseFeed, Feed, Tag, Event + +@register(BaseFeed) +class BaseFeedTranslationOptions(TranslationOptions): + fields = ('title', 'description', 'content') + +@register(Feed) +class FeedTranslationOptions(TranslationOptions): + fields = () + +@register(Event) +class EventTranslationOptions(TranslationOptions): + fields = () + + +@register(Tag) +class TagTranslationOptions(TranslationOptions): + fields = ('name',) diff --git a/webapp/utils.py b/webapp/utils.py new file mode 100644 index 0000000..0886e08 --- /dev/null +++ b/webapp/utils.py @@ -0,0 +1,6 @@ +from django.utils import timezone +from datetime import timedelta + + +def month_from_now(): + return timezone.now() + timedelta(days=30)