def manual_assign(request, position_id, cid): position = get_object_or_404(EventPosition, id=position_id) controller = get_object_or_404(User, cid=cid) if position.user != controller: if position.user is not None: send_mail( 'Event Position Unassigned', render_to_string('emails/position_unassigned.html', {'position': position}), os.getenv('NO_REPLY'), [position.user.email], ) position.user = controller position.save() send_mail( 'Event Position Assigned!', render_to_string('emails/position_assigned.html', {'position': position}), os.getenv('NO_REPLY'), [controller.email], ) return HttpResponse(status=200) return HttpResponse('Position is already assigned to selected user.', status=403)
def submit_visiting_request(request): if request.method == 'POST': if User.objects.filter(cid=request.POST.get('cid')).exclude( status=2).exists(): return HttpResponse('You are already a controller at Houston!', status=403) else: visiting_request = Visit( cid=int(request.POST.get('cid')), rating=request.POST.get('rating'), home_facility=request.POST.get('home_facility'), first_name=request.POST.get('first_name'), last_name=request.POST.get('last_name'), email=request.POST.get('email'), reason=request.POST.get('reason'), submitted=timezone.now(), ) visiting_request.save() send_mail( 'We have received your visiting request!', render_to_string('emails/visiting_request_received.html', {'name': visiting_request.first_name}), os.getenv('NO_REPLY'), [visiting_request.email], ) return redirect(reverse('home')) return render(request, 'visit.html', {'page_title': 'Visit Houston'})
def accept_training_request(request, request_id): training_request = TrainingRequest.objects.get(id=request_id) training_session = TrainingSession( student=training_request.student, instructor=request.user_obj, start=pytz.utc.localize( datetime.strptime(request.POST.get('start'), '%Y-%m-%dT%H:%M:%S.%f')), end=pytz.utc.localize( datetime.strptime(request.POST.get('end'), '%Y-%m-%dT%H:%M:%S.%f')), type=training_request.type, level=training_request.level, ) training_session.save() send_mail( 'Training Scheduled!', render_to_string('emails/request_accepted.html', {'session': training_session}), os.getenv('NO_REPLY'), [training_session.student.email, training_session.instructor.email], ) ActionLog( action= f'{request.user_obj} accepted {training_request.student.full_name}\'s training request.' ).save() training_request.delete() return redirect(reverse('training_requests'))
def assign_position(request, request_id): position_request = get_object_or_404(EventPositionRequest, id=request_id) if position_request.position.user != position_request.user: if position_request.position.user is not None: send_mail( 'Event Position Unassigned', render_to_string('emails/position_unassigned.html', {'position': position_request.position}), os.getenv('NO_REPLY'), [position_request.position.user.email], ) position_request.assign() send_mail( 'Event Position Assigned!', render_to_string('emails/position_assigned.html', {'position': position_request.position}), os.getenv('NO_REPLY'), [position_request.user.email], ) position_request.user.event_requests.filter( position__event=position_request.position.event).delete() return HttpResponse(status=200) return HttpResponse('Position is already assigned to selected user.', status=403)
def unassign_position(request, position_id): position = EventPosition.objects.get(id=position_id) send_mail( 'Event Position Unassigned', render_to_string('emails/position_unassigned.html', {'position': position}), os.getenv('NO_REPLY'), [position.user.email], ) position.user = None position.save() return HttpResponse(status=200)
def warn_inactive_users(): for aggregate in return_inactive_users(): context = { 'user': aggregate['user_obj'], 'hours': round(aggregate['hours']['current'].total_seconds() / 3600, 1), } send_mail( 'Controller Activity Warning', render_to_string('emails/activity_warning.html', context), os.getenv('NO_REPLY'), [aggregate['user_obj'].email], fail_silently=True, )
def reject_training_request(request, request_id): training_request = TrainingRequest.objects.get(id=request_id) send_mail( 'Training Request Rejected', render_to_string('emails/request_rejected.html', {'request': training_request}), os.getenv('NO_REPLY'), [training_request.student.email], ) ActionLog( action= f'{request.user_obj} rejected {training_request.student.full_name}\'s training request.' ).save() training_request.delete() return redirect(reverse('training_requests'))
def approve_feedback(request, feedback_id): feedback = Feedback.objects.get(id=feedback_id) feedback.approved = True feedback.save() ActionLog( action= f'Feedback for {feedback.controller.full_name} was accepted by {request.user_obj}.' ).save() send_mail( 'Thank you for your feedback!', render_to_string('emails/feedback_approved.html', {'feedback': feedback}), os.getenv('NO_REPLY'), [feedback.pilot_email], ) return HttpResponse(status=200)
def remove_users(request): for id in request.POST.keys(): if id != 'csrfmiddlewaretoken': user = User.objects.get(id=id) if user.main_role == 'HC': requests.delete(f'https://api.vatusa.net/v2/facility/{os.getenv("ARTCC_ICAO")}/roster/{user.cid}') user.status = 2 user.save() send_mail( 'Roster Removal Notification', render_to_string('emails/roster_removal.html', {'user': user}), os.getenv('NO_REPLY'), [user.email], fail_silently=True, ) ActionLog(action=f'User {user.full_name} removed from the ARTCC {request.user_obj}.').save() return HttpResponse(status=200)
def assign_position(request, request_id): position_request = EventPositionRequest.objects.get(id=request_id) if position_request.position.user != position_request.user: if position_request.position.user is not None: send_mail( 'Event Position Unassigned', render_to_string('emails/position_unassigned.html', {'position': position_request.position}), os.getenv('NO_REPLY'), [position_request.position.user.email], ) position_request.assign() send_mail( 'Event Position Assigned!', render_to_string('emails/position_assigned.html', {'position': position_request.position}), os.getenv('NO_REPLY'), [position_request.user.email], ) return HttpResponse(status=200)
def add_feedback(request): if request.method == 'POST' and request.session.get('vatsim_data'): feedback = Feedback( controller=User.objects.get(cid=request.POST.get('controller')), controller_callsign=request.POST.get('controller_callsign'), rating=int(request.POST.get('rating')), pilot_name=request.POST.get('pilot_name', None), pilot_email=request.POST.get('pilot_email', None), event=Event.objects.get(id=request.POST.get('event')) if request.POST.get('event') != '' else None, flight_callsign=request.POST.get('flight_callsign', None), comments=request.POST.get('comments'), ) feedback.save() send_mail( 'We have received your feedback.', render_to_string('emails/feedback_received.html', {'feedback': feedback}), os.getenv('NO_REPLY'), [feedback.pilot_email], ) return redirect(reverse('feedback')) else: if request.session.get('vatsim_data'): return render( request, 'add_feedback.html', { 'page_title': 'Submit Feedback', 'controllers': User.objects.exclude(status=2).order_by('first_name'), 'events': Event.objects.filter( start__gte=timezone.now() - timedelta(days=30)).filter( start__lte=timezone.now()).filter(hidden=False), }) else: res = redirect('login') res.set_cookie('redirect-from', '/feedback/') return res
def reject_visiting_request(request, visit_id): visiting_request = Visit.objects.get(id=visit_id) ActionLog( action= f'{visiting_request}\'s visiting request was rejected by {request.user_obj}.' ).save() context = { 'name': visiting_request.first_name, 'reason': request.POST.get('reason') } send_mail( 'Your Houston ARTCC Visiting Request...', render_to_string('emails/visiting_request_rejected.html', context), os.getenv('NO_REPLY'), [visiting_request.email], ) visiting_request.delete() return redirect(reverse('visit_requests'))
def reject_feedback(request, feedback_id): feedback = Feedback.objects.get(id=feedback_id) ActionLog( action= f'Feedback for {feedback.controller.full_name} was rejected by {request.user_obj}.' ).save() context = { 'feedback': feedback, 'reason': request.POST.get('reason'), } send_mail( 'An update on your feedback...', render_to_string('emails/feedback_rejected.html', context), os.getenv('NO_REPLY'), [feedback.pilot_email], ) feedback.delete() return redirect(reverse('feedback_approval'))
def request_training(request): if request.method == 'POST': start = pytz.utc.localize( datetime.fromisoformat(request.POST.get('start'))) end = pytz.utc.localize(datetime.fromisoformat( request.POST.get('end'))) if start < end: training_request = TrainingRequest( student=request.user_obj, start=pytz.utc.localize( datetime.fromisoformat(request.POST.get('start'))), end=pytz.utc.localize( datetime.fromisoformat(request.POST.get('end'))), type=request.POST.get('type'), level=request.POST.get('level'), remarks=request.POST.get('remarks', None)) training_request.save() send_mail( 'Training Request Received', render_to_string('emails/request_received.html', {'request': training_request}), os.getenv('NO_REPLY'), [training_request.student.email], ) else: return HttpResponse('The start time must be before the end time.', status=400) return redirect(reverse('training')) else: return render( request, 'request_training.html', { 'page_title': 'Request Training', 'events': Event.objects.all().filter(hidden=False), 'sessions': TrainingSession.objects.all(), 'types': TrainingRequest._meta.get_field('type').choices, 'levels': TrainingRequest._meta.get_field('level').choices, })
def accept_visiting_request(request, visit_id): visiting_request = Visit.objects.get(id=visit_id) # If user is visiting the ARTCC after being marked inactive if User.objects.filter(cid=visiting_request.cid).exists(): edit_user = User.objects.get(cid=visiting_request.cid) if edit_user.status == 2: edit_user.status = 0 edit_user.email = visiting_request.email, edit_user.oper_init = assign_oper_init( visiting_request.first_name[0], visiting_request.first_name[0]), edit_user.rating = visiting_request.rating, edit_user.main_role = 'VC' edit_user.assign_initial_cert() edit_user.save() else: return HttpResponse('Visitor is already on the roster.', status=400) else: visiting_request.add_to_roster() ActionLog( action= f'{visiting_request}\'s visiting request was accepted by {request.user_obj}.' ).save() send_mail( 'Welcome to the Houston ARTCC!', render_to_string('emails/visiting_request_accepted.html', {'name': visiting_request.first_name}), os.getenv('NO_REPLY'), [visiting_request.email], ) visiting_request.delete() return HttpResponse(status=200)
def request_training(request): if request.method == 'POST': start = pytz.utc.localize( datetime.fromisoformat(request.POST.get('start'))) end = pytz.utc.localize(datetime.fromisoformat( request.POST.get('end'))) if start < end: training_request = TrainingRequest( student=request.user_obj, start=pytz.utc.localize( datetime.fromisoformat(request.POST.get('start'))), end=pytz.utc.localize( datetime.fromisoformat(request.POST.get('end'))), type=int(request.POST.get('type')), level=int(request.POST.get('level')), remarks=request.POST.get('remarks', None)) training_request.save() send_mail( 'Training Request Received', render_to_string('emails/request_received.html', {'request': training_request}), os.getenv('NO_REPLY'), [training_request.student.email], ) format = '%b %d, %Y @ %H%Mz' webhook = DiscordWebhook(url=os.getenv('TRAINING_WEBHOOK_URL')) embed = DiscordEmbed( title=':pencil: New Training Request!', description= 'See all requests at https://www.zhuartcc.org/training/requests.', color=2966946) embed.add_embed_field( name='User', value=f'[{request.user_obj.cid}] {request.user_obj.full_name}', inline=False, ) embed.add_embed_field( name='Availability', value= f'{training_request.start.strftime(format)} - {training_request.end.strftime(format)}', inline=False, ) embed.add_embed_field(name='Level', value=training_request.get_level_display()) embed.add_embed_field(name='Type', value=training_request.get_type_display()) embed.add_embed_field( name='Remarks', value=training_request.remarks if training_request.remarks != '' else 'No Remarks Provided', inline=False, ) webhook.add_embed(embed) webhook.execute() else: return HttpResponse('The start time must be before the end time.', status=400) return redirect(reverse('training')) else: return render( request, 'request_training.html', { 'page_title': 'Request Training', 'events': Event.objects.all().filter(hidden=False), 'sessions': TrainingSession.objects.all(), 'training_requests': request.user_obj.training_requests.all(), 'types': TrainingRequest._meta.get_field('type').choices, 'levels': TrainingRequest._meta.get_field('level').choices, })