importdatetimeimportloggingimporttimefromdjangoimporthttpfromdjango.confimportsettingsfromdjango.contribimportmessagesfromdjango.contrib.authimportget_user_modelfromdjango.contrib.auth.decoratorsimportlogin_requiredfromdjango.dbimporttransactionfromdjango.shortcutsimportget_object_or_404,redirect,renderfromdjango.utilsimporttimezonefromdjango.views.decorators.httpimportrequire_POSTfromprometheus_clientimportSummaryfrom....utils.dateimportget_date_range_this_yearfrom....utils.helpersimportis_entirely_digitfrom....utils.lockingimportlock_onfrom....utils.serializationimportsafe_jsonfrom...auth.decoratorsimportdeny_restricted,eighth_admin_requiredfrom..exceptionsimportSignupExceptionfrom..modelsimportEighthActivity,EighthBlock,EighthScheduledActivity,EighthSignup,EighthWaitlistfrom..serializersimportEighthBlockDetailSerializerlogger=logging.getLogger(__name__)eighth_signup_visits=Summary("intranet_eighth_signup_visits","Visits to the eighth signup view")eighth_signup_submits=Summary("intranet_eighth_signup_submits","Number of eighth period signups performed from the eighth signup view")@login_required@deny_restricteddefeighth_signup_view(request,block_id=None):start_time=time.time()ifblock_idisNoneand"block"inrequest.GET:block_ids=request.GET.getlist("block")iflen(block_ids)>1:returnredirect("/eighth/signup/multi?{}".format(request.META["QUERY_STRING"]))block_id=request.GET.get("block")args=""if"user"inrequest.GET:args="?user={}".format(request.GET.get("user"))returnredirect(f"/eighth/signup/{block_id}{args}")ifrequest.method=="POST":if"unsignup"inrequest.POSTand"aid"notinrequest.POST:uid=request.POST.get("uid")bid=request.POST.get("bid")force=request.POST.get("force")=="true"andrequest.user.is_eighth_adminifnotrequest.user.is_eighth_admin:ifuid!=request.user.id:returnhttp.HttpResponseNotFound()try:user=get_user_model().objects.get(id=uid)exceptget_user_model().DoesNotExist:returnhttp.HttpResponseNotFound("Given user does not exist.")try:eighth_signup=EighthSignup.objects.get(scheduled_activity__block__id=bid,user__id=uid)success_message=eighth_signup.remove_signup(request.user,force)exceptEighthSignup.DoesNotExist:returnhttp.HttpResponse("The signup did not exist.")exceptSignupExceptionase:show_admin_messages=request.user.is_eighth_adminandnotrequest.user.is_studentreturne.as_response(admin=show_admin_messages)returnhttp.HttpResponse(success_message)forfieldin("uid","bid","aid"):ifnot(fieldinrequest.POSTandis_entirely_digit(request.POST[field])):returnhttp.HttpResponseBadRequest(field+" must be an integer")uid=request.POST["uid"]bid=request.POST["bid"]aid=request.POST["aid"]try:user=get_user_model().objects.get(id=uid)exceptget_user_model().DoesNotExist:returnhttp.HttpResponseNotFound("Given user does not exist.")try:scheduled_activity=EighthScheduledActivity.objects.exclude(activity__deleted=True).exclude(cancelled=True).get(block=bid,activity=aid)exceptEighthScheduledActivity.DoesNotExist:returnhttp.HttpResponseNotFound("Given activity not scheduled for given block.")try:success_message=scheduled_activity.add_user(user,request)exceptSignupExceptionase:show_admin_messages=request.user.is_eighth_adminandnotrequest.user.is_studentreturne.as_response(admin=show_admin_messages)eighth_signup_submits.observe(time.time()-start_time)returnhttp.HttpResponse(success_message)else:#######ifsettings.ENABLE_HYBRID_EIGHTHandnotrequest.user.is_eighth_admin:block=Noneifblock_idisNone:now=timezone.localtime()ifnow.hour<17:now=now.replace(hour=0,minute=0,second=0,microsecond=0)surrounding_blocks=EighthBlock.objects.exclude(eighthscheduledactivity__in=EighthScheduledActivity.objects.filter(activity__name="z - Hybrid Sticky",members__in=[request.user])).order_by("date","block_letter")future_block=surrounding_blocks.filter(date__gte=now).first()iffuture_blockisnotNone:block=future_blockelifsurrounding_blocksisnotNone:block=surrounding_blocks.last()ifblockisnotNone:block_id=block.id#######else:block=Noneifblock_idisNone:next_block=EighthBlock.objects.get_first_upcoming_block()ifnext_blockisnotNone:block=next_blockblock_id=next_block.idelse:last_block=EighthBlock.objects.order_by("date").last()iflast_blockisnotNone:block=last_blockblock_id=last_block.idif"user"inrequest.GETandrequest.user.is_eighth_admin:try:user=get_user_model().objects.get(id=request.GET["user"])except(get_user_model().DoesNotExist,ValueError)ase:raisehttp.Http404fromeelifrequest.user.is_student:user=request.userelse:returnredirect("eighth_admin_dashboard")ifblockisNone:try:block=EighthBlock.objects.prefetch_related("eighthscheduledactivity_set").get(id=block_id)exceptEighthBlock.DoesNotExistase:ifnotEighthBlock.objects.exists():# No blocks have been added yetreturnrender(request,"eighth/signup.html",{"no_blocks":True})else:# The provided block_id is invalidraisehttp.Http404frome#######surrounding_blocks=[]ifsettings.ENABLE_HYBRID_EIGHTHandnotrequest.user.is_eighth_admin:date_start,date_end=get_date_range_this_year()surrounding_blocks=(EighthBlock.objects.exclude(eighthscheduledactivity__in=EighthScheduledActivity.objects.filter(activity__name="z - Hybrid Sticky",members__in=[request.user])).order_by("date","block_letter").filter(date__gte=date_start,date__lte=date_end))else:#######surrounding_blocks=EighthBlock.objects.get_blocks_this_year()schedule=[]signups=EighthSignup.objects.filter(user=user).select_related("scheduled_activity","scheduled_activity__activity")block_signup_map={s.scheduled_activity.block_id:s.scheduled_activityforsinsignups}ifsettings.ENABLE_WAITLIST:waitlists=EighthWaitlist.objects.filter(user=user).select_related("scheduled_activity__activity")else:waitlists=EighthWaitlist.objects.none()block_waitlist_map={w.scheduled_activity.block_id:w.scheduled_activityforwinwaitlists}today=timezone.localdate()forbinsurrounding_blocks:info={"id":b.id,"title":b,"block_letter":b.block_letter,"block_letter_width":(len(b.block_letter)-1)*6+15,"current_signup":getattr(block_signup_map.get(b.id,{}),"activity",None),"current_signup_cancelled":getattr(block_signup_map.get(b.id,{}),"cancelled",False),"current_waitlist":getattr(block_waitlist_map.get(b.id,{}),"activity",None),"within_few_days":b.date>=todayandb.date<=today+datetime.timedelta(days=2),"locked":b.locked,}#######ifsettings.ENABLE_HYBRID_EIGHTH:info.update({"block_letter":b.hybrid_text,"block_letter_width":(len(b.hybrid_text)-1)*6+15})#######ifscheduleandschedule[-1]["date"]==b.date:schedule[-1]["blocks"].append(info)else:day={}day["date"]=b.dateday["blocks"]=[]day["blocks"].append(info)schedule.append(day)serializer_context={"request":request,"user":user}block_info=EighthBlockDetailSerializer(block,context=serializer_context).datablock_info["schedule"]=scheduletry:active_block_current_signup=block_signup_map[int(block_id)].activity.idexceptKeyError:active_block_current_signup=Nonecontext={"user":user,"real_user":request.user,"block_info":block_info,"activities_list":safe_json(block_info["activities"]),"active_block":block,"active_block_current_signup":active_block_current_signup,}#######ifsettings.ENABLE_HYBRID_EIGHTH:context.update({"hybrid":True})#######eighth_signup_visits.observe(time.time()-start_time)returnrender(request,"eighth/signup.html",context)@login_required@deny_restricteddefeighth_multi_signup_view(request):ifrequest.method=="POST":if"unsignup"inrequest.POSTand"aid"notinrequest.POST:uid=request.POST.get("uid")bids_comma=request.POST.get("bid")force=request.POST.get("force")=="true"andrequest.user.is_eighth_adminifnotrequest.user.is_eighth_admin:ifuid!=request.user.id:returnhttp.HttpResponseNotFound()bids=bids_comma.split(",")try:user=get_user_model().objects.get(id=uid)exceptget_user_model().DoesNotExist:returnhttp.HttpResponseNotFound("Given user does not exist.")display_messages=[]status=200forbidinbids:try:btxt=EighthBlock.objects.get(id=bid).short_textexceptEighthBlock.DoesNotExist:returnhttp.HttpResponse(f"{bid}: Block did not exist.",status=403)exceptValueError:returnhttp.HttpResponse(f"{bid}: Invalid block ID.",status=403)try:eighth_signup=EighthSignup.objects.get(scheduled_activity__block__id=bid,user__id=uid)success_message=eighth_signup.remove_signup(request.user,force,request.session.get("disable_waitlist_transactions",False))exceptEighthSignup.DoesNotExist:status=403display_messages.append(f"{btxt}: Signup did not exist.")exceptSignupExceptionase:show_admin_messages=request.user.is_eighth_adminandnotrequest.user.is_studentresp=e.as_response(admin=show_admin_messages)status=403display_messages.append(f"{btxt}: {resp.content}")exceptException:display_messages.append(f"{btxt}: Unknown error.")else:display_messages.append(f"{btxt}: {success_message}")returnhttp.HttpResponse("\n".join(display_messages),status=status)forfieldin("uid","aid"):ifnot(fieldinrequest.POSTandis_entirely_digit(request.POST[field])):returnhttp.HttpResponseBadRequest(field+" must be an integer")uid=request.POST["uid"]bids_comma=request.POST["bid"]aid=request.POST["aid"]bids=bids_comma.split(",")try:user=get_user_model().objects.get(id=uid)exceptget_user_model().DoesNotExist:returnhttp.HttpResponseNotFound("Given user does not exist.")display_messages=[]status=200forbidinbids:try:btxt=EighthBlock.objects.get(id=bid).short_textexceptEighthBlock.DoesNotExist:returnhttp.HttpResponse(f"{bid}: Block did not exist.",status=403)try:scheduled_activity=(EighthScheduledActivity.objects.exclude(activity__deleted=True).exclude(cancelled=True).get(block=bid,activity=aid))exceptEighthScheduledActivity.DoesNotExist:display_messages.append(f"{btxt}: Activity was not scheduled for block")else:try:success_message=scheduled_activity.add_user(user,request)exceptSignupExceptionase:show_admin_messages=request.user.is_eighth_adminandnotrequest.user.is_studentresp=e.as_response(admin=show_admin_messages)status=403display_messages.append(f"{btxt}: {resp.content}")else:display_messages.append(f"{btxt}: {success_message}")returnhttp.HttpResponse("<br>".join(display_messages),status=status)else:if"user"inrequest.GETandrequest.user.is_eighth_admin:try:user=get_user_model().objects.get(id=request.GET["user"])except(get_user_model().DoesNotExist,ValueError)ase:raisehttp.Http404fromeelifrequest.user.is_student:user=request.userelse:returnredirect("eighth_admin_dashboard")block_ids=list(filter(None,request.GET.getlist("block")))try:blocks=EighthBlock.objects.select_related().filter(id__in=block_ids)exceptEighthBlock.DoesNotExistase:raisehttp.Http404fromeserializer_context={"request":request,"user":user}blocks_info=[]block_signups=[]activities={}forblockinblocks:try:signup=EighthSignup.objects.get(user=user,scheduled_activity__block=block)exceptEighthSignup.DoesNotExist:signup=Falseblock_signups.append({"block":block,"signup":signup})block_info=EighthBlockDetailSerializer(block,context=serializer_context).datablocks_info.append(block_info)acts=block_info["activities"]forainacts:info={"id":block.id,"date":block.date,"date_text":block.date.strftime("%a, %b %-d, %Y"),"block_letter":block.block_letter,"short_text":block.short_text,}ifainactivities:activities[a]["blocks"].append(info)else:activities[a]=acts[a]activities[a]["blocks"]=[info]activities[a]["total_num_blocks"]=len(blocks)context={"user":user,"profile_user":user,"real_user":request.user,"activities_list":safe_json(activities),"blocks":blocks,"block_signups":block_signups,"show_eighth_profile_link":True,}returnrender(request,"eighth/multi_signup.html",context)@login_required@deny_restricteddefsubscribe_to_club(request,activity_id):activity=get_object_or_404(EighthActivity,id=activity_id)ifnotactivity.is_subscribable_for_user(request.user):messages.error(request,"You are not allowed to subscribe to this activity.")returnhttp.HttpResponse(status=403)elifnotactivity.subscriptions_enabled:messages.error(request,"Subscriptions are not enabled for this activity.")returnhttp.HttpResponse(status=403)activity.subscribers.add(request.user)returnredirect(request.META.get("HTTP_REFERER","/"))@login_required@deny_restricteddefunsubscribe_from_club(request,activity_id):activity=get_object_or_404(EighthActivity,id=activity_id)ifactivity.sponsors.filter(user=request.user).exists()orrequest.userinactivity.club_sponsors.all():messages.error(request,"You cannot unsubscribe from an activity you sponsor.")returnredirect("club_announcements")ifrequest.userinactivity.subscribers.all():activity.subscribers.remove(request.user)returnredirect(request.META.get("HTTP_REFERER","/"))@login_required@deny_restricteddeftoggle_favorite_view(request):ifrequest.method!="POST":returnhttp.HttpResponseNotAllowed(["POST"],"HTTP 405: METHOD NOT ALLOWED")ifnot("aid"inrequest.POSTandis_entirely_digit(request.POST["aid"])):returnhttp.HttpResponseBadRequest("Must specify an integer aid")aid=request.POST["aid"]withtransaction.atomic():activity=get_object_or_404(EighthActivity,id=aid)# Lock on the User to prevent duplicates.lock_on([request.user])ifactivity.favorites.filter(id=request.user.id).nocache().exists():activity.favorites.remove(request.user)returnhttp.HttpResponse("Unfavorited activity.")else:activity.favorites.add(request.user)returnhttp.HttpResponse("Favorited activity.")
[docs]@login_requireddefeighth_location(request):blocks=EighthBlock.objects.get_blocks_today()ifblocks:sch_acts=[]forbinblocks:try:act=request.user.eighthscheduledactivity_set.get(block=b)ifact.activity.name!="z - Hybrid Sticky":sch_acts.append([b,act,", ".join([r.nameforrinact.get_true_rooms()]),", ".join([s.nameforsinact.get_true_sponsors()])])exceptEighthScheduledActivity.DoesNotExist:sch_acts.append([b,None])response=render(request,"eighth/location.html",context={"sch_acts":sch_acts})else:messages.error(request,"There are no eighth period blocks scheduled today.")response=redirect("index")response.set_cookie("seen_eighth_location","1",max_age=3*60*60)returnresponse
@require_POST@login_required@deny_restricteddefleave_waitlist_view(request):ifnotsettings.ENABLE_WAITLIST:returnhttp.HttpResponseForbidden("Waitlist functionality is currently disabled.")forfieldin("uid","bid"):ifnot(fieldinrequest.POSTandis_entirely_digit(request.POST[field])):returnhttp.HttpResponseBadRequest(field+" must be an integer")uid=request.POST["uid"]bid=request.POST["bid"]try:user=get_user_model().objects.get(id=uid)exceptget_user_model().DoesNotExist:returnhttp.HttpResponseNotFound("Given user does not exist.")EighthWaitlist.objects.filter(user_id=user.id,block_id=bid).delete()returnhttp.HttpResponse("Successfully left waitlist for this activity.")@login_required@deny_restricteddefseen_new_feature_view(request):request.session["seen_feature"]=Truereturnhttp.HttpResponse("Saved to session.")@eighth_admin_required@deny_restricteddeftoggle_waitlist_view(request):ifnotsettings.ENABLE_WAITLIST:returnhttp.HttpResponseForbidden("Waitlist functionality is currently disabled.")request.session["disable_waitlist_transactions"]=notrequest.session.get("disable_waitlist_transactions",False)returnhttp.HttpResponse("Successfully toggled waitlist transactions")