Skip to content
Merged

FIXES #424

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
6f7bb46
Edited Hackathon variables to be up to date with server, opened mento…
enric4000 Feb 6, 2026
957b7f9
Merge pull request #422 from hackupc/EditHackathonVariables
polmf Feb 9, 2026
5a110ea
Made Volunteer pages readOnly
enric4000 Feb 9, 2026
dfc20d1
Removed unused variable
enric4000 Feb 9, 2026
5f7508a
Merge pull request #423 from hackupc/VolunteersReadOnly+UnderAgeCorre…
polmf Feb 10, 2026
5959747
mails
polmf Feb 19, 2026
a2e8ebb
mails autoamtics
polmf Feb 19, 2026
81dba97
fix
polmf Feb 19, 2026
f437349
fix
polmf Feb 19, 2026
77b18f9
Merge pull request #425 from hackupc/mails_travel
polmf Feb 19, 2026
9fba62d
fix alguns errors
polmf Feb 19, 2026
09ada5f
Merge branch 'master' into develop
polmf Feb 19, 2026
2e60811
imatges wallet
polmf Feb 19, 2026
a9bc3f3
Merge branch 'develop' into wallwt
polmf Feb 19, 2026
6c0e921
Merge pull request #427 from hackupc/wallwt
polmf Feb 19, 2026
d56573e
style: updated wallet card for 2026 edition
EncryptEx Feb 20, 2026
37e90db
wallet final
polmf Feb 20, 2026
3267e83
Merge branch 'develop' into walletx2
polmf Feb 20, 2026
ed60897
Merge pull request #428 from hackupc/walletx2
polmf Feb 20, 2026
e02e424
style: fix alt on banner
EncryptEx Feb 20, 2026
7758f3e
final version
EncryptEx Feb 20, 2026
db59b85
fix punts
liugetu Feb 22, 2026
2e262be
Merge branch 'master' into develop
polmf Feb 24, 2026
0cdcf0e
Merge pull request #430 from hackupc/fix-punts
polmf Feb 25, 2026
96dafb7
Merge branch 'develop' into mailx2
polmf Feb 25, 2026
68d309a
update hackaton_variables
polmf Feb 25, 2026
1f54ecd
actualitzacions de plantilles
polmf Feb 25, 2026
0df616b
afegir paypal
polmf Feb 25, 2026
efa602e
cronjob diumenges a les 20
polmf Feb 25, 2026
bf49141
mail actualitzat
polmf Feb 26, 2026
c69ccc3
Merge pull request #426 from hackupc/mailx2
polmf Feb 28, 2026
294f0b4
mail_devpost
polmf Feb 28, 2026
2bef24f
mail_devpostx2
polmf Feb 28, 2026
30c7625
nous mails
polmf Feb 28, 2026
d866a7d
correcio mails
polmf Feb 28, 2026
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
104 changes: 60 additions & 44 deletions app/hackathon_variables.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,61 +4,77 @@

from django.utils import timezone

HACKATHON_NAME = 'HackUPC'
HACKATHON_NAME = "HackUPC"
# What's the name for the application
HACKATHON_APPLICATION_NAME = 'My HackUPC'
HACKATHON_APPLICATION_NAME = "My HackUPC"
# Hackathon timezone
TIME_ZONE = 'CET'
TIME_ZONE = "CET"
# This description will be used on the html and sharing meta tags
HACKATHON_DESCRIPTION = 'Join us for BarcelonaTech\'s hackathon. 36h. May 3 - 5.'
HACKATHON_DESCRIPTION = "Join us for BarcelonaTech's hackathon. 36h. April 24 - 26."
# Domain where application is deployed, can be set by env variable
HACKATHON_DOMAIN = os.environ.get('DOMAIN', None)
HEROKU_APP_NAME = os.environ.get('HEROKU_APP_NAME', None)
HACKATHON_DOMAIN = os.environ.get("DOMAIN", None)
HEROKU_APP_NAME = os.environ.get("HEROKU_APP_NAME", None)
if HEROKU_APP_NAME and not HACKATHON_DOMAIN:
HACKATHON_DOMAIN = '%s.herokuapp.com' % HEROKU_APP_NAME
HACKATHON_DOMAIN = "%s.herokuapp.com" % HEROKU_APP_NAME
elif not HACKATHON_DOMAIN:
HACKATHON_DOMAIN = 'localhost:8000'
HACKATHON_DOMAIN = "localhost:8000"
# Hackathon contact email: where should all hackers contact you. It will also be used as a sender for all emails
HACKATHON_CONTACT_EMAIL = 'contact@hackupc.com'
HACKATHON_CONTACT_EMAIL = "contact@hackupc.com"
# Hackathon logo url, will be used on all emails
HACKATHON_LOGO_URL = 'https://my.hackupc.com/static/logo.png'
HACKATHON_LOGO_URL = "https://my.hackupc.com/static/logo.png"

