diff --git a/necysc_app/models.py b/necysc_app/models.py index 7ad0a470..7f798a22 100644 --- a/necysc_app/models.py +++ b/necysc_app/models.py @@ -6,7 +6,6 @@ from solo.models import SingletonModel - class Applicant(models.Model): # choices for application status APP_STATUS_CHOICES = { @@ -42,9 +41,9 @@ class Applicant(models.Model): "AL": "Adult L", "AX": "Adult XL", } - + # choices for program data - PROGRAM_CHOICES={ + PROGRAM_CHOICES = { "D": "Day", "ON": "Overnight", "CIT": "CIT", @@ -54,13 +53,14 @@ class Applicant(models.Model): } # choices for forms - HEALTH_FORM_RECEIVED_CHOICES={ + HEALTH_FORM_RECEIVED_CHOICES = { "NS": "Not Submitted", "P": "Pending", "A": "Approved", } - - user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True) + + user = models.ForeignKey( + User, on_delete=models.CASCADE, blank=True, null=True) # status data created_at = models.DateTimeField(auto_now_add=True) @@ -69,7 +69,7 @@ class Applicant(models.Model): app_status = models.CharField( max_length=1, choices=APP_STATUS_CHOICES, - default= "I" + default="I" ) # this should be hidden from the user health_record_status = models.CharField( @@ -79,38 +79,55 @@ class Applicant(models.Model): ) # personal data - applicant_fname = models.CharField(max_length=200, verbose_name="First Name") - applicant_lname = models.CharField(max_length=200, verbose_name="Last Name") - applicant_chinese_name = models.CharField(max_length=200, blank=True, null=True, verbose_name="Chinese Name") # optional + applicant_fname = models.CharField( + max_length=200, verbose_name="First Name") + applicant_lname = models.CharField( + max_length=200, verbose_name="Last Name") + applicant_chinese_name = models.CharField( + max_length=200, blank=True, null=True, verbose_name="Chinese Name") # optional applicant_email = models.EmailField(verbose_name="Email") - parent1_fname = models.CharField(max_length=200, verbose_name="Primary Contact First Name") - parent1_lname = models.CharField(max_length=200, verbose_name="Primary Contact Last Name") + parent1_fname = models.CharField( + max_length=200, verbose_name="Primary Contact First Name") + parent1_lname = models.CharField( + max_length=200, verbose_name="Primary Contact Last Name") parent1_relationship = models.CharField( max_length=1, choices=PARENT_RELATIONSHIP_CHOICES, verbose_name="Primary Contact Relationship" ) - parent1_phone = models.CharField(max_length=15, verbose_name="Primary Contact Phone") + parent1_phone = models.CharField( + max_length=15, verbose_name="Primary Contact Phone") parent1_email = models.EmailField(verbose_name="Primary Contact Email") - parent1_for_POD = models.BooleanField(verbose_name="Primary Contact as POD") + parent1_for_POD = models.BooleanField( + verbose_name="Primary Contact as POD") - parent2_fname = models.CharField(max_length=200, blank=True, null=True, verbose_name="Secondary Contact First Name") # optional - parent2_lname = models.CharField(max_length=200, blank=True, null=True, verbose_name="Secondary Contact Last Name") # optional + parent2_fname = models.CharField( + max_length=200, blank=True, null=True, verbose_name="Secondary Contact First Name") # optional + parent2_lname = models.CharField( + max_length=200, blank=True, null=True, verbose_name="Secondary Contact Last Name") # optional parent2_relationship = models.CharField( max_length=1, choices=PARENT_RELATIONSHIP_CHOICES, - blank=True, null=True, verbose_name="Secondary Contact Relationship") # optional - parent2_phone = models.CharField(max_length=15, blank=True, null=True, verbose_name="Secondary Contact Phone") # optional - parent2_email = models.EmailField(blank=True, null=True, verbose_name="Secondary Contact Email") # optional - parent2_for_POD = models.BooleanField(blank=True, null=True, verbose_name="Secondary Contact as POD") # optional + blank=True, null=True, verbose_name="Secondary Contact Relationship") # optional + parent2_phone = models.CharField( + max_length=15, blank=True, null=True, verbose_name="Secondary Contact Phone") # optional + parent2_email = models.EmailField( + blank=True, null=True, verbose_name="Secondary Contact Email") # optional + parent2_for_POD = models.BooleanField( + blank=True, null=True, verbose_name="Secondary Contact as POD") # optional - interest_in_POD_lead = models.BooleanField(verbose_name="Interest in POD Lead") + interest_in_POD_lead = models.BooleanField( + verbose_name="Interest in POD Lead") - additional_emergency_contact_fname = models.CharField(max_length=200, blank=True, null=True, verbose_name="Emergency Contact First Name") # optional - additional_emergency_contact_lname = models.CharField(max_length=200, blank=True, null=True, verbose_name="Emergency Contact Last Name") # optional - additional_emergency_contact_relationship = models.CharField(max_length=200, blank=True, null=True, verbose_name="Emergency Contact Relationship") # optional - additional_emergency_contact_phone = models.CharField(max_length=15, blank=True, null=True, verbose_name="Emergency Contact Phone") # optional + additional_emergency_contact_fname = models.CharField( + max_length=200, blank=True, null=True, verbose_name="Emergency Contact First Name") # optional + additional_emergency_contact_lname = models.CharField( + max_length=200, blank=True, null=True, verbose_name="Emergency Contact Last Name") # optional + additional_emergency_contact_relationship = models.CharField( + max_length=200, blank=True, null=True, verbose_name="Emergency Contact Relationship") # optional + additional_emergency_contact_phone = models.CharField( + max_length=15, blank=True, null=True, verbose_name="Emergency Contact Phone") # optional street_address = models.CharField(max_length=200, verbose_name="Street") city = models.CharField(max_length=200, verbose_name="City") @@ -122,7 +139,8 @@ class Applicant(models.Model): max_length=1, choices=SEX_CHOICES, verbose_name="Gender") - applicant_grade = models.IntegerField(validators=[MinValueValidator(0)], verbose_name="School Grade") + applicant_grade = models.IntegerField( + validators=[MinValueValidator(0)], verbose_name="School Grade") applicant_shirt_size = models.CharField( max_length=2, choices=SHIRT_SIZE_CHOICES, @@ -136,13 +154,18 @@ class Applicant(models.Model): verbose_name="Program" ) payment_received = models.BooleanField(default=False) - payment_total = models.DecimalField(max_digits=10, decimal_places=2, default=0) - payment_camp = models.DecimalField(max_digits=10, decimal_places=2, default=0) - payment_donation = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True, default=0) - payment_pod = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True, default=0) + payment_total = models.DecimalField( + max_digits=10, decimal_places=2, default=0) + payment_camp = models.DecimalField( + max_digits=10, decimal_places=2, default=0) + payment_donation = models.DecimalField( + max_digits=10, decimal_places=2, blank=True, null=True, default=0) + payment_pod = models.DecimalField( + max_digits=10, decimal_places=2, blank=True, null=True, default=0) # other - allowed_pickup_persons = models.CharField(max_length=500, blank=True, null=True) + allowed_pickup_persons = models.CharField( + max_length=500, blank=True, null=True) financial_aid_requested = models.BooleanField(default=False) listing_on_weekbook = models.BooleanField(default=False) camper_contact_email = models.EmailField(blank=True, null=True) @@ -151,29 +174,38 @@ class Applicant(models.Model): available_for_carpool = models.BooleanField(default=False) referrals = models.CharField(max_length=200, blank=True, null=True) heard_from = models.CharField(max_length=200, blank=True, null=True) - preferred_roommate = models.CharField(max_length=200, blank=True, null=True) + preferred_roommate = models.CharField( + max_length=200, blank=True, null=True) # forms health_form_a_received = models.BooleanField(default=False) health_form_b_received = models.BooleanField(default=False) medication_slip_received = models.BooleanField(default=False) - parent1_cori_status = models.CharField(max_length=10, blank=True, null=True) - parent1_sori_status = models.CharField(max_length=10, blank=True, null=True) + parent1_cori_status = models.CharField( + max_length=10, blank=True, null=True) + parent1_sori_status = models.CharField( + max_length=10, blank=True, null=True) parent1_id_status = models.CharField(max_length=10, blank=True, null=True) - parent2_cori_status = models.CharField(max_length=10, blank=True, null=True) - parent2_sori_status = models.CharField(max_length=10, blank=True, null=True) + parent2_cori_status = models.CharField( + max_length=10, blank=True, null=True) + parent2_sori_status = models.CharField( + max_length=10, blank=True, null=True) parent2_id_status = models.CharField(max_length=10, blank=True, null=True) camper_cori_status = models.CharField(max_length=10, blank=True, null=True) camper_sori_status = models.CharField(max_length=10, blank=True, null=True) camper_id_status = models.CharField(max_length=10, blank=True, null=True) camp_rule_agreement = models.BooleanField(default=False) liability_agreement = models.BooleanField(default=False) - + # medical data - insurance_provider = models.CharField(max_length=200, blank=True, null=True, verbose_name="Health Insurance Provider") - subscriber_name = models.CharField(max_length=200, blank=True, null=True, verbose_name="Insurance Subscriber Name") - primary_physician_name = models.CharField(max_length=200, blank=True, null=True, verbose_name="Physician Name") - primary_physician_phone = models.CharField(max_length=15, blank=True, null=True, verbose_name="Physician Phone") + insurance_provider = models.CharField( + max_length=200, blank=True, null=True, verbose_name="Health Insurance Provider") + subscriber_name = models.CharField( + max_length=200, blank=True, null=True, verbose_name="Insurance Subscriber Name") + primary_physician_name = models.CharField( + max_length=200, blank=True, null=True, verbose_name="Physician Name") + primary_physician_phone = models.CharField( + max_length=15, blank=True, null=True, verbose_name="Physician Phone") # grant permission to questions - if left false contact guardian(s) grant_hospital_permission = models.BooleanField(default=False) @@ -184,80 +216,102 @@ class Applicant(models.Model): grant_skin_treatment_permission = models.BooleanField(default=False) allergies = models.BooleanField(default=False) - allergies_description = models.CharField(max_length=200, blank=True, null=True) - initial_for_allergy_treatment = models.CharField(max_length=200, blank=True, null=True) + allergies_description = models.CharField( + max_length=200, blank=True, null=True) + initial_for_allergy_treatment = models.CharField( + max_length=200, blank=True, null=True) epi_pen_prescribed = models.BooleanField(default=False) - - social_emotional_concerns = models.CharField(max_length=200, blank=True, null=True) - + + social_emotional_concerns = models.CharField( + max_length=200, blank=True, null=True) + wear_glasses = models.BooleanField(default=False) wear_contacts = models.BooleanField(default=False) wear_hearing_aids = models.BooleanField(default=False) medication = models.BooleanField(default=False) - medication_description = models.CharField(max_length=200, blank=True, null=True) + medication_description = models.CharField( + max_length=200, blank=True, null=True) + + opt_out_activities = models.CharField( + max_length=200, blank=True, null=True) - opt_out_activities = models.CharField(max_length=200, blank=True, null=True) - # hidden in form medical_comments = models.CharField(max_length=200, blank=True, null=True) signature = models.CharField(max_length=200, blank=True, null=True) - # registration - + # TODO: hidden in form - group_id = models.CharField(max_length=200, blank=True, null=True, default="0") + group_id = models.CharField( + max_length=200, blank=True, null=True, default="0") room_id = models.CharField(max_length=200, blank=True, null=True) internal_comments = models.CharField(max_length=200, blank=True, null=True) + class ApplicantHealth(Applicant): class Meta: proxy = True app_label = Applicant._meta.app_label verbose_name = "Applicant Health Info" + + class CampDirectory(Applicant): class Meta: proxy = True app_label = Applicant._meta.app_label verbose_name = "Camp Directory" + + class POD(Applicant): class Meta: proxy = True app_label = Applicant._meta.app_label - verbose_name = "Parent On Duty" + verbose_name = "Parent On Duty" + + class CarpoolApplicant(Applicant): class Meta: proxy = True app_label = Applicant._meta.app_label verbose_name = "Carpool Directory" + + class CamperReferral(Applicant): class Meta: proxy = True app_label = Applicant._meta.app_label verbose_name = "Camper Referral" + + class RoomateRequest(Applicant): class Meta: proxy = True app_label = Applicant._meta.app_label verbose_name = "Roomate Request" + class GlobalData(SingletonModel): - day_camp_cost = models.DecimalField(max_digits=10, decimal_places=2, default=0) - ON_camp_cost = models.DecimalField(max_digits=10, decimal_places=2, default=0) - EA_camp_cost = models.DecimalField(max_digits=10, decimal_places=2, default=0) - CIT_camp_cost = models.DecimalField(max_digits=10, decimal_places=2, default=0) + day_camp_cost = models.DecimalField( + max_digits=10, decimal_places=2, default=0) + ON_camp_cost = models.DecimalField( + max_digits=10, decimal_places=2, default=0) + EA_camp_cost = models.DecimalField( + max_digits=10, decimal_places=2, default=0) + CIT_camp_cost = models.DecimalField( + max_digits=10, decimal_places=2, default=0) # refers to both counselor and ra cost - RA_camp_cost = models.DecimalField(max_digits=10, decimal_places=2, default=0) - OPs_camp_cost = models.DecimalField(max_digits=10, decimal_places=2, default=0) - POD_camp_cost = models.DecimalField(max_digits=10, decimal_places=2, default=0) + RA_camp_cost = models.DecimalField( + max_digits=10, decimal_places=2, default=0) + OPs_camp_cost = models.DecimalField( + max_digits=10, decimal_places=2, default=0) + POD_camp_cost = models.DecimalField( + max_digits=10, decimal_places=2, default=0) def __str__(self): return "Global Data Settings" - + class Meta: verbose_name = "Global Data" verbose_name_plural = "Global Data" - - diff --git a/necysc_app/static/necysc_app/about.css b/necysc_app/static/necysc_app/about.css index bdc9d8e3..e3e59dbd 100644 --- a/necysc_app/static/necysc_app/about.css +++ b/necysc_app/static/necysc_app/about.css @@ -1,7 +1,8 @@ .hero-section { - background-image: url("./images/programs_hero.jpg"); + background-image: url("./images/necyscbannerimage.jpg"); } -h1, h4{ +h1, +h4 { color: #4e598c; } diff --git a/necysc_app/static/necysc_app/images/.DS_Store b/necysc_app/static/necysc_app/images/.DS_Store new file mode 100644 index 00000000..d7c02640 Binary files /dev/null and b/necysc_app/static/necysc_app/images/.DS_Store differ diff --git a/necysc_app/static/necysc_app/images/headshots/charles.jpg b/necysc_app/static/necysc_app/images/headshots/charles.jpg new file mode 100644 index 00000000..f1ad3fbc Binary files /dev/null and b/necysc_app/static/necysc_app/images/headshots/charles.jpg differ diff --git a/necysc_app/static/necysc_app/images/headshots/chris_chiu.jpg b/necysc_app/static/necysc_app/images/headshots/chris_chiu.jpg new file mode 100644 index 00000000..f4520b07 Binary files /dev/null and b/necysc_app/static/necysc_app/images/headshots/chris_chiu.jpg differ diff --git a/necysc_app/static/necysc_app/images/headshots/mikayla.jpg b/necysc_app/static/necysc_app/images/headshots/mikayla.jpg new file mode 100644 index 00000000..329a935e Binary files /dev/null and b/necysc_app/static/necysc_app/images/headshots/mikayla.jpg differ diff --git a/necysc_app/static/necysc_app/images/headshots/paul_eska.jpg b/necysc_app/static/necysc_app/images/headshots/paul_eska.jpg new file mode 100644 index 00000000..9a31656a Binary files /dev/null and b/necysc_app/static/necysc_app/images/headshots/paul_eska.jpg differ diff --git a/necysc_app/static/necysc_app/images/home_hero_banner.gif b/necysc_app/static/necysc_app/images/home_hero_banner.gif new file mode 100644 index 00000000..18b20129 Binary files /dev/null and b/necysc_app/static/necysc_app/images/home_hero_banner.gif differ diff --git a/necysc_app/static/necysc_app/login.css b/necysc_app/static/necysc_app/login.css deleted file mode 100644 index ebeef5fb..00000000 --- a/necysc_app/static/necysc_app/login.css +++ /dev/null @@ -1,109 +0,0 @@ -.login_page { - display: flex; - justify-content: center; - align-items: center; - flex-direction: row; - width: 100%; - height: 90vh; -} - -.login_form { - width: 50%; - height: 100%; - padding: 20px; - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - gap: 30px; -} - -.login_form_body { - display: flex; - justify-content: center; - align-items: center; - gap: 35px; - flex-direction: column; - width: 100%; -} - -.login_form_body #id_email, -.login_form_body #id_password { - width: 300px; - padding: 10px; - border-radius: 5px; - border: 1px solid #ccc; -} - -/* .login_form_body input[type="submit"] { - background-color: #2E6D9E; - color: white; - border: none; - padding: 10px; - cursor: pointer; - width: 50%; - border-radius: 50px; -} - -.login_form_body input[type="submit"]:hover { - transition: 0.3s; - background-color: #4E2498; -} */ - -.register_form { - width: 50%; - height: 100%; - padding: 60px; - padding-left: 150px; - - display: flex; - justify-content: center; - align-items: center; - position: relative; - background-image: url("./images/king.png"); - background-size: cover; - background-position: center; - background-repeat: no-repeat; - color: white; - flex-direction: column; - gap: 50px; - text-align: center; - clip-path: polygon(20% 0, 100% 0, 100% 100%, 0% 100%); -} - -.register_form h1 { - font-size: 35px; -} - -.register_form p { - font-size: 15px; -} - -/* .register_form a { - border: 1px solid white; - padding: 10px 20px; - color: white; - background-color: transparent; - text-decoration: none; - width: 350px; - font-size: 15px; - border-radius: 50px; - transition: background-color 0.3s ease; -} - -.register_form a:hover { - color: white; - background-color: rgba(255, 255, 255, 0.3); -} - -.register_form::before { - content: ""; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: rgba(0, 0, 0, 0.35); - z-index: -1; - clip-path: polygon(20% 0, 100% 0, 100% 100%, 0% 100%); -} */ diff --git a/necysc_app/static/necysc_app/register.css b/necysc_app/static/necysc_app/register.css deleted file mode 100644 index 611c4b19..00000000 --- a/necysc_app/static/necysc_app/register.css +++ /dev/null @@ -1,120 +0,0 @@ -/* Register Page Container */ -.register_page { - display: flex; - justify-content: center; - align-items: center; - width: 100%; - flex-direction: row-reverse; - height: 90vh; -} - -/* Register Form Section */ -.register_form { - width: 50%; - height: 100%; - padding-left: 50px; - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - gap: 30px; -} - -.register_form h1 { - font-size: 50px; -} - -.register_form_body { - display: flex; - justify-content: center; - align-items: center; - gap: 35px; - flex-direction: column; - width: 100%; -} - -.register_form_body #id_username, -.register_form_body #id_email, -.register_form_body #id_password1, -.register_form_body #id_password2 { - width: 300px; - padding: 10px; - border-radius: 5px; - border: 1px solid #ccc; -} - -/* Login Redirect Section with Triangle */ -.login_redirect { - width: 50%; - height: 100%; - padding: 60px; - padding-right: 150px; - display: flex; - justify-content: center; - align-items: center; - position: relative; - background-image: url("./images/night.png"); - background-size: cover; - background-position: center; - background-repeat: no-repeat; - z-index: 1; - color: white; - flex-direction: column; - gap: 50px; - text-align: center; - clip-path: polygon(0 0, 80% 0, 100% 100%, 0% 100%); /* Triangle shape */ -} - -.login_redirect h2 { - font-size: 35px; -} - -.login_redirect p { - font-size: 15px; -} - -.login_redirect a { - border: 1px solid white; - padding: 10px 20px; - color: white; - background-color: transparent; - text-decoration: none; - width: 350px; - font-size: 15px; - border-radius: 50px; - transition: background-color 0.3s ease; -} - -.login_redirect a:hover { - color: white; - background-color: rgba(255, 255, 255, 0.3); -} - -/* Dark overlay on the image to ensure text readability */ -.login_redirect::before { - content: ""; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: rgba(0, 0, 0, 0.35); - z-index: -1; - clip-path: polygon(0 0, 80% 0, 100% 100%, 0% 100%); /* Ensures overlay follows the triangle shape */ -} - -.btn-purple { - background-color: #4e598c; - color: #f9c784; - transition: all 0.3s ease; - border: none; - padding: 10px; - cursor: pointer; - width: 50%; - border-radius: 50px; - } - - .btn-purple:hover { - background-color: #f9c784; - color: #ffffff; - } \ No newline at end of file diff --git a/necysc_app/templates/necysc_app/applicant/application_detail.html b/necysc_app/templates/necysc_app/applicant/application_detail.html index 4ba31634..937ad04a 100644 --- a/necysc_app/templates/necysc_app/applicant/application_detail.html +++ b/necysc_app/templates/necysc_app/applicant/application_detail.html @@ -6,8 +6,9 @@ {% block content %} -

Application Details

- +
+ Back to Home +

Name: {{ application.applicant_fname }} {{ application.applicant_lname }}

diff --git a/necysc_app/templates/necysc_app/applicant/index.html b/necysc_app/templates/necysc_app/applicant/index.html index 9392bf79..28e9497c 100644 --- a/necysc_app/templates/necysc_app/applicant/index.html +++ b/necysc_app/templates/necysc_app/applicant/index.html @@ -123,10 +123,12 @@
{% if application.app_status == 'A' %} Accepted - {% elif application.app_status == 'P' %} + {% elif application.app_status == 'I' %} Pending - {% else %} + {% elif application.app_status == 'R' %} Rejected + {% else %} + Incomplete {% endif %}
diff --git a/necysc_app/templates/necysc_app/applicant/login.html b/necysc_app/templates/necysc_app/applicant/login.html index 17d4440f..abef632b 100644 --- a/necysc_app/templates/necysc_app/applicant/login.html +++ b/necysc_app/templates/necysc_app/applicant/login.html @@ -1,7 +1,119 @@ {% extends "necysc_app/base.html" %} {% load static %} {% block title %} Login / Register {% endblock %} {% block content %} - +