Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Profile UI for CCE Minor Experiences. #1293

Open
wants to merge 58 commits into
base: development
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
34b93d5
testing for UI CE Minor
esw0624 Jun 18, 2024
3067b1a
Final Update
esw0624 Jun 20, 2024
0263d7e
Fixed Final Update
esw0624 Jun 20, 2024
21954ab
Finalizing Final Update
esw0624 Jun 20, 2024
0eaf1c9
Merge branch 'development' of github.com:BCStudentSoftwareDevTeam/cel…
esw0624 Jun 24, 2024
85826e0
Merge branch 'development' of github.com:BCStudentSoftwareDevTeam/cel…
esw0624 Jun 28, 2024
45ceed4
Update for Mahak
esw0624 Jun 28, 2024
9f91bf1
Merge branch 'development' of github.com:BCStudentSoftwareDevTeam/cel…
esw0624 Jul 1, 2024
95ad2c9
Testing with Seedy
esw0624 Jul 3, 2024
a311d35
Updates of the day
esw0624 Jul 3, 2024
22857d3
Updating changes to GitHub
esw0624 Jul 9, 2024
9637377
Merge branch 'CCEMinorTabs' of github.com:BCStudentSoftwareDevTeam/ce…
esw0624 Jul 9, 2024
eeb1dc5
Updating to GitHub 2
esw0624 Jul 9, 2024
3ada839
Completed the backend for both Summer Experience and Other Engagement…
seedyjahateh Jul 23, 2024
87323ca
Fixing comments
Mbeweg Nov 8, 2024
3e84f24
Fixed the issues.
Mbeweg Nov 19, 2024
652e258
Fixed the issue.
Mbeweg Nov 20, 2024
ab2b6a3
Merge branch 'development' into CCEMinorTabs
bledsoef Jan 15, 2025
2106b77
Resolved PR Comments on January 15
Kafui123 Jan 15, 2025
e518367
Modifying the code based on comments
Kafui123 Jan 16, 2025
15e975b
Resolved changes to comments on Jan 17
Kafui123 Jan 17, 2025
eb3ee98
Changes made today for isOver300Hours on January 20
Kafui123 Jan 21, 2025
6797f2f
Delete app/models.py
bledsoef Jan 21, 2025
546780d
Delete databasebackup.sql
bledsoef Jan 21, 2025
b37fafa
deleted unused routes and functions
bledsoef Jan 21, 2025
00b3053
Changed all uses of vanilla javascript to jQUery
Kafui123 Jan 21, 2025
cdf085e
Merge branch 'CCEMinorTabs' of github.com:BCStudentSoftwareDevTeam/ce…
Kafui123 Jan 21, 2025
968dd5c
Removed all withdrawal logic here, reference for future use!
Kafui123 Jan 21, 2025
68e1c47
Made preliminary changes to the dropdown years
Kafui123 Jan 21, 2025
71c429a
combined the update and create routes
bledsoef Jan 22, 2025
cf4e13e
resolved merge conflicts
bledsoef Jan 22, 2025
59a0121
DELETED OTHER ENGAGEMENT LOGIC, CAN POTENTIALLY USE THIS FOR THE A NE…
bledsoef Jan 22, 2025
9e4684e
Populated the select year dropdown with actual years
Kafui123 Jan 22, 2025
c2276d3
modularized the profile.html so each component has its own file
bledsoef Jan 22, 2025
8e90b43
fixed merge conflicts
bledsoef Jan 22, 2025
a54e069
Committed changes
Kafui123 Jan 22, 2025
354a39e
Merged branch
Kafui123 Jan 22, 2025
427c2f9
attached javascript to file and working on conditional text boxes
bledsoef Jan 22, 2025
cb94bfe
Populated the years dropdown menu
Kafui123 Jan 22, 2025
2fe03e9
Populated the dropdown years column
Kafui123 Jan 22, 2025
eaab491
Removed commented code
Kafui123 Jan 23, 2025
c84049e
modularized the two forms even more
bledsoef Jan 23, 2025
d449c8a
removed redundant student information
bledsoef Jan 23, 2025
b44f3fe
Merge branch 'development' into CCEMinorTabs
bledsoef Jan 24, 2025
b8f88fa
deleted unused javascript
bledsoef Jan 24, 2025
52013a6
modified some styling and made conditional text boxes appear when the…
bledsoef Jan 24, 2025
1ad8991
adjusted styling on both of the forms
bledsoef Jan 24, 2025
97adb9a
set up two new fields and text boxes
bledsoef Jan 24, 2025
0ee411c
deleted unused imports and log statement
bledsoef Jan 24, 2025
5722384
started writing tests
bledsoef Jan 24, 2025
22873b5
Added 2+ years
Kafui123 Jan 27, 2025
91bb011
Merged
Kafui123 Jan 27, 2025
5031ea1
Changed redirect
Kafui123 Jan 27, 2025
7b0f03c
added a reload post form submit
bledsoef Jan 29, 2025
f627402
deleted update summer experience logic as we cant test it yet: REFERE…
bledsoef Jan 29, 2025
ae9f5a3
added testing and renamed some fields in summerExperience
bledsoef Jan 29, 2025
b336262
added phone number validation
bledsoef Jan 29, 2025
343ddee
Populated the drop down year menu, added experience information heade…
Kafui123 Jan 30, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion app/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
from flask import Flask, render_template
from playhouse.shortcuts import model_to_dict, dict_to_model
from app.logic.config import load_config_files

app = Flask(__name__)
app.debug = True # Enable debug mode
# Initialize our application
app = Flask(__name__, template_folder="templates")

Expand Down
49 changes: 32 additions & 17 deletions app/controllers/minor/routes.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
from flask import g, render_template, request, abort, flash, redirect, url_for
from flask import g, render_template, request, abort, flash, redirect, url_for, jsonify
from peewee import DoesNotExist
from datetime import datetime

from app.controllers.minor import minor_bp
from app.models.user import User
from app.models.term import Term
from app.models.attachmentUpload import AttachmentUpload
from app.models.summerExperience import SummerExperience
from app.models.otherExperience import OtherExperience

from app.logic.fileHandler import FileHandler
from app.logic.utils import selectSurroundingTerms, getFilesFromRequest
from app.logic.minor import getProgramEngagementHistory, getCourseInformation, getCommunityEngagementByTerm, removeSummerExperience
from app.logic.minor import saveOtherEngagementRequest, setCommunityEngagementForUser, saveSummerExperience, getSummerTerms, getSummerExperience, getEngagementTotal
from app.logic.minor import saveOtherEngagementRequest, setCommunityEngagementForUser, getSummerTerms, getSummerExperience, getEngagementTotal, createSummerExperience, getProgramEngagementHistory, getCourseInformation, getCommunityEngagementByTerm

@minor_bp.route('/profile/<username>/cceMinor', methods=['GET'])
def viewCceMinor(username):
Expand All @@ -22,13 +23,35 @@ def viewCceMinor(username):
sustainedEngagementByTerm = getCommunityEngagementByTerm(username)
selectedSummerTerm, summerExperience = getSummerExperience(username)

latestYear = datetime.now().year + 2

summerYears = [latestYear - i for i in range(5)]

return render_template("minor/profile.html",
user = User.get_by_id(username),
summerYears = summerYears,
sustainedEngagementByTerm = sustainedEngagementByTerm,
summerExperience = summerExperience if summerExperience else "",
selectedSummerTerm = selectedSummerTerm,
totalSustainedEngagements = getEngagementTotal(sustainedEngagementByTerm),
summerTerms = getSummerTerms())
summerTerms = getSummerTerms(),
allTerms = getSummerExperience(username))


# ################################################## SUMMER EXPERIENCE START ###########################################################

@minor_bp.route('/cceMinor/<username>/addSummerExperience', methods=['POST'])
def createOrUpdateSummerExperience(username):
formData = request.form
try:
createSummerExperience(username, formData)
flash(f'Summer Experience successfully created by {username}', 'success')
except Exception as e:
flash(f'An error occurred while adding the summer experience: {e}', 'danger')
print(f'An error occurred while adding the summer experience: {e}')
return ""

# ################################################## SUMMER EXPERIENCE END ###########################################################

@minor_bp.route('/cceMinor/<username>/getEngagementInformation/<type>/<term>/<id>', methods=['GET'])
def getEngagementInformation(username, type, id, term):
Expand Down Expand Up @@ -66,6 +89,9 @@ def requestOtherEngagement(username):
user = User.get_by_id(username)
terms = selectSurroundingTerms(g.current_term)

latestYear = datetime.now().year + 2

summerYears = [latestYear - i for i in range(5)]

if request.method == 'POST':
filename = None
Expand All @@ -83,16 +109,5 @@ def requestOtherEngagement(username):

return render_template("/minor/requestOtherEngagement.html",
user=user,
summerYears = summerYears,
terms=terms)

@minor_bp.route('/cceMinor/<username>/addSummerExperience', methods=['POST'])
def addSummerExperience(username):
saveSummerExperience(username, request.form, g.current_user)

return ""

@minor_bp.route('/cceMinor/<username>/deleteSummerExperience', methods=['POST'])
def deleteSummerExperience(username):
removeSummerExperience(username)

return ""
27 changes: 27 additions & 0 deletions app/logic/minor.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from collections import defaultdict
from typing import List, Dict
from flask import flash
from playhouse.shortcuts import model_to_dict
from peewee import JOIN, fn, Case, DoesNotExist

Expand All @@ -15,7 +16,33 @@
from app.models.individualRequirement import IndividualRequirement
from app.models.certificationRequirement import CertificationRequirement
from app.models.communityEngagementRequest import CommunityEngagementRequest
from app.models.summerExperience import SummerExperience
from app.models.otherExperience import OtherExperience

def createSummerExperience(username, formData):
"""
Given the username of the student and the formData which includes all of
the SummerExperience information, create a new SummerExperience object.
"""
try:
user = User.get(User.username == username)
contentAreas = ', '.join(formData.getlist('contentArea')) # Combine multiple content areas

# Directly assign the experience type
experienceType = formData['experienceType'] if formData['experienceType'] != 'Other' else formData.get('otherExperienceDescription', '')
if experienceType == '': # Check if the otherExperienceDescription is empty when required
raise ValueError("Other experience description is required.")
SummerExperience.create(
Kafui123 marked this conversation as resolved.
Show resolved Hide resolved
user=user,
contentAreas = contentAreas,
status="Pending",
**formData,
)
except Exception as e:
print(f"Error saving summer experience: {e}")
raise

