Skip to content
Snippets Groups Projects
Commit cce615e9 authored by s2536528's avatar s2536528
Browse files

Merged the develop branch with test branch

parent 6e959063
Branches
No related tags found
No related merge requests found
...@@ -27,6 +27,7 @@ class AssociationMembershipSerializerList(BaseSerializer): ...@@ -27,6 +27,7 @@ class AssociationMembershipSerializerList(BaseSerializer):
'association': {'lookup_field': 'slug'} 'association': {'lookup_field': 'slug'}
} }
class AssociationMembershipSerializerBase(FlexFieldsModelSerializer, serializers.HyperlinkedModelSerializer): class AssociationMembershipSerializerBase(FlexFieldsModelSerializer, serializers.HyperlinkedModelSerializer):
specific_data = AssociationSpecificDataSerializerSimple(many=True) specific_data = AssociationSpecificDataSerializerSimple(many=True)
debt_collection_mandate_id = serializers.ReadOnlyField(source="sepa_mandate.mandate_id") debt_collection_mandate_id = serializers.ReadOnlyField(source="sepa_mandate.mandate_id")
...@@ -36,7 +37,8 @@ class AssociationMembershipSerializerBase(FlexFieldsModelSerializer, serializers ...@@ -36,7 +37,8 @@ class AssociationMembershipSerializerBase(FlexFieldsModelSerializer, serializers
class Meta: class Meta:
model = AssociationMembership model = AssociationMembership
fields = ('url', 'slug', 'profile', 'association', 'date_joined', 'date_left', 'current', 'new_type', 'pay_by', fields = ('url', 'slug', 'profile', 'association', 'date_joined', 'date_left', 'current', 'new_type', 'pay_by',
'debt_collection_mandate_id', 'debt_collection_mandate_given', 'debt_collection_mandate_signature_date', 'debt_collection_mandate_id', 'debt_collection_mandate_given',
'debt_collection_mandate_signature_date',
'status', 'type', 'visible_after_date_left', 'specific_data', 'financial_obligations_satisfied', 'status', 'type', 'visible_after_date_left', 'specific_data', 'financial_obligations_satisfied',
'data_fields_last_modified', 'last_modified') 'data_fields_last_modified', 'last_modified')
extra_kwargs = { extra_kwargs = {
...@@ -90,9 +92,11 @@ class AssociationMembershipSerializerBase(FlexFieldsModelSerializer, serializers ...@@ -90,9 +92,11 @@ class AssociationMembershipSerializerBase(FlexFieldsModelSerializer, serializers
errors['date_left'] = "End date must be after start date." errors['date_left'] = "End date must be after start date."
if pay_by == AssociationMembership.PayBy.DEBT_COLLECTION.value: if pay_by == AssociationMembership.PayBy.DEBT_COLLECTION.value:
if (self.instance and self.instance.pay_by != AssociationMembership.PayBy.DEBT_COLLECTION.value) or (self.instance is None): if (self.instance and self.instance.pay_by != AssociationMembership.PayBy.DEBT_COLLECTION.value) or (
self.instance is None):
if not debt_collection_mandate_given: if not debt_collection_mandate_given:
errors["debt_collection_mandate_given"] = "Mandate for debt collection has to be given when paying by debt collection." errors[
"debt_collection_mandate_given"] = "Mandate for debt collection has to be given when paying by debt collection."
if type_.association != association: if type_.association != association:
errors["membertype E_1"] = "Association of membertype does not belong to this association" errors["membertype E_1"] = "Association of membertype does not belong to this association"
...@@ -102,7 +106,8 @@ class AssociationMembershipSerializerBase(FlexFieldsModelSerializer, serializers ...@@ -102,7 +106,8 @@ class AssociationMembershipSerializerBase(FlexFieldsModelSerializer, serializers
if old_type is not None and old_type != type_: if old_type is not None and old_type != type_:
errors["membertype E_3"] = "Only the board can change current membertype" errors["membertype E_3"] = "Only the board can change current membertype"
if change_type_on_period_end and new_type is None: if change_type_on_period_end and new_type is None:
errors["change_type_on_period_end"] = "You cannot say you change your type, but not have a type to change to" errors[
"change_type_on_period_end"] = "You cannot say you change your type, but not have a type to change to"
if type_.disabled: if type_.disabled:
errors["membertype E_4"] = "This is not a valid type, it has been disabled." errors["membertype E_4"] = "This is not a valid type, it has been disabled."
if new_type and new_type.disabled: if new_type and new_type.disabled:
...@@ -116,9 +121,9 @@ class AssociationMembershipSerializerBase(FlexFieldsModelSerializer, serializers ...@@ -116,9 +121,9 @@ class AssociationMembershipSerializerBase(FlexFieldsModelSerializer, serializers
# \\\\\\\\\\\\\\\\\\\\\\\\\\ # \\\\\\\\\\\\\\\\\\\\\\\\\\
if self.instance is None: if self.instance is None:
not_supplied_all_mandatory_data_fields = AssociationSpecificDataFields.objects\ not_supplied_all_mandatory_data_fields = AssociationSpecificDataFields.objects \
.filter(association=association, mandatory=True)\ .filter(association=association, mandatory=True) \
.exclude(slug__in=[data['data_field'].slug for data in specific_data])\ .exclude(slug__in=[data['data_field'].slug for data in specific_data]) \
.exists() .exists()
if not_supplied_all_mandatory_data_fields: if not_supplied_all_mandatory_data_fields:
errors["mandatory"] = "Not all mandatory data fields have been supplied." errors["mandatory"] = "Not all mandatory data fields have been supplied."
...@@ -126,7 +131,8 @@ class AssociationMembershipSerializerBase(FlexFieldsModelSerializer, serializers ...@@ -126,7 +131,8 @@ class AssociationMembershipSerializerBase(FlexFieldsModelSerializer, serializers
if specific_data: if specific_data:
for data in specific_data: for data in specific_data:
if association != data["data_field"].association: if association != data["data_field"].association:
errors[data["data_field"].name] = f"{association.slug}, doesn't match the association, {data['data_field'].association.slug}, of the data_field {data['data_field'].slug}" errors[data[
"data_field"].name] = f"{association.slug}, doesn't match the association, {data['data_field'].association.slug}, of the data_field {data['data_field'].slug}"
if data["data_field"].type == AssociationSpecificDataFields.Type.BOOLEAN.value: if data["data_field"].type == AssociationSpecificDataFields.Type.BOOLEAN.value:
if data["value"] not in ("True", "False"): if data["value"] not in ("True", "False"):
...@@ -173,7 +179,8 @@ class AssociationMembershipSerializerUpdate(AssociationMembershipSerializerBase) ...@@ -173,7 +179,8 @@ class AssociationMembershipSerializerUpdate(AssociationMembershipSerializerBase)
# Update sepa mandate # Update sepa mandate
# \\\\\\\\\\\\\\\\\\\\\\\\\\ # \\\\\\\\\\\\\\\\\\\\\\\\\\
if validated_data.get("pay_by", ""): if validated_data.get("pay_by", ""):
if instance.pay_by != AssociationMembership.PayBy.DEBT_COLLECTION and validated_data["pay_by"] == AssociationMembership.PayBy.DEBT_COLLECTION: if instance.pay_by != AssociationMembership.PayBy.DEBT_COLLECTION and validated_data[
"pay_by"] == AssociationMembership.PayBy.DEBT_COLLECTION:
sepa_mandate = SepaMandate.objects.create( sepa_mandate = SepaMandate.objects.create(
mandate_id=uuid.uuid4(), mandate_id=uuid.uuid4(),
signature_date=datetime.date.today(), signature_date=datetime.date.today(),
...@@ -181,7 +188,8 @@ class AssociationMembershipSerializerUpdate(AssociationMembershipSerializerBase) ...@@ -181,7 +188,8 @@ class AssociationMembershipSerializerUpdate(AssociationMembershipSerializerBase)
profile=instance.profile, profile=instance.profile,
) )
instance.sepa_mandate = sepa_mandate instance.sepa_mandate = sepa_mandate
elif instance.pay_by == AssociationMembership.PayBy.DEBT_COLLECTION and validated_data["pay_by"] != AssociationMembership.PayBy.DEBT_COLLECTION: elif instance.pay_by == AssociationMembership.PayBy.DEBT_COLLECTION and validated_data[
"pay_by"] != AssociationMembership.PayBy.DEBT_COLLECTION:
sepa_mandate = instance.sepa_mandate sepa_mandate = instance.sepa_mandate
sepa_mandate.withdrawal_date = datetime.date.today() sepa_mandate.withdrawal_date = datetime.date.today()
sepa_mandate.save() sepa_mandate.save()
......
from django.db.models import Prefetch from django.db.models import Prefetch
from rest_framework import viewsets from rest_framework import viewsets, status
from rest_framework.permissions import BasePermission from rest_framework.permissions import BasePermission
from rest_framework.permissions import IsAuthenticated from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from url_filter import filtersets from url_filter import filtersets
from apps.MySU.models import AssociationMembership from apps.MySU.models import AssociationMembership
...@@ -60,6 +61,8 @@ class UserViewSet(viewsets.ModelViewSet): ...@@ -60,6 +61,8 @@ class UserViewSet(viewsets.ModelViewSet):
def get_queryset(self): def get_queryset(self):
queryset = User.objects.filter(username=self.request.user.username) queryset = User.objects.filter(username=self.request.user.username)
token = super().get_authenticators()
print(token)
membership_subquery = AssociationMembership.objects.filter(user=self.request.user) membership_subquery = AssociationMembership.objects.filter(user=self.request.user)
membership_subquery = membership_subquery\ membership_subquery = membership_subquery\
.select_related('association', 'new_type', 'type', 'profile', 'profile__study')\ .select_related('association', 'new_type', 'type', 'profile', 'profile__study')\
......
...@@ -19,6 +19,7 @@ class EventSerializer(FlexFieldsModelSerializer, BaseSerializer): ...@@ -19,6 +19,7 @@ class EventSerializer(FlexFieldsModelSerializer, BaseSerializer):
fields = ('start_date', 'end_date', 'public', 'enrollable', 'enrollable_from', 'enrollable_until', 'unenrollable', fields = ('start_date', 'end_date', 'public', 'enrollable', 'enrollable_from', 'enrollable_until', 'unenrollable',
'unenrollable_until', 'max_number_of_enrollments', 'association', 'type', 'type_name', 'hidden_for_members', 'unenrollable_until', 'max_number_of_enrollments', 'association', 'type', 'type_name', 'hidden_for_members',
'slug', 'url', 'name', 'description', 'location', 'debt_collection') 'slug', 'url', 'name', 'description', 'location', 'debt_collection')
lookup_field = 'slug'
extra_kwargs = { extra_kwargs = {
'url': {'lookup_field': 'slug'}, 'url': {'lookup_field': 'slug'},
'association': {'lookup_field': 'slug'}, 'association': {'lookup_field': 'slug'},
......
from django.conf.urls import url from django.conf.urls import url
from django.urls import path, include
from rest_framework.routers import DefaultRouter from rest_framework.routers import DefaultRouter
from apps.calendar.views.enrollments_emails import EmailEnrollmentsView from apps.calendar.views.enrollments_emails import EmailEnrollmentsView
...@@ -8,7 +9,7 @@ from apps.calendar.viewsets.event import EventViewSet ...@@ -8,7 +9,7 @@ from apps.calendar.viewsets.event import EventViewSet
from apps.calendar.viewsets.eventtype import EventTypeViewSet from apps.calendar.viewsets.eventtype import EventTypeViewSet
router = DefaultRouter() router = DefaultRouter()
router.register(r'events', EventViewSet) router.register(r'events', EventViewSet, basename='event')
router.register(r'event_types', EventTypeViewSet) router.register(r'event_types', EventTypeViewSet)
router.register(r'enrollments', EnrollmentViewSet) router.register(r'enrollments', EnrollmentViewSet)
router.register(r'enrollment_options', EnrollmentOptionViewSet) router.register(r'enrollment_options', EnrollmentOptionViewSet)
...@@ -16,3 +17,4 @@ router.register(r'enrollment_options', EnrollmentOptionViewSet) ...@@ -16,3 +17,4 @@ router.register(r'enrollment_options', EnrollmentOptionViewSet)
urlpatterns = [ urlpatterns = [
url(r'^enrollments/email', EmailEnrollmentsView.as_view(), name='enrollements-email'), url(r'^enrollments/email', EmailEnrollmentsView.as_view(), name='enrollements-email'),
] ]
from django.contrib.auth.models import Permission
from django.shortcuts import get_object_or_404
from django.utils import timezone from django.utils import timezone
from guardian.shortcuts import get_objects_for_user from guardian.shortcuts import get_objects_for_user
from guardian.shortcuts import Q from guardian.shortcuts import Q
...@@ -34,13 +36,17 @@ class EventHttpPermissions(BasePermission): ...@@ -34,13 +36,17 @@ class EventHttpPermissions(BasePermission):
return request.user.has_perm('board', obj.association) return request.user.has_perm('board', obj.association)
return False return False
def has_permission(self, request, view): def has_permission(self, request, view): # this is subject to change !
if request.method == "GET": # HANDLES THE LIST if request.method == "GET": # HANDLES THE LIST
return True return True
if request.method == "POST": # HANDLES THE CREATION/INSERTION if request.method == "POST": # HANDLES THE CREATION/INSERTION
return get_objects_for_user(request.user, 'MySU.board').count() > 0 return get_objects_for_user(request.user, 'MySU.board').count() > 0
if request.method == "PUT" or request.method == "PATCH":
return True
return True return True
# and self.user.has_perm('board')
class EventFilterSet(filtersets.ModelFilterSet): class EventFilterSet(filtersets.ModelFilterSet):
class Meta: class Meta:
...@@ -71,6 +77,17 @@ class EventViewSet(viewsets.ModelViewSet): ...@@ -71,6 +77,17 @@ class EventViewSet(viewsets.ModelViewSet):
queryset = queryset.select_related(field) queryset = queryset.select_related(field)
return queryset.distinct() return queryset.distinct()
def patch(self, request, *args, **kwargs):
instance = self.get_object()
if not instance:
return Response(status=status.HTTP_404_NOT_FOUND)
serializer = self.get_serializer(instance, data=request.data, partial=True)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK)
else:
return Response(status=status.HTTP_400_BAD_REQUEST)
def destroy(self, request: 'Request', *args: 'Any', **kwargs: 'Any') -> 'Response': def destroy(self, request: 'Request', *args: 'Any', **kwargs: 'Any') -> 'Response':
event = self.get_object() event = self.get_object()
if event.attendants.exists(): if event.attendants.exists():
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment