Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Events with activitystream (resolves #213) #218

Merged
merged 9 commits into from
Dec 10, 2021
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.'})