HACKATHON_OG_IMAGE = 'https://hackupc.com/ogimage.png?v=2021'
HACKATHON_OG_IMAGE = "https://hackupc.com/ogimage.png?v=2021"
# (OPTIONAL) Track visits on your website
HACKATHON_GOOGLE_ANALYTICS = 'UA-69542332-2'
HACKATHON_GOOGLE_ANALYTICS = "UA-69542332-2"
# (OPTIONAL) Hackathon Twitter user
HACKATHON_TWITTER_ACCOUNT = 'hackupc'
HACKATHON_TWITTER_ACCOUNT = "hackupc"
# (OPTIONAL) Hackathon Facebook page
HACKATHON_FACEBOOK_PAGE = 'hackupc'
HACKATHON_FACEBOOK_PAGE = "hackupc"
# (OPTIONAL) Hackathon YouTube channel
HACKATHON_YOUTUBE_PAGE = 'UCiiRorGg59Xd5Sjj9bjIt-g'
HACKATHON_YOUTUBE_PAGE = "UCiiRorGg59Xd5Sjj9bjIt-g"
# (OPTIONAL) Hackathon Instagram user
HACKATHON_INSTAGRAM_ACCOUNT = 'hackupc'
HACKATHON_INSTAGRAM_ACCOUNT = "hackupc"
# (OPTIONAL) Hackathon Medium user
HACKATHON_MEDIUM_ACCOUNT = 'hackupc'
HACKATHON_MEDIUM_ACCOUNT = "hackupc"
# (OPTIONAL) Github Repo for this project (so meta)
HACKATHON_GITHUB_REPO = 'https://github.com/hackupc/myhackupc/'
HACKATHON_GITHUB_REPO = "https://github.com/hackupc/myhackupc/"

# (OPTIONAL) Applications deadline
HACKATHON_APP_DEADLINE = timezone.datetime(2030, 4, 24, 23, 59, tzinfo=timezone.pytz.timezone(TIME_ZONE))
VOLUNTEER_APP_DEADLINE = timezone.datetime(2030, 4, 18, 23, 59, tzinfo=timezone.pytz.timezone(TIME_ZONE))
MENTOR_APP_DEADLINE = timezone.datetime(2030, 3, 25, 23, 59, tzinfo=timezone.pytz.timezone(TIME_ZONE))
HACKATHON_APP_DEADLINE = timezone.datetime(
2026, 4, 1, 23, 59, tzinfo=timezone.pytz.timezone(TIME_ZONE)
)
VOLUNTEER_APP_DEADLINE = timezone.datetime(
2026, 3, 27, 23, 59, tzinfo=timezone.pytz.timezone(TIME_ZONE)
)
MENTOR_APP_DEADLINE = timezone.datetime(
2026, 3, 27, 23, 59, tzinfo=timezone.pytz.timezone(TIME_ZONE)
)

# (OPTIONAL) Online checkin activated
ONLINE_CHECKIN = timezone.datetime(2020, 5, 3, 17, 00, tzinfo=timezone.pytz.timezone(TIME_ZONE))
ONLINE_CHECKIN = timezone.datetime(
2020, 5, 3, 17, 00, tzinfo=timezone.pytz.timezone(TIME_ZONE)
)
# (OPTIONAL) When to arrive at the hackathon
HACKATHON_ARRIVE = ''
HACKATHON_ARRIVE = ""

