diff --git a/api/serializers.py b/api/serializers.py index a26cba4..2e295de 100755 --- a/api/serializers.py +++ b/api/serializers.py @@ -512,5 +512,8 @@ class ShowSerializer(serializers.ModelSerializer): class BlogSerializer(serializers.ModelSerializer): + slug = serializers.ReadOnlyField(required=False) + user = InlineUserProfileSerializer(read_only=True) + class Meta: model = Blog diff --git a/api/views.py b/api/views.py index f8c3d4d..84c30c6 100755 --- a/api/views.py +++ b/api/views.py @@ -353,4 +353,8 @@ class ShowViewSet(viewsets.ModelViewSet): class BlogViewSet(viewsets.ModelViewSet): queryset = Blog.objects.all() - serializer_class = serializers.BlogSerializer() \ No newline at end of file + serializer_class = serializers.BlogSerializer + lookup_field = 'slug' + + def perform_create(self, serializer): + serializer.save(user=self.request.user.userprofile) diff --git a/core/radio/ice_scrobbler.py b/core/radio/ice_scrobbler.py index 9be7b93..5e7d591 100644 --- a/core/radio/ice_scrobbler.py +++ b/core/radio/ice_scrobbler.py @@ -1,6 +1,5 @@ import requests from bs4 import BeautifulSoup -from requests.packages.urllib3.connection import ConnectionError from dss import settings diff --git a/dss/localsettings.py b/dss/localsettings.py index 5940763..e94c5de 100644 --- a/dss/localsettings.py +++ b/dss/localsettings.py @@ -18,7 +18,7 @@ MEDIA_ROOT = os.environ.get('MEDIA_ROOT', '/home/fergalm/Dropbox/development/dee STATIC_ROOT = os.environ.get('STATIC_ROOT', '/home/fergalm/Dropbox/development/deepsouthsounds.com/cache/static') CACHE_ROOT = os.environ.get('CACHE_ROOT', '/home/fergalm/Dropbox/development/deepsouthsounds.com/cache/cache') -MEDIA_URL = os.environ.get('MEDIA_URL', 'http://deepsouthsounds.com/media/') # '{0}media/'.format(CDN_URL) +MEDIA_URL = os.environ.get('MEDIA_URL', 'http://localhost/DSSMedia/') # '{0}media/'.format(CDN_URL) REDIS_HOST = os.environ.get('REDIS_HOST', 'localhost') BROKER_URL = os.environ.get('BROKER_URL', 'amqp://guest:guest@localhost:5672//') diff --git a/dss/psa.py b/dss/psa.py index dff67ff..1b72895 100755 --- a/dss/psa.py +++ b/dss/psa.py @@ -19,7 +19,6 @@ SOCIAL_AUTH_PIPELINE = ( 'social.pipeline.user.get_username', 'social.pipeline.social_auth.associate_by_email', 'social.pipeline.user.create_user', - 'spa.pipeline.save_profile', 'social.pipeline.social_auth.associate_user', 'social.pipeline.social_auth.load_extra_data', 'social.pipeline.user.user_details' diff --git a/dss/urls.py b/dss/urls.py index 78fdc2f..c6c308a 100755 --- a/dss/urls.py +++ b/dss/urls.py @@ -11,7 +11,8 @@ urlpatterns = patterns( url(r'^admin/', include(admin.site.urls)), url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), (r'^grappelli/', include('grappelli.urls')), - (r'^social/', include('spa.social.urls')), + (r'^__redir/blog/', include('spa.blog.urls')), + (r'^__redir/social/', include('spa.social.urls')), (r'^arges/', include('spa.social.urls')), url(r'', include('user_sessions.urls', 'user_sessions')), url(r'^', include('api.urls')), diff --git a/spa/blog/__init__.py b/spa/blog/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/spa/blog/urls.py b/spa/blog/urls.py new file mode 100755 index 0000000..d4eb282 --- /dev/null +++ b/spa/blog/urls.py @@ -0,0 +1,7 @@ +from django.conf.urls import patterns, url + +urlpatterns = patterns( + '', + url(r'^blog/(?P[\w\d_.-]+)/?$', 'spa.blog.views.entry', name='blog_entry_slug'), + url(r'^$', 'spa.blog.views.index', name='blog_index') +) diff --git a/spa/blog/views.py b/spa/blog/views.py new file mode 100755 index 0000000..478f108 --- /dev/null +++ b/spa/blog/views.py @@ -0,0 +1,58 @@ +import urllib.request, urllib.error, urllib.parse +import logging + +from django.conf.urls import url +from django.contrib.sites.models import Site +from django.core.urlresolvers import resolve +from django.http import Http404 +from django.shortcuts import render_to_response +from django.template.context import RequestContext +import requests +from allauth.socialaccount.models import SocialToken +from core.utils.url import wrap_full + +from dss import settings +from spa.models import Playlist, Blog +from spa.models.mix import Mix +from spa.models.userprofile import UserProfile + +logger = logging.getLogger(__name__) + +""" + Handles callbacks from non javascript browsers +""" + + +def _getPayload(request): + return { + "app_id": settings.FACEBOOK_APP_ID, + "site_url": 'http://%s' % Site.objects.get_current().domain, + "site_image_url": '%s/img/dss-large.png' % settings.STATIC_URL, + } + + +def entry(request, slug): + try: + blog = Blog.objects.get(slug=slug) + extras = { + "content": blog.body, + } + payload = dict(list(_getPayload(request).items()) + list(extras.items())) + response = render_to_response( + 'blog/entry.html', + payload, + context_instance=RequestContext(request) + ) + return response + except Blog.DoesNotExist: + raise Http404 + except Exception as ex: + logger.error(ex) + + +def index(request): + response = render_to_response( + "blog/index.html", + _getPayload(request), + context_instance=RequestContext(request)) + return response diff --git a/spa/migrations/0018_blog_published.py b/spa/migrations/0018_blog_published.py new file mode 100644 index 0000000..af98541 --- /dev/null +++ b/spa/migrations/0018_blog_published.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('spa', '0017_blog'), + ] + + operations = [ + migrations.AddField( + model_name='blog', + name='published', + field=models.BooleanField(default=False), + ), + ] diff --git a/spa/migrations/0019_blog_slug.py b/spa/migrations/0019_blog_slug.py new file mode 100644 index 0000000..2879276 --- /dev/null +++ b/spa/migrations/0019_blog_slug.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('spa', '0018_blog_published'), + ] + + operations = [ + migrations.AddField( + model_name='blog', + name='slug', + field=models.SlugField(default='arse'), + preserve_default=False, + ), + ] diff --git a/spa/migrations/0020_blogcomment.py b/spa/migrations/0020_blogcomment.py new file mode 100644 index 0000000..bef0d7d --- /dev/null +++ b/spa/migrations/0020_blogcomment.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('spa', '0019_blog_slug'), + ] + + operations = [ + migrations.CreateModel( + name='BlogComment', + fields=[ + ('id', models.AutoField(primary_key=True, auto_created=True, serialize=False, verbose_name='ID')), + ('object_created', models.DateTimeField(auto_now_add=True)), + ('object_updated', models.DateTimeField(auto_now=True, db_index=True)), + ('comment', models.CharField(max_length=1024)), + ('date_created', models.DateField(auto_now_add=True)), + ('blog', models.ForeignKey(to='spa.Blog')), + ('user', models.ForeignKey(null=True, to='spa.UserProfile', blank=True)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/spa/models/blog.py b/spa/models/blog.py index 641e93b..90543b3 100644 --- a/spa/models/blog.py +++ b/spa/models/blog.py @@ -1,3 +1,4 @@ +from core.utils.url import unique_slugify from spa.models import BaseModel, UserProfile from django.db import models @@ -5,6 +6,21 @@ from django.db import models class Blog(BaseModel): user = models.ForeignKey(UserProfile, null=True, blank=True) date_created = models.DateField(auto_now=True) + published = models.BooleanField(default=False) + slug = models.SlugField() title = models.CharField(max_length=1024) body = models.TextField() + + def save(self, force_insert=False, force_update=False, using=None, update_fields=None): + if not self.id: + self.slug = unique_slugify(self, self.title) + + super(Blog, self).save(force_insert, force_update, using, update_fields) + + +class BlogComment(BaseModel): + blog = models.ForeignKey(Blog) + user = models.ForeignKey(UserProfile, null=True, blank=True) + comment = models.CharField(max_length=1024) + date_created = models.DateField(auto_now_add=True) diff --git a/spa/pipeline.py b/spa/pipeline.py deleted file mode 100755 index d46d4be..0000000 --- a/spa/pipeline.py +++ /dev/null @@ -1,34 +0,0 @@ -from django.core.files.base import ContentFile -from requests import request, ConnectionError - - -def save_profile(backend, user, response, is_new, *args, **kwargs): - if backend.name == 'google-oauth2': - if response.get('image') and response['image'].get('url'): - url = response['image'].get('url') - profile = user.userprofile - - try: - response = request('GET', url) - response.raise_for_status() - except ConnectionError: - pass - else: - profile.avatar_image.save('', - ContentFile(response.content), - save=False) - profile.save() - elif backend.name == 'facebook': - profile = user.userprofile - url = 'http://graph.facebook.com/{0}/picture'.format(response['id']) - try: - response = request('GET', url, params={'type': 'large'}) - response.raise_for_status() - except ConnectionError: - pass - else: - profile.avatar_image.save('', - ContentFile(response.content), - save=False - ) - profile.save() diff --git a/templates/blog/entry.html b/templates/blog/entry.html new file mode 100644 index 0000000..02556c8 --- /dev/null +++ b/templates/blog/entry.html @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + {{ content }} + + \ No newline at end of file diff --git a/templates/blog/index.html b/templates/blog/index.html new file mode 100644 index 0000000..7b259f0 --- /dev/null +++ b/templates/blog/index.html @@ -0,0 +1,19 @@ + + + + + + + + + + + + + +

Blog Index

+{{ content }} + + \ No newline at end of file