Skip to content

Commit

Permalink
Merge pull request #636 from PetrDlouhy/demoproject
Browse files Browse the repository at this point in the history
Add demoproject
  • Loading branch information
jrief authored Sep 9, 2024
2 parents 68ed82d + dd61ea3 commit cdd8e7d
Show file tree
Hide file tree
Showing 19 changed files with 368 additions and 0 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,7 @@ docs/_build
*.egg-info
*.egg
*.pyc
*.swp
*.orig
reports/*
.python-version
Empty file.
16 changes: 16 additions & 0 deletions demoproject/demoproject/asgi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
"""
ASGI config for demoproject project.
It exposes the ASGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/4.2/howto/deployment/asgi/
"""

import os

from django.core.asgi import get_asgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "demoproject.settings")

application = get_asgi_application()
141 changes: 141 additions & 0 deletions demoproject/demoproject/settings.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
"""
Django settings for demoproject project.
Generated by 'django-admin startproject' using Django 4.2.14.
For more information on this file, see
https://docs.djangoproject.com/en/4.2/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/4.2/ref/settings/
"""

from pathlib import Path

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = "django-insecure-vk9u^p7&l*!p6h5q#ham8@@db-3bi4i6%kqllaux8=^_(1^(nc"

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"mainapp",
"easy_thumbnails",
]

MEDIA_URL = "/media/"
MEDIA_ROOT = BASE_DIR / "media"
THUMBNAIL_DEFAULT_STORAGE_ALIAS = "easy_thumbnails"
STORAGES = {
"default": {
"BACKEND": "django.core.files.storage.FileSystemStorage",
},
"staticfiles": {
"BACKEND": "django.core.files.storage.FileSystemStorage",
},
"easy_thumbnails": {
"BACKEND": "django.core.files.storage.FileSystemStorage",
# "BACKEND": "easy_thumbnails.tests.TemporaryStorage",
},
}

MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
]

ROOT_URLCONF = "demoproject.urls"

TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [],
"APP_DIRS": True,
"OPTIONS": {
"context_processors": [
"django.template.context_processors.debug",
"django.template.context_processors.request",
"django.contrib.auth.context_processors.auth",
"django.contrib.messages.context_processors.messages",
],
},
},
]

WSGI_APPLICATION = "demoproject.wsgi.application"


# Database
# https://docs.djangoproject.com/en/4.2/ref/settings/#databases

DATABASES = {
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": BASE_DIR / "db.sqlite3",
}
}


# Password validation
# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
{
"NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
},
{
"NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
},
{
"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
},
{
"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
},
]


# Internationalization
# https://docs.djangoproject.com/en/4.2/topics/i18n/

LANGUAGE_CODE = "en-us"

TIME_ZONE = "UTC"

USE_I18N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.2/howto/static-files/

STATIC_URL = "static/"

# Default primary key field type
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
26 changes: 26 additions & 0 deletions demoproject/demoproject/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
"""
URL configuration for demoproject project.
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/4.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""

from django.contrib import admin
from django.urls import include, path
from django.conf.urls.static import static
from django.conf import settings

urlpatterns = [
path("admin/", admin.site.urls),
path("", include("mainapp.urls")),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
16 changes: 16 additions & 0 deletions demoproject/demoproject/wsgi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
"""
WSGI config for demoproject project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/4.2/howto/deployment/wsgi/
"""

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "demoproject.settings")

application = get_wsgi_application()
Empty file added demoproject/mainapp/__init__.py
Empty file.
3 changes: 3 additions & 0 deletions demoproject/mainapp/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.contrib import admin

# Register your models here.
6 changes: 6 additions & 0 deletions demoproject/mainapp/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.apps import AppConfig


class MainappConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "mainapp"
13 changes: 13 additions & 0 deletions demoproject/mainapp/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from django import forms
from easy_thumbnails.widgets import ImageClearableFileInput

from .models import TestImage


class TestImageForm(forms.ModelForm):
class Meta:
model = TestImage
fields = ["title", "image"]
widgets = {
"image": ImageClearableFileInput,
}
33 changes: 33 additions & 0 deletions demoproject/mainapp/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Generated by Django 4.2.14 on 2024-07-27 08:17

import easy_thumbnails.fields
from django.db import migrations, models


class Migration(migrations.Migration):

initial = True

dependencies = []

operations = [
migrations.CreateModel(
name="TestImage",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("title", models.CharField(max_length=100)),
(
"image",
easy_thumbnails.fields.ThumbnailerImageField(upload_to="images"),
),
],
),
]
Empty file.
10 changes: 10 additions & 0 deletions demoproject/mainapp/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from django.db import models
from easy_thumbnails.fields import ThumbnailerImageField


class TestImage(models.Model):
title = models.CharField(max_length=100)
image = ThumbnailerImageField(upload_to="images")

def __str__(self):
return self.title
15 changes: 15 additions & 0 deletions demoproject/mainapp/templates/mainapp/edit_image.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<!DOCTYPE html>
<html>
<head>
<title>Edit Image</title>
</head>
<body>
<h1>Edit Image</h1>
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Save</button>
</form>
<a href="{% url 'index' %}">Back to list</a>
</body>
</html>
25 changes: 25 additions & 0 deletions demoproject/mainapp/templates/mainapp/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<!DOCTYPE html>
<html>
<head>
<title>Easy Thumbnails Demo</title>
</head>
<body>
<h1>Upload an Image</h1>
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Upload</button>
</form>

<h2>Uploaded Images</h2>
<ul>
{% for image in images %}
<li>
<img src="{{ image.image.url }}" alt="{{ image.title }}" style="max-height: 200px;">
<p>{{ image.title }}</p>
<a href="{% url 'edit_image' image.pk %}">Edit</a>
</li>
{% endfor %}
</ul>
</body>
</html>
3 changes: 3 additions & 0 deletions demoproject/mainapp/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.test import TestCase

# Create your tests here.
8 changes: 8 additions & 0 deletions demoproject/mainapp/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from django.urls import path

from .views import edit_image, index

urlpatterns = [
path("", index, name="index"),
path("edit/<int:pk>/", edit_image, name="edit_image"),
]
29 changes: 29 additions & 0 deletions demoproject/mainapp/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# mainapp/views.py
from django.shortcuts import get_object_or_404, redirect, render

from .forms import TestImageForm
from .models import TestImage


def index(request):
if request.method == "POST":
form = TestImageForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect("index")
else:
form = TestImageForm()
images = TestImage.objects.all()
return render(request, "mainapp/index.html", {"form": form, "images": images})


def edit_image(request, pk):
image = get_object_or_404(TestImage, pk=pk)
if request.method == "POST":
form = TestImageForm(request.POST, request.FILES, instance=image)
if form.is_valid():
form.save()
return redirect("index")
else:
form = TestImageForm(instance=image)
return render(request, "mainapp/edit_image.html", {"form": form, "image": image})
22 changes: 22 additions & 0 deletions demoproject/manage.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys


def main():
"""Run administrative tasks."""
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "demoproject.settings")
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)


if __name__ == "__main__":
main()

0 comments on commit cdd8e7d

Please sign in to comment.