Exemple #1
0
def PersonCreate(request, membertype):
    family = user_to_person(request.user).family
    if request.method == "POST":
        person = Person()
        person.membertype = membertype
        person.family = family
        form = PersonForm(request.POST, instance=person)
        if form.is_valid():
            UpdatePersonFromForm(person, form)
            return HttpResponseRedirect(reverse("entry_page"))
    else:
        person = Person()
        person.membertype = membertype
        if family.person_set.count() > 0:
            first_person = family.person_set.first()
            person.family = family
            person.zipcode = first_person.zipcode
            person.city = first_person.city
            person.streetname = first_person.streetname
            person.housenumber = first_person.housenumber
            person.floor = first_person.floor
            person.door = first_person.door
            person.placename = first_person.placename
            person.dawa_id = first_person.dawa_id
        form = PersonForm(instance=person)
    return render(
        request,
        "members/person_create_or_update.html",
        {
            "form": form,
            "person": person,
            "family": family,
            "membertype": membertype
        },
    )
def WaitingListSetSubscription(request, id, departmentId, action):

    family = user_to_person(request.user).family
    person = get_object_or_404(Person, pk=id)

    if person.family.id != family.id:
        raise Http404("Person ikke i samme familie som bruger")
    department = get_object_or_404(Department, pk=departmentId)

    if action == 'subscribe':
        if WaitingList.objects.filter(person=person, department=department):
            raise Http404("{} er allerede på {}s venteliste".format(person.name, department.name))
        waiting_list = WaitingList()
        waiting_list.person = person
        waiting_list.department = department
        waiting_list.save()

    if action == 'unsubscribe':
        try:
            waiting_list = WaitingList.objects.get(person=person, department=department)
            waiting_list.delete()
        except Exception:
            raise Http404("{} er ikke på {}s venteliste".format(person.name, department.name))

    return HttpResponseRedirect(reverse('family_detail'))
Exemple #3
0
def WaitingListSetSubscription(request, id, departmentId, action):

    family = user_to_person(request.user).family
    person = get_object_or_404(Person, pk=id)

    if person.family.id != family.id:
        raise Http404("Person ikke i samme familie som bruger")
    department = get_object_or_404(Department, pk=departmentId)

    if action == "subscribe":
        if WaitingList.objects.filter(person=person, department=department):
            raise Http404("{} er allerede på {}s venteliste".format(
                person.name, department.name))
        waiting_list = WaitingList()
        waiting_list.person = person
        waiting_list.department = department
        waiting_list.save()

    if action == "unsubscribe":
        try:
            waiting_list = WaitingList.objects.get(person=person,
                                                   department=department)
            waiting_list.delete()
        except Exception:
            raise Http404("{} er ikke på {}s venteliste".format(
                person.name, department.name))

    return HttpResponseRedirect(reverse("family_detail"))
def PersonCreate(request, membertype):
    family = user_to_person(request.user).family
    if request.method == 'POST':
        person = Person()
        person.membertype = membertype
        person.family = family
        form = PersonForm(request.POST, instance=person)
        if form.is_valid():
            UpdatePersonFromForm(person, form)
            return HttpResponseRedirect(reverse('family_detail'))
    else:
        person = Person()
        person.membertype = membertype
        if family.person_set.count() > 0:
            first_person = family.person_set.first()
            person.family = family
            person.zipcode = first_person.zipcode
            person.city = first_person.city
            person.streetname = first_person.streetname
            person.housenumber = first_person.housenumber
            person.floor = first_person.floor
            person.door = first_person.door
            person.placename = first_person.placename
            person.dawa_id = first_person.dawa_id
        form = PersonForm(instance=person)
    return render(request, 'members/person_create_or_update.html', {'form': form, 'person': person, 'family': family, 'membertype': membertype})
