Skip to content

Commit

Permalink
create event page functional
Browse files Browse the repository at this point in the history
  • Loading branch information
alexrandaccio committed Dec 2, 2021
1 parent 5a7f9b2 commit e1a4df3
Show file tree
Hide file tree
Showing 23 changed files with 988 additions and 73 deletions.
32 changes: 30 additions & 2 deletions backend/RxcVoiceApi/main/authviews.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,21 @@ class DelegateList(mixins.CreateModelMixin,
authentication_classes = [TokenAuthentication]

def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
profile_id = self.kwargs['profile_id']
try:
profile = Profile.objects.get(id=profile_id)
except Profile.DoesNotExist:
profile = None
if profile != None:
delegates = profile.delegates.all()
page = self.paginate_queryset(delegates)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(delegates, many=True)
return Response(serializer.data)
else:
return Response(status=status.HTTP_400_BAD_REQUEST)

def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
Expand Down Expand Up @@ -146,7 +160,21 @@ class GroupList(mixins.CreateModelMixin,
authentication_classes = [TokenAuthentication]

def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
user_id = self.kwargs['user_id']
try:
user = User.objects.get(id=user_id)
except User.DoesNotExist:
user = None
if user != None:
groups = user.groups.all()
page = self.paginate_queryset(groups)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(groups, many=True)
return Response(serializer.data)
else:
return Response(status=status.HTTP_400_BAD_REQUEST)

def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
Expand Down
7 changes: 4 additions & 3 deletions backend/RxcVoiceApi/main/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ class Process(models.Model):
id = models.AutoField(primary_key=True, editable=False)
title = models.CharField(max_length=256, blank=False)
description = models.TextField(blank=True, null=True)
invitation_message = models.TextField(blank=True, null=True)
start_date = models.DateTimeField(blank=False)
end_date = models.DateTimeField(blank=False)
groups = models.ManyToManyField(Group, blank=True, default=[])
Expand Down Expand Up @@ -54,10 +55,10 @@ def __str__(self):
class Delegate(models.Model):
id = models.AutoField(primary_key=True, editable=False)
profile = models.ForeignKey(
Profile, related_name='delegates', blank=True, null=True, on_delete=models.CASCADE)
Profile, related_name='delegates', on_delete=models.CASCADE)
invited_by = models.ForeignKey(
Profile, related_name='delegates_invited', blank=True, null=True, on_delete=models.SET_NULL)
process = models.ForeignKey(Process, related_name='delegates', null=True, on_delete=models.SET_NULL)
process = models.ForeignKey(Process, related_name='delegates', on_delete=models.CASCADE)
credit_balance = models.DecimalField(
default=0, blank=True, max_digits=6, decimal_places=0) # must be staff to change from default

Expand All @@ -83,7 +84,7 @@ class Stage(PolymorphicModel):
description = models.TextField(blank=True)
start_date = models.DateTimeField(blank=False)
end_date = models.DateTimeField(blank=False)
process = models.ForeignKey(Process, related_name='stages', null=True, on_delete=models.SET_NULL)
process = models.ForeignKey(Process, related_name='stages', on_delete=models.CASCADE)
position = models.DecimalField(
default=0, max_digits=2, decimal_places=0, editable=True)

Expand Down
97 changes: 87 additions & 10 deletions backend/RxcVoiceApi/main/processviews.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@
from rest_framework.authentication import TokenAuthentication
from rest_framework import generics, mixins, status
from django.db.models import Q
from .serializers import ProcessSerializer, TransferSerializer
from .serializers import ProfileSerializer, ProcessSerializer, TransferSerializer, DelegateSerializer, StageSerializer, DelegationSerializer, ConversationSerializer, ElectionSerializer
from .permissions import ProcessPermission, TransferPermission
from .models import Process, Transfer, MatchPayment
from .models import Process, Transfer, MatchPayment, Stage, Delegate, Profile
from django.contrib.auth.models import Group, User
from guardian.shortcuts import assign_perm
from django.utils import timezone
from .services import estimate_match
Expand Down Expand Up @@ -38,16 +39,96 @@ def get(self, request, *args, **kwargs):
return Response(serializer.data)

def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
# create process object
serializer = self.get_serializer(data=request.data['process'])
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
process_id = serializer.data.get('id')
process_object = Process.objects.get(pk=process_id)
# create stages
stages = request.data['stages']
for stage in stages:
stage['process'] = process_id
if stage['type'] == Stage.DELEGATION:
stage_serializer = DelegationSerializer(data=stage)
stage_serializer.is_valid(raise_exception=True)
DelegationSerializer.create(
DelegationSerializer(),
validated_data=stage_serializer.validated_data,
)
elif stage['type'] == Stage.CONVERSATION:
stage_serializer = ConversationSerializer(data=stage)
stage_serializer.is_valid(raise_exception=True)
ConversationSerializer.create(
ConversationSerializer(),
validated_data=stage_serializer.validated_data,
)
elif stage['type'] == Stage.ELECTION:
stage_serializer = ElectionSerializer(data=stage)
stage_serializer.is_valid(raise_exception=True)
ElectionSerializer.create(
ElectionSerializer(),
validated_data=stage_serializer.validated_data,
)
else:
stage_serializer = StageSerializer(data=stage)
stage_serializer.is_valid(raise_exception=True)
StageSerializer.create(
StageSerializer(),
validated_data=stage_serializer.validated_data,
)
# create new group if necessary
group_data = request.data['group']
if group_data['create']:
new_group = Group.objects.create(name=group_data['name'])
new_group.save()
process_object.groups.add(new_group)
request.user.groups.add(new_group)
# create new delegates if necessary
existing_groups = process_object.groups.all()
for existing_group in existing_groups:
assign_perm('can_view', existing_group, process_object)
for user in existing_group.user_set.all():
Delegate.objects.create(
profile=user.profile,
process=process_object,
credit_balance=request.data['stages'][0]['num_credits'],
invited_by=request.user.profile,
)
invites = request.data['invites']
if invites:
for delegate in invites:
delegate['process'] = process_id
if group_data['create']:
delegate['profile']['user']['groups'].append(new_group.id)
for existing_group in existing_groups:
delegate['profile']['user']['groups'].append(existing_group.id)
try:
profile_data = delegate['profile']
try:
existing_user = User.objects.get(email=profile_data['user']['email'])
except:
existing_user = None
if existing_user is not None:
profile = Profile.objects.get(user=existing_user)
else:
profile_serializer = ProfileSerializer(data=profile_data)
profile_serializer.is_valid(raise_exception=True)
profile = ProfileSerializer.create(
ProfileSerializer(),
validated_data=profile_serializer.validated_data,
set_unusable_password=True,
)
Delegate.objects.create(
credit_balance=delegate['credit_balance'],
profile=profile,
process=process_object,
invited_by=request.user.profile,
)
except:
print("could not create user")
headers = self.get_success_headers(serializer.data)
# assign can_view permission to any groups the process belongs to.
groups = process_object.groups.all()
for group in groups:
assign_perm('can_view', group, process_object)
return Response(
serializer.data,
status=status.HTTP_201_CREATED,
Expand Down Expand Up @@ -87,8 +168,6 @@ def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)




class TransferList(mixins.CreateModelMixin,
mixins.ListModelMixin,
generics.GenericAPIView):
Expand Down Expand Up @@ -129,8 +208,6 @@ def post(self, request, *args, **kwargs):
headers=headers)




