from django.shortcuts import render, redirect from .models import UsefulLinks, CalendarEvent, MembershipPerson, Payments, SCHAOfficer, Membership, CommunityPost from .forms import ( ChildrenForm, CommunityPostForm, AddressForm, PeopleForm, CommitteeForm, ServicesForm, CaptchaForm ) from django.db import transaction, IntegrityError # Stripe required imports from django.conf import settings # new from django.http.response import JsonResponse, HttpResponse from django.views.decorators.csrf import csrf_exempt # new from django.contrib.auth import logout, authenticate, login from django.contrib.auth.decorators import login_required import stripe import logging logger = logging.getLogger(__name__) print(__name__) """ Strip Stuff Tutorial: https://testdriven.io/blog/django-stripe-tutorial/ """ def dues(request): return render(request, "schasite/dues.html", {}) @csrf_exempt def stripe_config(request): if request.method == "GET": stripe_config = {"publicKey": settings.STRIPE_PUBLISHABLE_KEY} return JsonResponse(stripe_config, safe=False) @csrf_exempt def create_checkout_session(request): if request.method == 'GET': domain_url ="https://www.schawheaton.com/" stripe.api_key = settings.STRIPE_SECRET_KEY try: checkout_session = stripe.checkout.Session.create( success_url = domain_url+'success?session_id={CHECKOUT_SESSION_ID}', cancel_url = domain_url+'cancelled/', payment_method_types=['card'], mode="payment", line_items = [{ # 'name':'SCHA Dues', 'quantity': 1, # 'currency': 'usd', 'price':'price_1P5KBtIbGKYTLTtMJ0Rh1jMu', #'price_1P5K7uIbGKYTLTtMFNxbkA8X' #'price_1OxZLfDV0RPXOyxG5ipjhUXk', }] ) return JsonResponse({'sessionId': checkout_session['id']}) except Exception as e: return JsonResponse({'error': str(e)}) def stripe_success(request): return render(request, "schasite/dues_success.html", {}) def stripe_cancelled(request): return render(request, "schasite/dues_cancelled.html", {}) @csrf_exempt def stripe_webhook(request): stripe.api_key = settings.STRIPE_SECRET_KEY endpoint_secret = settings.STRIPE_ENDPOINT_SECRET payload = request.body sig_header = request.META['HTTP_STRIPE_SIGNATURE'] event = None try: event = stripe.Webhook.construct_event( payload, sig_header, endpoint_secret ) except ValueError as e: # Invalid payload return HttpResponse(status=400) except stripe.error.SignatureVerificationError as e: # Invalid signature return HttpResponse(status=400) # Handle the checkout.session.completed event if event['type'] == 'checkout.session.completed': email = None try: email = event['data']['object']['customer_details']['email'] except: pass person = MembershipPerson.objects.filter(email=email).first() # just take the first payment = Payments.objects.create( email=email, person = person ) # try to link to a member payment.save() # TODO: run some custom code here return HttpResponse(status=200) """ Django Stuff """ def useful_links(request): useful_links = UsefulLinks.objects.all() return render(request, "schasite/useful_links.html", {"links": useful_links}) def index2(request): return render(request, "schasite/index2.html", {}) def about_us2(request): return render(request, "schasite/about_us2.html", {}) def newsletters2(request): return render(request, "schasite/newsletters2.html", {}) def calendar2(request): all_events = CalendarEvent.objects.all() future_events = [event if event.future_event() else None for event in all_events] past_events = [event if event.past_event() else None for event in all_events] # remove none for each list sanitized_future_events = [i for i in future_events if i is not None] sanitized_past_events = [i for i in past_events if i is not None] return render( request, "schasite/calendar2.html", { "future_events": sanitized_future_events, "past_events": sanitized_past_events, }, ) def scha_board2(request): def get_officers(position_name) -> list[SCHAOfficer]: try: return SCHAOfficer.objects.filter(position=position_name) except: return None officers = [] for position in ["President","1st Vice President", "2nd Vice President", "Treasurer", "Secretary", "Website", "Membership", "Directory", "Facebook", "Eblasts"]: officers += get_officers(position) return render(request, "schasite/scha_board2.html", {"officers": officers}) def dues2(request): return render(request, "schasite/dues2.html", {}) def membership_form2(request): def sanitize_phone_number(data): if len(data) > 0: data = data.replace("-", "") if not data.startswith("+1"): data = "+1" + data return data if request.method == "POST": # before we pass in the data we want to sanitize the phone numbers address_data = { "address_1": request.POST.get("streetAddress", ""), "address_2": request.POST.get("unit", ""), "city": request.POST.get("city", "60189"), "state": request.POST.get("state", "IL"), "zip_code": request.POST.get("zipCode", "60189"), } logging.debug(address_data) addressForm = AddressForm(address_data) logging.debug(f"is addressForm valid: {addressForm.is_valid()}") if not addressForm.is_valid(): logging.error(f"addressForm Errors: {addressForm.errors}") services_data = { "babysitting": True if request.POST.get("babysitting", "") == "on" else False, "lawn_mowing": True if request.POST.get("lawn_mowing", "") == "on" else False, "snow_shoveling": True if request.POST.get("snow_shoveling", "") == "on" else False, "leaf_raking": True if request.POST.get("leaf_raking", "") == "on" else False, "petsitting": True if request.POST.get("petsitting", "") == "on" else False, "house_sitting": True if request.POST.get("house_sitting", "") == "on" else False, "other": True if request.POST.get("other", "") == "on" else False, "other_desc": True if request.POST.get("other_desc", "") == "on" else False, } committee_data = { "block_captain": True if request.POST.get("block_captain", "") == "on" else False, "coordinator": True if request.POST.get("coordinator", "") == "on" else False, "egg_hunt": True if request.POST.get("egg_hunt", "") == "on" else False, "spring_garage_sale": True if request.POST.get("spring_garage_sale", "") == "on" else False, "golf_outing": True if request.POST.get("golf_outing", "") == "on" else False, "ice_cream_social": True if request.POST.get("ice_cream_social", "") == "on" else False, "fall_garage_sale": True if request.POST.get("fall_garage_sale", "") == "on" else False, "halloween_party": True if request.POST.get("halloween_party", "") == "on" else False, "santa_visit": True if request.POST.get("santa_visit", "") == "on" else False, "website": True if request.POST.get("website", "") == "on" else False, "civic_affair": True if request.POST.get("civic_affair", "") == "on" else False, "phone_directory": True if request.POST.get("phone_directory", "") == "on" else False, "no_preference": True if request.POST.get("no_preference", "") == "on" else False, } servicesForm = ServicesForm(services_data) committeeForm = CommitteeForm(committee_data) person1_data = { "first_name": request.POST.get("firstName1"), "last_name": request.POST.get("lastName1"), "email": request.POST.get("email1"), "phone_number": sanitize_phone_number(request.POST.get("phone1")), } person2_data = { "frist_name": request.POST.get("firstName2"), "last_name": request.POST.get("lastName2"), "email": request.POST.get("email2"), "phone_number": sanitize_phone_number(request.POST.get("phone2")), } peopleForm1 = PeopleForm(person1_data) peopleForm2 = PeopleForm(person2_data) logging.debug("Validating the captcha form") logging.debug(request.POST.get("captcha","")) captchaForm = CaptchaForm({ "captcha": request.POST.get("captcha","") }) logging.debug(f"Captch form is: {captchaForm.is_valid()}") logging.debug(f"peopleForm1 form is: {peopleForm1.is_valid()}") logging.debug(f"peopleForm2 form is: {peopleForm2.is_valid()}") logging.debug(f"servicesForm form is: {servicesForm.is_valid()}") if ( addressForm.is_valid() and committeeForm.is_valid() and (peopleForm1.is_valid() or peopleForm2.is_valid()) and servicesForm.is_valid() and captchaForm.is_valid() ): with transaction.atomic(): logging.debug("starting to save") try: membership = Membership.objects.create() if peopleForm1.is_valid(): people1_obj = peopleForm1.save(commit=False) people1_obj.membership = membership people1_obj.save() if peopleForm2.is_valid(): people2_obj = peopleForm2.save(commit=False) people2_obj.membership = membership people2_obj.save() committee_obj = committeeForm.save(commit=False) committee_obj.membership = membership committee_obj.save() services_obj = servicesForm.save(commit=False) services_obj.membership = membership services_obj.save() address_obj = addressForm.save(commit=False) address_obj.membership = membership address_obj.save() except Exception as e: logging.error(e) return redirect("index2") else: logging.warning("Some field is not valid") return render( request, "schasite/membership_form2.html", { "peopleForm1": peopleForm1, "peopleForm2": peopleForm2, "addressForm": addressForm, "committeeForm": committeeForm, "servicesForm": servicesForm, 'captchaForm': captchaForm, }, ) else: return render( request, "schasite/membership_form2.html", { "peopleForm1": PeopleForm(prefix="person1"), "peopleForm2": PeopleForm(prefix="person2"), "committeeForm": CommitteeForm(), "servicesForm": ServicesForm(), 'captchaForm': CaptchaForm(), "addressForm": AddressForm( initial={ "city": "Wheaton", "state": "IL", "zip_code": 60189, } ), }, ) def useful_links2(request): useful_links = UsefulLinks.objects.all() return render(request, "schasite/useful_links2.html", {"links": useful_links}) def index(request): return render(request, "schasite/index.html", {}) def about_us(request): return render(request, "schasite/about_us.html", {}) def calendar(request): all_events = CalendarEvent.objects.all() future_events = [event if event.future_event() else None for event in all_events] past_events = [event if event.past_event() else None for event in all_events] # remove none for each list sanitized_future_events = [i for i in future_events if i is not None] sanitized_past_events = [i for i in past_events if i is not None] return render( request, "schasite/calendar.html", { "future_events": sanitized_future_events, "past_events": sanitized_past_events, }, ) def newsletters(request): return render(request, "schasite/newsletters.html", {}) def membership_form(request): def sanitize_phone_number(data): if len(data) > 0: data = data.replace("-", "") if not data.startswith("+1"): data = "+1" + data return data if request.method == "POST": # before we pass in the data we want to sanitize the phone numbers post_data = request.POST.copy() post_data.update( { "person1-phone_number": sanitize_phone_number( post_data["person1-phone_number"] ) } ) post_data.update( { "person2-phone_number": sanitize_phone_number( post_data["person2-phone_number"] ) } ) membershipForm = ChildrenForm(post_data) addressForm = AddressForm(post_data) peopleForm1 = PeopleForm(post_data, prefix="person1") peopleForm2 = PeopleForm(post_data, prefix="person2") servicesForm = ServicesForm(post_data) committeeForm = CommitteeForm(post_data) # captchaForm = CaptchaForm(post_data) if ( membershipForm.is_valid() and addressForm.is_valid() and committeeForm.is_valid() and (peopleForm1.is_valid() or peopleForm2.is_valid()) and servicesForm.is_valid() ): # and captchaForm.is_valid(): with transaction.atomic(): membershipForm = ChildrenForm({**post_data}) membership = membershipForm.save(commit=False) membership.save() if peopleForm1.is_valid(): people1_obj = peopleForm1.save(commit=False) people1_obj.membership = membership people1_obj.save() if peopleForm2.is_valid(): people2_obj = peopleForm2.save(commit=False) people2_obj.membership = membership people2_obj.save() committee_obj = committeeForm.save(commit=False) committee_obj.membership = membership committee_obj.save() services_obj = servicesForm.save(commit=False) services_obj.membership = membership services_obj.save() address_obj = addressForm.save(commit=False) address_obj.membership = membership address_obj.save() return redirect("index") else: return render( request, "schasite/membership_form.html", { "membershipForm": ChildrenForm, "peopleForm1": peopleForm1, "peopleForm2": peopleForm2, "addressForm": addressForm, "committeeForm": committeeForm, "servicesForm": servicesForm, # 'captchaForm': captchaForm, }, ) else: return render( request, "schasite/membership_form.html", { "membershipForm": ChildrenForm(), "peopleForm1": PeopleForm(prefix="person1"), "peopleForm2": PeopleForm(prefix="person2"), "committeeForm": CommitteeForm(), "servicesForm": ServicesForm(), # 'captchaForm': CaptchaForm(), "addressForm": AddressForm( initial={ "city": "Wheaton", "state": "IL", "zip_code": 60189, } ), }, ) def scha_board(request): return render(request, "schasite/scha_board.html", {}) def login(request): if request.method == "POST": username = request.POST["username"] password = request.POST["password"] user = authenticate(request, username=username, password=password) if user is not None: return redirect('dashboard') else: return render(request, "schasite/signin.html",{'error_msg': "Invalid username/password"}) else: return render(request, "schasite/signin.html",{}) def logout(request): if request.method == "POST": logout(request) return redirect('index2') def password_reset(request): if request.method == "POST": raise NotImplementedError() else: return render(request, "schasite/password_reset.html",{}) def set_password(request): if request.method == "POST": raise NotImplementedError() return redirect('login') else: return render(request, "schasite/set_password.html",{}) def signup(request): if request.method == "POST": raise NotImplementedError() return redirect('login') else: return render(request, "schasite/signup.html",{}) @login_required(login_url="/login") def member_directory(request): if request.method == "POST": # these should be filters raise NotImplementedError() else: members = MembershipPerson.objects.all() return render(request, "schasite/member_directory.html",{'members':members}) @login_required(login_url="/login") def member_dashboard(request): current_member = CommunityMember.objects.get(user=request.user) if request.method == "POST": raise NotImplementedError() else: recent_posts = CommunityPost.objects.all()[:5] member_recent_posts = CommunityPost.objects.filter(author=current_member)[:5] return render(request, "schasite/member_dashboard.html",{"recent_posts":recent_posts, "member_recent_posts": member_recent_posts, "current_member": current_member}) @login_required(login_url="/login") def member_posts(request): current_member = CommunityMember.objects.get(user=request.user) if request.method == "POST": raise NotImplementedError() else: posts = CommunityPost.objects.all()[:5] return render(request, "schasite/member_posts.html",{"posts":posts}) @login_required(login_url="/login") def member_posts_create(request): current_member = CommunityMember.objects.get(user=request.user) if request.method == "POST": community_post_form = CommunityPostForm(request.POST) if community_post_form.is_valid(): community_post_form.save() return render(request, "schasite/member_posts.html",{}) else: print(f'Error creating the post: {community_post_form.errors}') return render(request, "schasite/member_posts_create.html",{"community_post": community_post_form}) else: return render(request, "schasite/member_posts_create.html",{"community_post": CommunityPostForm()}) @login_required(login_url="/login") def member_posts_detail(request, post_id): current_member = CommunityMember.objects.get(user=request.user) if request.method == "POST": raise NotImplementedError() else: return render(request, "schasite/member_posts_detail.html",{}) #@login_required(login_url="/login") def profile(request): #current_member = CommunityMember.objects.get(user=request.user) if request.method == "POST": raise NotImplementedError() else: return render(request, "schasite/profile.html",{})