Skip to content

Commit

Permalink
Merge pull request #218 from bounswe/events-with-activitystream
Browse files Browse the repository at this point in the history
Events with activitystream (resolves #213)
  • Loading branch information
ege-kaya committed Dec 10, 2021
2 parents b70a41e + b2b63bb commit 024c5f8
Show file tree
Hide file tree
Showing 11 changed files with 148 additions and 107 deletions.
10 changes: 10 additions & 0 deletions backend/app/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,16 @@
'frontend',
]

SITE_ID = 1

ACTSTREAM_SETTINGS = {
'MANAGER': 'actstream.managers.ActionManager',
'FETCH_RELATIONS': True,
'USE_PREFETCH': True,
'USE_JSONFIELD': False,
'GFK_FETCH_DEPTH': 0,
}

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
Expand Down
4 changes: 2 additions & 2 deletions backend/app/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('authentication.urls')),
path('api/posts/', include('eventposts.urls')),
path('api/users/', include('profiles.urls')),
path('api/', include('eventposts.urls')),
path('api/', include('profiles.urls')),
path('', include('frontend.urls'))
]
3 changes: 3 additions & 0 deletions backend/authentication/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,6 @@
class AuthenticationConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'authentication'
def ready(self):
from actstream import registry
registry.register(self.get_model('User'))
3 changes: 3 additions & 0 deletions backend/eventposts/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,6 @@
class EventpostsConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'eventposts'
def ready(self):
from actstream import registry
registry.register(self.get_model('EventPost'))
25 changes: 16 additions & 9 deletions backend/eventposts/models.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
from django.db import models
from authentication.models import User
from django.contrib.postgres.fields import ArrayField

def empty_list():
return list([])

class Post(models.Model):

Expand All @@ -17,17 +21,20 @@ class Meta:

class EventPost(Post):
date = models.DateTimeField(auto_now_add=True)
duration = models.TimeField(auto_now_add=True)
duration = models.IntegerField(default=60)

sport = models.CharField(max_length=30)
age_group = models.IntegerField(default=-1)
min_age = models.IntegerField(default=18)
max_age = models.IntegerField(default=75)

player_capacity = models.IntegerField(default=-1)
spec_capacity = models.IntegerField(default=-1)
players = models.IntegerField(default=-1)
spectators = models.IntegerField(default=-1)
player_capacity = models.IntegerField(default=10)
spec_capacity = models.IntegerField(default=0)
players = ArrayField(models.IntegerField(), default=empty_list)
applicants = ArrayField(models.IntegerField(), default=empty_list)
spectators = ArrayField(models.IntegerField(), default=empty_list)

skill_level = models.TextChoices('skill_level', 'Beginner Preintermediate Intermediate Advanced Expert')
min_skill_level = models.IntegerField(default=0)
max_skill_level = models.IntegerField(default=0)

latitude = models.FloatField(default=-1.0)
longitude = models.FloatField(default=-1.0)
latitude = models.FloatField(default=1.0)
longitude = models.FloatField(default=1.0)
17 changes: 3 additions & 14 deletions backend/eventposts/serializers.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,7 @@
from rest_framework import serializers
from .models import EventPost,Post
"""
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = EventPost
fields = ['date', 'duration', 'sport', 'age_group','player_capacity','spec_capacity']
"""
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = '__all__'

from .models import EventPost, Post

class EventPostSerializer(PostSerializer):
class EventSerializer(serializers.ModelSerializer):
class Meta:
model = EventPost
fields = '__all__'
fields = "__all__"
10 changes: 4 additions & 6 deletions backend/eventposts/urls.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
from django.urls import path
from . import views
from rest_framework.routers import SimpleRouter

urlpatterns=[

path('<int:id>/', views.EventPostView.as_view(), name="EventPost"),
path('all/', views.EventPostViewAll.as_view(), name="EventPostAll"),
path('', views.EventPostPostView.as_view(), name="EventPostPost"),
]
router = SimpleRouter()
router.register(r'posts', views.EventViewSet)
urlpatterns = router.urls
114 changes: 59 additions & 55 deletions backend/eventposts/views.py
Original file line number Diff line number Diff line change
@@ -1,56 +1,60 @@
#from typing import ValuesView
from django.shortcuts import render
from django.http import HttpResponse
from rest_framework.response import Response
from rest_framework.decorators import api_view
from rest_framework import status

from rest_framework import generics
from .models import EventPost, Post
from .serializers import EventPostSerializer, PostSerializer
from rest_framework.views import APIView
from django.forms.models import model_to_dict





class EventPostView(APIView):

def get(self, request, id):
try:
eventpost = EventPost.objects.get(id=id)
except:
return Response(status=status.HTTP_204_NO_CONTENT)
return Response(EventPostSerializer(eventpost).data)

class EventPostViewAll(APIView):

def get(self, request):
try:
eventpost = EventPost.objects.all()
except:
return Response(status=status.HTTP_204_NO_CONTENT)
eventserializer=EventPostSerializer(eventpost,many=True)

return Response(eventserializer.data)


class EventPostPostView(APIView):

def post(self, request):
serializer = EventPostSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)