def FamilyDetails(request):

    family = user_to_person(request.user).family
    invites = ActivityInvite.objects.filter(person__family=family, expire_dtm__gte=timezone.now(), rejected_dtm=None)
    open_activities = Activity.objects.filter(open_invite=True, signup_closing__gte=timezone.now()).order_by('zipcode')
    participating = ActivityParticipant.objects.filter(member__person__family=family).order_by('-activity__start_date')
    departments_with_no_waiting_list = Department.objects.filter(has_waiting_list=False)
    waiting_lists = WaitingList.objects.filter(person__family=family)
    children = family.person_set.filter(membertype=Person.CHILD)
    ordered_persons = family.person_set.order_by('membertype').all()

    open_activities_with_persons = []
    # augment open invites with the persons who could join it in the family
    for curActivity in open_activities:
        applicablePersons = Person.objects.filter(family=family,  # only members of this family
                                                  birthday__lte=timezone.now() - datetime.timedelta(days=curActivity.min_age * 365),  # old enough
                                                  birthday__gt=timezone.now() - datetime.timedelta(days=curActivity.max_age * 365),  # not too old
                                                  ).exclude(member__activityparticipant__activity=curActivity)  # not already participating

        if applicablePersons.exists():
            open_activities_with_persons.append({'id': curActivity.id, 'name': curActivity.name, 'department': curActivity.department, 'persons': applicablePersons})

    # update visited field
    family.last_visit_dtm = timezone.now()
    family.save()

    department_children_waiting = {'departments': {}}
    loop_counter = 0
    for department in Department.objects.filter(has_waiting_list=True, closed_dtm=None).order_by('zipcode'):
        department_children_waiting['departments'][loop_counter] = {}
        department_children_waiting['departments'][loop_counter]['object'] = department
        department_children_waiting['departments'][loop_counter]['children_status'] = {}
        for child in children:
            department_children_waiting['departments'][loop_counter]['children_status'][child.pk] = {}
            department_children_waiting['departments'][loop_counter]['children_status'][child.pk]['object'] = child
            department_children_waiting['departments'][loop_counter]['children_status'][child.pk]['firstname'] = child.firstname()
            department_children_waiting['departments'][loop_counter]['children_status'][child.pk]['waiting'] = False  # default not waiting
            for current_wait in waiting_lists:
                if(current_wait.department == department and current_wait.person == child):
                    # child is waiting on this department
                    department_children_waiting['departments'][loop_counter]['children_status'][child.pk]['waiting'] = True
                    break
        loop_counter = loop_counter + 1

    context = {
        'family': family,
        'invites': invites,
        'participating': participating,
        'open_activities': open_activities_with_persons,
        'need_confirmation': family.confirmed_dtm is None or family.confirmed_dtm < timezone.now() - datetime.timedelta(days=settings.REQUEST_FAMILY_VALIDATION_PERIOD),
        'request_parents': family.person_set.exclude(membertype=Person.CHILD).count() < 1,
        'department_children_waiting': department_children_waiting,
        'departments_with_no_waiting_list': departments_with_no_waiting_list,
        'children': children,
        'ordered_persons': ordered_persons,
    }
    return render(request, 'members/family_details.html', context)
def PersonUpdate(request, id):
    person = Person.objects.get(pk=id)
    persons_in_family = Person.objects.filter(family=user_to_person(request.user).family)
    if person in persons_in_family:
        if request.method == 'POST':
            form = PersonForm(request.POST, instance=person)
            if form.is_valid():
                UpdatePersonFromForm(person, form)
                return HttpResponseRedirect(reverse('family_detail'))
        else:
            form = PersonForm(instance=person)
        return render(request, 'members/person_create_or_update.html', {'form': form, 'person': person})
    else:
        return HttpResponse("Du kan kun redigere en person i din egen familie")
def ConfirmFamily(request):

    family = user_to_person(request.user).family
    persons = Person.objects.filter(family=family)
    subscribed_waiting_lists = WaitingList.objects.filter(person__family=family)

    if request.method == 'POST':
        ''' No data recieved - just set confirmed_dtm date to now '''
        family.confirmed_dtm = timezone.now()
        family.save()
        return HttpResponseRedirect(reverse('family_detail'))
    else:
        context = {
            'family': family,
            'persons': persons,
            'subscribed_waitinglists': subscribed_waiting_lists
        }
        return render(request, 'members/family_confirm_details.html', context)
Exemple #8
0
def ConfirmFamily(request):
    family = user_to_person(request.user).family
    persons = Person.objects.filter(family=family)
    subscribed_waiting_lists = WaitingList.objects.filter(
        person__family=family)

    if request.method == "POST":
        """No data recieved - just set confirmed_dtm date to now"""
        family.confirmed_dtm = timezone.now()
        family.save()
        return HttpResponseRedirect(reverse("family_detail"))
    else:
        context = {
            "family": family,
            "persons": persons,
            "subscribed_waitinglists": subscribed_waiting_lists,
        }
        return render(request, "members/family_confirm_details.html", context)
