From bdc845e62aa4e1f9813c13e7f14c66bf3efcfc9b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Stefan=20K=C3=B6gl?= Date: Sun, 31 Aug 2014 11:53:54 +0200 Subject: [PATCH] [Directory] migrate example podcasts to Django ORM --- mygpo/api/simple.py | 14 ++------- mygpo/core/models.py | 13 +++++++++ mygpo/directory/admin.py | 18 ++++++++++++ .../management/commands/set-example-podcasts.py | 29 ------------------- mygpo/directory/migrations/0001_initial.py | 33 ++++++++++++++++++++++ mygpo/directory/migrations/__init__.py | 0 mygpo/directory/models.py | 25 ++++++++++++++-- mygpo/podcasts/models.py | 15 +--------- 8 files changed, 90 insertions(+), 57 deletions(-) create mode 100644 mygpo/directory/admin.py delete mode 100644 mygpo/directory/management/commands/set-example-podcasts.py create mode 100644 mygpo/directory/migrations/0001_initial.py create mode 100644 mygpo/directory/migrations/__init__.py diff --git a/mygpo/api/simple.py b/mygpo/api/simple.py index 5c637ccf..e22205c3 100644 --- a/mygpo/api/simple.py +++ b/mygpo/api/simple.py @@ -35,7 +35,7 @@ from mygpo.api.backend import get_device from mygpo.podcasts.models import Podcast from mygpo.api.opml import Exporter, Importer from mygpo.api.httpresponse import JsonResponse -from mygpo.directory.models import ExamplePodcasts +from mygpo.directory.models import ExamplePodcast from mygpo.api.advanced.directory import podcast_data from mygpo.subscriptions import get_subscribed_podcasts, subscribe, unsubscribe from mygpo.directory.search import search_podcasts @@ -324,17 +324,9 @@ def example_podcasts(request, format): if scale not in range(1, 257): return HttpResponseBadRequest('scale_logo has to be a number from 1 to 256') - if not podcasts: - - try: - examples = ExamplePodcasts.get('example_podcasts') - ids = examples.podcast_ids - podcasts = Podcasts.objects.filter(id__in=ids) - cache.set('example-podcasts', podcasts) - - except ResourceNotFound: - podcasts = [] + podcasts = ExamplePodcast.objects.get_podcasts() + cache.set('example-podcasts', podcasts) title = 'gPodder Podcast Directory' domain = RequestSite(request).domain diff --git a/mygpo/core/models.py b/mygpo/core/models.py index 46fa957a..4d2f75cd 100644 --- a/mygpo/core/models.py +++ b/mygpo/core/models.py @@ -104,3 +104,16 @@ class DeleteableModel(models.Model): class Meta: abstract = True + + +class OrderedModel(models.Model): + """ A model that can be ordered + + The implementing Model must make sure that 'order' is sufficiently unique + """ + + order = models.PositiveSmallIntegerField() + + class Meta: + abstract = True + ordering = ['order'] diff --git a/mygpo/directory/admin.py b/mygpo/directory/admin.py new file mode 100644 index 00000000..181eb63c --- /dev/null +++ b/mygpo/directory/admin.py @@ -0,0 +1,18 @@ +from __future__ import unicode_literals + +from django.contrib import admin + +from mygpo.directory.models import ExamplePodcast + + +@admin.register(ExamplePodcast) +class ExamplePodcastAdmin(admin.ModelAdmin): + """ Admin page for example podcasts """ + + # configuration for the list view + list_display = ('podcast', ) + + # fetch the related objects for the fields in list_display + list_select_related = ('podcast', ) + + raw_id_fields = ('podcast', ) diff --git a/mygpo/directory/management/commands/set-example-podcasts.py b/mygpo/directory/management/commands/set-example-podcasts.py deleted file mode 100644 index c05b8251..00000000 --- a/mygpo/directory/management/commands/set-example-podcasts.py +++ /dev/null @@ -1,29 +0,0 @@ -from datetime import datetime -import fileinput - -from django.core.management.base import BaseCommand - -from couchdbkit.exceptions import ResourceNotFound - -from mygpo.podcasts.models import Podcast -from mygpo.directory.models import ExamplePodcasts - - -EXAMPLES_DOCID = 'example_podcasts' - -class Command(BaseCommand): - - def handle(self, *args, **options): - - urls = list(map(str.strip, fileinput.input(args))) - - try: - examples = ExamplePodcasts.get(EXAMPLES_DOCID) - except ResourceNotFound: - examples = ExamplePodcasts() - examples._id = EXAMPLES_DOCID - - podcasts = Podcast.objects.filter(urls__url__in=urls) - examples.podcast_ids = [podcast.id for podcast in podcasts] - examples.updated = datetime.utcnow() - examples.save() diff --git a/mygpo/directory/migrations/0001_initial.py b/mygpo/directory/migrations/0001_initial.py new file mode 100644 index 00000000..89c85d2a --- /dev/null +++ b/mygpo/directory/migrations/0001_initial.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('podcasts', '0028_episode_indexes'), + ] + + operations = [ + migrations.CreateModel( + name='ExamplePodcast', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('created', models.DateTimeField(auto_now_add=True)), + ('modified', models.DateTimeField(auto_now=True)), + ('order', models.PositiveSmallIntegerField()), + ('podcast', models.ForeignKey(to='podcasts.Podcast')), + ], + options={ + 'ordering': ['order'], + 'abstract': False, + }, + bases=(models.Model,), + ), + migrations.AlterUniqueTogether( + name='examplepodcast', + unique_together=set([('order',)]), + ), + ] diff --git a/mygpo/directory/migrations/__init__.py b/mygpo/directory/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/mygpo/directory/models.py b/mygpo/directory/models.py index 270c0158..0443f5af 100644 --- a/mygpo/directory/models.py +++ b/mygpo/directory/models.py @@ -1,11 +1,13 @@ from __future__ import unicode_literals +from django.db import models from django.core.cache import cache from couchdbkit.ext.django.schema import * from mygpo.podcasts.models import Podcast from mygpo.utils import iterate_together +from mygpo.core.models import UpdateInfoModel, OrderedModel from mygpo.core.proxy import DocumentABCMeta @@ -79,6 +81,23 @@ class Category(Document): return '%s (+%d variants)' % (self.label, len(self.spellings)) -class ExamplePodcasts(Document): - podcast_ids = StringListProperty() - updated = DateTimeProperty() +class ExamplePodcastsManager(models.Manager): + """ Manager fo the ExamplePodcast model """ + + def get_podcasts(self): + """ The example podcasts """ + return Podcast.objects.filter(examplepodcast__isnull=False)\ + .order_by('examplepodcast__order') + + +class ExamplePodcast(UpdateInfoModel, OrderedModel): + """ Example podcasts returned by the API """ + + podcast = models.ForeignKey(Podcast) + + objects = ExamplePodcastsManager() + + class Meta(OrderedModel.Meta): + unique_together = [ + ('order', ) + ] diff --git a/mygpo/podcasts/models.py b/mygpo/podcasts/models.py index 56c25d06..062c69ee 100644 --- a/mygpo/podcasts/models.py +++ b/mygpo/podcasts/models.py @@ -13,7 +13,7 @@ from uuidfield import UUIDField from mygpo import utils from mygpo.core.models import (TwitterModel, UUIDModel, GenericManager, - UpdateInfoModel) + UpdateInfoModel, OrderedModel) import logging logger = logging.getLogger(__name__) @@ -317,19 +317,6 @@ class TagsMixin(models.Model): abstract = True -class OrderedModel(models.Model): - """ A model that can be ordered - - The implementing Model must make sure that 'order' is sufficiently unique - """ - - order = models.PositiveSmallIntegerField() - - class Meta: - abstract = True - ordering = ['order'] - - class PodcastGroup(UUIDModel, TitleModel, SlugsMixin): """ Groups multiple podcasts together """ -- 2.11.4.GIT