class EstimateMatch(mixins.CreateModelMixin,
mixins.ListModelMixin,
generics.GenericAPIView):
Expand Down
35 changes: 17 additions & 18 deletions backend/RxcVoiceApi/main/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,10 +127,17 @@ def create(self, validated_data):


class GroupSerializer(serializers.ModelSerializer):
def __init__(self, *args, **kwargs):
super(GroupSerializer, self).__init__(*args, **kwargs)
self.fields['users'] = serializers.SerializerMethodField()

class Meta:
model = Group
fields = '__all__'

def get_users(self, obj):
return map(lambda user: user.first_name + " " + user.last_name, obj.user_set.all())


class PermissionSerializer(serializers.ModelSerializer):
class Meta:
Expand Down Expand Up @@ -252,23 +259,13 @@ def get_pending_credits(self, obj):
total += transfer.amount
return total

def create(self, validated_data, set_unusable_password):
profile_data = validated_data.get('profile')
try:
existing_user = User.objects.get(email=profile_data['user']['email'])
except User.DoesNotExist:
existing_user = None
if existing_user is not None:
profile = Profile.objects.get(user=existing_user)
else:
profile = ProfileSerializer.create(
ProfileSerializer(),
validated_data=profile_data,
set_unusable_password=set_unusable_password
)
def create(self, validated_data):
invited_by = None
if validated_data.get('invited_by'):
invited_by = validated_data.get('invited_by').profile
delegate, created = Delegate.objects.update_or_create(
profile=profile,
invited_by=validated_data.get('invited_by').profile,
profile=validated_data.get('profile'),
invited_by=invited_by,
process=validated_data.get('process'),
credit_balance=validated_data.get('credit_balance', 0),
)
Expand Down Expand Up @@ -460,10 +457,11 @@ def create(self, validated_data):
class ProcessSerializer(serializers.ModelSerializer):
def __init__(self, *args, **kwargs):
super(ProcessSerializer, self).__init__(*args, **kwargs)
self.fields['stages'] = StageSerializer(many=True, context=self.context)
self.fields['stages'] = StageSerializer(many=True, context=self.context, required=False)
self.fields['delegates'] = DelegateSerializer(
many=True,
context={'allowed_fields': ['id', 'profile', 'invited_by', 'process', 'credit_balance', 'pending_credits']}
context={'allowed_fields': ['id', 'profile', 'invited_by', 'process', 'credit_balance', 'pending_credits']},
required=False,
)

class Meta:
Expand All @@ -474,6 +472,7 @@ def create(self, validated_data):
process = Process.objects.create(
title=validated_data.get('title'),
description=validated_data.get('description'),
invitation_message=validated_data.get('invitation_message'),
start_date=validated_data.get('start_date'),
end_date=validated_data.get('end_date'),
)
Expand Down
6 changes: 4 additions & 2 deletions backend/RxcVoiceApi/main/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from .authviews import (DelegateList, DelegateDetail, ProfileList, ProfileDetail, UserDetail,
CustomAuthToken, PermissionList, EmailApplication,
GroupList, GetGithubUser, ValidateAuthToken,
GetTwitterToken, ForgotPassword, ResetPassword)
GetTwitterToken, ForgotPassword, ResetPassword, GroupList)
from .electionviews import (ElectionList, ElectionDetail, ProposalList,
VoteList)
from .conversationviews import (ConversationList, ConversationDetail)
Expand All @@ -18,9 +18,11 @@
path('profile/', ProfileList.as_view(), name='profile-list'),
path('profiles/<int:pk>/', ProfileDetail.as_view(),
name='profile-detail'),
path('delegates/', DelegateList.as_view(), name='delegate-list'),
path('profile/<int:profile_id>/delegates', DelegateList.as_view(), name='delegate-list'),
path('delegates/<int:pk>/', DelegateDetail.as_view(),
name='delegate-detail'),
path('users/<int:user_id>/groups', GroupList.as_view(),
name='group-list'),
path('users/<int:pk>/', UserDetail.as_view(),
name='user-detail'),
path('groups/', GroupList.as_view(), name='group-list'),
Expand Down
Loading

0 comments on commit e1a4df3

Please sign in to comment.