def Activities(request):
    family = user_to_person(request.user).family
    invites = ActivityInvite.objects.filter(person__family=family,
                                            expire_dtm__gte=timezone.now(),
                                            rejected_dtm=None)
    open_activities = Activity.objects.filter(
        open_invite=True,
        signup_closing__gte=timezone.now(),
        activitytype__in=["FORLØB", "ARRANGEMENT"],
    ).order_by("zipcode")
    participating = ActivityParticipant.objects.filter(
        member__person__family=family,
        activity__activitytype__in=["FORLØB", "ARRANGEMENT"],
    ).order_by("-activity__start_date")

    open_activities_with_persons = []
    # augment open invites with the persons who could join it in the family
    for curActivity in open_activities:
        applicablePersons = Person.objects.filter(
            family=family,  # only members of this family
            birthday__lte=timezone.now() -
            datetime.timedelta(days=curActivity.min_age * 365),  # old enough
            birthday__gt=timezone.now() -
            datetime.timedelta(days=curActivity.max_age * 365),  # not too old
        ).exclude(member__activityparticipant__activity=curActivity
                  )  # not already participating

        if applicablePersons.exists():
            open_activities_with_persons.append({
                "id": curActivity.id,
                "name": curActivity.name,
                "department": curActivity.department,
                "persons": applicablePersons,
            })

    context = {
        "family": family,
        "invites": invites,
        "participating": participating,
        "open_activities": open_activities_with_persons,
    }
    return render(request, "members/activities.html", context)
def PersonUpdate(request, id):
    person = Person.objects.get(pk=id)
    persons_in_family = Person.objects.filter(
        family=user_to_person(request.user).family
    )
    if person in persons_in_family:
        if request.method == "POST":
            form = PersonForm(request.POST, instance=person)
            if form.is_valid():
                UpdatePersonFromForm(person, form)
                return HttpResponseRedirect(reverse("family_detail"))
        else:
            form = PersonForm(instance=person)
        return render(
            request,
            "members/person_create_or_update.html",
            {"form": form, "person": person},
        )
    else:
        return HttpResponse("Du kan kun redigere en person i din egen familie")
Exemple #11
0
def Membership(request):
    family = user_to_person(request.user).family
    membership_activities = Activity.objects.filter(
        signup_closing__gte=timezone.now(),
        activitytype__in=["FORENINGSMEDLEMSKAB"],
    ).order_by("zipcode")
    participating = ActivityParticipant.objects.filter(
        member__person__family=family,
        activity__activitytype__in=["FORENINGSMEDLEMSKAB"],
    ).order_by("-activity__start_date")

    membership_activities_with_persons = []
    # augment open invites with the persons who could join it in the family
    for curActivity in membership_activities:
        applicablePersons = Person.objects.filter(
            family=family,  # only members of this family
            birthday__lte=timezone.now() -
            datetime.timedelta(days=curActivity.min_age * 365),  # old enough
            birthday__gt=timezone.now() -
            datetime.timedelta(days=curActivity.max_age * 365),  # not too old
        ).exclude(member__activityparticipant__activity=curActivity
                  )  # not already participating

        if applicablePersons.exists():
            membership_activities_with_persons.append({
                "id":
                curActivity.id,
                "name":
                curActivity.name,
                "union":
                curActivity.union,
                "persons":
                applicablePersons,
            })

    context = {
        "participating": participating,
        "membership_activities": membership_activities_with_persons,
    }
    return render(request, "members/membership.html", context)
Exemple #12
0
def DepartmentSignView(request):
    family = user_to_person(request.user).family
    departments = Department.get_open_departments()
    children = [
        {"person": child, "waitinglists": WaitingList.get_by_child(child)}
        for child in family.get_children()
    ]
    for child in children:
        child["departments_is_waiting"] = [
            department for (department, _place) in child["waitinglists"]
        ]
        child["departments_not_waiting"] = [
            department
            for department in departments
            if department not in child["departments_is_waiting"]
        ]
    departments = [
        department for department in departments if department.address.region != ""
    ]
    return render(
        request,
        "members/department_signup.html",
        {"departments": departments, "children": children},
    )
