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

Upgrade to Django 3.2 LTS and Dockerize junction #757

Merged
merged 20 commits into from
Jun 15, 2023
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
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
50 changes: 50 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# .dockerignore

# Ignore Python bytecode files
__pycache__/
*.pyc
*.pyo
*.pyd

# Ignore virtual environment directories
venv/
*.virtualenv/
.env/

# Ignore Django migration files
*/migrations/*.pyc
*/migrations/__pycache__/

# Ignore logs
logs/
*.log

# Ignore configuration files
*.ini

# Ignore user-specific files (e.g., editor settings)
*.swp
*.swo
*.swn
*.bak
*.tmp
*.sublime*
*.vscode/

# Ignore local media files
media/

# Ignore local database files (SQLite)
*.sqlite3
*.sqlite3-journal

# Ignore test coverage reports
.coverage
htmlcov/

# Ignore build artifacts and distribution files
build/
dist/
*.egg-info/
*.egg
*.wheel
24 changes: 24 additions & 0 deletions .env.sample
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
DEBUG=TRUE
POSTGRES_USER=postgres
POSTGRES_PASSWORD=junction
POSTGRES_DB=junction
HOST_NAME=db
DB_PORT=5432
BROKER_URL=redis://redis:6379/0
CELERY_RESULT_BACKEND=redis://redis:6379/0
SITE_NAME=junction
SERVER_PORT=8888
GOOGLE_ANALYTICS_ID=google_analytics_id
FACEBOOK_APP_ID=fb_app_id
EMAIL_HOST_USER=email_host_user
EMAIL_HOST_PASSWORD=email_host_pass
SECRET_KEY=secret_key
GITHUB_CLIENT_ID=github_client_id
GITHUB_CLIENT_SECRET=github_client_secret
GOOGLE_CLIENT_ID=google_oauth_client_id
GOOGLE_CLIENT_SECRET=google_oauth_client_secret
TWITTER_CONSUMER_KEY=twitter_consume_key
TWITTER_CONSUMER_SECRET=twitter_consume_secret
TWITTER_ACCESS_TOKEN_KEY=twitter_access_token
TWITTER_ACCESS_TOKEN_SECRET=twitter_access_token_secret
USE_ASYNC_FOR_EMAIL=boolean
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -91,3 +91,6 @@ qr_files/
.vscode/

tmp/

# Env
.env
32 changes: 32 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
FROM python:3.10-slim-buster

WORKDIR /code

