Skip to content

Commit

Permalink
Merge pull request #54 from Nettverksdagen/fix/participant_count
Browse files Browse the repository at this point in the history
Fixed participant count. Only registers participant if email sent.
  • Loading branch information
olejodd10 authored Feb 17, 2022
2 parents a0cc2cf + e6f5bd8 commit 6f802db
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 91 deletions.
112 changes: 42 additions & 70 deletions api/nvdagen/viewsets.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@
from .models import Listing, Business, Sponsor, TeamMember, Form, Participant, Program
from .serializers import ListingSerializer, BusinessSerializer, SponsorSerializer, TeamMemberSerializer, FormSerializer, ParticipantSerializer, ProgramSerializer
from django.core.mail import send_mail
from django.template.loader import render_to_string
from django.utils.html import strip_tags


class ListingViewSet(viewsets.ModelViewSet):
queryset = Listing.objects.all()
Expand Down Expand Up @@ -43,106 +42,79 @@ class ParticipantViewSet(viewsets.ModelViewSet):


def create(self, request):
#Data to be used
data = {'year': request.data.get('year'), 'study': request.data.get('study'), 'email': request.data.get('email'), 'name': request.data.get('name'), 'event': request.data.get('event'), 'code': request.data.get('code')}
ParticipantValidationList = Participant.objects.filter(email=data['email'], event=data['event'])
ProgramToBeAdded = Program.objects.filter(id=data['event'])[0]

#Validates that a new Participant can enter the event
if (len(ParticipantValidationList) == 0):
#Using the default django-create function
super().create(request)

#Updating the registrationlist on event
ProgramToBeAdded.registered += 1
ProgramToBeAdded.save()
data = request.data
notRegistered = Participant.objects.filter(email=data['email'], event=data['event']).count() == 0
program = Program.objects.get(id=data['event'])

if (notRegistered):
currentlyRegistered = program.participant_set.all().count()
try:
# If program is full, send waiting list email
if (ProgramToBeAdded.registered > ProgramToBeAdded.maxRegistered):
waitingListIndex = ProgramToBeAdded.registered - ProgramToBeAdded.maxRegistered

#Sending the mail
if (currentlyRegistered >= program.maxRegistered):
waitingListIndex = currentlyRegistered - program.maxRegistered + 1
send_mail('Nettverksdagene - Du står på venteliste',
'Vi bekrefter herved at du står på venteliste til ' + ProgramToBeAdded.header + '. Din plass på ventelisten er ' + str(waitingListIndex) + '. Dersom du skulle ønske å melde deg av, vennligst gjør det via nettverksdagene.no/program. Tusen takk for din interesse i Nettverksdagene!',
'Vi bekrefter herved at du står på venteliste til ' + program.header + '. Din plass på ventelisten er ' + str(waitingListIndex) + '. Dersom du skulle ønske å melde deg av, vennligst gjør det via nettverksdagene.no/program. Tusen takk for din interesse i Nettverksdagene!',
'[email protected]',
[data.get('email')],
[data['email']],
fail_silently=False)