def Activities(request):
    family = user_to_person(request.user).family
    invites = ActivityInvite.objects.filter(person__family=family, expire_dtm__gte=timezone.now(), rejected_dtm=None)
    open_activities = Activity.objects.filter(open_invite=True, signup_closing__gte=timezone.now()).order_by('zipcode')
    participating = ActivityParticipant.objects.filter(member__person__family=family).order_by('-activity__start_date')

    open_activities_with_persons = []
    # augment open invites with the persons who could join it in the family
    for curActivity in open_activities:
        applicablePersons = Person.objects.filter(family=family,  # only members of this family
                                                birthday__lte=timezone.now() - datetime.timedelta(days=curActivity.min_age * 365),  # old enough
                                                birthday__gt=timezone.now() - datetime.timedelta(days=curActivity.max_age * 365),  # not too old
                                                ).exclude(member__activityparticipant__activity=curActivity)  # not already participating

        if applicablePersons.exists():
            open_activities_with_persons.append({'id': curActivity.id, 'name': curActivity.name, 'department': curActivity.department, 'persons': applicablePersons})

    context = {
        'family': family,
        'invites': invites,
        'participating': participating,
        'open_activities': open_activities_with_persons,
    }
    return render(request, 'members/activities.html', context)
def FamilyDetails(request):
    family = user_to_person(request.user).family

    # update visited field
    family.last_visit_dtm = timezone.now()
    family.save()

    need_confirmation = family.confirmed_dtm is None or (
        family.confirmed_dtm < timezone.now() -
        datetime.timedelta(days=settings.REQUEST_FAMILY_VALIDATION_PERIOD))

    context = {
        "family":
        family,
        "need_confirmation":
        need_confirmation,
        "children":
        family.person_set.filter(membertype=Person.CHILD),
        "request_parents":
        family.person_set.exclude(membertype=Person.CHILD).count() < 1,
        "ordered_persons":
        family.person_set.order_by("membertype").all(),
    }
    return render(request, "members/family_details.html", context)
