Compare commits
6 Commits
35255cf4e9
...
master
Author | SHA1 | Date | |
---|---|---|---|
6dd781021c | |||
7e0fc86b7f | |||
7a1bf054f5 | |||
5b6f4e16ef | |||
191705c6a6 | |||
ba0da19810 |
1
.dockerignore
Normal file
1
.dockerignore
Normal file
@@ -0,0 +1 @@
|
||||
start_server.sh
|
6
Dockerfile
Normal file
6
Dockerfile
Normal file
@@ -0,0 +1,6 @@
|
||||
FROM alpine:latest
|
||||
RUN apk add --no-cache python3 py3-pip python3-dev py3-setuptools gcc python3-dev jpeg-dev zlib-dev musl-dev py3-gunicorn
|
||||
COPY . /home/shimatta/kenkyusho
|
||||
WORKDIR /home/shimatta/kenkyusho
|
||||
RUN python3 -m venv /home/shimatta/kenkyusho/.venv && . /home/shimatta/kenkyusho/.venv/bin/activate && pip install -r requirements.txt
|
||||
ENTRYPOINT ["/home/shimatta/kenkyusho/entrypoint.sh"]
|
6
entrypoint.sh
Executable file
6
entrypoint.sh
Executable file
@@ -0,0 +1,6 @@
|
||||
#!/bin/sh
|
||||
source /home/shimatta/kenkyusho/.venv/bin/activate
|
||||
cd /home/shimatta/kenkyusho/shimatta_kenkyusho
|
||||
python manage.py migrate --settings shimatta_kenkyusho.settings_production
|
||||
python manage.py collectstatic --settings shimatta_kenkyusho.settings_production --noinput
|
||||
gunicorn -w 4 shimatta_kenkyusho.wsgi:application
|
@@ -14,7 +14,6 @@ lazy-object-proxy==1.6.0
|
||||
MarkupSafe==2.0.1
|
||||
mccabe==0.6.1
|
||||
Pillow==8.3.1
|
||||
psycopg2==2.9.1
|
||||
pylint==2.9.6
|
||||
pytz==2021.1
|
||||
qrcode==7.2
|
||||
@@ -23,3 +22,5 @@ six==1.16.0
|
||||
sqlparse==0.4.1
|
||||
toml==0.10.2
|
||||
wrapt==1.12.1
|
||||
psycopg2-binary==2.9.9
|
||||
gunicorn==21.2.0
|
||||
|
@@ -0,0 +1,59 @@
|
||||
from django.core.management.base import BaseCommand
|
||||
from parts.models import Component, Package, Distributor, Manufacturer
|
||||
import os
|
||||
import shutil
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = 'Migrate all media files to the current folder structure'
|
||||
|
||||
def move_files_of_model(self, queryset):
|
||||
for comp in queryset:
|
||||
img_path = comp.image.name
|
||||
img_path = os.path.normpath(img_path)
|
||||
path_components = img_path.split(os.sep)
|
||||
|
||||
if len(path_components) <= 2:
|
||||
self.stdout.write(f'Legacy path found: {img_path}. Will be moved')
|
||||
full_path_components = os.path.normpath(comp.image.path).split(os.sep)
|
||||
fname = full_path_components[-1]
|
||||
path_elem_count = len(full_path_components)
|
||||
full_path_components.insert(path_elem_count-1, str(fname[1]))
|
||||
full_path_components.insert(path_elem_count-1, str(fname[0]))
|
||||
dest_path = os.sep.join(full_path_components)
|
||||
|
||||
# Move file
|
||||
os.makedirs(os.path.dirname(dest_path), exist_ok=True)
|
||||
shutil.move(comp.image.path, dest_path)
|
||||
|
||||
# Update model
|
||||
new_rel_path_comps = path_components
|
||||
l = len(new_rel_path_comps)
|
||||
new_rel_path_comps.insert(l-1, str(fname[1]))
|
||||
new_rel_path_comps.insert(l-1, str(fname[0]))
|
||||
new_name = os.sep.join(new_rel_path_comps)
|
||||
self.stdout.write(f'New location: {dest_path}, new name: {new_name}')
|
||||
comp.image.name = new_name
|
||||
comp.save()
|
||||
|
||||
def handle(self, *args, **kwargs):
|
||||
|
||||
self.stdout.write('Querying components...')
|
||||
components = Component.objects.exclude(image='')
|
||||
self.stdout.write(f'Count of components with images: {components.count()}');
|
||||
self.move_files_of_model(components)
|
||||
|
||||
self.stdout.write('Querying packages...')
|
||||
pkgs = Package.objects.exclude(image='')
|
||||
self.stdout.write(f'Count of components with images: {pkgs.count()}');
|
||||
self.move_files_of_model(pkgs)
|
||||
|
||||
self.stdout.write('Querying manufacturers...')
|
||||
manufacturers = Manufacturer.objects.exclude(image='')
|
||||
self.stdout.write(f'Count of components with images: {manufacturers.count()}');
|
||||
self.move_files_of_model(manufacturers)
|
||||
|
||||
self.stdout.write('Querying distributors...')
|
||||
distris = Distributor.objects.exclude(image='')
|
||||
self.stdout.write(f'Count of components with images: {distris.count()}');
|
||||
self.move_files_of_model(distris)
|
||||
|
@@ -138,6 +138,7 @@ DATABASES = {
|
||||
'USER': db_user,
|
||||
'PASSWORD': db_pw,
|
||||
'HOST': get_env_value('DJANGO_POSTGRESQL_SOCKET'),
|
||||
'PORT': get_env_value('DJANGO_POSTGRESQL_PORT'),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -229,6 +230,6 @@ CRISPY_TEMPLATE_PACK = "bootstrap5"
|
||||
SESSION_COOKIE_SECURE = True
|
||||
CSRF_COOKIE_SECURE = True
|
||||
|
||||
SECURE_SSL_REDIRECT = True
|
||||
SECURE_SSL_REDIRECT = False
|
||||
|
||||
SECURE_HSTS_SECONDS = get_env_value('DJANGO_SECURE_HSTS_SECONDS', default=120)
|
@@ -6,8 +6,13 @@ from django.utils.deconstruct import deconstructible
|
||||
@deconstructible
|
||||
class RandomFileName(object):
|
||||
def __init__(self, path):
|
||||
self.path = os.path.join(path, "%s%s")
|
||||
self.path = os.path.join(path, "%s/%s/%s%s")
|
||||
|
||||
def __call__(self, _, filename):
|
||||
extension = os.path.splitext(filename)[1]
|
||||
return self.path % (uuid.uuid4(), extension)
|
||||
file_uuid = uuid.uuid4()
|
||||
uuid_str = str(file_uuid)
|
||||
first_char = uuid_str[0]
|
||||
second_char = uuid_str[1]
|
||||
|
||||
return self.path % (first_char, second_char, file_uuid, extension)
|
||||
|
1
start_server.sh
Executable file
1
start_server.sh
Executable file
@@ -0,0 +1 @@
|
||||
podman run -it -e DJANGO_SECRET_KEY=<secret_key> -e DJANGO_ALLOWED_HOST=parts.shimatta.net -e DJANGO_STATIC_ROOT=/var/static -e DJANGO_MEDIA_URL=media -e DJANGO_MEDIA_ROOT=/var/media -e DJANGO_POSTGRESQL_SOCKET=host.docker.internal -e DJANGO_POSTGRESQL_PORT=2345 -e DJANGO_POSTGRESQL_USER=<db_user> -e DJANGO_POSTGRESQL_PW=<db_pass> -v /var/parts/static:/var/static -v /var/parts/media:/var/media -p 8000:8000 --entrypoint /bin/sh localhost/kenkyusho:0.1
|
Reference in New Issue
Block a user