from .serializers import EventSerializer
from rest_framework_simplejwt.authentication import JWTAuthentication
from django.http import JsonResponse
from rest_framework import status
from rest_framework.response import Response
from rest_framework import viewsets


class EventViewSet(viewsets.ModelViewSet):
queryset = EventPost.objects.all()
serializer_class = EventSerializer
JWTauth = JWTAuthentication()
lookup_field = "id"

def wrap(self, request, data):
response = \
{"@context": "https://www.w3.org/ns/activitystreams", "summary": str(request.user) + " created an event",
"type": "Create",
"actor": {"type": "Person", "name": str(request.user)}, "object": {"type": "Event",
"name": "A Simple Event",
"postId": data["id"],
"ownerId": data["owner"],
"content": data["content"],
"title": data["title"],
"creationDate": data["creation_date"],
"numberOfClicks": 0,
"location": {
"name": data["location"],
"type": "Place",
"longitude": data["longitude"],
"latitude": data["latitude"],
"units": "m"
}}, "eventDate": data["date"],
"eventSport": data["sport"], "eventMinAge": data["min_age"], "eventMaxAge": data["max_age"],
"eventMinSkillLevel": data["min_skill_level"], "eventMaxSkillLevel": data["max_skill_level"],
"eventPlayerCapacity": data["player_capacity"], "eventSpectatorCapacity": data["spec_capacity"],
"eventApplicants": data["applicants"], "eventPlayers": data["players"]}

return response

def authenticate(self):
user, _ = self.JWTauth.authenticate(self.request)
return user.id == self.request.data["owner"]

def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)
return Response(self.wrap(request, serializer.data))

def create(self, request, *args, **kwargs):
if self.authenticate():
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(self.wrap(request, serializer.data), status=status.HTTP_201_CREATED, headers=headers)
else:
return JsonResponse(status=401, data={'detail': 'Unauthorized.'})
2 changes: 1 addition & 1 deletion backend/profiles/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ class Meta:
model = User
fields = ('first_name', 'last_name',
'bio', 'fav_sport_1', 'fav_sport_2', 'fav_sport_3',
'location')
'location', 'avatar')

class ProfileUpdateSerializer(serializers.ModelSerializer):
class Meta:
Expand Down
9 changes: 5 additions & 4 deletions backend/profiles/urls.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
from django.urls import path
from . import views

urlpatterns = [
path('<str:username>/', views.ProfileView.as_view(), name="ProfileGet"),
path('<str:username>/update', views.ProfileUpdateView.as_view(), name="ProfileUpdate")
]
from rest_framework.routers import SimpleRouter

router = SimpleRouter()
router.register(r'users', views.ProfileViewSet)
urlpatterns = router.urls
58 changes: 42 additions & 16 deletions backend/profiles/views.py
Original file line number Diff line number Diff line change
@@ -1,35 +1,61 @@
from django.shortcuts import render

# Create your views here.
from rest_framework import status
from rest_framework import generics
from rest_framework.response import Response
from authentication.models import User
from .serializers import ProfileSerializer, ProfileUpdateSerializer
from rest_framework import status, permissions
from .serializers import ProfileSerializer
from rest_framework_simplejwt.authentication import JWTAuthentication
from django.http import HttpResponse


from django.http import JsonResponse
from rest_framework import viewsets
from rest_framework.response import Response


class ProfileView(generics.RetrieveAPIView):
class ProfileViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = ProfileSerializer
lookup_field = 'username'

class ProfileUpdateView(generics.RetrieveUpdateAPIView):
queryset = User.objects.all()
serializer_class = ProfileUpdateSerializer
lookup_field = 'username'
JWTauth = JWTAuthentication()

def authenticate(self):
user, _ = self.JWTauth.authenticate(self.request)
return user.username == self.kwargs['username']

def put(self, request, *args, **kwargs):
def update(self, request, *args, **kwargs):
if self.authenticate():
return self.update(request, *args, **kwargs)
partial = kwargs.pop('partial', False)
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)

if getattr(instance, '_prefetched_objects_cache', None):
# If 'prefetch_related' has been applied to a queryset, we need to
# forcibly invalidate the prefetch cache on the instance.
instance._prefetched_objects_cache = {}

return Response(serializer.data)
else:
return HttpResponse('Unauthorized', status=401)
return JsonResponse(status=401, data={'detail':'Unauthorized.'})



# class ProfileView(generics.RetrieveAPIView):
# queryset = User.objects.all()
# serializer_class = ProfileSerializer
# lookup_field = 'username'
#
# class ProfileUpdateView(generics.RetrieveUpdateAPIView):
# queryset = User.objects.all()
# serializer_class = ProfileUpdateSerializer
# lookup_field = 'username'
# JWTauth = JWTAuthentication()
#
# def authenticate(self):
# user, _ = self.JWTauth.authenticate(self.request)
# return user.username == self.kwargs['username']
#
# def put(self, request, *args, **kwargs):
# if self.authenticate():
# return self.update(request, *args, **kwargs)
# else:
# return JsonResponse(status=401, data={'detail':'Unauthorized.'})

0 comments on commit 024c5f8

Please sign in to comment.