def ActivitySignup(request, activity_id, person_id=None):
    # TODO: is should be possible to view an activity without loggin in
    if(person_id is None):
        # View only mode
        view_only_mode = True
    else:
        view_only_mode = False

    activity = get_object_or_404(Activity, pk=activity_id)

    participating = False

    if(request.resolver_match.url_name == 'activity_view_person'):
        view_only_mode = True

    family = user_to_person(request.user).family

    if person_id:
        try:
            person = family.person_set.get(pk=person_id)

            # Check not already signed up
            try:
                participant = ActivityParticipant.objects.get(activity=activity, member__person=person)
                # found - we can only allow one - switch to view mode
                participating = True
                view_only_mode = True
            except ActivityParticipant.DoesNotExist:
                participating = False  # this was expected - if not signed up yet

        except Person.DoesNotExist:
            raise Http404('Person not found on family')
    else:
        person = None

    if(not activity.open_invite):
        ''' Make sure valid not expired invitation to event exists '''
        try:
            invitation = ActivityInvite.objects.get(activity=activity, person=person, expire_dtm__gte=timezone.now())
        except ActivityInvite.DoesNotExist:
            view_only_mode = True  # not invited - switch to view mode
            invitation = None
    else:
        invitation = None

    # signup_closed should default to False
    signup_closed = False

    # if activity is closed for signup, only invited persons can still join
    if activity.signup_closing < timezone.now().date() and invitation is None:
        view_only_mode = True  # Activivty closed for signup
        signup_closed = True

    # check if activity is full
    if activity.seats_left() <= 0:
        view_only_mode = True  # activity full
        signup_closed = True

    if(request.method == "POST"):
        if view_only_mode:
            return HttpResponse('Du kan ikke tilmelde dette event nu. (ikke inviteret / tilmelding lukket / du er allerede tilmeldt eller aktiviteten er fuldt booket)')

        if activity.max_age < person.age_years() or activity.min_age > person.age_years():
            return HttpResponse('Barnet skal være mellem ' + str(activity.min_age) + ' og ' + str(activity.max_age) + ' år gammel for at deltage. (Er fødselsdatoen udfyldt korrekt ?)')

        if Person.objects.filter(family=family).exclude(membertype=Person.CHILD).count() <= 0:
            return HttpResponse('Barnet skal have en forælder eller værge. Gå tilbage og tilføj en før du tilmelder.')

        signup_form = ActivitySignupForm(request.POST)

        if signup_form.is_valid():
            # Sign up and redirect to payment link or family page

            # Calculate membership
            membership_start = timezone.datetime(year=activity.start_date.year, month=1, day=1)
            membership_end = timezone.datetime(year=activity.start_date.year, month=12, day=31)
            # check if person is member, otherwise make a member
            try:
                member = Member.objects.get(person=person)
            except Member.DoesNotExist:
                member = Member(
                    department=activity.department,
                    person=person,
                    member_since=membership_start,
                    member_until=membership_end,
                )
                member.save()

            # update membership end date
            member.member_until = membership_end
            member.save()

            # Make ActivityParticipant
            participant = ActivityParticipant(member=member, activity=activity, note=signup_form.cleaned_data['note'])

            # If conditions not accepted, make error
            if signup_form.cleaned_data['read_conditions'] == "NO":
                return HttpResponse("For at gå til en Coding Pirates aktivitet skal du acceptere vores betingelser.")

            # Make sure people have selected yes or no in photo permission and update photo permission
            if signup_form.cleaned_data['photo_permission'] == "Choose":
                return HttpResponse("Du skal vælge om vi må tage billeder eller ej.")
            participant.photo_permission = signup_form.cleaned_data['photo_permission']
            participant.save()

            return_link_url = reverse('activity_view_person', args=[activity.id, person.id])

            # Make payment if activity costs
            if activity.price_in_dkk is not None and activity.price_in_dkk != 0:
                # using creditcard ?
                if signup_form.cleaned_data['payment_option'] == Payment.CREDITCARD:
                    payment = Payment(
                        payment_type=Payment.CREDITCARD,
                        activity=activity,
                        activityparticipant=participant,
                        person=person,
                        family=family,
                        body_text=timezone.now().strftime("%Y-%m-%d") + ' Betaling for ' + activity.name + ' på ' + activity.department.name,
                        amount_ore=int(activity.price_in_dkk * 100),
                    )
                    payment.save()

                    return_link_url = payment.get_quickpaytransaction().get_link_url(return_url=settings.BASE_URL + reverse('activity_view_person', args=[activity.id, person.id]))

            # expire invitation
            if invitation:
                invitation.expire_dtm = timezone.now() - timezone.timedelta(days=1)
                invitation.save()

            # reject all seasonal invitations on person if this was a seasonal invite
            # (to avoid signups on multiple departments for club season)
            if activity.is_season():
                invites = ActivityInvite.objects.filter(person=person).exclude(activity=activity)
                for invite in invites:
                    if invite.activity.is_season():
                        invite.rejected_dtm = timezone.now()
                        invite.save()

            return HttpResponseRedirect(return_link_url)
        # fall through else
    else:

        signup_form = ActivitySignupForm()

    union = activity.department.union

    context = {
        'family': family,
        'activity': activity,
        'person': person,
        'invitation': invitation,
        'price': activity.price_in_dkk,
        'seats_left': activity.seats_left(),
        'signupform': signup_form,
        'signup_closed': signup_closed,
        'view_only_mode': view_only_mode,
        'participating': participating,
        'union': union,
    }
    return render(request, 'members/activity_signup.html', context)
def paymentGatewayErrorView(request):
    unique = user_to_person(request.user).family.unique
    return render(request, "members/payment_gateway_error.html",
                  {"unique": unique})