RUN apt-get update && \
apt-get install -y --no-install-recommends \
gcc \
postgresql-client \
build-essential \
nodejs \
npm \
libpq-dev && \
rm -rf /var/lib/apt/lists/*

COPY requirements.txt /code/
RUN pip install --no-cache-dir -r requirements.txt

# Install requirements for running tests
COPY ./tools/requirements-test.txt /code/
inovizz marked this conversation as resolved.
Show resolved Hide resolved
RUN pip install --no-cache-dir -r requirements-test.txt

RUN npm install -g yarn
RUN npm install -g grunt-cli

COPY . /code/

RUN chmod +x bin/install-static.sh
RUN bin/install-static.sh
# not getting used at this moment
RUN chmod +x bin/wait-for-it.sh

ENV PYTHONUNBUFFERED=1
5 changes: 5 additions & 0 deletions bin/install-static.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#!/bin/bash
cd junction/static
yarn install
grunt less
cd ../..
17 changes: 17 additions & 0 deletions bin/wait-for-it.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#!/bin/bash
# wait-for-it.sh: Wait for a service to be ready.

set -e

host="$1"
port="$2"
shift 2
cmd="$@"

until PGPASSWORD="$POSTGRES_PASSWORD" psql -h "$host" -U "$POSTGRES_USER" -c '\q'; do
>&2 echo "Postgres is unavailable - sleeping"
sleep 1
done

>&2 echo "Postgres is up - executing command"
exec $cmd
41 changes: 41 additions & 0 deletions docker-compose.prod.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
version: '3.8'

services:
db:
image: postgres:15-alpine
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data/
env_file:
- .env

redis:
image: redis:latest
ports:
- "6379:6379"

web:
image: ananyo2012/junction:1.1
volumes:
- .:/code
ports:
- "${SERVER_PORT}:${SERVER_PORT}"
depends_on:
- db
env_file:
- .env
command: sh -c 'python manage.py migrate && python manage.py collectstatic --noinput --clear && gunicorn -c gunicorn.conf.py'

celery:
image: ananyo2012/junction:1.1
depends_on:
- db
- redis
- web
env_file:
- .env
command: sh -c 'celery -A junction worker -l info -E'

volumes:
postgres_data:
8 changes: 8 additions & 0 deletions docker-compose.test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
version: '3.8'

services:
test:
build:
context: .
dockerfile: Dockerfile
command: sh -c pytest --cov=unit --cov=integrations --cov-report=html -v
44 changes: 44 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
version: '3.8'

services:
db:
image: postgres:15-alpine
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data/
env_file:
- .env

redis:
image: redis:latest
ports:
- "6379:6379"

web:
build:
context: .
dockerfile: Dockerfile
image: junction_local
volumes:
- .:/code
ports:
- "${SERVER_PORT}:${SERVER_PORT}"
depends_on:
- db
env_file:
- .env
command: sh -c 'python manage.py migrate && python manage.py runsslserver 0.0.0.0:${SERVER_PORT}'

celery:
image: junction_local
depends_on:
- db
- redis
- web
env_file:
- .env
command: sh -c 'celery -A junction worker -l info -E'

volumes:
postgres_data:
7 changes: 7 additions & 0 deletions gunicorn.conf.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import os
port = os.environ.get("SERVER_PORT", "8888")

wsgi_app = "wsgi"
bind = f"0.0.0.0:{port}"
workers = 2
loglevel = "debug"
13 changes: 7 additions & 6 deletions junction/base/monkey.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,14 @@ def new_render(cls, context):


def patch_urlresolvers():
from django.core import urlresolvers # noqa
from django.urls import get_urlconf, get_resolver # noqa
from django.conf import settings # noqa

if hasattr(urlresolvers, "_patched"):
urlconf = get_urlconf()
resolver = get_resolver(urlconf)
if hasattr(resolver, "_patched"):
return

old_reverse = urlresolvers.reverse
old_reverse = resolver.reverse

def new_reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None):
path = old_reverse(
Expand All @@ -45,5 +46,5 @@ def new_reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None

return settings.SITE_URL + path

urlresolvers._patched = True
urlresolvers.reverse = new_reverse
resolver._patched = True
resolver.reverse = new_reverse
29 changes: 6 additions & 23 deletions junction/base/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,39 +3,22 @@

def get_date_diff_display(start, end):
if end.year != start.year:
return "%s - %s" % (start.strftime("%-d %b %Y"), end.strftime("%-d %b %Y"))
return f"{start.strftime('%d %b %Y')} - {end.strftime('%d %b %Y')}"

# year are same now
if end.month != start.month:
return "%s - %s, %s" % (
start.strftime("%-d %b"),
end.strftime("%-d %b"),
start.year,
)
return f"{start.strftime('%d %b')} - {end.strftime('%d %b')}, {start.year}"

# month and year are same now
if end.day != start.day:
return "%s-%s %s, %s" % (
start.strftime("%d"),
end.strftime("%d"),
start.strftime("%b"),
start.year,
)
return f"{start.strftime('%d')} - {end.strftime('%d')} {start.strftime('%b')}, {start.year}"

# day, month and year are same now
if isinstance(start, dt.date):
return "%s" % (start.strftime("%-d %b %Y"))
return f"{start.strftime('%d %b %Y')}"

# am/pm, day, month and year are same now
if end.strftime("%p") != start.strftime("%p"):
return "%s - %s, %s" % (
start.strftime("%-I:%M%p"),
end.strftime("%-I:%M%p"),
start.strftime("%-d %b %Y"),
)
return f"{start.strftime('%I:%M%p')} - {end.strftime('%I:%M%p')}, {start.strftime('%d %b %Y')}"

return "%s - %s%s" % (
start.strftime("%-I:%M"),
end.strftime("%-I:%M"),
start.strftime("%p, %-d %b %Y"),
)
return f"{start.strftime('%I:%M')} - {end.strftime('%I:%M')}{start.strftime('%p, %d %b %Y')}"
40 changes: 40 additions & 0 deletions junction/conferences/migrations/0016_auto_20230110_1818.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# Generated by Django 3.2 on 2023-01-10 12:48

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('conferences', '0015_auto_20200322_1904'),
]

operations = [
migrations.AlterModelOptions(
name='historicalconferenceproposalreviewer',
options={'get_latest_by': ('history_date', 'history_id'), 'ordering': ('-history_date', '-history_id'), 'verbose_name': 'historical proposals reviewer', 'verbose_name_plural': 'historical proposals reviewers'},
),
migrations.AddField(
model_name='historicalconferenceproposalreviewer',
name='history_change_reason',
field=models.CharField(max_length=100, null=True),
),
migrations.AlterField(
model_name='historicalconferenceproposalreviewer',
name='created_by',
field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Created By'),
),
migrations.AlterField(
model_name='historicalconferenceproposalreviewer',
name='history_date',
field=models.DateTimeField(db_index=True),
),
migrations.AlterField(
model_name='historicalconferenceproposalreviewer',
name='modified_by',
field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Modified By'),
),
]
6 changes: 3 additions & 3 deletions junction/conferences/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@

from django.contrib.auth.models import User
from django.core.exceptions import ValidationError
from django.core.urlresolvers import reverse
from django.urls import reverse
from django.db import models
from django.utils.encoding import python_2_unicode_compatible
from six import python_2_unicode_compatible
from django.utils.timezone import now
from django.utils.translation import ugettext as _
from django.utils.translation import gettext as _
from django_extensions.db.fields import AutoSlugField
from simple_history.models import HistoricalRecords
from slugify import slugify
Expand Down
2 changes: 1 addition & 1 deletion junction/conferences/permissions.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
def is_reviewer(user, conference):
"""Returns a boolean indicating if a given user is a conference reviewer.
"""
if not user.is_authenticated():
if not user.is_authenticated:
return False

qs = ConferenceProposalReviewer.objects.filter(
Expand Down
4 changes: 2 additions & 2 deletions junction/conferences/urls.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-

from django.conf.urls import url
from django.urls import re_path

from . import views

urlpatterns = [url(r"^$", views.get_conference, name="get-conference")]
urlpatterns = [re_path(r"^$", views.get_conference, name="get-conference")]
Loading