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'))
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)
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")
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)
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)
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)