Compare commits
No commits in common. "4c5a5fee8dce1868614989da91d7ee736f844f40" and "bce03d05006092603e0069d4ae577cc04dd80e5f" have entirely different histories.
4c5a5fee8d
...
bce03d0500
1
.gitignore
vendored
1
.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
django_web_galleries/media/*
|
|
2
Pipfile
2
Pipfile
@ -5,8 +5,6 @@ name = "pypi"
|
|||||||
|
|
||||||
[packages]
|
[packages]
|
||||||
django = "*"
|
django = "*"
|
||||||
django-responsive-images = "*"
|
|
||||||
pillow = "*"
|
|
||||||
|
|
||||||
[dev-packages]
|
[dev-packages]
|
||||||
|
|
||||||
|
@ -37,8 +37,6 @@ INSTALLED_APPS = [
|
|||||||
'django.contrib.sessions',
|
'django.contrib.sessions',
|
||||||
'django.contrib.messages',
|
'django.contrib.messages',
|
||||||
'django.contrib.staticfiles',
|
'django.contrib.staticfiles',
|
||||||
'responsive_images',
|
|
||||||
'web_galleries',
|
|
||||||
]
|
]
|
||||||
|
|
||||||
MIDDLEWARE = [
|
MIDDLEWARE = [
|
||||||
@ -117,13 +115,9 @@ USE_TZ = True
|
|||||||
# Static files (CSS, JavaScript, Images)
|
# Static files (CSS, JavaScript, Images)
|
||||||
# https://docs.djangoproject.com/en/4.1/howto/static-files/
|
# https://docs.djangoproject.com/en/4.1/howto/static-files/
|
||||||
|
|
||||||
STATIC_ROOT = BASE_DIR / 'static'
|
|
||||||
STATIC_URL = 'static/'
|
STATIC_URL = 'static/'
|
||||||
|
|
||||||
# Default primary key field type
|
# Default primary key field type
|
||||||
# https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field
|
# https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field
|
||||||
|
|
||||||
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
||||||
|
|
||||||
MEDIA_ROOT = BASE_DIR / 'media'
|
|
||||||
MEDIA_URL = 'media/'
|
|
@ -14,9 +14,8 @@ Including another URLconf
|
|||||||
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
||||||
"""
|
"""
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from django.urls import path, include
|
from django.urls import path
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('admin/', admin.site.urls),
|
path('admin/', admin.site.urls),
|
||||||
path('', include('web_galleries.urls'))
|
|
||||||
]
|
]
|
||||||
|
@ -1,11 +1,3 @@
|
|||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
|
||||||
from .models import (
|
# Register your models here.
|
||||||
Image,
|
|
||||||
Visitor,
|
|
||||||
Gallery
|
|
||||||
)
|
|
||||||
|
|
||||||
admin.site.register(Image)
|
|
||||||
admin.site.register(Visitor)
|
|
||||||
admin.site.register(Gallery)
|
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
from django import forms
|
|
||||||
from django.utils.translation import gettext as _
|
|
||||||
|
|
||||||
from .models import Image
|
|
||||||
|
|
||||||
class ImageUploadForm(forms.ModelForm):
|
|
||||||
class Meta:
|
|
||||||
model = Image
|
|
||||||
fields = ['description', 'image_file', 'private']
|
|
@ -1,55 +0,0 @@
|
|||||||
# Generated by Django 4.1.4 on 2022-12-18 08:19
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
initial = True
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='Gallery',
|
|
||||||
fields=[
|
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('title', models.CharField(max_length=100, null=True, verbose_name='Optional title for this gallery')),
|
|
||||||
('private', models.BooleanField(blank=True, default=False, verbose_name='Wether the gallery is vsibile publicly or to certain users only')),
|
|
||||||
('access_code', models.CharField(max_length=32, null=True, verbose_name='Code to access private galleries')),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='Visitor',
|
|
||||||
fields=[
|
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('session_id', models.CharField(max_length=50, verbose_name='A cookie set by this application to identify a visitor by session')),
|
|
||||||
('name', models.CharField(default=None, max_length=50, null=True, unique=True, verbose_name='Human readable, self assigned name of the visitor')),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='Image',
|
|
||||||
fields=[
|
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('description', models.TextField(null=True, verbose_name='An optional description of the Image')),
|
|
||||||
('image_file', models.ImageField(upload_to='web_galleries/uploads/', verbose_name='File of the image')),
|
|
||||||
('private', models.BooleanField(blank=True, default=False, verbose_name='Wether this image is visible publicly or to certain users only')),
|
|
||||||
('access_code', models.CharField(max_length=32, null=True, verbose_name='Code to access private images')),
|
|
||||||
('uploaded_when', models.DateTimeField(auto_now_add=True, verbose_name='When this picture was uploaded')),
|
|
||||||
('galleries', models.ManyToManyField(related_name='images', to='web_galleries.gallery', verbose_name='What galleries this image is in')),
|
|
||||||
('uploaded_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='uploaded_images', to='web_galleries.visitor', verbose_name='Which visitor uploaded this picture')),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='gallery',
|
|
||||||
name='created_by',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='created_galleries', to='web_galleries.visitor', verbose_name='Visitor who created the gallery'),
|
|
||||||
),
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='gallery',
|
|
||||||
name='visitors',
|
|
||||||
field=models.ManyToManyField(related_name='linked_galleries', to='web_galleries.visitor', verbose_name='Visitors that a part of this gallery'),
|
|
||||||
),
|
|
||||||
]
|
|
@ -1,46 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<title>Web Gallery</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="RV-Page">
|
|
||||||
<head class="RV-Head">
|
|
||||||
<nav class="RV-Navigation">
|
|
||||||
<ul class="RV-Navigation__list">
|
|
||||||
<li class="RV-Navigation__item">
|
|
||||||
<a href="{% url 'home' %}" class="RV-Navigation__link">
|
|
||||||
Home
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li class="RV-Navigation__item">
|
|
||||||
<a href="{% url 'upload_image' %}" class="RV-Navigation__link">
|
|
||||||
Upload image
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li class="RV-Navigation__item">
|
|
||||||
<a href="#" class="RV-Navigation__link">
|
|
||||||
My galleries
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li class="RV-Navigation__item">
|
|
||||||
<a href="#" class="RV-Navigation__link">
|
|
||||||
Create gallery
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
</head>
|
|
||||||
<main class="RV-Content">
|
|
||||||
{% block content %}
|
|
||||||
{% endblock content %}
|
|
||||||
</main>
|
|
||||||
<footer class="RV-Footer">
|
|
||||||
|
|
||||||
</footer>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,13 +0,0 @@
|
|||||||
{% extends '../global.html' %}
|
|
||||||
|
|
||||||
{% load responsive_images %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<sectoin class="RV-Images">
|
|
||||||
<li class="RV-Images__list">
|
|
||||||
{% for image in images %}
|
|
||||||
<img src="{% src image.image_file 200x200 %}">
|
|
||||||
{% endfor %}
|
|
||||||
</li>
|
|
||||||
</sectoin>
|
|
||||||
{% endblock content %}
|
|
@ -1,9 +0,0 @@
|
|||||||
{% extends '../global.html' %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<form method="POST" enctype="multipart/form-data">
|
|
||||||
{% csrf_token %}
|
|
||||||
{{ form }}
|
|
||||||
<button type="submit">Upload</button>
|
|
||||||
</form>
|
|
||||||
{% endblock content %}
|
|
@ -1,19 +0,0 @@
|
|||||||
from django.urls import path
|
|
||||||
from django.conf import settings
|
|
||||||
from django.conf.urls.static import static
|
|
||||||
|
|
||||||
from .views import (
|
|
||||||
ImageUploadView,
|
|
||||||
PublicImageListView
|
|
||||||
)
|
|
||||||
|
|
||||||
urlpatterns = [
|
|
||||||
path('', PublicImageListView.as_view(), name='home'),
|
|
||||||
path('upload/', ImageUploadView.as_view(), name='upload_image')
|
|
||||||
]
|
|
||||||
|
|
||||||
if settings.DEBUG:
|
|
||||||
urlpatterns += static(
|
|
||||||
settings.MEDIA_URL,
|
|
||||||
document_root=settings.MEDIA_ROOT
|
|
||||||
)
|
|
@ -1,55 +1,3 @@
|
|||||||
import secrets
|
from django.shortcuts import render
|
||||||
|
|
||||||
from django.views import View
|
# Create your views here.
|
||||||
from django.views.generic.list import ListView
|
|
||||||
from django.shortcuts import render, redirect
|
|
||||||
from django.urls import reverse
|
|
||||||
|
|
||||||
from .forms import ImageUploadForm
|
|
||||||
from .models import Image
|
|
||||||
|
|
||||||
class ImageUploadView(View):
|
|
||||||
def get(self, request):
|
|
||||||
form = ImageUploadForm()
|
|
||||||
return render(
|
|
||||||
request,
|
|
||||||
'upload_image/upload.html',
|
|
||||||
{
|
|
||||||
'form': form
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
def post(self, request):
|
|
||||||
form = ImageUploadForm(
|
|
||||||
request.POST,
|
|
||||||
request.FILES
|
|
||||||
)
|
|
||||||
|
|
||||||
if form.is_valid():
|
|
||||||
image = form.save(commit=False)
|
|
||||||
|
|
||||||
if image.private:
|
|
||||||
image.access_code = secrets.token_hex(32)
|
|
||||||
|
|
||||||
image.save()
|
|
||||||
return redirect(
|
|
||||||
reverse('home')
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
form = ImageUploadForm()
|
|
||||||
return render(
|
|
||||||
request,
|
|
||||||
'upload_image/upload.html',
|
|
||||||
{
|
|
||||||
'form': form
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
class PublicImageListView(ListView):
|
|
||||||
model = Image
|
|
||||||
paginate_by = 20
|
|
||||||
context_object_name = 'images'
|
|
||||||
template_name = 'list_images/image_list.html'
|
|
||||||
|
|
||||||
def get_queryset(self):
|
|
||||||
return Image.objects.all().filter(private=False)
|
|
||||||
|
Loading…
Reference in New Issue
Block a user