def stats(request, visit_id): v = get_object_or_404(SchoolVisit, pk=visit_id) if v.school.chapter != request.user.chapter: raise Http404 if not request.user.is_staff: raise Http404 if request.method == 'POST': form = SchoolVisitStatsForm(request.POST, visit = v) if form.is_valid(): data = form.cleaned_data stats = SchoolVisitStats() stats.visit = v stats.visit_type = data['visit_type'] stats.primary_girls_first = data['primary_girls_first'] stats.primary_girls_repeat = data['primary_girls_repeat'] stats.primary_boys_first = data['primary_boys_first'] stats.primary_boys_repeat = data['primary_boys_repeat'] stats.high_girls_first = data['high_girls_first'] stats.high_girls_repeat = data['high_girls_repeat'] stats.high_boys_first = data['high_boys_first'] stats.high_boys_repeat = data['high_boys_repeat'] stats.other_girls_first = data['other_girls_first'] stats.other_girls_repeat = data['other_girls_repeat'] stats.other_boys_first = data['other_boys_first'] stats.other_boys_repeat = data['other_boys_repeat'] stats.notes = data['notes'] stats.save() for attendee in data['attended']: list = EventAttendee.objects.filter(event__id=v.id).values_list('user_id', flat=True) if attendee.id not in list: newinvite = EventAttendee() newinvite.event = v newinvite.user = attendee newinvite.actual_status = 1 newinvite.rsvp_status = 0 newinvite.save() for person in EventAttendee.objects.filter(event__id=v.id): if person.user in data['attended']: person.actual_status = 1 person.save() else: person.actual_status = 2 person.save() v.status = 1 v.save() request.user.message_set.create(message=unicode(_("Stats saved successfully, visit closed."))) return HttpResponseRedirect('/teaching/') else: form = SchoolVisitStatsForm(None, visit = v) return render_to_response('visit_stats.html', {'form':form, 'visit_id':visit_id}, context_instance=RequestContext(request))
def dorsvp(request, event_id, user_id, rsvp_status): event = get_object_or_404(Event, pk=event_id) user = get_object_or_404(User, pk=user_id) if event.status != 0: raise Http404 if request.user.is_staff: EventAttendee.objects.filter(user=user, event=event).delete() ea = EventAttendee(user=user, event=event, rsvp_status=rsvp_status) ea.save() elif event.chapter == user.chapter and user == request.user: if event.allow_rsvp == 0: # Allow anyone to RSVP EventAttendee.objects.filter(user=user, event=event).delete() ea = EventAttendee(user=user, event=event, rsvp_status=rsvp_status) ea.save() elif event.allow_rsvp == 1: # Only allow invitees to RSVP if EventAttendee.objects.filter(user=user, event=event).count() > 0: EventAttendee.objects.filter(user=user, event=event).delete() ea = EventAttendee(user=user, event=event, rsvp_status=rsvp_status) ea.save() return HttpResponseRedirect('/teaching/' + str(event.pk) + '/')
def instantvisit(request): chapter = request.user.chapter # Check if the user has exec rights if not request.user.is_staff and not request.user.is_superuser: raise Http404 if not request.session.get('hoursPerPersonStage', False): request.session['hoursPerPersonStage'] = 1 # Sometimes request.session['hoursPerPersonStage'] may equal 1 from editing stats from a closed workshop if request.method == 'POST' and request.session['hoursPerPersonStage'] != 2: if request.user.is_superuser: formpart1 = SchoolVisitFormInstant(request.POST, chapter=None) formpart2 = SchoolVisitStatsFormInstant(request.POST, chapter=None) else: formpart1 = SchoolVisitFormInstant(request.POST, chapter=chapter) formpart2 = SchoolVisitStatsFormInstant(request.POST, chapter=chapter) form_school = SchoolFormPartOne(request.POST, chapter=chapter, school_id=0) # Validate form if formpart1.is_valid() and formpart2.is_valid(): data = formpart1.cleaned_data data_stats = formpart2.cleaned_data selected_school = data['school'] school_visit = SchoolVisit() new_school = School() school_visit.created_method = 1 # Check if new school was selected, New school equals to 0 if selected_school == u'0': if form_school.is_valid(): new_school_form = form_school.cleaned_data # Check if school exists exist = School.objects.filter( name__iexact=new_school_form['name'], chapter=chapter) if exist: messages.error( request, "School seems to already exist, please recheck list." ) return render_to_response( 'instant_workshop.html', { 'form1': formpart1, 'form2': formpart2, 'schoolform': form_school }, context_instance=RequestContext(request)) # Create new school after checking it doesn't exist new_school.name = new_school_form['name'] new_school.chapter = chapter new_school.address_street = new_school_form[ 'address_street'] new_school.address_city = new_school_form['address_city'] new_school.address_state = new_school_form['address_state'] new_school.address_country = new_school_form[ 'address_country'] new_school.save() school_visit.school = new_school else: # School form invalid return render_to_response( 'instant_workshop.html', { 'form1': formpart1, 'form2': formpart2, 'schoolform': form_school }, context_instance=RequestContext(request)) else: try: previously_visited_school = School.objects.get( name=selected_school) except ObjectDoesNotExist: messages.error( request, message=unicode( "Please select a school from the list or create a new one." )) return render_to_response( 'instant_workshop.html', { 'form1': formpart1, 'form2': formpart2, 'schoolform': form_school }, context_instance=RequestContext(request)) school_visit.school = previously_visited_school school_visit.chapter = chapter school_visit.creator = request.user school_visit.location = data['location'] school_visit.visit_start = make_aware(datetime.datetime.combine( data['date'], data['start_time']), timezone=chapter.tz_obj()) school_visit.visit_end = make_aware(datetime.datetime.combine( data['date'], data['end_time']), timezone=chapter.tz_obj()) school_visit.save() # Add the new stats just entered stats = SchoolVisitStats() stats.visit = school_visit stats.visit_type = data_stats['visit_type'] stats.primary_girls_first = data_stats['primary_girls_first'] stats.primary_girls_repeat = data_stats['primary_girls_repeat'] stats.primary_boys_first = data_stats['primary_boys_first'] stats.primary_boys_repeat = data_stats['primary_boys_repeat'] stats.high_girls_first = data_stats['high_girls_first'] stats.high_girls_repeat = data_stats['high_girls_repeat'] stats.high_boys_first = data_stats['high_boys_first'] stats.high_boys_repeat = data_stats['high_boys_repeat'] stats.other_girls_first = data_stats['other_girls_first'] stats.other_girls_repeat = data_stats['other_girls_repeat'] stats.other_boys_first = data_stats['other_boys_first'] stats.other_boys_repeat = data_stats['other_boys_repeat'] stats.notes = data_stats['notes'] stats.save() # Save attendance in database for attendee in data_stats['attended']: newinvite = EventAttendee() newinvite.event = school_visit newinvite.user = attendee newinvite.actual_status = 1 newinvite.rsvp_status = 0 newinvite.save() # Render page 2: enter user-specific volunteering hours default_hours = int( math.ceil((school_visit.visit_end - school_visit.visit_start).total_seconds() / 3600.0)) request.session['hoursPerPersonStage'] = 2 return render_to_response('visit_hoursPerPerson.html', { 'attended': data_stats['attended'], 'visit_id': school_visit.id, 'defaultHours': range(default_hours) }, context_instance=RequestContext(request)) # Form is invalid else: return render_to_response('instant_workshop.html', { 'form1': formpart1, 'form2': formpart2, 'schoolform': form_school }, context_instance=RequestContext(request)) # Happens when someone presses back - refer them to the workshop list page to refill stats there elif request.method == 'POST' and request.session[ 'hoursPerPersonStage'] == 2: del request.session['hoursPerPersonStage'] messages.info( request, message= 'An error occurred, find your newly created workshop here and refill in your stats.' ) return redirect('/teaching/list/') # Prepare form if request.user.is_superuser: formpart1 = SchoolVisitFormInstant(chapter=None) formpart2 = SchoolVisitStatsFormInstant(chapter=None) else: formpart1 = SchoolVisitFormInstant(chapter=chapter) formpart2 = SchoolVisitStatsFormInstant(chapter=chapter) form_school = SchoolFormPartOne(chapter=chapter, school_id=0) # Render clean form return render_to_response('instant_workshop.html', { 'form1': formpart1, 'form2': formpart2, 'schoolform': form_school }, context_instance=RequestContext(request))
def stats(request, visit_id): v = get_object_or_404(SchoolVisit, pk=visit_id) if v.school.chapter != request.user.chapter: raise Http404 if not request.user.is_staff: raise Http404 if not request.session.get('hoursPerPersonStage', False): request.session['hoursPerPersonStage'] = 1 form = SchoolVisitStatsForm(None, visit = v) return render_to_response('visit_stats.html', {'form':form, 'visit_id':visit_id}, context_instance=RequestContext(request)) if request.method == 'POST' and request.session['hoursPerPersonStage'] == 1: request.session['hoursPerPersonStage'] = 2 form = SchoolVisitStatsForm(request.POST, visit = v) if form.is_valid(): data = form.cleaned_data stats = SchoolVisitStats() stats.visit = v stats.visit_type = data['visit_type'] stats.primary_girls_first = data['primary_girls_first'] stats.primary_girls_repeat = data['primary_girls_repeat'] stats.primary_boys_first = data['primary_boys_first'] stats.primary_boys_repeat = data['primary_boys_repeat'] stats.high_girls_first = data['high_girls_first'] stats.high_girls_repeat = data['high_girls_repeat'] stats.high_boys_first = data['high_boys_first'] stats.high_boys_repeat = data['high_boys_repeat'] stats.other_girls_first = data['other_girls_first'] stats.other_girls_repeat = data['other_girls_repeat'] stats.other_boys_first = data['other_boys_first'] stats.other_boys_repeat = data['other_boys_repeat'] stats.notes = data['notes'] stats.save() for attendee in data['attended']: list = EventAttendee.objects.filter(event__id=v.id).values_list('user_id', flat=True) if attendee.id not in list: newinvite = EventAttendee() newinvite.event = v newinvite.user = attendee newinvite.actual_status = 1 newinvite.rsvp_status = 0 newinvite.save() for person in EventAttendee.objects.filter(event__id=v.id): if person.user in data['attended']: person.actual_status = 1 person.save() else: person.actual_status = 2 person.save() defaultHours = v.visit_end.hour - v.visit_start.hour if v.visit_end.minute > v.visit_start.minute: defaultHours += 1 return render_to_response('visit_hoursPerPerson.html', {'attended': data['attended'], 'visit_id': visit_id, 'defaultHours': range(defaultHours)}, context_instance=RequestContext(request)) else: request.session['hoursPerPersonStage'] = 1 return render_to_response('visit_stats.html', {'form':form, 'visit_id':visit_id}, context_instance=RequestContext(request)) elif request.method == 'POST' and request.session['hoursPerPersonStage'] == 2: raise Http404 else: request.session['hoursPerPersonStage'] = 1 form = SchoolVisitStatsForm(None, visit = v) return render_to_response('visit_stats.html', {'form':form, 'visit_id':visit_id}, context_instance=RequestContext(request))
def invitetovisit(request, visit_id): chapter = request.user.chapter v = get_object_or_404(SchoolVisit, pk=visit_id) error = '' if (v.chapter != chapter): raise Http404 if request.method == 'POST': inviteform = InviteForm(request.POST, user=request.user, visit=v) if inviteform.is_valid(): data = inviteform.cleaned_data try: if data['action'] == '1': message = EmailMessage() message.subject = data['subject'] try: message.body = data['body'].format( visit=v, user=request.user ) except Exception: raise Exception(_('Email body contains invalid fields')) message.from_address = request.user.email message.reply_address = request.user.email message.sender = request.user message.html = True message.from_name = chapter.name # Don't send it yet until the recipient list is done message.status = -1 # Save to database so we get a value for the primary key, # which we need for entering the recipient entries message.save() if request.POST['type'] == '1': users = User.objects.filter(chapter=chapter, is_active=True, email_reminder_optin=True) elif request.POST['type'] == '2': users = User.objects.filter(chapter=chapter, is_active=True, is_staff=True) elif request.POST['type'] == '4': users = User.objects.filter(chapter=chapter, is_active=True, email_reminder_optin=True, trained=True) elif request.POST['type'] == '5': ul = data['list'] users = ul.users.all() else: users = data['memberselect'] for one_user in users: if data['action'] == '1': recipient = EmailRecipient() recipient.message = message recipient.user = one_user recipient.to_name = one_user.get_full_name() recipient.to_address = one_user.email recipient.save() EventAttendee.objects.filter(user=one_user, event=v).delete() ea = EventAttendee() ea.event=v ea.user=one_user if data['action'] == '1': ea.rsvp_status=1 if data['action'] == '2': ea.rsvp_status=2 ea.actual_status=0 ea.save() if data['action'] == '1': # Now mark it as OK to send. The email and all recipients are now in MySQL. # A background script on the server will process the queue. message.status = 0 message.save() if data['action'] == '1': request.user.message_set.create(message=unicode(_("Invitations have been sent to the selected volunteers"))) if data['action'] == '2': request.user.message_set.create(message=unicode(_("Selected volunteers have been added as attending"))) return HttpResponseRedirect('/teaching/' + str(v.pk) + '/') except Exception as e: error = e.args[0] else: inviteform = InviteForm(None, user=request.user, visit=v) return render_to_response('visit_invite.html', {'inviteform': inviteform, 'visit_id': visit_id, 'error': error}, context_instance=RequestContext(request))
def instantvisit(request): chapter = request.user.chapter # Check if the user has exec rights if not request.user.is_staff and not request.user.is_superuser: raise Http404 if not request.session.get('hoursPerPersonStage', False): request.session['hoursPerPersonStage'] = 1 # Sometimes request.session['hoursPerPersonStage'] may equal 1 from editing stats from a closed workshop if request.method == 'POST' and request.session['hoursPerPersonStage'] != 2: if request.user.is_superuser: formpart1 = SchoolVisitFormInstant(request.POST, chapter=None) formpart2 = SchoolVisitStatsFormInstant(request.POST, chapter=None) else: formpart1 = SchoolVisitFormInstant(request.POST, chapter=chapter) formpart2 = SchoolVisitStatsFormInstant(request.POST, chapter=chapter) form_school = SchoolFormPartOne(request.POST, chapter=chapter, school_id=0) # Validate form if formpart1.is_valid() and formpart2.is_valid(): data = formpart1.cleaned_data data_stats = formpart2.cleaned_data selected_school = data['school'] school_visit = SchoolVisit() new_school = School() school_visit.created_method = 1 # Check if new school was selected, New school equals to 0 if selected_school == u'0': if form_school.is_valid(): new_school_form = form_school.cleaned_data # Check if school exists exist = School.objects.filter(name__iexact=new_school_form['name'], chapter=chapter) if exist: messages.error(request, "School seems to already exist, please recheck list.") return render_to_response('instant_workshop.html', {'form1': formpart1, 'form2': formpart2, 'schoolform': form_school}, context_instance=RequestContext(request)) # Create new school after checking it doesn't exist new_school.name = new_school_form['name'] new_school.chapter = chapter new_school.address_street = new_school_form['address_street'] new_school.address_city = new_school_form['address_city'] new_school.address_state = new_school_form['address_state'] new_school.address_country = new_school_form['address_country'] new_school.save() school_visit.school = new_school else: # School form invalid return render_to_response('instant_workshop.html', {'form1': formpart1, 'form2': formpart2, 'schoolform': form_school}, context_instance=RequestContext(request)) else: try: previously_visited_school = School.objects.get(name=selected_school, chapter=chapter) except ObjectDoesNotExist: messages.error(request, message=unicode("Please select a school from the list or create a new one.")) return render_to_response('instant_workshop.html', {'form1': formpart1, 'form2': formpart2, 'schoolform': form_school}, context_instance=RequestContext(request)) school_visit.school = previously_visited_school school_visit.chapter = chapter school_visit.creator = request.user school_visit.location = data['location'] school_visit.visit_start = make_aware(datetime.datetime.combine(data['date'], data['start_time']), timezone=chapter.tz_obj()) school_visit.visit_end = make_aware(datetime.datetime.combine(data['date'], data['end_time']), timezone=chapter.tz_obj()) school_visit.save() # Add the new stats just entered stats = SchoolVisitStats() stats.visit = school_visit stats.visit_type = data_stats['visit_type'] stats.primary_girls_first = data_stats['primary_girls_first'] stats.primary_girls_repeat = data_stats['primary_girls_repeat'] stats.primary_boys_first = data_stats['primary_boys_first'] stats.primary_boys_repeat = data_stats['primary_boys_repeat'] stats.high_girls_first = data_stats['high_girls_first'] stats.high_girls_repeat = data_stats['high_girls_repeat'] stats.high_boys_first = data_stats['high_boys_first'] stats.high_boys_repeat = data_stats['high_boys_repeat'] stats.other_girls_first = data_stats['other_girls_first'] stats.other_girls_repeat = data_stats['other_girls_repeat'] stats.other_boys_first = data_stats['other_boys_first'] stats.other_boys_repeat = data_stats['other_boys_repeat'] stats.notes = data_stats['notes'] stats.save() # Save attendance in database for attendee in data_stats['attended']: newinvite = EventAttendee() newinvite.event = school_visit newinvite.user = attendee newinvite.actual_status = 1 newinvite.rsvp_status = 0 newinvite.save() # Render page 2: enter user-specific volunteering hours default_hours = int(math.ceil((school_visit.visit_end - school_visit.visit_start).total_seconds() / 3600.0)) request.session['hoursPerPersonStage'] = 2 return render_to_response('visit_hoursPerPerson.html', {'attended': data_stats['attended'], 'visit_id': school_visit.id, 'defaultHours': range(default_hours)}, context_instance=RequestContext(request)) # Form is invalid else: return render_to_response('instant_workshop.html', {'form1': formpart1, 'form2': formpart2, 'schoolform': form_school}, context_instance=RequestContext(request)) # Happens when someone presses back - refer them to the workshop list page to refill stats there elif request.method == 'POST' and request.session['hoursPerPersonStage'] == 2: del request.session['hoursPerPersonStage'] messages.info(request, message='An error occurred, find your newly created workshop here and refill in your stats.') return redirect('/teaching/list/') # Prepare form if request.user.is_superuser: formpart1 = SchoolVisitFormInstant(chapter=None) formpart2 = SchoolVisitStatsFormInstant(chapter=None) else: formpart1 = SchoolVisitFormInstant(chapter=chapter) formpart2 = SchoolVisitStatsFormInstant(chapter=chapter) form_school = SchoolFormPartOne(chapter=chapter, school_id=0) # Render clean form return render_to_response('instant_workshop.html', {'form1': formpart1, 'form2': formpart2, 'schoolform': form_school}, context_instance=RequestContext(request))
def import_workshop_csv(request, filerows, save): columns = None workshops_imported = 0 workshop_list = [] err_msg = {} row_idx = 0 # Find the indices of fields for row in filerows: if any(row): row_idx += 1 if columns is None: columns = row # Check to see there are an appropriate number of columns in the header if len(columns) < 20: err_msg.update({str(row_idx): 'You are missing columns in your .csv table. Please correct the error and try again.'}) workshops_imported = None return workshop_list, workshops_imported, err_msg continue school_visit = SchoolVisit() stats = SchoolVisitStats() school_visit.chapter = request.user.chapter school_visit.creator = request.user school_visit.created_method = 2 i = 0 date = '' attendees_list = [] attendee_errors = {} data_filled_correctly = False for col in row: colname = columns[i] i += 1 if i > 19: i = 19 if 'Attendees' in colname: if i != 19: err_msg.update({str(row_idx): 'There was an incorrect number of items in this row, please check your columns from template again'}) break # ASSUMPTION: The remaining columns in a row are all volunteer usernames data_filled_correctly = True attendee = EventAttendee() try: # Empty attendee field if not col: continue # Try to find in the user exists u = User.objects.get(username__exact=col) except ObjectDoesNotExist: try: attendee_errors[str(row_idx)] += '<br>Could not find %s and has not been added to the workshop' % col except KeyError: attendee_errors.update({str(row_idx): 'Could not find %s and has not been added to the workshop' % col}) continue attendee.user = u attendee.actual_status = 1 attendee.rsvp_status = 0 attendees_list.append(attendee) else: if colname == 'School ID': try: school_visit.school = School.objects.get(pk=sint(col), chapter=request.user.chapter) except ObjectDoesNotExist: err_msg.update({str(row_idx): "That school ID does not exist in your schools database, please check again from your schools list. If they don't exist, add them in the Schools tab and try again"}) break elif colname == 'Visit Date': # Check for correct format try: date = datetime.strptime(col, '%d/%m/%Y') except ValueError: err_msg.update({str(row_idx): 'The date format specified (%s) is not in the correct format' % col}) break # Check if user enters an event that's set in the future if make_aware(date, timezone=request.user.chapter.tz_obj()) > datetime.now(tz=request.user.chapter.tz_obj()): err_msg.update({str(row_idx): 'This event has not occurred yet and therefore cannot be entered in'}) break elif colname == 'Start Time': # Check for correct format try: t = datetime.strptime(col, '%H:%M:%S').time() except ValueError: try: # Try another format cause excel -_- t = datetime.strptime(col, '%H:%M').time() except ValueError: err_msg.update({str(row_idx): 'The start time specified (%s) is not in the correct format' % col}) break school_visit.visit_start = make_aware(datetime.combine(date, t), timezone=request.user.chapter.tz_obj()) elif colname == 'End Time': # Check for correct format try: t = datetime.strptime(col, '%H:%M:%S').time() except ValueError: try: # Try another format cause excel -_- t = datetime.strptime(col, '%H:%M').time() except ValueError: err_msg.update({str(row_idx): 'The end time specified (%s) is not in the correct format' % col}) break school_visit.visit_end = make_aware(datetime.combine(date, t), timezone=request.user.chapter.tz_obj()) if school_visit.visit_end < school_visit.visit_start: err_msg.update({str(row_idx): 'The end time is earlier than start time'}) break elif colname == 'Location': if col == '': err_msg.update({str(row_idx): 'You must specify a location for this visit'}) break school_visit.location = col elif colname == 'Visit Type ID': if sint(col) < 0 or sint(col) > 7: stats.visit_type = 0 else: stats.visit_type = sint(col) elif colname == 'Primary Girls First': stats.primary_girls_first = sint(col) elif colname == 'Primary Girls Repeat': stats.primary_girls_repeat = sint(col) elif colname == 'Primary Boys First': stats.primary_boys_first = sint(col) elif colname == 'Primary Boys Repeat': stats.primary_boys_repeat = sint(col) elif colname == 'High Girls First': stats.high_girls_first = sint(col) elif colname == 'High Girls Repeat': stats.high_girls_repeat = sint(col) elif colname == 'High Boys First': stats.high_boys_first = sint(col) elif colname == 'High Boys Repeat': stats.high_boys_repeat = sint(col) elif colname == 'Other Girls First': stats.other_girls_first = sint(col) elif colname == 'Other Girls Repeat': stats.other_girls_repeat = sint(col) elif colname == 'Other Boys First': stats.other_boys_first = sint(col) elif colname == 'Other Boys Repeat': stats.other_boys_repeat = sint(col) elif colname == 'Notes': stats.notes = col else: err_msg.update({str(row_idx): "Column not recognised, use the column names provided in the template and reupload your file."}) return workshop_list, workshops_imported, err_msg # Only check for existence and save when data is filled correctly if data_filled_correctly: # Perform saves to database d_start = datetime.replace(school_visit.visit_start, microsecond=0, tzinfo=None).__format__('%d/%m/%y %H:%M') d_end = datetime.replace(school_visit.visit_end, microsecond=0, tzinfo=None).time().__format__('%H:%M') try: s = SchoolVisit.objects.get( visit_start=school_visit.visit_start, visit_end=school_visit.visit_end, school=school_visit.school ) err_msg.update({str(row_idx): ' Visit to %s on %s-%s already exists in the database' % (school_visit.school.name, d_start, d_end)}) continue except ObjectDoesNotExist: w = {'text': {str(row_idx): 'Adding visit to %s on %s-%s' % (school_visit.school.name, d_start, d_end)}, 'attendees': attendees_list} workshop_list.append(w) if save: school_visit.status = 1 school_visit.save() stats.visit = school_visit stats.save() # Save the stats of all attendees for attendee in attendees_list: attendee.event = school_visit attendee.save() err_msg.update(attendee_errors) workshops_imported += 1 return workshop_list, workshops_imported, err_msg
def import_workshop_csv(request, filerows, save): columns = None workshops_imported = 0 workshop_list = [] err_msg = {} row_idx = 0 # Find the indices of fields for row in filerows: if any(row): row_idx += 1 if columns is None: columns = row # Check to see there are an appropriate number of columns in the header if len(columns) < 20: err_msg.update({ str(row_idx): 'You are missing columns in your .csv table. Please correct the error and try again.' }) workshops_imported = None return workshop_list, workshops_imported, err_msg continue school_visit = SchoolVisit() stats = SchoolVisitStats() school_visit.chapter = request.user.chapter school_visit.creator = request.user school_visit.created_method = 2 i = 0 date = '' attendees_list = [] attendee_errors = {} data_filled_correctly = False for col in row: colname = columns[i] i += 1 if i > 19: i = 19 if 'Attendees' in colname: if i != 19: err_msg.update({ str(row_idx): 'There was an incorrect number of items in this row, please check your columns from template again' }) break # ASSUMPTION: The remaining columns in a row are all volunteer usernames data_filled_correctly = True attendee = EventAttendee() try: # Empty attendee field if not col: continue # Try to find in the user exists u = User.objects.get(username__exact=col) except ObjectDoesNotExist: try: attendee_errors[str( row_idx )] += '<br>Could not find %s and has not been added to the workshop' % col except KeyError: attendee_errors.update({ str(row_idx): 'Could not find %s and has not been added to the workshop' % col }) continue attendee.user = u attendee.actual_status = 1 attendee.rsvp_status = 0 attendees_list.append(attendee) else: if colname == 'School ID': try: school_visit.school = School.objects.get( pk=sint(col), chapter=request.user.chapter) except ObjectDoesNotExist: err_msg.update({ str(row_idx): "That school ID does not exist in your schools database, please check again from your schools list. If they don't exist, add them in the Schools tab and try again" }) break elif colname == 'Visit Date': # Check for correct format try: date = datetime.strptime(col, '%d/%m/%Y') except ValueError: err_msg.update({ str(row_idx): 'The date format specified (%s) is not in the correct format' % col }) break # Check if user enters an event that's set in the future if make_aware( date, timezone=request.user.chapter.tz_obj() ) > datetime.now(tz=request.user.chapter.tz_obj()): err_msg.update({ str(row_idx): 'This event has not occurred yet and therefore cannot be entered in' }) break elif colname == 'Start Time': # Check for correct format try: t = datetime.strptime(col, '%H:%M:%S').time() except ValueError: try: # Try another format cause excel -_- t = datetime.strptime(col, '%H:%M').time() except ValueError: err_msg.update({ str(row_idx): 'The start time specified (%s) is not in the correct format' % col }) break school_visit.visit_start = make_aware( datetime.combine(date, t), timezone=request.user.chapter.tz_obj()) elif colname == 'End Time': # Check for correct format try: t = datetime.strptime(col, '%H:%M:%S').time() except ValueError: try: # Try another format cause excel -_- t = datetime.strptime(col, '%H:%M').time() except ValueError: err_msg.update({ str(row_idx): 'The end time specified (%s) is not in the correct format' % col }) break school_visit.visit_end = make_aware( datetime.combine(date, t), timezone=request.user.chapter.tz_obj()) if school_visit.visit_end < school_visit.visit_start: err_msg.update({ str(row_idx): 'The end time is earlier than start time' }) break elif colname == 'Location': if col == '': err_msg.update({ str(row_idx): 'You must specify a location for this visit' }) break school_visit.location = col elif colname == 'Visit Type ID': if sint(col) < 0 or sint(col) > 7: stats.visit_type = 0 else: stats.visit_type = sint(col) elif colname == 'Primary Girls First': stats.primary_girls_first = sint(col) elif colname == 'Primary Girls Repeat': stats.primary_girls_repeat = sint(col) elif colname == 'Primary Boys First': stats.primary_boys_first = sint(col) elif colname == 'Primary Boys Repeat': stats.primary_boys_repeat = sint(col) elif colname == 'High Girls First': stats.high_girls_first = sint(col) elif colname == 'High Girls Repeat': stats.high_girls_repeat = sint(col) elif colname == 'High Boys First': stats.high_boys_first = sint(col) elif colname == 'High Boys Repeat': stats.high_boys_repeat = sint(col) elif colname == 'Other Girls First': stats.other_girls_first = sint(col) elif colname == 'Other Girls Repeat': stats.other_girls_repeat = sint(col) elif colname == 'Other Boys First': stats.other_boys_first = sint(col) elif colname == 'Other Boys Repeat': stats.other_boys_repeat = sint(col) elif colname == 'Notes': stats.notes = col else: err_msg.update({ str(row_idx): "Column not recognised, use the column names provided in the template and reupload your file." }) return workshop_list, workshops_imported, err_msg # Only check for existence and save when data is filled correctly if data_filled_correctly: # Perform saves to database d_start = datetime.replace( school_visit.visit_start, microsecond=0, tzinfo=None).__format__('%d/%m/%y %H:%M') d_end = datetime.replace( school_visit.visit_end, microsecond=0, tzinfo=None).time().__format__('%H:%M') try: s = SchoolVisit.objects.get( visit_start=school_visit.visit_start, visit_end=school_visit.visit_end, school=school_visit.school) err_msg.update({ str(row_idx): ' Visit to %s on %s-%s already exists in the database' % (school_visit.school.name, d_start, d_end) }) continue except ObjectDoesNotExist: w = { 'text': { str(row_idx): 'Adding visit to %s on %s-%s' % (school_visit.school.name, d_start, d_end) }, 'attendees': attendees_list } workshop_list.append(w) if save: school_visit.status = 1 school_visit.save() stats.visit = school_visit stats.save() # Save the stats of all attendees for attendee in attendees_list: attendee.event = school_visit attendee.save() err_msg.update(attendee_errors) workshops_imported += 1 return workshop_list, workshops_imported, err_msg