Skip to content

Commit

Permalink
44 - Tweet Action View
Browse files Browse the repository at this point in the history
  • Loading branch information
codingforentrepreneurs committed Dec 17, 2019
1 parent d7dcc83 commit a801e54
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 2 deletions.
2 changes: 2 additions & 0 deletions tweetme2/settings.py
Expand Up @@ -28,7 +28,9 @@

ALLOWED_HOSTS = ['127.0.0.1', '.cfe.sh']
LOGIN_URL = "/login"

MAX_TWEET_LENGTH = 240
TWEET_ACTION_OPTIONS = ["like", "unlike", "retweet"]

# Application definition

Expand Down
11 changes: 11 additions & 0 deletions tweets/serializers.py
Expand Up @@ -3,6 +3,17 @@
from .models import Tweet

MAX_TWEET_LENGTH = settings.MAX_TWEET_LENGTH
TWEET_ACTION_OPTIONS = settings.TWEET_ACTION_OPTIONS

class TweetActionSerializer(serializers.Serializer):
id = serializers.IntegerField()
action = serializers.CharField()

def validate_action(self, value):
value = value.lower().strip() # "Like " -> "like"
if not value in TWEET_ACTION_OPTIONS:
raise serializers.ValidationError("This is not a valid action for tweets")
return value

class TweetSerializer(serializers.ModelSerializer):
class Meta:
Expand Down
30 changes: 28 additions & 2 deletions tweets/views.py
Expand Up @@ -10,7 +10,7 @@
from rest_framework.response import Response
from .forms import TweetForm
from .models import Tweet
from .serializers import TweetSerializer
from .serializers import TweetSerializer, TweetActionSerializer

ALLOWED_HOSTS = settings.ALLOWED_HOSTS

Expand Down Expand Up @@ -53,7 +53,33 @@ def tweet_delete_view(request, tweet_id, *args, **kwargs):
obj = qs.first()
obj.delete()
return Response({"message": "Tweet removed"}, status=200)


@api_view(['POST'])
@permission_classes([IsAuthenticated])
def tweet_action_view(request, *args, **kwargs):
'''
id is required.
Action options are: like, unlike, retweet
'''
serializer = TweetActionSerializer(request.POST)
if serializer.is_valid(raise_exception=True):
data = serializer.validated_data
tweet_id = data.get("id")
action = data.get("action")
qs = Tweet.objects.filter(id=tweet_id)
if not qs.exists():
return Response({}, status=404)
obj = qs.first()
if action == "like":
obj.likes.add(request.user)
elif action == "unlike":
obj.likes.remove(request.user)
elif action == "retweet":
# this is todo
pass
return Response({"message": "Tweet removed"}, status=200)


@api_view(['GET'])
def tweet_list_view(request, *args, **kwargs):
qs = Tweet.objects.all()
Expand Down

0 comments on commit a801e54

Please sign in to comment.