def FamilyDetails(request):

    family = user_to_person(request.user).family
    invites = ActivityInvite.objects.filter(
        person__family=family, expire_dtm__gte=timezone.now(), rejected_dtm=None
    )
    open_activities = Activity.objects.filter(
        open_invite=True, signup_closing__gte=timezone.now()
    ).order_by("zipcode")
    participating = ActivityParticipant.objects.filter(
        member__person__family=family
    ).order_by("-activity__start_date")
    departments_with_no_waiting_list = Department.objects.filter(has_waiting_list=False)
    waiting_lists = WaitingList.objects.filter(person__family=family)
    children = family.person_set.filter(membertype=Person.CHILD)
    ordered_persons = family.person_set.order_by("membertype").all()

    open_activities_with_persons = []
    # augment open invites with the persons who could join it in the family
    for curActivity in open_activities:
        applicablePersons = Person.objects.filter(
            family=family,  # only members of this family
            birthday__lte=timezone.now()
            - datetime.timedelta(days=curActivity.min_age * 365),  # old enough
            birthday__gt=timezone.now()
            - datetime.timedelta(days=curActivity.max_age * 365),  # not too old
        ).exclude(
            member__activityparticipant__activity=curActivity
        )  # not already participating

        if applicablePersons.exists():
            open_activities_with_persons.append(
                {
                    "id": curActivity.id,
                    "name": curActivity.name,
                    "department": curActivity.department,
                    "persons": applicablePersons,
                }
            )

    # update visited field
    family.last_visit_dtm = timezone.now()
    family.save()

    department_children_waiting = {"departments": {}}
    loop_counter = 0
    for department in Department.objects.filter(
        has_waiting_list=True, closed_dtm=None
    ).order_by("zipcode"):
        department_children_waiting["departments"][loop_counter] = {}
        department_children_waiting["departments"][loop_counter]["object"] = department
        department_children_waiting["departments"][loop_counter]["children_status"] = {}
        for child in children:
            department_children_waiting["departments"][loop_counter]["children_status"][
                child.pk
            ] = {}
            department_children_waiting["departments"][loop_counter]["children_status"][
                child.pk
            ]["object"] = child
            department_children_waiting["departments"][loop_counter]["children_status"][
                child.pk
            ]["firstname"] = child.firstname()
            department_children_waiting["departments"][loop_counter]["children_status"][
                child.pk
            ][
                "waiting"
            ] = False  # default not waiting
            for current_wait in waiting_lists:
                if (
                    current_wait.department == department
                    and current_wait.person == child
                ):
                    # child is waiting on this department
                    department_children_waiting["departments"][loop_counter][
                        "children_status"
                    ][child.pk]["waiting"] = True
                    break
        loop_counter = loop_counter + 1

    context = {
        "family": family,
        "invites": invites,
        "participating": participating,
        "open_activities": open_activities_with_persons,
        "need_confirmation": family.confirmed_dtm is None
        or family.confirmed_dtm
        < timezone.now()
        - datetime.timedelta(days=settings.REQUEST_FAMILY_VALIDATION_PERIOD),
        "request_parents": family.person_set.exclude(membertype=Person.CHILD).count()
        < 1,
        "department_children_waiting": department_children_waiting,
        "departments_with_no_waiting_list": departments_with_no_waiting_list,
        "children": children,
        "ordered_persons": ordered_persons,
    }
    return render(request, "members/family_details.html", context)