# (OPTIONAL) When to arrive at the hackathon
HACKATHON_LEAVE = ''
HACKATHON_LEAVE = ""

# (OPTIONAL) When the event ends (to send Devpost link emails)
HACKATHON_EVENT_END = timezone.datetime(
2026, 4, 26, 20, 00, tzinfo=timezone.pytz.timezone(TIME_ZONE)
)

# (OPTIONAL) Hackathon live page
HACKATHON_LIVE_PAGE = 'https://live.hackupc.com'
HACKATHON_LIVE_PAGE = "https://live.hackupc.com"

# (OPTIONAL) Regex to automatically match organizers emails and set them as organizers when signing up
REGEX_HACKATHON_ORGANIZER_EMAIL = '^.*@hackupc\.com$'
REGEX_HACKATHON_ORGANIZER_EMAIL = "^.*@hackupc\.com$"

# (OPTIONAL) Send 500 errors to email while on production mode
HACKATHON_DEV_EMAILS = ['devs@hackupc.com', ]
HACKATHON_DEV_EMAILS = [
"devs@hackupc.com",
]

# Baggage configuration
BAGGAGE_ENABLED = True
Expand All @@ -67,10 +83,10 @@
# Reimbursement configuration
REIMBURSEMENT_ENABLED = True
DEFAULT_REIMBURSEMENT_AMOUNT = 100
CURRENCY = '€'
REIMBURSEMENT_EXPIRY_DATE = timezone.datetime(2025, 5, 2, 17, 00, tzinfo=timezone.pytz.timezone(TIME_ZONE))
CURRENCY = "€"
REIMBURSEMENT_EXPIRY_DATE = timezone.datetime(2026, 4, 4, 17, 00, tzinfo=timezone.pytz.timezone(TIME_ZONE))
REIMBURSEMENT_REQUIREMENTS = 'You have to submit a project and demo it during the event in order to get reimbursed'
REIMBURSEMENT_DEADLINE = timezone.datetime(2025, 5, 5, 23, 59, tzinfo=timezone.pytz.timezone(TIME_ZONE))
REIMBURSEMENT_DEADLINE = timezone.datetime(2026, 4, 4, 23, 59, tzinfo=timezone.pytz.timezone(TIME_ZONE))

# (OPTIONAL) Max team members. Defaults to 4
TEAMS_ENABLED = True
Expand All @@ -82,9 +98,9 @@
# (OPTIONAL) Slack credentials
# Highly recommended to create a separate user account to extract the token from
SLACK = {
'team': os.environ.get('SL_TEAM', 'test'),
"team": os.environ.get("SL_TEAM", "test"),
# Get it here: https://api.slack.com/custom-integrations/legacy-tokens
'token': os.environ.get('SL_TOKEN', None)
"token": os.environ.get("SL_TOKEN", None),
}

# (OPTIONAL) Logged in cookie
Expand All @@ -95,16 +111,16 @@
# Hardware configuration
# Hardware request time length (in minutes)
HARDWARE_ENABLED = True
#Hardware request time length (in minutes)
# Hardware request time length (in minutes)
HARDWARE_REQUEST_TIME = 15


SLACK_BOT = {
'id': os.environ.get('SL_BOT_ID', None),
'token': os.environ.get('SL_BOT_TOKEN', None),
'channel': os.environ.get('SL_BOT_CHANNEL', None),
'director1': os.environ.get('SL_BOT_DIRECTOR1', None),
'director2': os.environ.get('SL_BOT_DIRECTOR2', None)
"id": os.environ.get("SL_BOT_ID", None),
"token": os.environ.get("SL_BOT_TOKEN", None),
"channel": os.environ.get("SL_BOT_CHANNEL", None),
"director1": os.environ.get("SL_BOT_DIRECTOR1", None),
"director2": os.environ.get("SL_BOT_DIRECTOR2", None),
}
# Enable judging tab
JUDGING_ENABLED = False
Expand All @@ -119,7 +135,7 @@
# Enable blacklist separate pipeline (disabled by default)
BLACKLIST_ENABLED = True

SUPPORTED_RESUME_EXTENSIONS = ['.pdf']
SUPPORTED_RESUME_EXTENSIONS = [".pdf"]