# ################################################
def getEngagementTotal(engagementData):
"""
Count the number of engagements (from all terms) that have matched with a requirement
Expand Down
1 change: 1 addition & 0 deletions app/models/individualRequirement.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from app.models.course import Course
from app.models.program import Program
from app.models.certificationRequirement import CertificationRequirement
from app.models.summerExperience import SummerExperience


class IndividualRequirement(baseModel):
Expand Down
2 changes: 2 additions & 0 deletions app/models/otherExperience.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
from app.models import *
from app.models.term import Term
from app.models.user import User

class OtherExperience(baseModel):
user = ForeignKeyField(User)
activity = CharField()
term = ForeignKeyField(Term)
hours = IntegerField()
Expand Down
23 changes: 23 additions & 0 deletions app/models/summerExperience.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import datetime
from app.models import *
from app.models.user import User

class SummerExperience(baseModel):
user = ForeignKeyField(User)
summerYear = CharField()
roleDescription = TextField()
experienceType = CharField()
contentAreas = TextField() # Store as comma-separated values or use a related table if needed
isOver300Hours = BooleanField()
status = CharField(constraints=[Check("status in ('Approved', 'Pending', 'Denied')")], default='Pending')
orgName= CharField()
orgAddress = CharField()
hoursNotOver300 = IntegerField(null=True)
weeksNotOver300 = IntegerField(null=True)
orgPhone = CharField()
orgWebsite = CharField()
supervisorName = CharField()
supervisorPhone = CharField()
supervisorEmail = CharField()
createdOn = DateTimeField(default=datetime.datetime.now)

66 changes: 66 additions & 0 deletions app/static/js/minorProfilePage.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
$(document).ready(function() {
$('#hoursBelow300Container').hide()
$('#otherExperienceDescription').hide()

$('input.phone-input').inputmask('(999)-999-9999')
$('input.phone-input').on('input', function(){
let matches = $(this).val().match(/\d/g);
let digits = matches?matches.length:0;
if (digits == 0 || digits == 10){
this.setCustomValidity('')
}
else{
this.setCustomValidity('Please enter a valid phone number.')
this.reportValidity()
}
})
$("input[name='experienceType']").on("change", function() {
toggleOtherExperienceTextarea();
});

$("input[name='experienceHoursOver300']").on("change", function() {
toggleUnder300HoursTextarea();
});

function toggleUnder300HoursTextarea() {
var yesRadio = $('#yes300hours');
var conditionalTextBox = $('#hoursBelow300Container');
if (yesRadio.is(':checked')) {
conditionalTextBox.hide()
} else {
conditionalTextBox.show()
}
}

function toggleOtherExperienceTextarea() {
var otherRadio = $('#otherExperience');
var conditionalTextBox = $('#otherExperienceDescription');
if (otherRadio.is(':checked')) {
conditionalTextBox.show()
} else {
conditionalTextBox.hide()
}
}

$('#summerExperienceForm').on('submit', function(event) {
event.preventDefault();
var formData = new FormData(this);
var actionUrl = $(this).attr('action');

$.ajax({
url: actionUrl,
type: 'POST',
data: formData,
contentType: false,
processData: false,
success: function(response) {
$('#pills-summerExperience').html(response);
$('#summerExperience').tab('show');
location.reload()
},
error: function(xhr, status, error) {
console.error('Error:', error);
}
});
});
})
4 changes: 1 addition & 3 deletions app/templates/admin/searchStudentPage.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,7 @@
<script type="module" src="/static/js/searchStudent.js"></script>
{% endblock %}

{% block styles %}
{{super()}}
{% endblock %}


{% block app_content %}
<form id= "searchStudent" action="/userProfile" method="post">
Expand Down
2 changes: 2 additions & 0 deletions app/templates/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,8 @@
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script src="{{url_for('static', filename='js/bootstrap.bundle.min.js') }}?u={{lastStaticUpdate}}" type="text/javascript"></script>
<script src="{{url_for('static', filename='js/base.js') }}?u={{lastStaticUpdate}}" type="text/javascript"></script>


{% endblock %}

</html>
30 changes: 30 additions & 0 deletions app/templates/minor/companyOrganizationInformation.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<div class="form-group">
<br>
<h4>Company/Organization Information</h4>
<hr>
</div>

<div class="form-group">
<label class="form-label" for="orgName"><strong>Name</strong></label>
<input class="form-control" id="orgName" name="orgName" placeholder="Company or organization's name" required/>
</div>

<br>

<div class="form-group">
<label class="form-label" for="orgAddress"><strong>Address</strong></label>
<input class="form-control" id="orgAddress" name="orgAddress" placeholder="Company or organization's physical address" required/>
</div>

<br>

<div class="row">
<div class="form-group col-6">
<label class="form-label" for="orgPhone"><strong>Phone Number</strong></label>
<input class="form-control phone-input" type="text" id="orgPhone" name="orgPhone" placeholder="Company or organization's phone number" required/>
</div>
<div class="form-group col-6">
<label class="form-label" for="orgWebsite"><strong>Website</strong></label>
<input class="form-control" id="orgWebsite" name="orgWebsite" placeholder="Company or organization's website" required/>
</div>
</div>
Loading