mirror of
https://github.com/fergalmoran/dss.api.git
synced 2025-12-22 09:18:13 +00:00
Loadsa stuff
This commit is contained in:
1
___api/__init__.py
Normal file
1
___api/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
__author__ = 'fergalm'
|
||||||
16
___api/serializers.py
Normal file
16
___api/serializers.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
from rest_framework import serializers
|
||||||
|
from spa import models
|
||||||
|
|
||||||
|
|
||||||
|
class MixSerializer(serializers.ModelSerializer):
|
||||||
|
user = serializers.SlugRelatedField(slug_field='slug', read_only=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = models.Mix
|
||||||
|
|
||||||
|
|
||||||
|
class UserProfileSerializer(serializers.ModelSerializer):
|
||||||
|
mixes = serializers.HyperlinkedRelatedField(queryset=models.Mix.objects.all(), view_name='mix-detail', many=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = models.UserProfile
|
||||||
12
___api/urls.py
Executable file
12
___api/urls.py
Executable file
@@ -0,0 +1,12 @@
|
|||||||
|
from ___api import views
|
||||||
|
from django.conf.urls import patterns, url, include
|
||||||
|
from rest_framework.routers import DefaultRouter
|
||||||
|
|
||||||
|
router = DefaultRouter()
|
||||||
|
router.register(r'user', views.UserProfileViewSet)
|
||||||
|
router.register(r'mix', views.MixViewSet)
|
||||||
|
|
||||||
|
urlpatterns = patterns(
|
||||||
|
'',
|
||||||
|
url(r'^', include(router.urls)),
|
||||||
|
)
|
||||||
27
___api/views.py
Normal file
27
___api/views.py
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
from rest_framework import viewsets
|
||||||
|
from rest_framework.permissions import IsAuthenticatedOrReadOnly
|
||||||
|
|
||||||
|
from ___api import serializers
|
||||||
|
from spa import models
|
||||||
|
|
||||||
|
|
||||||
|
class MixViewSet(viewsets.ModelViewSet):
|
||||||
|
queryset = models.Mix.objects.all()
|
||||||
|
serializer_class = serializers.MixSerializer
|
||||||
|
|
||||||
|
filter_fields = (
|
||||||
|
'waveform_generated',
|
||||||
|
'slug',
|
||||||
|
'user',
|
||||||
|
'is_featured',
|
||||||
|
)
|
||||||
|
|
||||||
|
class UserProfileViewSet(viewsets.ModelViewSet):
|
||||||
|
queryset = models.UserProfile.objects.all().order_by('-id') # annotate(mix_count=Count('mixes')).order_by('-mix_count')
|
||||||
|
serializer_class = serializers.UserProfileSerializer
|
||||||
|
|
||||||
|
permission_classes = (IsAuthenticatedOrReadOnly,)
|
||||||
|
lookup_field = 'slug'
|
||||||
|
filter_fields = (
|
||||||
|
'slug',
|
||||||
|
)
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
#update comments user_id to be userprofile_id
|
#update poorly saved descriptions
|
||||||
UPDATE spa_comment SET user_id = spa_userprofile.id FROM spa_userprofile WHERE spa_comment.user_id = spa_userprofile.user_id
|
update spa_userprofile set description = '' where description like('Just another%')
|
||||||
|
|
||||||
|
|
||||||
#import the avatars
|
#import the avatars
|
||||||
python manage.py get_avatars
|
python manage.py get_avatars
|
||||||
|
|
||||||
#jiggle the waveforms
|
#jiggle the waveforms
|
||||||
python manage.py zoom_convert_waveforms
|
python manage.py zoom_convert_waveforms
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import datetime
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework.status import HTTP_400_BAD_REQUEST, HTTP_201_CREATED
|
from rest_framework.status import HTTP_400_BAD_REQUEST, HTTP_201_CREATED
|
||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
@@ -16,8 +17,8 @@ class ActivityPlayHelper(ActivityHelper):
|
|||||||
mix = Mix.objects.get(slug=self.request.QUERY_PARAMS.get('id'))
|
mix = Mix.objects.get(slug=self.request.QUERY_PARAMS.get('id'))
|
||||||
mix.add_play(request.user)
|
mix.add_play(request.user)
|
||||||
data = {
|
data = {
|
||||||
'user': request.user.get_nice_name() if request.user.is_authenticated() else settings.DEFAULT_USER_NAME,
|
'user': request.user.userprofile.get_nice_name() if request.user.is_authenticated() else settings.DEFAULT_USER_NAME,
|
||||||
'date': mix.description
|
'date': datetime.datetime.now()
|
||||||
}
|
}
|
||||||
return Response(data, HTTP_201_CREATED)
|
return Response(data, HTTP_201_CREATED)
|
||||||
except Mix.DoesNotExist:
|
except Mix.DoesNotExist:
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ class LoginException(Exception):
|
|||||||
|
|
||||||
@strategy()
|
@strategy()
|
||||||
def register_by_access_token(request, backend):
|
def register_by_access_token(request, backend):
|
||||||
strat = load_strategy(request)
|
|
||||||
auth = get_authorization_header(request).split()
|
auth = get_authorization_header(request).split()
|
||||||
if not auth or auth[0].lower() != b'social':
|
if not auth or auth[0].lower() != b'social':
|
||||||
raise LoginException("Unable to register_by_access_token: No token header provided")
|
raise LoginException("Unable to register_by_access_token: No token header provided")
|
||||||
@@ -93,7 +92,6 @@ class ObtainUser(APIView):
|
|||||||
model = Token
|
model = Token
|
||||||
|
|
||||||
def get(self, request):
|
def get(self, request):
|
||||||
serializer = self.serializer_class(data=request.DATA)
|
|
||||||
if request.META.get('HTTP_AUTHORIZATION'):
|
if request.META.get('HTTP_AUTHORIZATION'):
|
||||||
|
|
||||||
auth = request.META.get('HTTP_AUTHORIZATION').split()
|
auth = request.META.get('HTTP_AUTHORIZATION').split()
|
||||||
@@ -107,7 +105,7 @@ class ObtainUser(APIView):
|
|||||||
return Response({'id': token.user_id, 'name': token.user.username, 'firstname': token.user.first_name,
|
return Response({'id': token.user_id, 'name': token.user.username, 'firstname': token.user.first_name,
|
||||||
'userRole': 'user', 'token': token.key})
|
'userRole': 'user', 'token': token.key})
|
||||||
else:
|
else:
|
||||||
return Response(serializer.errors, status=status.HTTP_401_UNAUTHORIZED)
|
return Response(status=status.HTTP_401_UNAUTHORIZED)
|
||||||
|
|
||||||
|
|
||||||
class ObtainLogout(APIView):
|
class ObtainLogout(APIView):
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
import json
|
|
||||||
# from django.core.serializers import serialize
|
|
||||||
from django.db.models import Count
|
from django.db.models import Count
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
from core.utils.html import strip_tags
|
||||||
|
|
||||||
from dss import settings
|
from dss import settings
|
||||||
|
from spa import models
|
||||||
from spa.models import Activity
|
from spa.models import Activity
|
||||||
from spa.models.activity import ActivityDownload, ActivityPlay
|
from spa.models.activity import ActivityDownload, ActivityPlay
|
||||||
from spa.models.genre import Genre
|
from spa.models.genre import Genre
|
||||||
@@ -12,41 +13,6 @@ from spa.models.mix import Mix, MixUpdateException
|
|||||||
from spa.models.comment import Comment
|
from spa.models.comment import Comment
|
||||||
|
|
||||||
|
|
||||||
class InlineUserProfileSerializer(serializers.ModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = UserProfile
|
|
||||||
fields = (
|
|
||||||
'slug',
|
|
||||||
'first_name',
|
|
||||||
'last_name',
|
|
||||||
'display_name',
|
|
||||||
'avatar_image',
|
|
||||||
'avatar_image_tiny',
|
|
||||||
)
|
|
||||||
|
|
||||||
first_name = serializers.ReadOnlyField(source='get_first_name')
|
|
||||||
last_name = serializers.ReadOnlyField(source='get_last_name')
|
|
||||||
display_name = serializers.ReadOnlyField(source='get_nice_name')
|
|
||||||
avatar_image = serializers.SerializerMethodField()
|
|
||||||
avatar_image_tiny = serializers.SerializerMethodField()
|
|
||||||
|
|
||||||
def get_avatar_image(self, obj):
|
|
||||||
return obj.get_sized_avatar_image(64, 64)
|
|
||||||
|
|
||||||
def get_avatar_image_tiny(self, obj):
|
|
||||||
return obj.get_sized_avatar_image(32, 32)
|
|
||||||
|
|
||||||
def to_representation(self, instance):
|
|
||||||
if instance.user.is_anonymous():
|
|
||||||
return {
|
|
||||||
'avatar_image': settings.DEFAULT_USER_IMAGE,
|
|
||||||
'display_name': settings.DEFAULT_USER_NAME,
|
|
||||||
'slug': ''
|
|
||||||
}
|
|
||||||
|
|
||||||
return super(serializers.ModelSerializer, self).to_representation(instance)
|
|
||||||
|
|
||||||
|
|
||||||
class InlineMixSerializer(serializers.ModelSerializer):
|
class InlineMixSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Mix
|
model = Mix
|
||||||
@@ -114,7 +80,7 @@ class InlineActivityDownloadSerializer(InlineActivitySerializer):
|
|||||||
|
|
||||||
class MixSerializer(serializers.ModelSerializer):
|
class MixSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Mix
|
model = models.Mix
|
||||||
fields = [
|
fields = [
|
||||||
'id',
|
'id',
|
||||||
'slug',
|
'slug',
|
||||||
@@ -137,13 +103,13 @@ class MixSerializer(serializers.ModelSerializer):
|
|||||||
]
|
]
|
||||||
|
|
||||||
slug = serializers.ReadOnlyField(required=False)
|
slug = serializers.ReadOnlyField(required=False)
|
||||||
user = InlineUserProfileSerializer(many=False, required=False, read_only=True)
|
user = serializers.SlugRelatedField(slug_field='slug', read_only=True)
|
||||||
waveform_url = serializers.ReadOnlyField(source='get_waveform_url')
|
waveform_url = serializers.ReadOnlyField(source='get_waveform_url')
|
||||||
waveform_progress_url = serializers.ReadOnlyField(source='get_waveform_progress_url')
|
waveform_progress_url = serializers.ReadOnlyField(source='get_waveform_progress_url')
|
||||||
mix_image = serializers.ReadOnlyField(source='get_image_url')
|
mix_image = serializers.ReadOnlyField(source='get_image_url')
|
||||||
can_edit = serializers.SerializerMethodField()
|
can_edit = serializers.SerializerMethodField()
|
||||||
|
|
||||||
genres = GenreSerializer(many=True, required=False, read_only=True)
|
genres = GenreSerializer(many=True, required=False, read_only=False)
|
||||||
likes = LikeSerializer(many=True, required=False, read_only=False) # slug_field='slug', many=True, read_only=True)
|
likes = LikeSerializer(many=True, required=False, read_only=False) # slug_field='slug', many=True, read_only=True)
|
||||||
favourites = serializers.SlugRelatedField(slug_field='slug', many=True, read_only=True)
|
favourites = serializers.SlugRelatedField(slug_field='slug', many=True, read_only=True)
|
||||||
plays = InlineActivityPlaySerializer(many=True, read_only=True, source='activity_plays')
|
plays = InlineActivityPlaySerializer(many=True, read_only=True, source='activity_plays')
|
||||||
@@ -175,11 +141,18 @@ class MixSerializer(serializers.ModelSerializer):
|
|||||||
validated_data.pop('likes', None)
|
validated_data.pop('likes', None)
|
||||||
|
|
||||||
# get any likes that aren't in passed bundle
|
# get any likes that aren't in passed bundle
|
||||||
plays = validated_data['downloads']
|
if 'downloads' in validated_data:
|
||||||
|
plays = validated_data['downloads'] or []
|
||||||
for play in plays:
|
for play in plays:
|
||||||
instance.add_play(play)
|
instance.add_play(play)
|
||||||
validated_data.pop('downloads', None)
|
validated_data.pop('downloads', None)
|
||||||
|
|
||||||
|
if 'genres' in validated_data:
|
||||||
|
genres = validated_data['genres'] or []
|
||||||
|
for genre in genres:
|
||||||
|
instance.add_genre(genre)
|
||||||
|
validated_data.pop('genres', None)
|
||||||
|
|
||||||
return super(MixSerializer, self).update(instance, validated_data)
|
return super(MixSerializer, self).update(instance, validated_data)
|
||||||
except MixUpdateException, ex:
|
except MixUpdateException, ex:
|
||||||
raise ex
|
raise ex
|
||||||
@@ -188,7 +161,7 @@ class MixSerializer(serializers.ModelSerializer):
|
|||||||
return super(MixSerializer, self).is_valid(raise_exception)
|
return super(MixSerializer, self).is_valid(raise_exception)
|
||||||
|
|
||||||
def get_avatar_image(self, obj):
|
def get_avatar_image(self, obj):
|
||||||
return obj.user.get_sized_avatar_image(32, 32)
|
return obj.user.get_sized_avatar_image(64, 64)
|
||||||
|
|
||||||
def get_can_edit(self, obj):
|
def get_can_edit(self, obj):
|
||||||
user = self.context['request'].user
|
user = self.context['request'].user
|
||||||
@@ -210,9 +183,55 @@ class MixSerializer(serializers.ModelSerializer):
|
|||||||
return obj.is_liked(user) if user.is_authenticated() else False
|
return obj.is_liked(user) if user.is_authenticated() else False
|
||||||
|
|
||||||
|
|
||||||
|
class InlineUserProfileSerializer(serializers.ModelSerializer):
|
||||||
|
profile_image_small = serializers.SerializerMethodField()
|
||||||
|
profile_image_medium = serializers.SerializerMethodField()
|
||||||
|
profile_image_header = serializers.SerializerMethodField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = UserProfile
|
||||||
|
fields = (
|
||||||
|
'slug',
|
||||||
|
'first_name',
|
||||||
|
'last_name',
|
||||||
|
'display_name',
|
||||||
|
'profile_image_small',
|
||||||
|
'profile_image_medium',
|
||||||
|
'profile_image_header',
|
||||||
|
)
|
||||||
|
|
||||||
|
first_name = serializers.ReadOnlyField(source='get_first_name')
|
||||||
|
last_name = serializers.ReadOnlyField(source='get_last_name')
|
||||||
|
display_name = serializers.ReadOnlyField(source='get_nice_name')
|
||||||
|
|
||||||
|
def get_avatar_image(self, obj):
|
||||||
|
return obj.get_sized_avatar_image(64, 64)
|
||||||
|
|
||||||
|
def get_avatar_image_tiny(self, obj):
|
||||||
|
return obj.get_sized_avatar_image(64, 64)
|
||||||
|
|
||||||
|
def to_representation(self, instance):
|
||||||
|
if instance.user.is_anonymous():
|
||||||
|
return {
|
||||||
|
'avatar_image': settings.DEFAULT_USER_IMAGE,
|
||||||
|
'display_name': settings.DEFAULT_USER_NAME,
|
||||||
|
'slug': ''
|
||||||
|
}
|
||||||
|
|
||||||
|
return super(serializers.ModelSerializer, self).to_representation(instance)
|
||||||
|
|
||||||
|
def get_profile_image_small(self, obj):
|
||||||
|
return obj.get_sized_avatar_image(64, 64)
|
||||||
|
|
||||||
|
def get_profile_image_medium(self, obj):
|
||||||
|
return obj.get_sized_avatar_image(170, 170)
|
||||||
|
|
||||||
|
def get_profile_image_header(self, obj):
|
||||||
|
return obj.get_sized_avatar_image(1200, 150)
|
||||||
|
|
||||||
|
|
||||||
class UserProfileSerializer(serializers.ModelSerializer):
|
class UserProfileSerializer(serializers.ModelSerializer):
|
||||||
roles = serializers.SerializerMethodField()
|
roles = serializers.SerializerMethodField()
|
||||||
mixes = InlineMixSerializer(many=True, required=False)
|
|
||||||
likes = serializers.SlugRelatedField(slug_field='slug', many=True, read_only=True)
|
likes = serializers.SlugRelatedField(slug_field='slug', many=True, read_only=True)
|
||||||
favourites = serializers.SlugRelatedField(slug_field='slug', many=True, read_only=True)
|
favourites = serializers.SlugRelatedField(slug_field='slug', many=True, read_only=True)
|
||||||
following = InlineUserProfileSerializer(many=True, read_only=True)
|
following = InlineUserProfileSerializer(many=True, read_only=True)
|
||||||
@@ -224,6 +243,7 @@ class UserProfileSerializer(serializers.ModelSerializer):
|
|||||||
date_joined = serializers.SerializerMethodField()
|
date_joined = serializers.SerializerMethodField()
|
||||||
last_login = serializers.SerializerMethodField()
|
last_login = serializers.SerializerMethodField()
|
||||||
title = serializers.SerializerMethodField()
|
title = serializers.SerializerMethodField()
|
||||||
|
description = serializers.SerializerMethodField()
|
||||||
profile_image_small = serializers.SerializerMethodField()
|
profile_image_small = serializers.SerializerMethodField()
|
||||||
profile_image_medium = serializers.SerializerMethodField()
|
profile_image_medium = serializers.SerializerMethodField()
|
||||||
profile_image_header = serializers.SerializerMethodField()
|
profile_image_header = serializers.SerializerMethodField()
|
||||||
@@ -246,7 +266,6 @@ class UserProfileSerializer(serializers.ModelSerializer):
|
|||||||
'profile_image_medium',
|
'profile_image_medium',
|
||||||
'profile_image_header',
|
'profile_image_header',
|
||||||
'slug',
|
'slug',
|
||||||
'mixes',
|
|
||||||
'likes',
|
'likes',
|
||||||
'isme',
|
'isme',
|
||||||
'favourites',
|
'favourites',
|
||||||
@@ -258,12 +277,15 @@ class UserProfileSerializer(serializers.ModelSerializer):
|
|||||||
def get_title(self, obj):
|
def get_title(self, obj):
|
||||||
try:
|
try:
|
||||||
if obj.description:
|
if obj.description:
|
||||||
return obj.description[:75] + (obj.description[75:] and '..')
|
return strip_tags(obj.description[:128] + (obj.description[128:] and '..'))
|
||||||
else:
|
else:
|
||||||
return settings.DEFAULT_USER_TITLE
|
return settings.DEFAULT_USER_TITLE
|
||||||
except:
|
except:
|
||||||
return settings.DEFAULT_USER_TITLE
|
return settings.DEFAULT_USER_TITLE
|
||||||
|
|
||||||
|
def get_description(self, obj):
|
||||||
|
return obj.description if obj.description else settings.DEFAULT_USER_TITLE
|
||||||
|
|
||||||
def get_roles(self, obj):
|
def get_roles(self, obj):
|
||||||
return obj.get_roles()
|
return obj.get_roles()
|
||||||
|
|
||||||
@@ -276,15 +298,6 @@ class UserProfileSerializer(serializers.ModelSerializer):
|
|||||||
def get_last_login(self, obj):
|
def get_last_login(self, obj):
|
||||||
return obj.user.last_login
|
return obj.user.last_login
|
||||||
|
|
||||||
def get_profile_image_small(self, obj):
|
|
||||||
return obj.get_sized_avatar_image(32, 32)
|
|
||||||
|
|
||||||
def get_profile_image_medium(self, obj):
|
|
||||||
return obj.get_sized_avatar_image(170, 170)
|
|
||||||
|
|
||||||
def get_profile_image_header(self, obj):
|
|
||||||
return obj.get_sized_avatar_image(1200, 150)
|
|
||||||
|
|
||||||
def get_top_tags(self, obj):
|
def get_top_tags(self, obj):
|
||||||
return list(
|
return list(
|
||||||
Genre.objects.filter(mix__user__slug='fergalmoran').
|
Genre.objects.filter(mix__user__slug='fergalmoran').
|
||||||
@@ -292,11 +305,19 @@ class UserProfileSerializer(serializers.ModelSerializer):
|
|||||||
order_by('-total').
|
order_by('-total').
|
||||||
values('total', 'description', 'slug')[0:3])
|
values('total', 'description', 'slug')[0:3])
|
||||||
|
|
||||||
|
def get_profile_image_small(self, obj):
|
||||||
|
return obj.get_sized_avatar_image(64, 64)
|
||||||
|
|
||||||
|
def get_profile_image_medium(self, obj):
|
||||||
|
return obj.get_sized_avatar_image(170, 170)
|
||||||
|
|
||||||
|
def get_profile_image_header(self, obj):
|
||||||
|
return obj.get_sized_avatar_image(1200, 150)
|
||||||
|
|
||||||
|
|
||||||
class CommentSerializer(serializers.HyperlinkedModelSerializer):
|
class CommentSerializer(serializers.HyperlinkedModelSerializer):
|
||||||
user = serializers.SlugRelatedField(slug_field='slug', read_only=True)
|
user = InlineUserProfileSerializer(source='get_comment_user', read_only=True)
|
||||||
avatar_image = serializers.SerializerMethodField()
|
avatar_image = serializers.SerializerMethodField()
|
||||||
user_display_name = serializers.SerializerMethodField('get_display_name')
|
|
||||||
mix = serializers.PrimaryKeyRelatedField(read_only=True)
|
mix = serializers.PrimaryKeyRelatedField(read_only=True)
|
||||||
can_edit = serializers.SerializerMethodField()
|
can_edit = serializers.SerializerMethodField()
|
||||||
|
|
||||||
@@ -308,27 +329,35 @@ class CommentSerializer(serializers.HyperlinkedModelSerializer):
|
|||||||
'time_index',
|
'time_index',
|
||||||
'date_created',
|
'date_created',
|
||||||
'user',
|
'user',
|
||||||
'user_display_name',
|
|
||||||
'avatar_image',
|
'avatar_image',
|
||||||
'mix',
|
'mix',
|
||||||
'can_edit',
|
'can_edit'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def get_comment_user(self, obj):
|
||||||
|
try:
|
||||||
|
if obj.user is not None:
|
||||||
|
return obj.user.get_nice_name()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return settings.DEFAULT_USER_NAME
|
||||||
|
|
||||||
def get_display_name(self, obj):
|
def get_display_name(self, obj):
|
||||||
if obj.user is not None:
|
if obj.user is not None:
|
||||||
return obj.user.get_nice_name()
|
return obj.user.userprofile.get_nice_name()
|
||||||
else:
|
else:
|
||||||
return settings.DEFAULT_USER_NAME
|
return settings.DEFAULT_USER_NAME
|
||||||
|
|
||||||
def get_avatar_image(self, obj):
|
def get_avatar_image(self, obj):
|
||||||
if obj.user is not None:
|
if obj.user is not None:
|
||||||
return obj.user.get_sized_avatar_image(48, 48)
|
return obj.user.userprofile.get_sized_avatar_image(48, 48)
|
||||||
else:
|
else:
|
||||||
return settings.DEFAULT_USER_IMAGE
|
return settings.DEFAULT_USER_IMAGE
|
||||||
|
|
||||||
def get_can_edit(self, obj):
|
def get_can_edit(self, obj):
|
||||||
user = self.context['request'].user
|
user = self.context['request'].user
|
||||||
if user.is_authenticated():
|
if user is not None and user.is_authenticated():
|
||||||
return user.is_staff or obj.user.id == user.userprofile.id
|
return user.is_staff or obj.user.id == user.userprofile.id
|
||||||
|
|
||||||
return False
|
return False
|
||||||
55
api/urls.py
55
api/urls.py
@@ -1,43 +1,38 @@
|
|||||||
from api.auth import ObtainAuthToken, ObtainUser, ObtainLogout
|
from django.conf.urls import patterns, url, include
|
||||||
from api.activity_helpers import ActivityPlayHelper
|
from rest_framework.routers import DefaultRouter
|
||||||
from api.views import CommentViewSet, MixViewSet, UserProfileViewSet, NotificationViewSet, PartialMixUploadView, \
|
|
||||||
GenreViewSet, ActivityViewSet, HitlistViewset, AttachedImageUploadView, DownloadItemView, SearchResultsView
|
|
||||||
from django.conf.urls import url, patterns, include
|
|
||||||
from rest_framework_nested import routers
|
|
||||||
|
|
||||||
router = routers.SimpleRouter(trailing_slash=True)
|
from api import views, auth, activity_helpers
|
||||||
router.register(r'notification', NotificationViewSet)
|
|
||||||
router.register(r'hitlist', HitlistViewset)
|
|
||||||
router.register(r'comments', CommentViewSet)
|
|
||||||
router.register(r'user', UserProfileViewSet, base_name='userprofile')
|
|
||||||
router.register(r'activity', ActivityViewSet, base_name='activity')
|
|
||||||
|
|
||||||
router.register(r'mix', MixViewSet)
|
router = DefaultRouter() # trailing_slash=True)
|
||||||
mix_router = routers.NestedSimpleRouter(router, r'mix', lookup='mix')
|
|
||||||
mix_router.register('comments', CommentViewSet)
|
router.register(r'user', views.UserProfileViewSet)
|
||||||
|
router.register(r'mix', views.MixViewSet)
|
||||||
|
|
||||||
|
|
||||||
|
router.register(r'notification', views.NotificationViewSet)
|
||||||
|
router.register(r'hitlist', views.HitlistViewSet)
|
||||||
|
router.register(r'comments', views.CommentViewSet)
|
||||||
|
router.register(r'activity', views.ActivityViewSet, base_name='activity')
|
||||||
|
router.register(r'genre', views.GenreViewSet, base_name='genre')
|
||||||
|
|
||||||
"""
|
|
||||||
router.register(r'hitlist', HitlistViewset, base_name='hitlist')
|
|
||||||
router.register(r'notification', NotificationViewSet, base_name='notification')
|
|
||||||
"""
|
|
||||||
router.register(r'genre', GenreViewSet, base_name='genre')
|
|
||||||
urlpatterns = patterns(
|
urlpatterns = patterns(
|
||||||
'',
|
'',
|
||||||
url(r'^', include(router.urls)),
|
url(r'^', include(router.urls)),
|
||||||
url(r'^', include(mix_router.urls)),
|
# url(r'^', include(mix_router.urls)),
|
||||||
url(r'_download/', DownloadItemView.as_view()),
|
url(r'_download/', views.DownloadItemView.as_view()),
|
||||||
url(r'_upload/$', PartialMixUploadView.as_view()),
|
url(r'_upload/$', views.PartialMixUploadView.as_view()),
|
||||||
url(r'_image/$', AttachedImageUploadView.as_view()),
|
url(r'_image/$', views.AttachedImageUploadView.as_view()),
|
||||||
url(r'_search/$', SearchResultsView.as_view()),
|
url(r'_search/$', views.SearchResultsView.as_view()),
|
||||||
url(r'^', include(router.urls)),
|
url(r'^', include(router.urls)),
|
||||||
|
|
||||||
url(r'^login/', ObtainAuthToken.as_view()),
|
url(r'^login/', auth.ObtainAuthToken.as_view()),
|
||||||
url(r'^user/', ObtainUser.as_view()),
|
url(r'^logout/', auth.ObtainLogout.as_view()),
|
||||||
url(r'^logout/', ObtainLogout.as_view()),
|
|
||||||
#url(r'^_tr/', RefreshToken.as_view()),
|
# url(r'^_tr/', RefreshToken.as_view()),
|
||||||
|
url(r'^__user/', auth.ObtainUser.as_view()),
|
||||||
|
|
||||||
|
|
||||||
url(r'^_act/play', ActivityPlayHelper.as_view()),
|
url(r'^_act/play', activity_helpers.ActivityPlayHelper.as_view()),
|
||||||
|
|
||||||
url('', include('social.apps.django_app.urls', namespace='social')),
|
url('', include('social.apps.django_app.urls', namespace='social')),
|
||||||
)
|
)
|
||||||
|
|||||||
62
api/views.py
62
api/views.py
@@ -6,36 +6,41 @@ from django.core.files.base import ContentFile
|
|||||||
from django.core.files.storage import FileSystemStorage
|
from django.core.files.storage import FileSystemStorage
|
||||||
from django.db.models import Count
|
from django.db.models import Count
|
||||||
from django.http.response import HttpResponse
|
from django.http.response import HttpResponse
|
||||||
from django.utils.encoding import smart_str
|
|
||||||
from rest_framework import viewsets
|
from rest_framework import viewsets
|
||||||
from rest_framework import views
|
from rest_framework import views
|
||||||
from rest_framework.decorators import detail_route
|
from rest_framework.decorators import detail_route
|
||||||
|
from rest_framework.permissions import BasePermission
|
||||||
from rest_framework.parsers import FileUploadParser
|
from rest_framework.parsers import FileUploadParser
|
||||||
from rest_framework.permissions import IsAuthenticated, IsAuthenticatedOrReadOnly
|
from rest_framework.permissions import IsAuthenticated, IsAuthenticatedOrReadOnly
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework.status import HTTP_202_ACCEPTED, HTTP_401_UNAUTHORIZED, HTTP_400_BAD_REQUEST, HTTP_404_NOT_FOUND, \
|
from rest_framework.status import HTTP_202_ACCEPTED, HTTP_401_UNAUTHORIZED, HTTP_400_BAD_REQUEST, HTTP_404_NOT_FOUND, \
|
||||||
HTTP_200_OK, HTTP_204_NO_CONTENT
|
HTTP_200_OK, HTTP_204_NO_CONTENT
|
||||||
from rest_framework import filters
|
|
||||||
|
|
||||||
from api.serialisers import MixSerializer, UserProfileSerializer, NotificationSerializer, \
|
from api import serializers
|
||||||
ActivitySerializer, HitlistSerializer, CommentSerializer, GenreSerializer
|
|
||||||
from dss import settings
|
from dss import settings
|
||||||
from core.tasks import create_waveform_task, archive_mix_task
|
from core.tasks import create_waveform_task
|
||||||
from spa.models.genre import Genre
|
from spa.models.genre import Genre
|
||||||
from spa.models.activity import Activity, ActivityPlay
|
from spa.models.activity import ActivityPlay
|
||||||
from spa.models.mix import Mix
|
from spa.models.mix import Mix
|
||||||
from spa.models.comment import Comment
|
from spa.models.comment import Comment
|
||||||
from spa.models.notification import Notification
|
from spa.models.notification import Notification
|
||||||
from spa.models.userprofile import UserProfile
|
from spa.models.userprofile import UserProfile
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class AnonymousWriteUserDelete(BasePermission):
|
||||||
|
def has_permission(self, request, view):
|
||||||
|
return True
|
||||||
|
|
||||||
|
def has_object_permission(self, request, view, obj):
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
class CommentViewSet(viewsets.ModelViewSet):
|
class CommentViewSet(viewsets.ModelViewSet):
|
||||||
queryset = Comment.objects.all()
|
queryset = Comment.objects.all()
|
||||||
serializer_class = CommentSerializer
|
serializer_class = serializers.CommentSerializer
|
||||||
permission_classes = (IsAuthenticatedOrReadOnly,)
|
permission_classes = (AnonymousWriteUserDelete,)
|
||||||
filter_fields = (
|
filter_fields = (
|
||||||
'comment',
|
'comment',
|
||||||
'mix__slug',
|
'mix__slug',
|
||||||
@@ -49,30 +54,45 @@ class CommentViewSet(viewsets.ModelViewSet):
|
|||||||
try:
|
try:
|
||||||
mix = Mix.objects.get(pk=self.request.DATA['mix_id'])
|
mix = Mix.objects.get(pk=self.request.DATA['mix_id'])
|
||||||
if mix is not None:
|
if mix is not None:
|
||||||
serializer.save(mix=mix, user=self.request.user.userprofile)
|
serializer.save(
|
||||||
|
mix=mix,
|
||||||
|
user=self.request.user if self.request.user.is_authenticated() else None
|
||||||
|
)
|
||||||
except Mix.DoesNotExist:
|
except Mix.DoesNotExist:
|
||||||
pass
|
pass
|
||||||
|
except Exception, ex:
|
||||||
|
pass
|
||||||
|
|
||||||
class UserProfileViewSet(viewsets.ModelViewSet):
|
class UserProfileViewSet(viewsets.ModelViewSet):
|
||||||
queryset = UserProfile.objects.annotate(mix_count=Count('mixes')).order_by('-mix_count')
|
queryset = UserProfile.objects.annotate(mix_count=Count('mixes')).order_by('-mix_count')
|
||||||
serializer_class = UserProfileSerializer
|
serializer_class = serializers.UserProfileSerializer
|
||||||
permission_classes = (IsAuthenticatedOrReadOnly,)
|
permission_classes = (IsAuthenticatedOrReadOnly,)
|
||||||
lookup_field = 'slug'
|
lookup_field = 'slug'
|
||||||
filter_fields = (
|
filter_fields = (
|
||||||
'slug',
|
'slug',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
if 'following' in self.request.QUERY_PARAMS:
|
||||||
|
ret = UserProfile.objects.filter(following__slug__in=[self.request.QUERY_PARAMS['following']])
|
||||||
|
elif 'followers' in self.request.QUERY_PARAMS:
|
||||||
|
ret = UserProfile.objects.filter(followers__slug__in=[self.request.QUERY_PARAMS['followers']])
|
||||||
|
else:
|
||||||
|
ret = super(UserProfileViewSet, self).get_queryset()
|
||||||
|
|
||||||
|
return ret
|
||||||
|
|
||||||
|
|
||||||
class MixViewSet(viewsets.ModelViewSet):
|
class MixViewSet(viewsets.ModelViewSet):
|
||||||
queryset = Mix.objects.all()
|
queryset = Mix.objects.all()
|
||||||
serializer_class = MixSerializer
|
serializer_class = serializers.MixSerializer
|
||||||
lookup_field = 'slug'
|
|
||||||
permission_classes = (IsAuthenticatedOrReadOnly,)
|
permission_classes = (IsAuthenticatedOrReadOnly,)
|
||||||
|
lookup_field = 'slug'
|
||||||
|
|
||||||
filter_fields = (
|
filter_fields = (
|
||||||
'waveform_generated',
|
'waveform_generated',
|
||||||
'slug',
|
'slug',
|
||||||
'user',
|
'user__slug',
|
||||||
'is_featured',
|
'is_featured',
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -165,14 +185,14 @@ class PartialMixUploadView(views.APIView):
|
|||||||
raise
|
raise
|
||||||
|
|
||||||
|
|
||||||
class HitlistViewset(viewsets.ModelViewSet):
|
class HitlistViewSet(viewsets.ModelViewSet):
|
||||||
queryset = UserProfile.objects.all().annotate(mix_count=Count('mixes')).order_by('-mix_count')[0:10]
|
queryset = UserProfile.objects.all().annotate(mix_count=Count('mixes')).order_by('-mix_count')[0:10]
|
||||||
serializer_class = HitlistSerializer
|
serializer_class = serializers.HitlistSerializer
|
||||||
|
|
||||||
|
|
||||||
class ActivityViewSet(viewsets.ModelViewSet):
|
class ActivityViewSet(viewsets.ModelViewSet):
|
||||||
queryset = ActivityPlay.objects.all() #select_subclasses()
|
queryset = ActivityPlay.objects.all() # select_subclasses()
|
||||||
serializer_class = ActivitySerializer
|
serializer_class = serializers.ActivitySerializer
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
user = self.request.user
|
user = self.request.user
|
||||||
@@ -194,7 +214,7 @@ class DownloadItemView(views.APIView):
|
|||||||
|
|
||||||
class NotificationViewSet(viewsets.ModelViewSet):
|
class NotificationViewSet(viewsets.ModelViewSet):
|
||||||
queryset = Notification.objects.all()
|
queryset = Notification.objects.all()
|
||||||
serializer_class = NotificationSerializer
|
serializer_class = serializers.NotificationSerializer
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
user = self.request.user
|
user = self.request.user
|
||||||
@@ -206,7 +226,7 @@ class NotificationViewSet(viewsets.ModelViewSet):
|
|||||||
|
|
||||||
class GenreViewSet(viewsets.ModelViewSet):
|
class GenreViewSet(viewsets.ModelViewSet):
|
||||||
queryset = Genre.objects.all()
|
queryset = Genre.objects.all()
|
||||||
serializer_class = GenreSerializer
|
serializer_class = serializers.GenreSerializer
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
if 'q' in self.request.QUERY_PARAMS:
|
if 'q' in self.request.QUERY_PARAMS:
|
||||||
|
|||||||
@@ -1,18 +1,28 @@
|
|||||||
from HTMLParser import HTMLParser
|
from HTMLParser import HTMLParser
|
||||||
|
|
||||||
|
|
||||||
class HTMLStripper(HTMLParser):
|
class HTMLStripper(HTMLParser):
|
||||||
"""
|
"""
|
||||||
Class that cleans HTML, removing all tags and HTML entities.
|
Class that cleans HTML, removing all tags and HTML entities.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.reset()
|
self.reset()
|
||||||
self.fed = []
|
self.fed = []
|
||||||
|
|
||||||
def handle_data(self, d):
|
def handle_data(self, d):
|
||||||
self.fed.append(d)
|
self.fed.append(d)
|
||||||
|
|
||||||
def get_data(self):
|
def get_data(self):
|
||||||
return ''.join(self.fed)
|
return ''.join(self.fed)
|
||||||
|
|
||||||
def strip(self, d):
|
def strip(self, d):
|
||||||
self.reset()
|
self.reset()
|
||||||
self.fed = []
|
self.fed = []
|
||||||
self.feed(d)
|
self.feed(d)
|
||||||
return self.get_data().strip()
|
return self.get_data().strip()
|
||||||
|
|
||||||
|
def strip_tags(html):
|
||||||
|
s = HTMLStripper()
|
||||||
|
s.feed(html)
|
||||||
|
return s.get_data()
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ SOCIAL_AUTH_PIPELINE = (
|
|||||||
'social.pipeline.user.get_username',
|
'social.pipeline.user.get_username',
|
||||||
'social.pipeline.social_auth.associate_by_email',
|
'social.pipeline.social_auth.associate_by_email',
|
||||||
'social.pipeline.user.create_user',
|
'social.pipeline.user.create_user',
|
||||||
'api.pipeline.save_profile',
|
'spa.pipeline.save_profile',
|
||||||
'social.pipeline.social_auth.associate_user',
|
'social.pipeline.social_auth.associate_user',
|
||||||
'social.pipeline.social_auth.load_extra_data',
|
'social.pipeline.social_auth.load_extra_data',
|
||||||
'social.pipeline.user.user_details'
|
'social.pipeline.user.user_details'
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ MIDDLEWARE_CLASSES = (
|
|||||||
# 'htmlmin.middleware.MarkRequestMiddleware',
|
# 'htmlmin.middleware.MarkRequestMiddleware',
|
||||||
'django_user_agents.middleware.UserAgentMiddleware',
|
'django_user_agents.middleware.UserAgentMiddleware',
|
||||||
# 'spa.middleware.uploadify.SWFUploadMiddleware',
|
# 'spa.middleware.uploadify.SWFUploadMiddleware',
|
||||||
#'spa.middleware.sqlprinter.SqlPrintingMiddleware' if DEBUG else None,
|
'spa.middleware.sqlprinter.SqlPrintingMiddleware' if DEBUG else None,
|
||||||
# 'debug_toolbar.middleware.DebugToolbarMiddleware',
|
# 'debug_toolbar.middleware.DebugToolbarMiddleware',
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -216,3 +216,4 @@ DEFAULT_USER_TITLE = 'Just another DSS lover'
|
|||||||
|
|
||||||
|
|
||||||
SITE_NAME = 'Deep South Sounds'
|
SITE_NAME = 'Deep South Sounds'
|
||||||
|
THUMBNAIL_PREFIX = 'cache/_tn/'
|
||||||
|
|||||||
@@ -6,10 +6,6 @@ from dss import settings
|
|||||||
|
|
||||||
admin.autodiscover()
|
admin.autodiscover()
|
||||||
|
|
||||||
# Uncomment the next two lines to enable the admin:
|
|
||||||
# from django.contrib import admin
|
|
||||||
# admin.autodiscover()
|
|
||||||
|
|
||||||
urlpatterns = patterns(
|
urlpatterns = patterns(
|
||||||
'',
|
'',
|
||||||
url(r'^admin/', include(admin.site.urls)),
|
url(r'^admin/', include(admin.site.urls)),
|
||||||
|
|||||||
273
spa/migrations/0070_auto__chg_field_comment_user.py
Normal file
273
spa/migrations/0070_auto__chg_field_comment_user.py
Normal file
@@ -0,0 +1,273 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from south.utils import datetime_utils as datetime
|
||||||
|
from south.db import db
|
||||||
|
from south.v2 import SchemaMigration
|
||||||
|
from django.db import models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(SchemaMigration):
|
||||||
|
|
||||||
|
def forwards(self, orm):
|
||||||
|
|
||||||
|
# Changing field 'Comment.user'
|
||||||
|
db.alter_column(u'spa_comment', 'user_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], null=True))
|
||||||
|
|
||||||
|
def backwards(self, orm):
|
||||||
|
|
||||||
|
# Changing field 'Comment.user'
|
||||||
|
db.alter_column(u'spa_comment', 'user_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['spa.UserProfile'], null=True))
|
||||||
|
|
||||||
|
models = {
|
||||||
|
u'auth.group': {
|
||||||
|
'Meta': {'object_name': 'Group'},
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
|
||||||
|
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
|
||||||
|
},
|
||||||
|
u'auth.permission': {
|
||||||
|
'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
|
||||||
|
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||||
|
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||||
|
},
|
||||||
|
u'auth.user': {
|
||||||
|
'Meta': {'object_name': 'User'},
|
||||||
|
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||||
|
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
|
||||||
|
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||||
|
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||||
|
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||||
|
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||||
|
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||||
|
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||||
|
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
|
||||||
|
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}),
|
||||||
|
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
|
||||||
|
},
|
||||||
|
u'contenttypes.contenttype': {
|
||||||
|
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
|
||||||
|
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||||
|
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
|
||||||
|
},
|
||||||
|
'spa._lookup': {
|
||||||
|
'Meta': {'object_name': '_Lookup'},
|
||||||
|
'description': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
|
||||||
|
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'})
|
||||||
|
},
|
||||||
|
'spa.activity': {
|
||||||
|
'Meta': {'object_name': 'Activity'},
|
||||||
|
'date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
|
||||||
|
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||||
|
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.UserProfile']", 'null': 'True', 'blank': 'True'})
|
||||||
|
},
|
||||||
|
'spa.activitycomment': {
|
||||||
|
'Meta': {'object_name': 'ActivityComment', '_ormbases': ['spa.Activity']},
|
||||||
|
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
|
||||||
|
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_comments'", 'to': "orm['spa.Mix']"})
|
||||||
|
},
|
||||||
|
'spa.activitydownload': {
|
||||||
|
'Meta': {'object_name': 'ActivityDownload', '_ormbases': ['spa.Activity']},
|
||||||
|
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
|
||||||
|
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_downloads'", 'to': "orm['spa.Mix']"})
|
||||||
|
},
|
||||||
|
'spa.activityfavourite': {
|
||||||
|
'Meta': {'object_name': 'ActivityFavourite', '_ormbases': ['spa.Activity']},
|
||||||
|
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
|
||||||
|
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_favourites'", 'to': "orm['spa.Mix']"})
|
||||||
|
},
|
||||||
|
'spa.activityfollow': {
|
||||||
|
'Meta': {'object_name': 'ActivityFollow', '_ormbases': ['spa.Activity']},
|
||||||
|
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
|
||||||
|
'to_user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_follow'", 'to': "orm['spa.UserProfile']"})
|
||||||
|
},
|
||||||
|
'spa.activitylike': {
|
||||||
|
'Meta': {'object_name': 'ActivityLike', '_ormbases': ['spa.Activity']},
|
||||||
|
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
|
||||||
|
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_likes'", 'to': "orm['spa.Mix']"})
|
||||||
|
},
|
||||||
|
'spa.activityplay': {
|
||||||
|
'Meta': {'object_name': 'ActivityPlay', '_ormbases': ['spa.Activity']},
|
||||||
|
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
|
||||||
|
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_plays'", 'to': "orm['spa.Mix']"})
|
||||||
|
},
|
||||||
|
'spa.chatmessage': {
|
||||||
|
'Meta': {'object_name': 'ChatMessage'},
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'message': ('django.db.models.fields.TextField', [], {}),
|
||||||
|
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
|
||||||
|
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||||
|
'timestamp': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||||
|
'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'chat_messages'", 'null': 'True', 'to': "orm['spa.UserProfile']"})
|
||||||
|
},
|
||||||
|
'spa.comment': {
|
||||||
|
'Meta': {'object_name': 'Comment'},
|
||||||
|
'comment': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
|
||||||
|
'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'likes': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'liked_comments'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['spa.UserProfile']"}),
|
||||||
|
'mix': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'comments'", 'null': 'True', 'to': "orm['spa.Mix']"}),
|
||||||
|
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
|
||||||
|
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||||
|
'time_index': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
|
||||||
|
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'})
|
||||||
|
},
|
||||||
|
'spa.genre': {
|
||||||
|
'Meta': {'object_name': 'Genre'},
|
||||||
|
'description': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
|
||||||
|
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||||
|
'slug': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'})
|
||||||
|
},
|
||||||
|
'spa.label': {
|
||||||
|
'Meta': {'object_name': 'Label'},
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||||
|
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
|
||||||
|
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'})
|
||||||
|
},
|
||||||
|
'spa.mix': {
|
||||||
|
'Meta': {'ordering': "('-id',)", 'object_name': 'Mix'},
|
||||||
|
'archive_path': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'null': 'True', 'blank': 'True'}),
|
||||||
|
'archive_updated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||||
|
'description': ('django.db.models.fields.TextField', [], {}),
|
||||||
|
'download_allowed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||||
|
'duration': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
|
||||||
|
'favourites': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'favourites'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['spa.UserProfile']"}),
|
||||||
|
'filetype': ('django.db.models.fields.CharField', [], {'default': "'mp3'", 'max_length': '10'}),
|
||||||
|
'genres': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['spa.Genre']", 'symmetrical': 'False'}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||||
|
'is_featured': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||||
|
'likes': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'likes'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['spa.UserProfile']"}),
|
||||||
|
'mix_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '1024', 'blank': 'True'}),
|
||||||
|
'mp3tags_updated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||||
|
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
|
||||||
|
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||||
|
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}),
|
||||||
|
'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}),
|
||||||
|
'uid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '38', 'blank': 'True'}),
|
||||||
|
'upload_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||||
|
'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'mixes'", 'to': "orm['spa.UserProfile']"}),
|
||||||
|
'waveform_generated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||||
|
'waveform_version': ('django.db.models.fields.IntegerField', [], {'default': '1'})
|
||||||
|
},
|
||||||
|
'spa.notification': {
|
||||||
|
'Meta': {'ordering': "('-id',)", 'object_name': 'Notification'},
|
||||||
|
'accepted_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||||
|
'date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||||
|
'from_user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'notifications'", 'null': 'True', 'to': "orm['spa.UserProfile']"}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'notification_html': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
|
||||||
|
'notification_text': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
|
||||||
|
'notification_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True'}),
|
||||||
|
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
|
||||||
|
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||||
|
'target': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}),
|
||||||
|
'to_user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'to_notications'", 'to': "orm['spa.UserProfile']"}),
|
||||||
|
'verb': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'})
|
||||||
|
},
|
||||||
|
'spa.playlist': {
|
||||||
|
'Meta': {'object_name': 'Playlist'},
|
||||||
|
'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'mixes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['spa.Mix']", 'symmetrical': 'False'}),
|
||||||
|
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
|
||||||
|
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
|
||||||
|
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||||
|
'public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||||
|
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}),
|
||||||
|
'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'playlists'", 'to': "orm['spa.UserProfile']"})
|
||||||
|
},
|
||||||
|
'spa.purchaselink': {
|
||||||
|
'Meta': {'object_name': 'PurchaseLink'},
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
|
||||||
|
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||||
|
'provider': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
|
||||||
|
'track': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'purchase_link'", 'to': "orm['spa.Tracklist']"}),
|
||||||
|
'url': ('django.db.models.fields.URLField', [], {'max_length': '200'})
|
||||||
|
},
|
||||||
|
'spa.recurrence': {
|
||||||
|
'Meta': {'object_name': 'Recurrence', '_ormbases': ['spa._Lookup']},
|
||||||
|
u'_lookup_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa._Lookup']", 'unique': 'True', 'primary_key': 'True'})
|
||||||
|
},
|
||||||
|
'spa.release': {
|
||||||
|
'Meta': {'object_name': 'Release'},
|
||||||
|
'embed_code': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||||
|
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
|
||||||
|
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||||
|
'release_artist': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||||
|
'release_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)'}),
|
||||||
|
'release_description': ('django.db.models.fields.TextField', [], {}),
|
||||||
|
'release_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
|
||||||
|
'release_label': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.Label']"}),
|
||||||
|
'release_title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||||
|
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.UserProfile']"})
|
||||||
|
},
|
||||||
|
'spa.releaseaudio': {
|
||||||
|
'Meta': {'object_name': 'ReleaseAudio'},
|
||||||
|
'description': ('django.db.models.fields.TextField', [], {}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
|
||||||
|
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||||
|
'release': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'release_audio'", 'null': 'True', 'to': "orm['spa.Release']"})
|
||||||
|
},
|
||||||
|
'spa.tracklist': {
|
||||||
|
'Meta': {'object_name': 'Tracklist'},
|
||||||
|
'artist': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
|
||||||
|
'description': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'index': ('django.db.models.fields.SmallIntegerField', [], {}),
|
||||||
|
'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
|
||||||
|
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tracklist'", 'to': "orm['spa.Mix']"}),
|
||||||
|
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
|
||||||
|
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||||
|
'remixer': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
|
||||||
|
'timeindex': ('django.db.models.fields.TimeField', [], {'null': 'True'}),
|
||||||
|
'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
|
||||||
|
},
|
||||||
|
'spa.userprofile': {
|
||||||
|
'Meta': {'object_name': 'UserProfile'},
|
||||||
|
'activity_sharing_facebook': ('django.db.models.fields.BigIntegerField', [], {'default': '0'}),
|
||||||
|
'activity_sharing_networks': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
|
||||||
|
'activity_sharing_twitter': ('django.db.models.fields.BigIntegerField', [], {'default': '0'}),
|
||||||
|
'avatar_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '1024', 'blank': 'True'}),
|
||||||
|
'avatar_type': ('django.db.models.fields.CharField', [], {'default': "'social'", 'max_length': '15'}),
|
||||||
|
'city': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
|
||||||
|
'country': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
|
||||||
|
'description': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'blank': 'True'}),
|
||||||
|
'display_name': ('django.db.models.fields.CharField', [], {'max_length': '35', 'blank': 'True'}),
|
||||||
|
'email_notifications': ('django.db.models.fields.BigIntegerField', [], {'default': '0'}),
|
||||||
|
'following': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'followers'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['spa.UserProfile']"}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'last_known_session': ('django.db.models.fields.CharField', [], {'max_length': '250', 'null': 'True', 'blank': 'True'}),
|
||||||
|
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
|
||||||
|
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||||
|
'slug': ('django.db.models.fields.SlugField', [], {'default': 'None', 'max_length': '50', 'null': 'True', 'blank': 'True'}),
|
||||||
|
'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'userprofile'", 'unique': 'True', 'to': u"orm['auth.User']"})
|
||||||
|
},
|
||||||
|
'spa.venue': {
|
||||||
|
'Meta': {'object_name': 'Venue'},
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
|
||||||
|
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 5, 17, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||||
|
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
|
||||||
|
'venue_address': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
|
||||||
|
'venue_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
|
||||||
|
'venue_name': ('django.db.models.fields.CharField', [], {'max_length': '250'})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
complete_apps = ['spa']
|
||||||
@@ -9,7 +9,7 @@ class Comment(BaseModel):
|
|||||||
class Meta:
|
class Meta:
|
||||||
app_label = 'spa'
|
app_label = 'spa'
|
||||||
|
|
||||||
user = models.ForeignKey(UserProfile, editable=False, null=True, blank=True)
|
user = models.ForeignKey(User, editable=False, null=True, blank=True)
|
||||||
mix = models.ForeignKey(Mix, editable=False, null=True, blank=True, related_name='comments')
|
mix = models.ForeignKey(Mix, editable=False, null=True, blank=True, related_name='comments')
|
||||||
comment = models.CharField(max_length=1024)
|
comment = models.CharField(max_length=1024)
|
||||||
date_created = models.DateTimeField(auto_now_add=True)
|
date_created = models.DateTimeField(auto_now_add=True)
|
||||||
@@ -22,16 +22,19 @@ class Comment(BaseModel):
|
|||||||
def create_activity(self):
|
def create_activity(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def get_user(self):
|
||||||
|
return self.user.userprofile if self.user.is_authenticated() else self.user
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def avatar_image(self):
|
def avatar_image(self):
|
||||||
if self.user is None:
|
if self.user is None:
|
||||||
return UserProfile.get_default_avatar_image()
|
return UserProfile.get_default_avatar_image()
|
||||||
else:
|
else:
|
||||||
return self.user.get_profile().get_avatar_image()
|
return self.user.userprofile.get_avatar_image()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def user_display_name(self):
|
def user_display_name(self):
|
||||||
if self.user is None:
|
if self.user is None:
|
||||||
return UserProfile.get_default_display_name()
|
return UserProfile.get_default_display_name()
|
||||||
else:
|
else:
|
||||||
return self.user.get_profile().get_nice_name()
|
return self.user.userprofile.get_nice_name()
|
||||||
|
|||||||
@@ -210,6 +210,19 @@ class Mix(BaseModel):
|
|||||||
except Exception, e:
|
except Exception, e:
|
||||||
self.logger.exception("Error adding mix download: %s" % e.message)
|
self.logger.exception("Error adding mix download: %s" % e.message)
|
||||||
|
|
||||||
|
def add_genre(self, new_genre):
|
||||||
|
# first look for genre by slug
|
||||||
|
genre = Genre.objects.get(slug=new_genre['slug'])
|
||||||
|
if not genre:
|
||||||
|
# need to find a genre by description
|
||||||
|
genre = Genre.objects.get(description__iexact=new_genre['description'])
|
||||||
|
if not genre:
|
||||||
|
genre = Genre(description=new_genre['description'])
|
||||||
|
|
||||||
|
if genre:
|
||||||
|
self.genres.add(genre)
|
||||||
|
self.save()
|
||||||
|
|
||||||
def add_play(self, user):
|
def add_play(self, user):
|
||||||
try:
|
try:
|
||||||
if user.is_authenticated():
|
if user.is_authenticated():
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import logging
|
import logging
|
||||||
|
import os
|
||||||
import urlparse
|
import urlparse
|
||||||
|
|
||||||
from bitfield.models import BitField
|
from bitfield.models import BitField
|
||||||
@@ -15,7 +16,6 @@ from core.utils.url import unique_slugify
|
|||||||
from dss import settings
|
from dss import settings
|
||||||
from spa.models.basemodel import BaseModel
|
from spa.models.basemodel import BaseModel
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@@ -180,7 +180,10 @@ class UserProfile(BaseModel):
|
|||||||
if gravatar_exists:
|
if gravatar_exists:
|
||||||
return get_gravatar_url(self.email)
|
return get_gravatar_url(self.email)
|
||||||
else:
|
else:
|
||||||
|
if os.path.exists(self.avatar_image.file.name):
|
||||||
return self.avatar_image
|
return self.avatar_image
|
||||||
|
else:
|
||||||
|
return self.get_default_avatar_image()
|
||||||
|
|
||||||
return UserProfile.get_default_avatar_image()
|
return UserProfile.get_default_avatar_image()
|
||||||
|
|
||||||
@@ -202,4 +205,3 @@ class UserProfile(BaseModel):
|
|||||||
@classmethod
|
@classmethod
|
||||||
def get_default_display_name(cls):
|
def get_default_display_name(cls):
|
||||||
return settings.DEFAULT_USER_NAME
|
return settings.DEFAULT_USER_NAME
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user