diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/src/admin.py | 6 | ||||
-rw-r--r-- | app/src/migrations/0001_initial.py | 76 | ||||
-rw-r--r-- | app/src/migrations/0002_auto_20160329_2107.py | 19 | ||||
-rw-r--r-- | app/src/migrations/__init__.py | 0 | ||||
-rw-r--r-- | app/src/models.py | 2 | ||||
-rw-r--r-- | app/src/views.py | 10 | ||||
-rw-r--r-- | app/syndication/medium.py | 14 | ||||
-rw-r--r-- | app/syndication/models.py | 16 | ||||
-rw-r--r-- | app/syndication/templatetags/__init__.py | 0 | ||||
-rw-r--r-- | app/syndication/templatetags/facebook_processor.py | 23 |
10 files changed, 150 insertions, 16 deletions
diff --git a/app/src/admin.py b/app/src/admin.py index 76f09a2..25237ff 100644 --- a/app/src/admin.py +++ b/app/src/admin.py @@ -1,5 +1,5 @@ from django.contrib import admin -from .models import Topic, Entry, Book +from .models import Topic, Post, Book from utils.widgets import LGEntryForm @@ -31,7 +31,7 @@ class BookAdmin(admin.ModelAdmin): ) -class EntryAdmin(admin.ModelAdmin): +class PostAdmin(admin.ModelAdmin): form = LGEntryForm list_display = ('title', 'pub_date', 'enable_comments', 'status') list_filter = ('pub_date', 'enable_comments', 'status') @@ -57,4 +57,4 @@ class EntryAdmin(admin.ModelAdmin): admin.site.register(Book, BookAdmin) admin.site.register(Topic, TopicAdmin) -admin.site.register(Entry, EntryAdmin) +admin.site.register(Post, PostAdmin) diff --git a/app/src/migrations/0001_initial.py b/app/src/migrations/0001_initial.py new file mode 100644 index 0000000..1f672ee --- /dev/null +++ b/app/src/migrations/0001_initial.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9 on 2016-03-29 21:06 +from __future__ import unicode_literals + +from django.db import migrations, models +import src.models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Book', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=200)), + ('image', models.FileField(blank=True, null=True, upload_to=src.models.get_upload_path)), + ('slug', models.SlugField(unique_for_date='pub_date')), + ('body_html', models.TextField(blank=True)), + ('body_markdown', models.TextField()), + ('pub_date', models.DateTimeField(verbose_name='Date published')), + ('last_updated', models.DateTimeField(auto_now=True)), + ('status', models.IntegerField(choices=[(0, 'Draft'), (1, 'Published')], default=0)), + ('price', models.FloatField()), + ('price_sale', models.FloatField()), + ('meta_description', models.CharField(blank=True, max_length=256, null=True)), + ('pages', models.DecimalField(blank=True, decimal_places=0, max_digits=3, null=True)), + ('template_name', models.CharField(choices=[('details/src_book.html', 'Default'), ('details/src_book_2.html', 'Book Two')], default='details/src_book.html', max_length=200)), + ], + options={ + 'get_latest_by': 'pub_date', + 'ordering': ('-pub_date',), + }, + ), + migrations.CreateModel( + name='Entry', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=200)), + ('slug', models.SlugField(unique_for_date='pub_date')), + ('body_html', models.TextField(blank=True)), + ('body_markdown', models.TextField()), + ('pub_date', models.DateTimeField(verbose_name='Date published')), + ('last_updated', models.DateTimeField(auto_now=True)), + ('enable_comments', models.BooleanField(default=False)), + ('has_code', models.BooleanField(default=False)), + ('status', models.IntegerField(choices=[(0, 'Draft'), (1, 'Published')], default=0)), + ('meta_description', models.CharField(blank=True, max_length=256, null=True)), + ('template_name', models.IntegerField(choices=[(0, 'default')], default=0)), + ], + options={ + 'get_latest_by': 'pub_date', + 'ordering': ('-pub_date',), + 'verbose_name_plural': 'entries', + }, + ), + migrations.CreateModel( + name='Topic', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=60)), + ('slug', models.SlugField()), + ('pluralized_name', models.CharField(max_length=60)), + ], + ), + migrations.AddField( + model_name='entry', + name='topics', + field=models.ManyToManyField(blank=True, to='src.Topic'), + ), + ] diff --git a/app/src/migrations/0002_auto_20160329_2107.py b/app/src/migrations/0002_auto_20160329_2107.py new file mode 100644 index 0000000..25f5e4e --- /dev/null +++ b/app/src/migrations/0002_auto_20160329_2107.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9 on 2016-03-29 21:07 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('src', '0001_initial'), + ] + + operations = [ + migrations.RenameModel( + old_name='Entry', + new_name='Post', + ), + ] diff --git a/app/src/migrations/__init__.py b/app/src/migrations/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/app/src/migrations/__init__.py diff --git a/app/src/models.py b/app/src/models.py index 2b36fab..ce78c24 100644 --- a/app/src/models.py +++ b/app/src/models.py @@ -25,7 +25,7 @@ class Topic(models.Model): return datetime.datetime.now() -class Entry(models.Model): +class Post(models.Model): title = models.CharField(max_length=200) slug = models.SlugField(unique_for_date='pub_date') body_html = models.TextField(blank=True) diff --git a/app/src/views.py b/app/src/views.py index 85a5242..f2466eb 100644 --- a/app/src/views.py +++ b/app/src/views.py @@ -6,7 +6,7 @@ from django.conf import settings from paypal.standard.forms import PayPalPaymentsForm -from .models import Entry, Topic, Book +from .models import Post, Topic, Book class BookListView(ListView): @@ -48,11 +48,11 @@ class SrcListView(ListView): template_name = "archives/src_home.html" def queryset(self): - return Entry.objects.filter(status__exact=1) + return Post.objects.filter(status__exact=1) class EntryDetailView(DetailView): - model = Entry + model = Post template_name = "details/src_entry.html" slug_field = "slug" @@ -69,7 +69,7 @@ class TopicListView(ListView): template_name = 'archives/src_home.html' def queryset(self): - return Entry.objects.filter(topics__slug=self.kwargs['slug']) + return Post.objects.filter(topics__slug=self.kwargs['slug']) def get_context_data(self, **kwargs): # Call the base implementation first to get a context @@ -85,4 +85,4 @@ class SrcRSSFeedView(Feed): description_template = 'feeds/blog_description.html' def items(self): - return Entry.objects.filter(status__exact=1).order_by('-pub_date')[:10] + return Post.objects.filter(status__exact=1).order_by('-pub_date')[:10] diff --git a/app/syndication/medium.py b/app/syndication/medium.py index 9787a1a..de157af 100644 --- a/app/syndication/medium.py +++ b/app/syndication/medium.py @@ -16,16 +16,16 @@ def post_to_medium(item): client = Client(application_id=settings.MEDIUM_CLIENT_ID, application_secret=settings.MEDIUM_CLIENT_SECRET) client.access_token = settings.MEDIUM_INT_TOKEN user = client.get_current_user() - head = '<p><i>This was originally posted <a href="https://luxagraf.net%s" rel="canonical">on my own site</a>.</i></p>' % item.content_object.get_absolute_url() - body = "%s %s" % (head, absolute_urls_for_syndication(item.content_object.body_html)) + head = '<p><i>This was originally posted <a href="https://luxagraf.net%s" rel="canonical">on my own site</a>.</i></p>' % item.get_absolute_url() + body = "%s %s" % (head, absolute_urls_for_syndication(item.body_html)) # Create a post. post = client.create_post( user_id=user["id"], - title=item.content_object.title, + title=item.title, content=body, content_format="html", - publish_status="draft" + publish_status="public", + canonicalUrl="https://luxagraf.net%s" % item.get_absolute_url(), + license="all-rights-reserved" ) - item.rel_link = post["url"] - item.status = 2 - item.save() + return post["url"] diff --git a/app/syndication/models.py b/app/syndication/models.py index 5856de1..a58da8d 100644 --- a/app/syndication/models.py +++ b/app/syndication/models.py @@ -1,6 +1,10 @@ from django.db import models from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.fields import GenericForeignKey +from django.db.models.signals import post_save +from django.dispatch import receiver + +from .medium import post_to_medium class Syndicate(models.Model): @@ -25,3 +29,15 @@ class SyndicatedItem(models.Model): def __str__(self): return self.content_object.title + + +@receiver(post_save, sender=SyndicatedItem) +def post_save_events(sender, update_fields, created, instance, **kwargs): + if instance.status == 1: + for item in instance.syndicate.all(): + if item.name == "Medium": + instance.rel_link = post_to_medium(instance.content_object) + instance.status = 2 + post_save.disconnect(post_save_events, sender=SyndicatedItem) + instance.save() + post_save.connect(post_save_events, sender=SyndicatedItem) diff --git a/app/syndication/templatetags/__init__.py b/app/syndication/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/app/syndication/templatetags/__init__.py diff --git a/app/syndication/templatetags/facebook_processor.py b/app/syndication/templatetags/facebook_processor.py new file mode 100644 index 0000000..d940838 --- /dev/null +++ b/app/syndication/templatetags/facebook_processor.py @@ -0,0 +1,23 @@ +from django import template +from bs4 import BeautifulSoup + +from .medium import absolute_urls_for_syndication + +register = template.Library() + + +def wrap_image_tags(text): + soup = BeautifulSoup(text, 'lxml') + for img in soup.find_all('img'): + if img.parent.name != "figure": + new_tag = soup.new_tag('figure') + img.wrap(new_tag) + return soup + + +def facebook_processor(text): + ia = absolute_urls_for_syndication(text) + ia = wrap_image_tags(ia) + return ia + +register.filter('facebook_processor', facebook_processor) |