summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/src/admin.py6
-rw-r--r--app/src/migrations/0001_initial.py76
-rw-r--r--app/src/migrations/0002_auto_20160329_2107.py19
-rw-r--r--app/src/migrations/__init__.py0
-rw-r--r--app/src/models.py2
-rw-r--r--app/src/views.py10
-rw-r--r--app/syndication/medium.py14
-rw-r--r--app/syndication/models.py16
-rw-r--r--app/syndication/templatetags/__init__.py0
-rw-r--r--app/syndication/templatetags/facebook_processor.py23
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)