Compare commits
No commits in common. "1df19b8a74bf6bc493fb438130efc4ee0f38ed79" and "ac26050a788e1b5ad9709053895f3eb92d029aeb" have entirely different histories.
1df19b8a74
...
ac26050a78
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,2 +1 @@
|
|||||||
django_web_galleries/media/*
|
django_web_galleries/media/*
|
||||||
django_web_galleries/static/*
|
|
3
Pipfile
3
Pipfile
@ -7,7 +7,8 @@ name = "pypi"
|
|||||||
django = "*"
|
django = "*"
|
||||||
django-responsive-images = "*"
|
django-responsive-images = "*"
|
||||||
pillow = "*"
|
pillow = "*"
|
||||||
django-widget-tweaks = "*"
|
|
||||||
|
[dev-packages]
|
||||||
|
|
||||||
[requires]
|
[requires]
|
||||||
python_version = "3.8"
|
python_version = "3.8"
|
||||||
|
@ -38,7 +38,6 @@ INSTALLED_APPS = [
|
|||||||
'django.contrib.messages',
|
'django.contrib.messages',
|
||||||
'django.contrib.staticfiles',
|
'django.contrib.staticfiles',
|
||||||
'responsive_images',
|
'responsive_images',
|
||||||
'widget_tweaks',
|
|
||||||
'web_galleries',
|
'web_galleries',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -16,20 +16,7 @@ Including another URLconf
|
|||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from django.urls import path, include
|
from django.urls import path, include
|
||||||
|
|
||||||
from django.conf import settings
|
|
||||||
from django.conf.urls.static import static
|
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('admin/', admin.site.urls),
|
path('admin/', admin.site.urls),
|
||||||
path('', include('web_galleries.urls'))
|
path('', include('web_galleries.urls'))
|
||||||
]
|
]
|
||||||
|
|
||||||
if settings.DEBUG:
|
|
||||||
urlpatterns += static(
|
|
||||||
settings.MEDIA_URL,
|
|
||||||
document_root=settings.MEDIA_ROOT
|
|
||||||
)
|
|
||||||
urlpatterns += static(
|
|
||||||
settings.STATIC_URL,
|
|
||||||
document_root=settings.STATIC_ROOT
|
|
||||||
)
|
|
@ -6,7 +6,4 @@ from .models import Image
|
|||||||
class ImageUploadForm(forms.ModelForm):
|
class ImageUploadForm(forms.ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Image
|
model = Image
|
||||||
fields = ['description', 'image_file', 'private', 'title']
|
fields = ['description', 'image_file', 'private']
|
||||||
labels = {
|
|
||||||
'private': 'Make this image private'
|
|
||||||
}
|
|
||||||
|
@ -1,12 +1,7 @@
|
|||||||
import uuid
|
|
||||||
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
from django.utils.translation import gettext as _
|
from django.utils.translation import gettext as _
|
||||||
|
|
||||||
def get_uuid():
|
|
||||||
return str(uuid.uuid4())
|
|
||||||
|
|
||||||
class Visitor(models.Model):
|
class Visitor(models.Model):
|
||||||
"""
|
"""
|
||||||
Stores information about a visitor of this application.
|
Stores information about a visitor of this application.
|
||||||
@ -15,8 +10,7 @@ class Visitor(models.Model):
|
|||||||
"""
|
"""
|
||||||
session_id = models.CharField(
|
session_id = models.CharField(
|
||||||
_('A cookie set by this application to identify a visitor by session'),
|
_('A cookie set by this application to identify a visitor by session'),
|
||||||
max_length=50,
|
max_length=50
|
||||||
default=get_uuid
|
|
||||||
)
|
)
|
||||||
name = models.CharField(
|
name = models.CharField(
|
||||||
_('Human readable, self assigned name of the visitor'),
|
_('Human readable, self assigned name of the visitor'),
|
||||||
@ -73,13 +67,6 @@ class Image(models.Model):
|
|||||||
An image contains the path to the image file and several information
|
An image contains the path to the image file and several information
|
||||||
like description, uploader and affiliation to galleries.
|
like description, uploader and affiliation to galleries.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
title = models.CharField(
|
|
||||||
_('Title of the image'),
|
|
||||||
max_length=100,
|
|
||||||
null=True,
|
|
||||||
blank=True
|
|
||||||
)
|
|
||||||
description = models.TextField(
|
description = models.TextField(
|
||||||
_('An optional description of the Image'),
|
_('An optional description of the Image'),
|
||||||
null=True
|
null=True
|
||||||
@ -118,11 +105,3 @@ class Image(models.Model):
|
|||||||
related_name='images'
|
related_name='images'
|
||||||
)
|
)
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
if self.title:
|
|
||||||
return self.title
|
|
||||||
elif self.description:
|
|
||||||
return self.description[:100]
|
|
||||||
else:
|
|
||||||
return super.__str__()
|
|
||||||
|
|
||||||
|
@ -1,74 +0,0 @@
|
|||||||
.RV-Header {
|
|
||||||
height: 80px;
|
|
||||||
margin-bottom: 70px;
|
|
||||||
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: flex-start;
|
|
||||||
|
|
||||||
border-bottom: 1px solid gray;
|
|
||||||
}
|
|
||||||
|
|
||||||
.RV-Navigation__list {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
|
|
||||||
list-style-type: none;
|
|
||||||
gap: 1em;
|
|
||||||
|
|
||||||
font-size: 22px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.RV-Navigation__link {
|
|
||||||
text-decoration: none;
|
|
||||||
display: inline-block;
|
|
||||||
transition: transform 300ms ease-in-out;
|
|
||||||
}
|
|
||||||
|
|
||||||
.RV-Navigation__link:hover {
|
|
||||||
transform: scale(1.2);
|
|
||||||
}
|
|
||||||
|
|
||||||
.RV-Images__list {
|
|
||||||
list-style-type: none;
|
|
||||||
display: grid;
|
|
||||||
gap: 22px;
|
|
||||||
|
|
||||||
grid-template-columns: repeat(auto-fit, 200px);
|
|
||||||
}
|
|
||||||
|
|
||||||
.RV-Image__link {
|
|
||||||
transition: transform 300ms ease-in-out;
|
|
||||||
}
|
|
||||||
|
|
||||||
.RV-Image__link:hover {
|
|
||||||
transform: scale(1.1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.RV-Fieldset {
|
|
||||||
margin: 50px 200px;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: 30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.RV-Input {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: flex-start;
|
|
||||||
}
|
|
||||||
|
|
||||||
.RV-Input--compact {
|
|
||||||
flex-direction: row;
|
|
||||||
}
|
|
||||||
|
|
||||||
.RV-Input.RV-Input--reverse {
|
|
||||||
flex-direction: column-reverse;
|
|
||||||
align-items: flex-end;
|
|
||||||
}
|
|
||||||
|
|
||||||
.RV-Input--compact.RV-Input--reverse {
|
|
||||||
flex-direction: row-reverse;
|
|
||||||
justify-content: flex-end;
|
|
||||||
}
|
|
@ -1,5 +1,3 @@
|
|||||||
{% load static %}
|
|
||||||
|
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
@ -7,11 +5,10 @@
|
|||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>Web Gallery</title>
|
<title>Web Gallery</title>
|
||||||
<link rel="stylesheet" href="{% static 'web-galleries.css' %}">
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="RV-Page">
|
<div class="RV-Page">
|
||||||
<header class="RV-Header">
|
<head class="RV-Head">
|
||||||
<nav class="RV-Navigation">
|
<nav class="RV-Navigation">
|
||||||
<ul class="RV-Navigation__list">
|
<ul class="RV-Navigation__list">
|
||||||
<li class="RV-Navigation__item">
|
<li class="RV-Navigation__item">
|
||||||
@ -36,7 +33,7 @@
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</head>
|
||||||
<main class="RV-Content">
|
<main class="RV-Content">
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
@ -6,9 +6,7 @@
|
|||||||
<sectoin class="RV-Images">
|
<sectoin class="RV-Images">
|
||||||
<li class="RV-Images__list">
|
<li class="RV-Images__list">
|
||||||
{% for image in images %}
|
{% for image in images %}
|
||||||
<a href="#" class="RV-Image__link RV-Image__link--detail">
|
<img src="{% src image.image_file 200x200 %}">
|
||||||
<img class="RV-Image__source" src="{% src image.image_file 200x200 %}">
|
|
||||||
</a>
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</li>
|
</li>
|
||||||
</sectoin>
|
</sectoin>
|
||||||
|
@ -1,16 +0,0 @@
|
|||||||
{% load widget_tweaks %}
|
|
||||||
|
|
||||||
<div class="RV-Input {% if classes%}{{classes}}{% endif %} {% if field.errors %} RV-Input--error {% endif %}">
|
|
||||||
<label for="{{field.id_for_label}}" class="RV-Input__Label">{{field.label}}</label>
|
|
||||||
{% render_field field class+='RV-Input__Field' %}
|
|
||||||
|
|
||||||
<span class="RV-Input__Message">
|
|
||||||
{% if field.errors %}
|
|
||||||
{% for error in field.errors%}
|
|
||||||
{{error}}
|
|
||||||
{% endfor %}
|
|
||||||
{% elif field.help_text%}
|
|
||||||
{{ field.help_text }}
|
|
||||||
{% endif %}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
@ -3,15 +3,7 @@
|
|||||||
{% block content %}
|
{% block content %}
|
||||||
<form method="POST" enctype="multipart/form-data">
|
<form method="POST" enctype="multipart/form-data">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<div class="RV-Fieldset">
|
{{ form }}
|
||||||
{% include 'partials/form_input.html' with field=form.title %}
|
|
||||||
{% include 'partials/form_input.html' with field=form.image_file %}
|
|
||||||
{% include 'partials/form_input.html' with field=form.description %}
|
|
||||||
{% include 'partials/form_input.html' with field=form.private classes='RV-Input--compact RV-Input--reverse' %}
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="RV-Fieldset">
|
|
||||||
<button type="submit">Upload</button>
|
<button type="submit">Upload</button>
|
||||||
</div>
|
|
||||||
</form>
|
</form>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
from django.urls import path
|
from django.urls import path
|
||||||
|
from django.conf import settings
|
||||||
|
from django.conf.urls.static import static
|
||||||
|
|
||||||
from .views import (
|
from .views import (
|
||||||
ImageUploadView,
|
ImageUploadView,
|
||||||
@ -9,3 +11,9 @@ urlpatterns = [
|
|||||||
path('', PublicImageListView.as_view(), name='home'),
|
path('', PublicImageListView.as_view(), name='home'),
|
||||||
path('upload/', ImageUploadView.as_view(), name='upload_image')
|
path('upload/', ImageUploadView.as_view(), name='upload_image')
|
||||||
]
|
]
|
||||||
|
|
||||||
|
if settings.DEBUG:
|
||||||
|
urlpatterns += static(
|
||||||
|
settings.MEDIA_URL,
|
||||||
|
document_root=settings.MEDIA_ROOT
|
||||||
|
)
|
@ -6,26 +6,9 @@ from django.shortcuts import render, redirect
|
|||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
|
|
||||||
from .forms import ImageUploadForm
|
from .forms import ImageUploadForm
|
||||||
from .models import (
|
from .models import Image
|
||||||
Image,
|
|
||||||
Visitor
|
|
||||||
)
|
|
||||||
|
|
||||||
class VisitorSessionMixin(View):
|
class ImageUploadView(View):
|
||||||
def get_visitor(self):
|
|
||||||
if self.request.session:
|
|
||||||
if 'visitor_session' in self.request.session:
|
|
||||||
if Visitor.objects.get(session_id=self.request.session['visitor_session']).exists():
|
|
||||||
return Visitor.objects.get(session_id=self.request.session['visitor_session'])
|
|
||||||
else:
|
|
||||||
visitor = Visitor.objects.create()
|
|
||||||
self.request.session['visitor_session'] = visitor.session_id
|
|
||||||
return visitor
|
|
||||||
else:
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
class ImageUploadView(VisitorSessionMixin, View):
|
|
||||||
def get(self, request):
|
def get(self, request):
|
||||||
form = ImageUploadForm()
|
form = ImageUploadForm()
|
||||||
return render(
|
return render(
|
||||||
@ -48,8 +31,6 @@ class ImageUploadView(VisitorSessionMixin, View):
|
|||||||
if image.private:
|
if image.private:
|
||||||
image.access_code = secrets.token_hex(32)
|
image.access_code = secrets.token_hex(32)
|
||||||
|
|
||||||
image.uploaded_by = self.get_visitor()
|
|
||||||
print(image.uploaded_by)
|
|
||||||
image.save()
|
image.save()
|
||||||
return redirect(
|
return redirect(
|
||||||
reverse('home')
|
reverse('home')
|
||||||
|
Loading…
Reference in New Issue
Block a user