#returning a response
response = {'message': 'It works!!'}
return Response(response, status = status.HTTP_200_OK)
# If program not full, send confirmation email
else:
#Sending the mail
send_mail('Nettverksdagene - Påmelding bekreftet for ' + data.get('name'),
'Vi bekrefter herved at du er påmeldt ' + ProgramToBeAdded.header + '. Dersom du skulle ønske å melde deg av, vennligst gjør det via nettverksdagene.no/program. Tusen takk for din interesse i Nettverksdagene!',
send_mail('Nettverksdagene - Påmelding bekreftet for ' + data['name'],
'Vi bekrefter herved at du er påmeldt ' + program.header + '. Dersom du skulle ønske å melde deg av, vennligst gjør det via nettverksdagene.no/program. Tusen takk for din interesse i Nettverksdagene!',
'[email protected]',
[data.get('email')],
[data['email']],
fail_silently=False)

#returning a response
response = {'message': 'It works!!'}
return Response(response, status = status.HTTP_200_OK)
except:
#An error to be raised if the send_mail function doesn't work
print("ERROR: Konfigurer email-settings i mail_settings.py")
raise Exception('ERROR: Konfigurer email-settings i mail_settings.py')
print("ERROR: Could not send email. Is mail_settings.py correct?")
response = {'message': 'Could not send email'}
return Response(response, status = status.HTTP_500_INTERNAL_SERVER_ERROR)

return super().create(request)

else:
#returning a response
response = {'message': 'Invalid input, check Participant list. Should not be duplicated'}
response = {'message': 'Invalid input. Is participant already registered?'}
return Response(response, status = status.HTTP_400_BAD_REQUEST)

def retrieve(self, request, pk):
participant = Participant.objects.get(id=pk)
program_id = participant.event
program = Program.objects.get(id=program_id)
program = participant.event

try:
send_mail('Nettverksdagene - Avmeldingskode for ' + participant.name,
'Din avmeldingskode for ' + program.header + ' er: ' + participant.code + '. Tusen takk for din interesse i Nettverksdagene!',
'[email protected]',
[participant.email],
fail_silently=False)
#returning a response
response = {'message': 'It works!!'}
return Response(response, status = status.HTTP_200_OK)
except:
#An error to be raised if the send_mail function doesn't work
print("ERROR: Konfigurer email-settings i mail_settings.py")
raise Exception('ERROR: Konfigurer email-settings i mail_settings.py')
print("ERROR: Could not send email. Is mail_settings.py correct?")
response = {'message': 'Could not send email'}
return Response(response, status = status.HTTP_500_INTERNAL_SERVER_ERROR)

response = {'message': 'Participant code sent successfully'}
return Response(response, status = status.HTTP_200_OK)

def destroy(self, request, pk):

participant = Participant.objects.get(id=pk)
program_id = participant.event

response = super().destroy(request)

if status.is_success(response.status_code):
program = Program.objects.get(id=program_id)
program.registered -= 1
program.save()

if program.registered >= program.maxRegistered:
new_participant = Participant.objects.order_by('id')[program.maxRegistered-1]
try:
#Sending the mail
send_mail('Nettverksdagene - Påmelding bekreftet for ' + new_participant.name,
'Du sto på ventelisten for ' + program.header + ', og har nå fått plass. Dersom du skulle ønske å melde deg av, vennligst gjør det via nettverksdagene.no/program. Tusen takk for din interesse i Nettverksdagene!',
'[email protected]',
[new_participant.email],
fail_silently=False)
program = participant.event
registered = program.participant_set.all().count()

if registered >= program.maxRegistered: # If last participant exists
lastParticipant = program.participant_set.all().order_by('id')[program.maxRegistered-1]
if participant.id < lastParticipant.id: # If lastParticipant is new
try:
send_mail('Nettverksdagene - Påmelding bekreftet for ' + lastParticipant.name,
'Du sto på ventelisten for ' + program.header + ', og har nå fått plass. Dersom du skulle ønske å melde deg av, vennligst gjør det via nettverksdagene.no/program. Tusen takk for din interesse i Nettverksdagene!',
'[email protected]',
[lastParticipant.email],
fail_silently=False)
except:
print("ERROR: Could not send email. Is mail_settings.py correct?")
response = {'message': 'Could not send email'}
return Response(response, status = status.HTTP_500_INTERNAL_SERVER_ERROR)

#returning a response
response = {'message': 'It works!!'}
return Response(response, status = status.HTTP_200_OK)
except:
#An error to be raised if the send_mail function doesn't work
print("ERROR: Konfigurer email-settings i mail_settings.py")
raise Exception('ERROR: Konfigurer email-settings i mail_settings.py')
else:
raise Exception(f'ERROR: DELETE request returned {response.status_code}.')

return response
34 changes: 13 additions & 21 deletions frontend/src/components/anon/ProgramItem.vue
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
</div>
</div>
<div v-if="registration" class='button'>
<b-button v-if="enableRegistration && notSendtEmail" variant='primary' @click="openDialog">Påmelding</b-button>
<b-button v-if="enableRegistration && !submitted" variant='primary' @click="openDialog">Påmelding</b-button>
<b-button v-else disabled variant="dark">Påmelding</b-button>
</div>
<div class="footer">
Expand All @@ -43,7 +43,7 @@
<b-link @click.native="destroy_participant(name)">Ønsker du å melde deg av? Klikk her.</b-link>
</div>
<div v-if="registration">
<div v-if="!notSendtEmail">
<div v-if="submitted">
<div>Dersom du ble med, har du fått en bekreftelsesmail</div>
</div>
<div v-else-if="enableRegistration && registered<maxRegistered">
Expand Down Expand Up @@ -146,7 +146,7 @@ import { faMapMarkerAlt, faClock } from '@fortawesome/free-solid-svg-icons'
library.add(faMapMarkerAlt, faClock)
export default {
name: 'ProgramItem',
props: ['timeStart', 'timeEnd', 'place', 'header', 'paragraph', 'registration', 'maxRegistered', 'registered', 'cancelEmail', 'registrationStart', 'registrationEnd', 'name'],
props: ['timeStart', 'timeEnd', 'place', 'header', 'paragraph', 'registration', 'maxRegistered', 'cancelEmail', 'registrationStart', 'registrationEnd', 'name'],
data () {
return {
form: {
Expand All @@ -156,10 +156,13 @@ export default {
year: ''
},
show: false,
notSendtEmail: true
submitted: false
}
},
computed: {
registered: function () {
return this.$store.state.participant.all.filter(par => par.event === this.$props.name).length
},
beforeRegistration: function () {
let now = new Date()
return this.$props.registrationStart.getTime() > now.getTime()
Expand Down Expand Up @@ -210,30 +213,20 @@ export default {
// Generate and include 6-character random deregistering code
data.code = Array(6).fill(0).map(x => Math.random().toString(36).charAt(2)).join('').toUpperCase()
if (this.checkValidForm(data)) {
// Send email here
this.sendEmail()
// Clear data
this.$data.show = false
this.$data.form = {email: '', name: '', study: '', year: ''}
this.$data.notSendtEmail = false
} else {
/*
// Send email here
this.sendEmail()
this.submitForm()
// Clear data
this.$data.show = false
this.$data.form = {email: '', name: '', study: '', year: ''}
this.$data.notSendtEmail = false
*/
this.$data.submitted = true
}
},
sendEmail () {
submitForm () {
console.log({event: this.$props.name, ...this.$data.form})
axios.post(process.env.VUE_APP_API_HOST +
'/api/participant/', {event: this.$props.name, ...this.$data.form})
.then((response) => console.log(response))
.catch((e) => {
console.log('Error in sendEmail')
console.log('Error in submitForm')
console.log(e)
})
},
Expand All @@ -256,8 +249,7 @@ export default {
}
return true
},
destroy_participant: function (eventName) {
let event = eventName
destroy_participant: function (event) {
let email = prompt('Vennligst skriv inn emailen din:')
let participants = this.$store.state.participant.all
let participant = participants.filter(par => par.email === email && par.event === event)[0]
Expand Down Expand Up @@ -378,7 +370,7 @@ export default {
.timestamp {
position: absolute;
left: -82px;
left: -92px;
top: 16px;
}
Expand Down

0 comments on commit 6f802db

Please sign in to comment.