# Mentor/Volunteer applications can expire if they are invited, set to False to not
MENTOR_EXPIRES = False
Expand All @@ -129,9 +145,9 @@
HYBRID_HACKATHON = False
N_MAX_LIVE_HACKERS = 600

SERVER_EMAIL = 'HackUPC Team <noreply@hackupc.com>'
SERVER_EMAIL = "HackUPC Team <noreply@hackupc.com>"

CODE_CONDUCT_LINK = 'https://legal.hackersatupc.org/hackupc/code_of_conduct'
LEGAL_LINK = 'https://legal.hackersatupc.org/hackupc/legal_notice'
PRIVACY_LINK = 'https://legal.hackersatupc.org/hackupc/privacy_and_cookies'
TERMS_LINK = 'https://legal.hackersatupc.org/hackupc/terms_and_conditions'
CODE_CONDUCT_LINK = "https://legal.hackersatupc.org/hackupc/code_of_conduct"
LEGAL_LINK = "https://legal.hackersatupc.org/hackupc/legal_notice"
PRIVACY_LINK = "https://legal.hackersatupc.org/hackupc/privacy_and_cookies"
TERMS_LINK = "https://legal.hackersatupc.org/hackupc/terms_and_conditions"
6 changes: 2 additions & 4 deletions app/templates/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -111,10 +111,8 @@
{% endif %}
</li>
{% if request.user.is_organizer %}
{% if request.user.has_volunteer_access %}
<li class="{% if 'volunteer' in request.build_absolute_uri %}active{% endif %}"><a
href="{% url 'volunteer_list' %}">Volunteer</a></li>
{% endif %}
<li class="{% if 'volunteer' in request.build_absolute_uri %}active{% endif %}"><a
href="{% url 'volunteer_list' %}">Volunteer</a></li>
{% if request.user.has_mentor_access %}
<li class="{% if 'mentor' in request.build_absolute_uri %}active{% endif %}"><a
href="{% url 'mentor_list' %}">Mentor</a></li>
Expand Down
2 changes: 1 addition & 1 deletion applications/templates/include/application_form.html
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
<div style="background-color: #fff3cd; padding: 15px; border-radius: 6px; border: 1px solid #ffeeba; margin-bottom: 15px; text-align: center;">
<p style="margin: 0; color: #856404; font-size: 16px;">
❗ Before filling out the application, read this article about
<a href="https://medium.com/@hackupc/the-application-process-44853805521f" target="_blank" rel="noopener noreferrer" style="font-weight: bold; color: #0c5460;">How To Do a Good Application.</a>.
<a href="https://medium.com/@hackupc/the-application-process-44853805521f" target="_blank" rel="noopener noreferrer" style="font-weight: bold; color: #0c5460;">How To Do a Good Application</a>.
</p>
</div>
{% endif %}
Expand Down
6 changes: 6 additions & 0 deletions applications/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,12 @@ def get(self, request, *args, **kwargs):

