From 462074664e6452d7d065d407320e0a9ecb8c7c74 Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Sun, 25 Oct 2015 20:53:51 +0000 Subject: [PATCH 01/12] Removed azure uninstall --- .gitignore | 1 + Dockerfile | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index b68b21f..4f4b50d 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ build/* _working/* static/CACHE/* dss/localsettings.py +dss/localsettings.py.dev dss/storagesettings.py dss/celery_settings.py dss.conf diff --git a/Dockerfile b/Dockerfile index ed49c85..f6e5191 100644 --- a/Dockerfile +++ b/Dockerfile @@ -19,10 +19,9 @@ ADD . /code/ RUN apt-get update && apt-get install -y sox lame vim \ libboost-program-options-dev libsox-fmt-mp3 postgresql-client rsync openssh-client -RUN pip uninstall azure RUN pip install -r requirements.txt RUN adduser --disabled-password --gecos '' djworker RUN chown djworker /files -R RUN chown djworker /srv/logs -R -RUN export PATH=$PATH:/mnt/bin/ \ No newline at end of file +RUN export PATH=$PATH:/mnt/bin/ From bd10dce7f4614d45f5e2f706106232d210d20bf7 Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Wed, 28 Oct 2015 20:45:47 +0000 Subject: [PATCH 02/12] Moved secrets to env file --- api/views.py | 2 +- dss/celeryconf.py | 2 -- dss/settings.py | 30 ++++++++++++++++++++++++++++++ spa/models/mix.py | 6 +++--- 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/api/views.py b/api/views.py index ca58883..fae35c7 100755 --- a/api/views.py +++ b/api/views.py @@ -217,7 +217,7 @@ class PartialMixUploadView(views.APIView): ( tasks.create_waveform_task.s(input_file, uid) | tasks.upload_to_cdn_task.subtask(('mp3', uid, 'mixes'), immutable=True) | - tasks.upload_to_cdn_task.subtask(('png', uid, 'waveforms'), immutable=True) | + tasks.upload_to_cdn_task.subtask (('png', uid, 'waveforms'), immutable=True) | tasks.notify_subscriber.subtask((session_id, uid), immutable=True) ).delay() logger.debug("Waveform task started") diff --git a/dss/celeryconf.py b/dss/celeryconf.py index 8499c10..5a1a57a 100644 --- a/dss/celeryconf.py +++ b/dss/celeryconf.py @@ -1,5 +1,3 @@ - - import os import logging diff --git a/dss/settings.py b/dss/settings.py index 305ee76..837b219 100755 --- a/dss/settings.py +++ b/dss/settings.py @@ -4,6 +4,7 @@ import mimetypes from datetime import timedelta from django.core.urlresolvers import reverse_lazy from django.conf import global_settings +from dss import storagesettings from utils import here @@ -211,3 +212,32 @@ JWT_AUTH = { 'JWT_ALLOW_REFRESH': True, 'JWT_REFRESH_EXPIRATION_DELTA': timedelta(days=30), } + +""" static settings """ +CDN_URL = storagesettings.AZURE_ITEM_BASE_URL +MIXIMAGE_URL = '{0}miximages/'.format(CDN_URL) +WAVEFORM_URL = '{0}waveforms/'.format(CDN_URL) +STREAM_URL = '{0}mixes/'.format(CDN_URL) +AUDIO_URL = '{0}mixes/'.format(CDN_URL) + +MEDIA_URL = 'http://home.bitchmints.com/DSSMedia/' # '{0}media/'.format(CDN_URL) + +NOTIFICATIONS_FROM_ADDRESS = "admin@deepsouthsounds.com" + +CORS_ORIGIN_ALLOW_ALL = True +CORS_ALLOW_CREDENTIALS = True +CORS_ALLOW_HEADERS = ( + 'x-requested-with', + 'content-type', + 'cache-control', + 'accept', + 'origin', + 'authorization', + + 'upload-hash', + 'session-id', + 'auth-backend', + 'x-csrftoken' +) + +""" End static settings """ \ No newline at end of file diff --git a/spa/models/mix.py b/spa/models/mix.py index 743dc3c..679f747 100755 --- a/spa/models/mix.py +++ b/spa/models/mix.py @@ -103,7 +103,7 @@ class Mix(BaseModel): self.clean_image('mix_image', Mix) # Check for the unlikely event that the waveform has been generated - if cdn.file_exists('{0}{1}.png'.format(localsettings.WAVEFORM_URL, self.uid)): + if cdn.file_exists('{0}{1}.png'.format(settings.WAVEFORM_URL, self.uid)): self.waveform_generated = True try: self.duration = mp3_length(self.get_absolute_path()) @@ -153,12 +153,12 @@ class Mix(BaseModel): def get_waveform_url(self, waveform_type=""): # TODO: Design better flow for this sort of thing - if not self.waveform_generated and cdn.file_exists('{0}{1}.png'.format(localsettings.WAVEFORM_URL, self.uid)): + if not self.waveform_generated and cdn.file_exists('{0}{1}.png'.format(settings.WAVEFORM_URL, self.uid)): self.waveform_generated = True self.save() if self.waveform_generated: - waveform_root = localsettings.WAVEFORM_URL \ + waveform_root = settings.WAVEFORM_URL \ if hasattr(localsettings, 'WAVEFORM_URL') else "%swaveforms" % settings.MEDIA_URL From 0b5995a11e88183756f020e25eb07a79289a267d Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Wed, 28 Oct 2015 21:07:06 +0000 Subject: [PATCH 03/12] Added localsettings --- .gitignore | 1 - dss/localsettings.py | 52 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100755 dss/localsettings.py diff --git a/.gitignore b/.gitignore index 4f4b50d..ba820fb 100644 --- a/.gitignore +++ b/.gitignore @@ -11,7 +11,6 @@ media/* build/* _working/* static/CACHE/* -dss/localsettings.py dss/localsettings.py.dev dss/storagesettings.py dss/celery_settings.py diff --git a/dss/localsettings.py b/dss/localsettings.py new file mode 100755 index 0000000..ed46508 --- /dev/null +++ b/dss/localsettings.py @@ -0,0 +1,52 @@ +import os + +DEBUG = True +DSS_TEMP_PATH = os.environ.get('DSS_TEMP_PATH', '/tmp/') +DSS_LAME_PATH = os.environ.get('DSS_LAME_PATH', '/usr/bin/sox') +DSS_WAVE_PATH = os.environ.get('DSS_WAVE_PATH', + '/home/fergalm/Dropbox/development/deepsouthsounds.com/dss.lib/wav2png/bin/Linux/wav2png') +GEOIP_PATH = os.environ.get('GEOIP_PATH', '/home/fergalm/Dropbox/Private/deepsouthsounds.com/working/geolite') + +DATABASE_PASSWORD = os.environ.get('DATABASE_PASSWORD', 'deepsouthsounds') +DATABASE_NAME = os.environ.get('DATABASE_NAME', 'deepsouthsounds') +DATABASE_USER = os.environ.get('DATABASE_USER', 'deepsouthsounds') +DATABASE_HOST = os.environ.get('DATABASE_HOST', 'localhost') + +STATIC_URL = '/assets/' +MEDIA_ROOT = os.environ.get('MEDIA_ROOT', '/files/media') +STATIC_ROOT = os.environ.get('STATIC_ROOT', '/files/static') +CACHE_ROOT = os.environ.get('CACHE_ROOT', '/files/cache') + +REDIS_HOST = 'localhost' +BROKER_URL = os.environ.get('BROKER_URL', 'amqp://guest:guest@localhost:5672//') +CELERY_ACCEPT_CONTENT = ['pickle', 'msgpack', 'json'] + +SECRET_KEY = os.environ.get('SECRET_KEY', '') +LIVE_ENABLED = os.environ.get('LIVE_ENABLED', False) + +ICE_HOST = os.environ.get('ICE_HOST', 'localhost') +ICE_MOUNT = os.environ.get('ICE_MOUNT =', 'dss') +ICE_PORT = os.environ.get('ICE_PORT', 8000) + +RADIO_HOST = os.environ.get('RADIO_HOST', 'localhost') +RADIO_PORT = os.environ.get('RADIO_PORT', 8888) + +MANDRILL_API_KEY = os.environ.get('MANDRILL_API_KEY', '') + +SOCIAL_AUTH_FACEBOOK_KEY = os.environ.get('MANDRILL_API_KEY', '') +SOCIAL_AUTH_FACEBOOK_SECRET = os.environ.get('MANDRILL_API_KEY', '') + +SOCIAL_AUTH_TWITTER_KEY = os.environ.get('MANDRILL_API_KEY', '') +SOCIAL_AUTH_TWITTER_SECRET = os.environ.get('MANDRILL_API_KEY', '') + +SOCIAL_AUTH_GOOGLE_OAUTH_KEY = os.environ.get('MANDRILL_API_KEY', '') +SOCIAL_AUTH_GOOGLE_OAUTH_SECRET = os.environ.get('MANDRILL_API_KEY', '') + +SOCIAL_AUTH_GOOGLE_PLUS_KEY = os.environ.get('MANDRILL_API_KEY', '') +SOCIAL_AUTH_GOOGLE_PLUS_SECRET = os.environ.get('MANDRILL_API_KEY', '') + +DSS_DB_BACKUP_KEY = os.environ.get('MANDRILL_API_KEY', '') +DSS_DB_BACKUP_SECRET = os.environ.get('MANDRILL_API_KEY', '') +DSS_DB_BACKUP_TOKEN = os.environ.get('MANDRILL_API_KEY', '') + +AZURE_ACCOUNT_KEY = os.environ.get('MANDRILL_API_KEY', '') From 3f49076251108d4b43966d25d08cfdbc5f78b470 Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Wed, 28 Oct 2015 21:07:29 +0000 Subject: [PATCH 04/12] Mod gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index ba820fb..a1e853a 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ build/* _working/* static/CACHE/* dss/localsettings.py.dev +dss/localsettings.py.docker dss/storagesettings.py dss/celery_settings.py dss.conf From c3a94b2104de626e269f8e5f22bd307119615555 Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Thu, 29 Oct 2015 20:58:53 +0000 Subject: [PATCH 05/12] Added storage settings --- .gitignore | 1 - dss/localsettings.py | 2 ++ dss/settings.py | 1 - dss/storagesettings.py | 6 ++++++ 4 files changed, 8 insertions(+), 2 deletions(-) create mode 100755 dss/storagesettings.py diff --git a/.gitignore b/.gitignore index a1e853a..1ec4988 100644 --- a/.gitignore +++ b/.gitignore @@ -13,7 +13,6 @@ _working/* static/CACHE/* dss/localsettings.py.dev dss/localsettings.py.docker -dss/storagesettings.py dss/celery_settings.py dss.conf dss/debugsettings.py diff --git a/dss/localsettings.py b/dss/localsettings.py index ed46508..9b99123 100755 --- a/dss/localsettings.py +++ b/dss/localsettings.py @@ -17,6 +17,8 @@ MEDIA_ROOT = os.environ.get('MEDIA_ROOT', '/files/media') STATIC_ROOT = os.environ.get('STATIC_ROOT', '/files/static') CACHE_ROOT = os.environ.get('CACHE_ROOT', '/files/cache') +MEDIA_URL = os.environ.get('MEDIA_URL', 'http://deepsouthsounds.com/media') # '{0}media/'.format(CDN_URL) + REDIS_HOST = 'localhost' BROKER_URL = os.environ.get('BROKER_URL', 'amqp://guest:guest@localhost:5672//') CELERY_ACCEPT_CONTENT = ['pickle', 'msgpack', 'json'] diff --git a/dss/settings.py b/dss/settings.py index 837b219..099c0b5 100755 --- a/dss/settings.py +++ b/dss/settings.py @@ -220,7 +220,6 @@ WAVEFORM_URL = '{0}waveforms/'.format(CDN_URL) STREAM_URL = '{0}mixes/'.format(CDN_URL) AUDIO_URL = '{0}mixes/'.format(CDN_URL) -MEDIA_URL = 'http://home.bitchmints.com/DSSMedia/' # '{0}media/'.format(CDN_URL) NOTIFICATIONS_FROM_ADDRESS = "admin@deepsouthsounds.com" diff --git a/dss/storagesettings.py b/dss/storagesettings.py new file mode 100755 index 0000000..2e30c6b --- /dev/null +++ b/dss/storagesettings.py @@ -0,0 +1,6 @@ +from dss import localsettings + +AZURE_ACCOUNT_NAME = 'dsscdn' +AZURE_CONTAINER = 'media' +AZURE_ACCOUNT_KEY = localsettings.AZURE_ACCOUNT_KEY +AZURE_ITEM_BASE_URL = 'https://dsscdn.blob.core.windows.net/' From 6e0b118cd8329e08ee73b15b9231b6c04f45447d Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Thu, 29 Oct 2015 21:52:06 +0000 Subject: [PATCH 06/12] Fixed waveform url --- dss/localsettings.py | 2 +- spa/models/mix.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/dss/localsettings.py b/dss/localsettings.py index 9b99123..61aae0e 100755 --- a/dss/localsettings.py +++ b/dss/localsettings.py @@ -17,7 +17,7 @@ MEDIA_ROOT = os.environ.get('MEDIA_ROOT', '/files/media') STATIC_ROOT = os.environ.get('STATIC_ROOT', '/files/static') CACHE_ROOT = os.environ.get('CACHE_ROOT', '/files/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://deepsouthsounds.com/media/') # '{0}media/'.format(CDN_URL) REDIS_HOST = 'localhost' BROKER_URL = os.environ.get('BROKER_URL', 'amqp://guest:guest@localhost:5672//') diff --git a/spa/models/mix.py b/spa/models/mix.py index 679f747..bde24ac 100755 --- a/spa/models/mix.py +++ b/spa/models/mix.py @@ -159,8 +159,7 @@ class Mix(BaseModel): if self.waveform_generated: waveform_root = settings.WAVEFORM_URL \ - if hasattr(localsettings, - 'WAVEFORM_URL') else "%swaveforms" % settings.MEDIA_URL + if hasattr(settings, 'WAVEFORM_URL') else "%swaveforms" % settings.MEDIA_URL ret = "%s/%s%s.%s" % (waveform_root, self.uid, waveform_type, "png") return url.urlclean(ret) From 124a3c31bd66eae7ff2796826883993e00fcd3de Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Fri, 30 Oct 2015 22:12:43 +0000 Subject: [PATCH 07/12] Fixed broken keys --- dss/localsettings.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/dss/localsettings.py b/dss/localsettings.py index 61aae0e..1455792 100755 --- a/dss/localsettings.py +++ b/dss/localsettings.py @@ -23,7 +23,7 @@ REDIS_HOST = 'localhost' BROKER_URL = os.environ.get('BROKER_URL', 'amqp://guest:guest@localhost:5672//') CELERY_ACCEPT_CONTENT = ['pickle', 'msgpack', 'json'] -SECRET_KEY = os.environ.get('SECRET_KEY', '') +SECRET_KEY = os.environ.get('SECRET_KEY', 'AAA') LIVE_ENABLED = os.environ.get('LIVE_ENABLED', False) ICE_HOST = os.environ.get('ICE_HOST', 'localhost') @@ -35,20 +35,20 @@ RADIO_PORT = os.environ.get('RADIO_PORT', 8888) MANDRILL_API_KEY = os.environ.get('MANDRILL_API_KEY', '') -SOCIAL_AUTH_FACEBOOK_KEY = os.environ.get('MANDRILL_API_KEY', '') -SOCIAL_AUTH_FACEBOOK_SECRET = os.environ.get('MANDRILL_API_KEY', '') +SOCIAL_AUTH_FACEBOOK_KEY = os.environ.get('SOCIAL_AUTH_FACEBOOK_KEY', '') +SOCIAL_AUTH_FACEBOOK_SECRET = os.environ.get('SOCIAL_AUTH_FACEBOOK_SECRET', '') -SOCIAL_AUTH_TWITTER_KEY = os.environ.get('MANDRILL_API_KEY', '') -SOCIAL_AUTH_TWITTER_SECRET = os.environ.get('MANDRILL_API_KEY', '') +SOCIAL_AUTH_TWITTER_KEY = os.environ.get('SOCIAL_AUTH_TWITTER_KEY', '') +SOCIAL_AUTH_TWITTER_SECRET = os.environ.get('SOCIAL_AUTH_TWITTER_SECRET', '') -SOCIAL_AUTH_GOOGLE_OAUTH_KEY = os.environ.get('MANDRILL_API_KEY', '') -SOCIAL_AUTH_GOOGLE_OAUTH_SECRET = os.environ.get('MANDRILL_API_KEY', '') +SOCIAL_AUTH_GOOGLE_OAUTH_KEY = os.environ.get('SOCIAL_AUTH_GOOGLE_OAUTH_KEY', '') +SOCIAL_AUTH_GOOGLE_OAUTH_SECRET = os.environ.get('SOCIAL_AUTH_GOOGLE_OAUTH_SECRET', '') -SOCIAL_AUTH_GOOGLE_PLUS_KEY = os.environ.get('MANDRILL_API_KEY', '') -SOCIAL_AUTH_GOOGLE_PLUS_SECRET = os.environ.get('MANDRILL_API_KEY', '') +SOCIAL_AUTH_GOOGLE_PLUS_KEY = os.environ.get('SOCIAL_AUTH_GOOGLE_PLUS_KEY', '') +SOCIAL_AUTH_GOOGLE_PLUS_SECRET = os.environ.get('SOCIAL_AUTH_GOOGLE_PLUS_SECRET', '') -DSS_DB_BACKUP_KEY = os.environ.get('MANDRILL_API_KEY', '') -DSS_DB_BACKUP_SECRET = os.environ.get('MANDRILL_API_KEY', '') -DSS_DB_BACKUP_TOKEN = os.environ.get('MANDRILL_API_KEY', '') +DSS_DB_BACKUP_KEY = os.environ.get('DSS_DB_BACKUP_KEY', '') +DSS_DB_BACKUP_SECRET = os.environ.get('DSS_DB_BACKUP_SECRET', '') +DSS_DB_BACKUP_TOKEN = os.environ.get('DSS_DB_BACKUP_TOKEN', '') -AZURE_ACCOUNT_KEY = os.environ.get('MANDRILL_API_KEY', '') +AZURE_ACCOUNT_KEY = os.environ.get('AZURE_ACCOUNT_KEY', '') From a38401efe2a80120fe1b8928721028653b53c3a0 Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Fri, 30 Oct 2015 22:47:04 +0000 Subject: [PATCH 08/12] Added redis host to settings --- dss/localsettings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dss/localsettings.py b/dss/localsettings.py index 1455792..9c82de2 100755 --- a/dss/localsettings.py +++ b/dss/localsettings.py @@ -19,7 +19,7 @@ CACHE_ROOT = os.environ.get('CACHE_ROOT', '/files/cache') MEDIA_URL = os.environ.get('MEDIA_URL', 'http://deepsouthsounds.com/media/') # '{0}media/'.format(CDN_URL) -REDIS_HOST = 'localhost' +REDIS_HOST = os.environ.get('REDIS_HOST', 'localhost') BROKER_URL = os.environ.get('BROKER_URL', 'amqp://guest:guest@localhost:5672//') CELERY_ACCEPT_CONTENT = ['pickle', 'msgpack', 'json'] From 08241d31272d31999bc59b3da30aec7eeb9b63b1 Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Sun, 1 Nov 2015 16:13:00 +0000 Subject: [PATCH 09/12] Changed azure import --- spa/management/commands/get_avatars.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spa/management/commands/get_avatars.py b/spa/management/commands/get_avatars.py index 32d71de..e8cdf30 100755 --- a/spa/management/commands/get_avatars.py +++ b/spa/management/commands/get_avatars.py @@ -1,7 +1,7 @@ +from azure.storage.blob import BlobService import urllib.request, urllib.error, urllib.parse from allauth.socialaccount.models import SocialAccount -from azure.storage import BlobService from django.core.files.base import File from django.core.files.temp import NamedTemporaryFile from django.core.management.base import NoArgsCommand From d53c90486e94bc38cd7bc1d8c536749159ba9006 Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Sun, 1 Nov 2015 17:02:43 +0000 Subject: [PATCH 10/12] Settings changes --- .gitignore | 4 +- dss/localsettings.initial.py | 41 --------- dss/localsettings.py | 55 +++++++++++ dss/pipelinesettings.py | 91 ------------------- dss/settings.py | 7 +- dss/storagesettings.py | 6 ++ dss/test_settings.py | 10 -- .../__init__.cpython-34.pyc.139657446244720 | 0 spa/models/blog.py | 10 ++ 9 files changed, 73 insertions(+), 151 deletions(-) delete mode 100755 dss/localsettings.initial.py create mode 100644 dss/localsettings.py delete mode 100755 dss/pipelinesettings.py create mode 100644 dss/storagesettings.py delete mode 100755 dss/test_settings.py delete mode 100644 spa/models/__pycache__/__init__.cpython-34.pyc.139657446244720 create mode 100644 spa/models/blog.py diff --git a/.gitignore b/.gitignore index b68b21f..4558bcb 100644 --- a/.gitignore +++ b/.gitignore @@ -11,9 +11,7 @@ media/* build/* _working/* static/CACHE/* -dss/localsettings.py -dss/storagesettings.py -dss/celery_settings.py +dss/devsettings.py dss.conf dss/debugsettings.py mysql diff --git a/dss/localsettings.initial.py b/dss/localsettings.initial.py deleted file mode 100755 index 0867673..0000000 --- a/dss/localsettings.initial.py +++ /dev/null @@ -1,41 +0,0 @@ -import os - -DEBUG = True -if os.name == 'posix': - DSS_TEMP_PATH = "/tmp/" - DSS_LAME_PATH = "sox" - DSS_WAVE_PATH = "wav2png" -else: - DSS_TEMP_PATH = "d:\\temp\\" - DSS_LAME_PATH = "D:\\Apps\\lame\\lame.exe" - DSS_WAVE_PATH = "d:\\Apps\\waveformgen.exe" - -DATABASE_NAME = 'deepsouthsounds' -DATABASE_USER = 'deepsouthsounds' -DATABASE_PASSWORD = '' -# DATABASE_HOST = '' - -PIPELINE_YUI_BINARY = "" -FACEBOOK_APP_SECRET = '' - -JS_SETTINGS = { - 'CHAT_HOST': "ext-test.deepsouthsounds.com:8081", - 'API_URL': "/api/v1/", - 'LIVE_STREAM_URL': "radio.deepsouthsounds.com", - 'LIVE_STREAM_PORT': "8000", - 'LIVE_STREAM_MOUNT': "mp3", - 'DEFAULT_AUDIO_VOLUME': "50", - 'SM_DEBUG_MODE': DEBUG, - 'LIVE_STREAM_INFO_URL': "radio.deepsouthsounds.com:8000/mp3" -} -""" -WAVEFORM_URL = 'http://waveforms.podnoms.com/' -IMAGE_URL = 'http://images.podnoms.com/' -STATIC_URL = 'http://static.podnoms.com/' -""" -IMAGE_URL = 'http://ext-test.deepsouthsounds.com:8000/media/' -GOOGLE_ANALYTICS_CODE = '' -SENDFILE_BACKEND = 'sendfile.backends.development' -#SENDFILE_BACKEND = 'sendfile.backends.xsendfile' -#SENDFILE_BACKEND = 'sendfile.backends.nginx' - diff --git a/dss/localsettings.py b/dss/localsettings.py new file mode 100644 index 0000000..e14e7b0 --- /dev/null +++ b/dss/localsettings.py @@ -0,0 +1,55 @@ +import os +from dss import devsettings + +DEBUG = True +DSS_TEMP_PATH = os.environ.get('DSS_TEMP_PATH', '/tmp/') +DSS_LAME_PATH = os.environ.get('DSS_LAME_PATH', '/usr/bin/sox') +DSS_WAVE_PATH = os.environ.get('DSS_WAVE_PATH', + '/home/fergalm/Dropbox/development/deepsouthsounds.com/dss.lib/wav2png/bin/Linux/wav2png') +GEOIP_PATH = os.environ.get('GEOIP_PATH', '/home/fergalm/Dropbox/Private/deepsouthsounds.com/working/geolite') + +DATABASE_PASSWORD = os.environ.get('DATABASE_PASSWORD', 'deepsouthsounds') +DATABASE_NAME = os.environ.get('DATABASE_NAME', 'deepsouthsounds') +DATABASE_USER = os.environ.get('DATABASE_USER', 'deepsouthsounds') +DATABASE_HOST = os.environ.get('DATABASE_HOST', 'localhost') + +STATIC_URL = '/assets/' +MEDIA_ROOT = os.environ.get('MEDIA_ROOT', '/files/media') +STATIC_ROOT = os.environ.get('STATIC_ROOT', '/files/static') +CACHE_ROOT = os.environ.get('CACHE_ROOT', '/files/cache') + +MEDIA_URL = os.environ.get('MEDIA_URL', 'http://deepsouthsounds.com/media/') # '{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//') +CELERY_ACCEPT_CONTENT = ['pickle', 'msgpack', 'json'] + +SECRET_KEY = os.environ.get('SECRET_KEY', devsettings.SECRET_KEY) +LIVE_ENABLED = os.environ.get('LIVE_ENABLED', False) + +ICE_HOST = os.environ.get('ICE_HOST', 'localhost') +ICE_MOUNT = os.environ.get('ICE_MOUNT =', 'dss') +ICE_PORT = os.environ.get('ICE_PORT', 8000) + +RADIO_HOST = os.environ.get('RADIO_HOST', 'localhost') +RADIO_PORT = os.environ.get('RADIO_PORT', 8888) + +MANDRILL_API_KEY = os.environ.get('MANDRILL_API_KEY', '') + +SOCIAL_AUTH_FACEBOOK_KEY = os.environ.get('SOCIAL_AUTH_FACEBOOK_KEY', '') +SOCIAL_AUTH_FACEBOOK_SECRET = os.environ.get('SOCIAL_AUTH_FACEBOOK_SECRET', '') + +SOCIAL_AUTH_TWITTER_KEY = os.environ.get('SOCIAL_AUTH_TWITTER_KEY', '') +SOCIAL_AUTH_TWITTER_SECRET = os.environ.get('SOCIAL_AUTH_TWITTER_SECRET', '') + +SOCIAL_AUTH_GOOGLE_OAUTH_KEY = os.environ.get('SOCIAL_AUTH_GOOGLE_OAUTH_KEY', '') +SOCIAL_AUTH_GOOGLE_OAUTH_SECRET = os.environ.get('SOCIAL_AUTH_GOOGLE_OAUTH_SECRET', '') + +SOCIAL_AUTH_GOOGLE_PLUS_KEY = os.environ.get('SOCIAL_AUTH_GOOGLE_PLUS_KEY', '') +SOCIAL_AUTH_GOOGLE_PLUS_SECRET = os.environ.get('SOCIAL_AUTH_GOOGLE_PLUS_SECRET', '') + +DSS_DB_BACKUP_KEY = os.environ.get('DSS_DB_BACKUP_KEY', '') +DSS_DB_BACKUP_SECRET = os.environ.get('DSS_DB_BACKUP_SECRET', '') +DSS_DB_BACKUP_TOKEN = os.environ.get('DSS_DB_BACKUP_TOKEN', '') + +AZURE_ACCOUNT_KEY = os.environ.get('AZURE_ACCOUNT_KEY', '') diff --git a/dss/pipelinesettings.py b/dss/pipelinesettings.py deleted file mode 100755 index e107b52..0000000 --- a/dss/pipelinesettings.py +++ /dev/null @@ -1,91 +0,0 @@ -iPIPELINE_TEMPLATE_FUNC = "_.template" - -PIPELINE_COMPILERS = ( - 'pipeline.compilers.coffee.CoffeeScriptCompiler', -) - -PIPELINE_CSS = { - 'css': { - 'source_filenames': ( - 'css/dss.overrides.css', - - 'css/ace/dropzone.css', - 'css/ace/uncompressed/jquery.gritter.css', - 'css/ace/uncompressed/bootstrap.css', - 'css/ace/uncompressed/ace.css', - 'css/ace/uncompressed/ace-ie.css', - 'css/ace/uncompressed/ace-skins.css', - 'css/ace/uncompressed/font-awesome.css', - 'css/ace/uncompressed/fullcalendar.css', - 'css/ace/uncompressed/bootstrap-editable.css', - - 'css/jasny-bootstrap.css', - 'css/select2.css', - 'css/jquery.fileupload-ui.css', - 'css/peneloplay.css', - 'css/toastr.css', - 'css/dss.main.css', - ), - 'output_filename': 'css/site.css' - } -} - -PIPELINE_JS = { - 'templates': { - 'source_filenames': ( - 'js/dss/templates/*.jst', - ), - 'variant': 'datauri', - 'output_filename': 'js/t.js', - }, - - 'lib': { - 'source_filenames': ( - 'js/lib/jquery.js', - 'js/lib/jquery-ui.js', - - 'js/lib/moment.js', - 'js/lib/typeahead.js', - - 'js/lib/sm/soundmanager2.js', - - 'js/lib/underscore.js', - 'js/lib/underscore.templatehelpers.js', - 'js/lib/backbone.js', - 'js/lib/backbone.syphon.js', - 'js/lib/backbone.associations.js', - 'js/lib/backbone.marionette.js', - - 'js/lib/ace/uncompressed/bootstrap.js', - 'js/lib/ace/uncompressed/ace.js', - 'js/lib/ace/uncompressed/ace-elements.js', - 'js/lib/ace/uncompressed/select2.js', - 'js/lib/ace/uncompressed/fuelux/fuelux.wizard.js', - 'js/lib/ace/ace/elements.wizard.js', - 'js/lib/ace/uncompressed/bootstrap-wysiwyg.js', - 'js/lib/ace/uncompressed/jquery.gritter.js', - 'js/lib/ace/uncompressed/dropzone.js', - 'js/lib/ace/uncompressed/fullcalendar.js', - 'js/lib/ace/uncompressed/x-editable/bootstrap-editable.js', - 'js/lib/ace/uncompressed/x-editable/ace-editable.js', - - 'js/lib/ajaxfileupload.js', - 'js/lib/jasny.fileinput.js', - 'js/lib/jquery.fileupload.js', - 'js/lib/jquery.fileupload-process.js', - 'js/lib/jquery.fileupload-audio.js', - 'js/lib/jquery.fileupload-video.js', - 'js/lib/jquery.fileupload-validate.js', - 'js/lib/jquery.fileupload-ui.js', - 'js/lib/jquery.fileupload-image.js', - 'js/lib/jquery.iframe-transport.js', - 'js/lib/jquery.ui.widget.js', - 'js/lib/toastr.js', - - 'js/dss/*.coffee', - 'js/dss/**/*.coffee', - 'js/dss/apps/**/**/*.coffee', - ), - 'output_filename': 'js/a.js', - }, -} diff --git a/dss/settings.py b/dss/settings.py index 305ee76..fd0f69a 100755 --- a/dss/settings.py +++ b/dss/settings.py @@ -168,12 +168,7 @@ if DEBUG: REALTIME_HEADERS = { 'content-type': 'application/json' } -TEST_RUNNER = 'django_nose.NoseTestSuiteRunner' -if 'test' in sys.argv: - try: - from .test_settings import * - except ImportError: - pass + REST_FRAMEWORK = { # Use hyperlinked styles by default. diff --git a/dss/storagesettings.py b/dss/storagesettings.py new file mode 100644 index 0000000..2e30c6b --- /dev/null +++ b/dss/storagesettings.py @@ -0,0 +1,6 @@ +from dss import localsettings + +AZURE_ACCOUNT_NAME = 'dsscdn' +AZURE_CONTAINER = 'media' +AZURE_ACCOUNT_KEY = localsettings.AZURE_ACCOUNT_KEY +AZURE_ITEM_BASE_URL = 'https://dsscdn.blob.core.windows.net/' diff --git a/dss/test_settings.py b/dss/test_settings.py deleted file mode 100755 index 5fc6de2..0000000 --- a/dss/test_settings.py +++ /dev/null @@ -1,10 +0,0 @@ -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': 'dss_test.db', - 'USER': '', - 'PASSWORD': '', - 'HOST': '', - 'PORT': '', - } -} diff --git a/spa/models/__pycache__/__init__.cpython-34.pyc.139657446244720 b/spa/models/__pycache__/__init__.cpython-34.pyc.139657446244720 deleted file mode 100644 index e69de29..0000000 diff --git a/spa/models/blog.py b/spa/models/blog.py new file mode 100644 index 0000000..641e93b --- /dev/null +++ b/spa/models/blog.py @@ -0,0 +1,10 @@ +from spa.models import BaseModel, UserProfile +from django.db import models + + +class Blog(BaseModel): + user = models.ForeignKey(UserProfile, null=True, blank=True) + date_created = models.DateField(auto_now=True) + + title = models.CharField(max_length=1024) + body = models.TextField() From fcfc1044c0284fccaaecc1e8a8474d51c6f2846c Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Sun, 1 Nov 2015 17:19:51 +0000 Subject: [PATCH 11/12] Initial scaffolding --- api/serializers.py | 5 +++++ api/urls.py | 1 + api/views.py | 6 ++++++ dss/localsettings.py | 37 +++++++++++++++---------------------- spa/migrations/0017_blog.py | 29 +++++++++++++++++++++++++++++ spa/models/__init__.py | 1 + 6 files changed, 57 insertions(+), 22 deletions(-) create mode 100644 spa/migrations/0017_blog.py diff --git a/api/serializers.py b/api/serializers.py index ab65b0b..a26cba4 100755 --- a/api/serializers.py +++ b/api/serializers.py @@ -6,6 +6,7 @@ from dss import settings from spa import models from spa.models import Activity, Message from spa.models.activity import ActivityDownload, ActivityPlay +from spa.models.blog import Blog from spa.models.genre import Genre from spa.models.notification import Notification from spa.models.show import Show @@ -509,3 +510,7 @@ class ShowSerializer(serializers.ModelSerializer): ) """ + +class BlogSerializer(serializers.ModelSerializer): + class Meta: + model = Blog diff --git a/api/urls.py b/api/urls.py index 2bee4ff..8d6c68b 100755 --- a/api/urls.py +++ b/api/urls.py @@ -23,6 +23,7 @@ router.register(r'activity', views.ActivityViewSet, base_name='activity') router.register(r'genre', views.GenreViewSet, base_name='genre') router.register(r'messages', views.MessageViewSet, base_name='messages') router.register(r'shows', views.ShowViewSet, base_name='shows') +router.register(r'blog', views.BlogViewSet, base_name='shows') class DebugView(APIView): diff --git a/api/views.py b/api/views.py index fae35c7..f8c3d4d 100755 --- a/api/views.py +++ b/api/views.py @@ -20,6 +20,7 @@ from api import serializers from dss import settings from spa import tasks from spa.models import Message +from spa.models.blog import Blog from spa.models.genre import Genre from spa.models.activity import ActivityPlay from spa.models.mix import Mix @@ -348,3 +349,8 @@ class ShowViewSet(viewsets.ModelViewSet): return Response(status=HTTP_400_BAD_REQUEST, data='Performer not found') except Exception as ex: return Response(status=HTTP_500_INTERNAL_SERVER_ERROR, data=ex) + + +class BlogViewSet(viewsets.ModelViewSet): + queryset = Blog.objects.all() + serializer_class = serializers.BlogSerializer() \ No newline at end of file diff --git a/dss/localsettings.py b/dss/localsettings.py index 798cb03..5940763 100644 --- a/dss/localsettings.py +++ b/dss/localsettings.py @@ -1,8 +1,5 @@ import os -<<<<<<< HEAD from dss import devsettings -======= ->>>>>>> master DEBUG = True DSS_TEMP_PATH = os.environ.get('DSS_TEMP_PATH', '/tmp/') @@ -17,9 +14,9 @@ DATABASE_USER = os.environ.get('DATABASE_USER', 'deepsouthsounds') DATABASE_HOST = os.environ.get('DATABASE_HOST', 'localhost') STATIC_URL = '/assets/' -MEDIA_ROOT = os.environ.get('MEDIA_ROOT', '/files/media') -STATIC_ROOT = os.environ.get('STATIC_ROOT', '/files/static') -CACHE_ROOT = os.environ.get('CACHE_ROOT', '/files/cache') +MEDIA_ROOT = os.environ.get('MEDIA_ROOT', '/home/fergalm/Dropbox/development/deepsouthsounds.com/cache/media') +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) @@ -27,11 +24,7 @@ REDIS_HOST = os.environ.get('REDIS_HOST', 'localhost') BROKER_URL = os.environ.get('BROKER_URL', 'amqp://guest:guest@localhost:5672//') CELERY_ACCEPT_CONTENT = ['pickle', 'msgpack', 'json'] -<<<<<<< HEAD SECRET_KEY = os.environ.get('SECRET_KEY', devsettings.SECRET_KEY) -======= -SECRET_KEY = os.environ.get('SECRET_KEY', 'AAA') ->>>>>>> master LIVE_ENABLED = os.environ.get('LIVE_ENABLED', False) ICE_HOST = os.environ.get('ICE_HOST', 'localhost') @@ -43,20 +36,20 @@ RADIO_PORT = os.environ.get('RADIO_PORT', 8888) MANDRILL_API_KEY = os.environ.get('MANDRILL_API_KEY', '') -SOCIAL_AUTH_FACEBOOK_KEY = os.environ.get('SOCIAL_AUTH_FACEBOOK_KEY', '') -SOCIAL_AUTH_FACEBOOK_SECRET = os.environ.get('SOCIAL_AUTH_FACEBOOK_SECRET', '') +SOCIAL_AUTH_FACEBOOK_KEY = os.environ.get('SOCIAL_AUTH_FACEBOOK_KEY', devsettings.SOCIAL_AUTH_FACEBOOK_KEY) +SOCIAL_AUTH_FACEBOOK_SECRET = os.environ.get('SOCIAL_AUTH_FACEBOOK_SECRET', devsettings.SOCIAL_AUTH_FACEBOOK_SECRET) -SOCIAL_AUTH_TWITTER_KEY = os.environ.get('SOCIAL_AUTH_TWITTER_KEY', '') -SOCIAL_AUTH_TWITTER_SECRET = os.environ.get('SOCIAL_AUTH_TWITTER_SECRET', '') +SOCIAL_AUTH_TWITTER_KEY = os.environ.get('SOCIAL_AUTH_TWITTER_KEY', devsettings.SOCIAL_AUTH_TWITTER_KEY) +SOCIAL_AUTH_TWITTER_SECRET = os.environ.get('SOCIAL_AUTH_TWITTER_SECRET', devsettings.SOCIAL_AUTH_TWITTER_SECRET) -SOCIAL_AUTH_GOOGLE_OAUTH_KEY = os.environ.get('SOCIAL_AUTH_GOOGLE_OAUTH_KEY', '') -SOCIAL_AUTH_GOOGLE_OAUTH_SECRET = os.environ.get('SOCIAL_AUTH_GOOGLE_OAUTH_SECRET', '') +SOCIAL_AUTH_GOOGLE_OAUTH_KEY = os.environ.get('SOCIAL_AUTH_GOOGLE_OAUTH_KEY', devsettings.SOCIAL_AUTH_GOOGLE_OAUTH_KEY) +SOCIAL_AUTH_GOOGLE_OAUTH_SECRET = os.environ.get('SOCIAL_AUTH_GOOGLE_OAUTH_SECRET', devsettings.SOCIAL_AUTH_GOOGLE_OAUTH_SECRET) -SOCIAL_AUTH_GOOGLE_PLUS_KEY = os.environ.get('SOCIAL_AUTH_GOOGLE_PLUS_KEY', '') -SOCIAL_AUTH_GOOGLE_PLUS_SECRET = os.environ.get('SOCIAL_AUTH_GOOGLE_PLUS_SECRET', '') +SOCIAL_AUTH_GOOGLE_PLUS_KEY = os.environ.get('SOCIAL_AUTH_GOOGLE_PLUS_KEY', devsettings.SOCIAL_AUTH_GOOGLE_PLUS_KEY) +SOCIAL_AUTH_GOOGLE_PLUS_SECRET = os.environ.get('SOCIAL_AUTH_GOOGLE_PLUS_SECRET', devsettings.SOCIAL_AUTH_GOOGLE_PLUS_SECRET) -DSS_DB_BACKUP_KEY = os.environ.get('DSS_DB_BACKUP_KEY', '') -DSS_DB_BACKUP_SECRET = os.environ.get('DSS_DB_BACKUP_SECRET', '') -DSS_DB_BACKUP_TOKEN = os.environ.get('DSS_DB_BACKUP_TOKEN', '') +DSS_DB_BACKUP_KEY = os.environ.get('DSS_DB_BACKUP_KEY', devsettings.DSS_DB_BACKUP_KEY) +DSS_DB_BACKUP_SECRET = os.environ.get('DSS_DB_BACKUP_SECRET', devsettings.DSS_DB_BACKUP_SECRET) +DSS_DB_BACKUP_TOKEN = os.environ.get('DSS_DB_BACKUP_TOKEN', devsettings.DSS_DB_BACKUP_TOKEN) -AZURE_ACCOUNT_KEY = os.environ.get('AZURE_ACCOUNT_KEY', '') +AZURE_ACCOUNT_KEY = os.environ.get('AZURE_ACCOUNT_KEY', devsettings.AZURE_ACCOUNT_KEY) diff --git a/spa/migrations/0017_blog.py b/spa/migrations/0017_blog.py new file mode 100644 index 0000000..180474c --- /dev/null +++ b/spa/migrations/0017_blog.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', '0016_remove_show_recurrence_rrule'), + ] + + operations = [ + migrations.CreateModel( + name='Blog', + fields=[ + ('id', models.AutoField(auto_created=True, verbose_name='ID', primary_key=True, serialize=False)), + ('object_created', models.DateTimeField(auto_now_add=True)), + ('object_updated', models.DateTimeField(auto_now=True, db_index=True)), + ('date_created', models.DateField(auto_now=True)), + ('title', models.CharField(max_length=1024)), + ('body', models.TextField()), + ('user', models.ForeignKey(blank=True, to='spa.UserProfile', null=True)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/spa/models/__init__.py b/spa/models/__init__.py index 338e671..221098c 100755 --- a/spa/models/__init__.py +++ b/spa/models/__init__.py @@ -16,3 +16,4 @@ from .release import Release from .playlist import Playlist from .message import Message from .show import Show +from .blog import Blog From 2c38baf18a74f73a555fd95f94e00649cff95056 Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Sun, 8 Nov 2015 19:17:18 +0000 Subject: [PATCH 12/12] Stuff --- api/serializers.py | 3 ++ api/views.py | 6 ++- core/radio/ice_scrobbler.py | 1 - dss/localsettings.py | 2 +- dss/psa.py | 1 - dss/urls.py | 3 +- spa/blog/__init__.py | 0 spa/blog/urls.py | 7 ++++ spa/blog/views.py | 58 +++++++++++++++++++++++++++ spa/migrations/0018_blog_published.py | 19 +++++++++ spa/migrations/0019_blog_slug.py | 20 +++++++++ spa/migrations/0020_blogcomment.py | 29 ++++++++++++++ spa/models/blog.py | 16 ++++++++ spa/pipeline.py | 34 ---------------- templates/blog/entry.html | 18 +++++++++ templates/blog/index.html | 19 +++++++++ 16 files changed, 197 insertions(+), 39 deletions(-) create mode 100644 spa/blog/__init__.py create mode 100755 spa/blog/urls.py create mode 100755 spa/blog/views.py create mode 100644 spa/migrations/0018_blog_published.py create mode 100644 spa/migrations/0019_blog_slug.py create mode 100644 spa/migrations/0020_blogcomment.py delete mode 100755 spa/pipeline.py create mode 100644 templates/blog/entry.html create mode 100644 templates/blog/index.html 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