From 9dbee27a16f2ffeaf0bd6ea7bbe906229b963e47 Mon Sep 17 00:00:00 2001 From: Oleg Lavrovsky Date: Mon, 4 Sep 2017 23:03:01 +0200 Subject: [PATCH] Multilingual entries --- feedler/feedparser.py | 4 ++++ feedler/migrations/0003_entry_lang.py | 20 ++++++++++++++++++++ feedler/models/admin.py | 2 ++ feedler/models/models.py | 18 +++++++++++++++++- publichealth/home/models/models.py | 8 +++++++- publichealth/settings/base.py | 4 ++++ requirements.txt | 3 ++- 7 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 feedler/migrations/0003_entry_lang.py diff --git a/feedler/feedparser.py b/feedler/feedparser.py index b4d4f7b..8d7f9e0 100644 --- a/feedler/feedparser.py +++ b/feedler/feedparser.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from datetime import datetime +from guess_language import guess_language def parse(obj, raw, stream): """ @@ -47,6 +48,9 @@ def parse(obj, raw, stream): else: obj.content = '' + # Detect language + obj.lang = guess_language(obj.content) or '' + # Collect tags tags = [] if 'tags' in obj.raw: diff --git a/feedler/migrations/0003_entry_lang.py b/feedler/migrations/0003_entry_lang.py new file mode 100644 index 0000000..e27ee89 --- /dev/null +++ b/feedler/migrations/0003_entry_lang.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.4 on 2017-09-04 20:33 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('feedler', '0002_feedpage'), + ] + + operations = [ + migrations.AddField( + model_name='entry', + name='lang', + field=models.CharField(blank=True, default='', max_length=2), + ), + ] diff --git a/feedler/models/admin.py b/feedler/models/admin.py index 604b92f..c6b6587 100644 --- a/feedler/models/admin.py +++ b/feedler/models/admin.py @@ -61,5 +61,7 @@ def handle_save_settings(sender, instance, *args, **kwargs): except Entry.DoesNotExist: logger.info("Adding entry '%s'" % eid) entry = Entry() + # Parse the Feedly object entry = feedparser.parse(entry, raw_entry, stream) + # Persist resulting object entry.save() diff --git a/feedler/models/models.py b/feedler/models/models.py index 8777e58..83e9240 100644 --- a/feedler/models/models.py +++ b/feedler/models/models.py @@ -6,6 +6,8 @@ from wagtail.wagtailcore.models import Page, Orderable from wagtail.wagtailadmin.edit_handlers import FieldPanel from wagtail.wagtailcore.fields import RichTextField +from django.utils import translation + class Stream(models.Model): title = models.CharField(max_length=255) ident = models.CharField(max_length=255) @@ -13,6 +15,14 @@ class Stream(models.Model): def __str__(self): return self.title +LANGUAGE_CHOICES = ( + ('de', 'Deutsch'), + ('fr', 'Français'), + ('it', 'Italiano'), + ('en', 'English'), + ('', ' * * * '), +) + class Entry(models.Model): """Implementation of the Entry from the feedly API as generic Django model """ @@ -25,7 +35,7 @@ class Entry(models.Model): author = models.CharField(max_length=255, blank=True) link = models.URLField() visual = models.URLField(blank=True) - + lang = models.CharField(max_length=2, blank=True, default='', choices=LANGUAGE_CHOICES) content = models.TextField() tags = models.TextField(blank=True) @@ -53,6 +63,12 @@ class FeedPage(Page): entries = Entry.objects.filter(stream=self.stream) else: entries = Entry.objects.all() + # Filter out by chosen language + curlang = translation.get_language() + if curlang in ['de']: + entries = entries.exclude(lang='fr') + elif curlang in ['fr']: + entries = entries.exclude(lang='de') # Order by most recent date first entries = entries.order_by('-published') return entries[:10] diff --git a/publichealth/home/models/models.py b/publichealth/home/models/models.py index 8bd5189..5354862 100644 --- a/publichealth/home/models/models.py +++ b/publichealth/home/models/models.py @@ -231,8 +231,14 @@ class HomePage(Page): @property def newsentries(self): - # Get news entries + # Get the last few news entries entries = Entry.objects.all().order_by('-published') + # Filter out by current language + curlang = translation.get_language() + if curlang in ['de']: + entries = entries.exclude(lang='fr') + elif curlang in ['fr']: + entries = entries.exclude(lang='de') return entries[:6] def get_context(self, request): diff --git a/publichealth/settings/base.py b/publichealth/settings/base.py index b164686..8559d48 100644 --- a/publichealth/settings/base.py +++ b/publichealth/settings/base.py @@ -132,6 +132,10 @@ PASSWORD_REQUIRED_TEMPLATE = 'password.html' # Internationalization # https://docs.djangoproject.com/en/1.8/topics/i18n/ +LANGUAGES = ( + ('de', u'Deutsch'), + ('fr', u'Français'), +) LANGUAGE_CODE = 'de' # default language TIME_ZONE = 'Europe/Zurich' diff --git a/requirements.txt b/requirements.txt index 433457f..8c9e836 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,8 +8,9 @@ Django==1.11.4 psycopg2==2.7.3.1 dj-database-url==0.4.2 -# Addons +# Content puput==0.9 +guess-language==0.2 # Search elasticsearch>=2.0.0,<3.0.0