if msg:
msg.send()
if application.user.is_hacker() and application.reimb:
from reimbursement import emails as reimb_emails
reimb_msg = reimb_emails.create_travel_tickets_upload_email(
application.user.reimbursement, request
)
reimb_msg.send()
try:
slack.send_slack_invite(request.user.email)
# Ignore if we can't send, it's only optional
Expand Down
2 changes: 2 additions & 0 deletions cronjob
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,5 @@
6 */2 * * * root /usr/local/bin/python /code/manage.py expire_applications
# Run expire reimbursements job at 6 minutes past the hour, every 2 hours
36 */2 * * * root /usr/local/bin/python /code/manage.py expire_reimbursements
# Run send devpost emails job every Sunday at 20:00 server va 1 hora abans
0 19 * * 0 root /usr/local/bin/python /code/manage.py send_devpost_emails
71 changes: 37 additions & 34 deletions organizers/templates/other_application_detail.html
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ <h3>Personal</h3>
{% include 'include/field.html' with desc='Name' value=app.name %}
{% elif app.user.is_volunteer %}
{% include 'include/field.html' with desc='Name' value=app.user.name %}
{% include 'include/field.html' with desc='Is over 18?' value=app.under_age|yesno %}
{% include 'include/field.html' with desc='Is underage?' value=app.under_age|yesno %}
{% include 'include/field.html' with desc='Studies and course/graduation' value=app.studies_and_course %}
{% else %}
{% include 'include/field.html' with desc='Name' value=app.user.name %}
Expand All @@ -35,7 +35,7 @@ <h3>Personal</h3>
{% include 'include/field.html' with desc='Gender' value=app.get_gender_display %}
{% include 'include/field.html' with desc='Other gender' value=app.other_gender %}
{% include 'include/field.html' with desc='In BCN Apr-May' value=app.lennyface|yesno %}
<hr>
<hr>
<dt>
<h3>Validation</h3>
</dt>
Expand All @@ -45,16 +45,18 @@ <h3>Validation</h3>
<form action="" method="post">
{% csrf_token %}
<input type="hidden" name="app_id" value="{{ app.pk }}"/>
<button name="change_valid" class="btn btn-default btn-block" value="valid">
{% if app.valid %}
Invalidate
{% else %}
Validate
{% endif %}
</button>
{% if user.has_volunteer_access %}
<button name="change_valid" class="btn btn-default btn-block" value="valid">
{% if app.valid %}
Invalidate
{% else %}
Validate
{% endif %}
</button>
{% endif %}
</form>
<br>
<hr>
<hr>
<dt>
<h3>Volunteering</h3>
</dt>
Expand Down Expand Up @@ -188,7 +190,7 @@ <h4>{{ comment.text }}</h4>
{% csrf_token %}
<input type="hidden" name="app_id" value="{{ app.pk }}"/>
<textarea name="comment_text" class="form-control" placeholder="Write a comment..."
rows="3" required maxlength="500"></textarea>
rows="3" required maxlength="500"></textarea>
<button name="add_comment" class="btn btn-block btn-default" value="comment">Add comment
</button>
</form>
Expand All @@ -198,28 +200,29 @@ <h4>{{ comment.text }}</h4>

{% block out_panel %}
{% if app and not app.user.is_sponsor %}
<div class="panel-footer">

<form action="" method="post">
{% csrf_token %}
<input type="hidden" name="app_id" value="{{ app.pk }}"/>
{% if app.is_pending %}
<button name="invite" class="btn btn-success btn-block" value="invite">Invite</button>
{% elif app.is_expired %}
<button name="invite" class="btn btn-success btn-block" value="invite">Invite again</button>
{% elif app.is_invited %}
<button name="cancel_invite" class="btn btn-danger btn-block" value="cancel_invite">Cancel invitation</button>
{% elif app.is_rejected %}
<button name="cancel_invite" class="btn btn-danger btn-block" value="cancel_invite">Move back to review</button>
{% endif %}
</form>
<br>
<form action="" method="post">
{% csrf_token %}
<input type="hidden" name="app_id" value="{{ app.pk }}"/>
<button name="reject" class="btn btn-danger btn-block" value="reject">Reject</button>
</form>
</div>

{% if app and app.user.is_volunteer and not user.has_volunteer_access %}
{% else %}
<div class="panel-footer">
<form action="" method="post">
{% csrf_token %}
<input type="hidden" name="app_id" value="{{ app.pk }}"/>
{% if app.is_pending %}
<button name="invite" class="btn btn-success btn-block" value="invite">Invite</button>
{% elif app.is_expired %}
<button name="invite" class="btn btn-success btn-block" value="invite">Invite again</button>
{% elif app.is_invited %}
<button name="cancel_invite" class="btn btn-danger btn-block" value="cancel_invite">Cancel invitation</button>
{% elif app.is_rejected %}
<button name="cancel_invite" class="btn btn-danger btn-block" value="cancel_invite">Move back to review</button>
{% endif %}
</form>
<br>
<form action="" method="post">
{% csrf_token %}
<input type="hidden" name="app_id" value="{{ app.pk }}"/>
<button name="reject" class="btn btn-danger btn-block" value="reject">Reject</button>
</form>
</div>
{% endif %}
{% endif %}
{% endblock %}
Loading