Exemple #18
0
def ActivitySignup(request, activity_id, person_id=None):
    # TODO: is should be possible to view an activity without loggin in
    if person_id is None:
        # View only mode
        view_only_mode = True
    else:
        view_only_mode = False

    activity = get_object_or_404(Activity, pk=activity_id)

    participating = False

    if request.resolver_match.url_name == "activity_view_person":
        view_only_mode = True

    family = user_to_person(request.user).family

    if person_id:
        try:
            person = family.person_set.get(pk=person_id)

            # Check not already signed up
            try:
                participant = ActivityParticipant.objects.get(
                    activity=activity, member__person=person)
                # found - we can only allow one - switch to view mode
                participating = True
                view_only_mode = True
            except ActivityParticipant.DoesNotExist:
                participating = False  # this was expected - if not signed up yet

        except Person.DoesNotExist:
            raise Http404("Person not found on family")
    else:
        person = None

    if not activity.open_invite:
        """ Make sure valid not expired invitation to event exists """
        try:
            invitation = ActivityInvite.objects.get(
                activity=activity,
                person=person,
                expire_dtm__gte=timezone.now())
        except ActivityInvite.DoesNotExist:
            view_only_mode = True  # not invited - switch to view mode
            invitation = None
    else:
        invitation = None

    # signup_closed should default to False
    signup_closed = False

    # if activity is closed for signup, only invited persons can still join
    if activity.signup_closing < timezone.now().date() and invitation is None:
        view_only_mode = True  # Activivty closed for signup
        signup_closed = True

    # check if activity is full
    if activity.seats_left() <= 0:
        view_only_mode = True  # activity full
        signup_closed = True

    if request.method == "POST":
        if view_only_mode:
            return HttpResponse(
                "Du kan ikke tilmelde dette event nu. (ikke inviteret / tilmelding lukket / du er allerede tilmeldt eller aktiviteten er fuldt booket)"
            )

        if (activity.max_age < person.age_years()
                or activity.min_age > person.age_years()):
            return HttpResponse(
                "Barnet skal være mellem " + str(activity.min_age) + " og " +
                str(activity.max_age) +
                " år gammel for at deltage. (Er fødselsdatoen udfyldt korrekt ?)"
            )

        if (Person.objects.filter(family=family).exclude(
                membertype=Person.CHILD).count() <= 0):
            return HttpResponse(
                "Barnet skal have en forælder eller værge. Gå tilbage og tilføj en før du tilmelder."
            )

        signup_form = ActivitySignupForm(request.POST)

        if signup_form.is_valid():
            # Sign up and redirect to payment link or family page

            # Calculate membership
            membership_start = timezone.datetime(year=activity.start_date.year,
                                                 month=1,
                                                 day=1)
            membership_end = timezone.datetime(year=activity.start_date.year,
                                               month=12,
                                               day=31)
            # check if person is member, otherwise make a member
            try:
                member = Member.objects.get(person=person)
            except Member.DoesNotExist:
                member = Member(
                    department=activity.department,
                    person=person,
                    member_since=membership_start,
                    member_until=membership_end,
                )
                member.save()

            # update membership end date
            member.member_until = membership_end
            member.save()

            # Make ActivityParticipant
            participant = ActivityParticipant(
                member=member,
                activity=activity,
                note=signup_form.cleaned_data["note"])

            # If conditions not accepted, make error
            if signup_form.cleaned_data["read_conditions"] == "NO":
                return HttpResponse(
                    "For at gå til en Coding Pirates aktivitet skal du acceptere vores betingelser."
                )

            # Make sure people have selected yes or no in photo permission and update photo permission
            if signup_form.cleaned_data["photo_permission"] == "Choose":
                return HttpResponse(
                    "Du skal vælge om vi må tage billeder eller ej.")
            participant.photo_permission = signup_form.cleaned_data[
                "photo_permission"]
            participant.save()

            return_link_url = reverse("activity_view_person",
                                      args=[activity.id, person.id])

            # Make payment if activity costs
            if activity.price_in_dkk is not None and activity.price_in_dkk != 0:
                # using creditcard ?
                if signup_form.cleaned_data[
                        "payment_option"] == Payment.CREDITCARD:
                    payment = Payment(
                        payment_type=Payment.CREDITCARD,
                        activity=activity,
                        activityparticipant=participant,
                        person=person,
                        family=family,
                        body_text=timezone.now().strftime("%Y-%m-%d") +
                        " Betaling for " + activity.name + " på " +
                        activity.department.name,
                        amount_ore=int(activity.price_in_dkk * 100),
                    )
                    payment.save()

                    return_link_url = payment.get_quickpaytransaction(
                    ).get_link_url(return_url=settings.BASE_URL + reverse(
                        "activity_view_person", args=[activity.id, person.id]))

            # expire invitation
            if invitation:
                invitation.expire_dtm = timezone.now() - timezone.timedelta(
                    days=1)
                invitation.save()

            # reject all seasonal invitations on person if this was a seasonal invite
            # (to avoid signups on multiple departments for club season)
            if activity.is_season():
                invites = ActivityInvite.objects.filter(person=person).exclude(
                    activity=activity)
                for invite in invites:
                    if invite.activity.is_season():
                        invite.rejected_dtm = timezone.now()
                        invite.save()

            return HttpResponseRedirect(return_link_url)
        # fall through else
    else:

        signup_form = ActivitySignupForm()

    union = activity.department.union

    context = {
        "family": family,
        "activity": activity,
        "person": person,
        "invitation": invitation,
        "price": activity.price_in_dkk,
        "seats_left": activity.seats_left(),
        "signupform": signup_form,
        "signup_closed": signup_closed,
        "view_only_mode": view_only_mode,
        "participating": participating,
        "union": union,
    }
    return render(request, "members/activity_signup.html", context)