mirror of
https://github.com/boostorg/website-v2.git
synced 2026-01-19 04:42:17 +00:00
🚧 cleanup from rebases
This commit is contained in:
@@ -66,6 +66,7 @@ INSTALLED_APPS += [
|
|||||||
"health_check",
|
"health_check",
|
||||||
"health_check.db",
|
"health_check.db",
|
||||||
"health_check.contrib.celery",
|
"health_check.contrib.celery",
|
||||||
|
"imagekit",
|
||||||
# Allauth dependencies:
|
# Allauth dependencies:
|
||||||
"allauth",
|
"allauth",
|
||||||
"allauth.account",
|
"allauth.account",
|
||||||
@@ -132,8 +133,6 @@ TEMPLATES = [
|
|||||||
"django.template.context_processors.request",
|
"django.template.context_processors.request",
|
||||||
"django.contrib.auth.context_processors.auth",
|
"django.contrib.auth.context_processors.auth",
|
||||||
"django.contrib.messages.context_processors.messages",
|
"django.contrib.messages.context_processors.messages",
|
||||||
# Our stuff (see core.context_processors.py)
|
|
||||||
"core.context_processors.current_release",
|
|
||||||
],
|
],
|
||||||
"loaders": [
|
"loaders": [
|
||||||
"django.template.loaders.filesystem.Loader",
|
"django.template.loaders.filesystem.Loader",
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ django-cors-headers
|
|||||||
django-db-geventpool
|
django-db-geventpool
|
||||||
django-extensions
|
django-extensions
|
||||||
django-health-check
|
django-health-check
|
||||||
|
django-imagekit
|
||||||
django-redis
|
django-redis
|
||||||
django-rest-auth
|
django-rest-auth
|
||||||
django-widget-tweaks
|
django-widget-tweaks
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
<footer class="py-2 px-4 my-5 mx-auto max-w-full md:pb-11 md:mb-11">
|
<footer class="py-2 px-4 my-5 mx-auto max-w-full md:pb-11 md:mb-11">
|
||||||
<div class="items-center px-5 pt-4 mt-4 text-center">
|
<div class="items-center px-5 pt-4 mt-4 text-center">
|
||||||
<div class="justify-between pt-3 pb-3 sm:space-x-3 xl:space-x-6 border-dotted border-t-2 px-20 border-t-white/5 w-fit mx-auto">
|
<div class="justify-between pt-3 pb-3 sm:space-x-3 xl:space-x-6 border-dotted border-t-2 px-20 border-t-white/5 w-fit mx-auto">
|
||||||
|
<a class="block my-2 sm:inline hover:text-orange" href="/help/">Contact</a>
|
||||||
<a class="block my-2 sm:inline hover:text-orange" href="{% url 'privacy' %}">Privacy Policy</a>
|
<a class="block my-2 sm:inline hover:text-orange" href="{% url 'privacy' %}">Privacy Policy</a>
|
||||||
<a class="block my-2 sm:inline hover:text-orange" href="{% url 'terms-of-use' %}">Terms of Use</a>
|
<a class="block my-2 sm:inline hover:text-orange" href="{% url 'terms-of-use' %}">Terms of Use</a>
|
||||||
<a class="my-2 inline hover:text-orange" href="https://twitter.com/boost_libraries" target="_blank">Twitter</a>
|
<a class="my-2 inline hover:text-orange" href="https://twitter.com/boost_libraries" target="_blank">Twitter</a>
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if field.field.widget.input_type == "file" %}
|
{% if field.field.widget.input_type == "file" %}
|
||||||
{% render_field field class="text-sm text-grey-500 !border-0 file:mr-5 file:py-2 file:px-6 file:rounded-lg file:border-0 file:text-sm file:font-medium file:bg-white file:text-slate hover:file:cursor-pointer hover:file:bg-orange hover:file:text-white" placeholder=field.label %}
|
{% render_field field class="text-sm text-grey-500 !border-0 file:mr-5 file:py-2 file:px-6 file:rounded-lg file:border-0 file:text-sm file:font-medium file:bg-white file:text-slate hover:file:cursor-pointer hover:file:bg-orange hover:file:text-white"%}
|
||||||
{% elif field.field.widget.input_type == "checkbox" %}
|
{% elif field.field.widget.input_type == "checkbox" %}
|
||||||
{% render_field field %}
|
{% render_field field %}
|
||||||
{% else %}
|
{% else %}
|
||||||
|
|||||||
@@ -29,9 +29,7 @@
|
|||||||
</nav>
|
</nav>
|
||||||
<nav class="flex items-center space-x-3 lg:space-x-5 h-[30px]" x-data="{ 'searchOpen': false }">
|
<nav class="flex items-center space-x-3 lg:space-x-5 h-[30px]" x-data="{ 'searchOpen': false }">
|
||||||
<span class="relative">
|
<span class="relative">
|
||||||
{% if current_release %}
|
<i id="gecko-search-button" data-current-boost-version="1_83_0" data-theme-mode="light" data-font-family="Cairo, sans-serif" class="inline -mt-1 cursor-pointer text-slate fas fa-search dark:text-white/50 dark:hover:text-orange hover:text-orange"></i>
|
||||||
<i id="gecko-search-button" data-current-boost-version="{{ current_release.stripped_boost_url_slug }}" data-theme-mode="light" data-font-family="Cairo, sans-serif" class="inline -mt-1 cursor-pointer text-slate fas fa-search dark:text-white/50 dark:hover:text-orange hover:text-orange"></i>
|
|
||||||
{% endif %}
|
|
||||||
<script>
|
<script>
|
||||||
const geckoSearchButton = document.getElementById('gecko-search-button');
|
const geckoSearchButton = document.getElementById('gecko-search-button');
|
||||||
geckoSearchButton.setAttribute('data-theme-mode', localStorage.getItem('colorMode') === 'dark' ? 'dark' : 'light');
|
geckoSearchButton.setAttribute('data-theme-mode', localStorage.getItem('colorMode') === 'dark' ? 'dark' : 'light');
|
||||||
@@ -173,11 +171,11 @@
|
|||||||
<a href="{% url 'account_signup' %}" class="hover:no-underline inline font-medium dark:text-white dark:visited:text-white text-slate visited:text-slate dark:hover:text-orange hover:text-orange">Join</a>
|
<a href="{% url 'account_signup' %}" class="hover:no-underline inline font-medium dark:text-white dark:visited:text-white text-slate visited:text-slate dark:hover:text-orange hover:text-orange">Join</a>
|
||||||
{% else %}
|
{% else %}
|
||||||
{% if user.image %}
|
{% if user.image %}
|
||||||
<span class="inline-block h-[30px] w-[30px] overflow-hidden rounded mt-1 border border-gray-400 dark:border-gray-500">
|
<span class="inline-block h-[30px] w-[30px] overflow-hidden rounded mt-1 bg-white dark:bt-slate">
|
||||||
<img src="{{ user.image.url }}" alt="user" class="h-full w-full cursor-pointer object-cover" @click="userOpen = !userOpen" />
|
<img src="{{ user.image_thumbnail.url }}" alt="user" class="h-full w-full cursor-pointer object-cover" @click="userOpen = !userOpen" />
|
||||||
</span>
|
</span>
|
||||||
{% else %}
|
{% else %}
|
||||||
<span class="inline-block h-[30px] w-[30px] bg-white rounded dark:text-white mt-1 dark:bg-slate border border-gray-400 dark:border-gray-500">
|
<span class="inline-block h-[30px] w-[30px] bg-white rounded dark:text-white mt-1 dark:bg-slate">
|
||||||
<i class="fas fa-user text-2xl ml-[4px]" @click="userOpen = !userOpen"></i>
|
<i class="fas fa-user text-2xl ml-[4px]" @click="userOpen = !userOpen"></i>
|
||||||
</span>
|
</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
@@ -45,7 +45,7 @@
|
|||||||
<div class="space-x-2 mt-3 flex items-center">
|
<div class="space-x-2 mt-3 flex items-center">
|
||||||
{% if entry.author.image %}
|
{% if entry.author.image %}
|
||||||
<span class="inline-block h-[30px] w-[30px] overflow-hidden rounded border border-gray-400 dark:border-gray-500">
|
<span class="inline-block h-[30px] w-[30px] overflow-hidden rounded border border-gray-400 dark:border-gray-500">
|
||||||
<img src="{{ entry.author.image.url }}" alt="{{ entry.author.get_full_name }}" class="h-full w-full object-cover" />
|
<img src="{{ entry.author.image_thumbnail.url }}" alt="{{ entry.author.get_full_name }}" class="h-full w-full object-cover" />
|
||||||
</span>
|
</span>
|
||||||
{% else %}
|
{% else %}
|
||||||
<span class="inline-block h-[30px] w-[30px] bg-white rounded dark:text-white dark:bg-slate border border-gray-400 dark:border-gray-500">
|
<span class="inline-block h-[30px] w-[30px] bg-white rounded dark:text-white dark:bg-slate border border-gray-400 dark:border-gray-500">
|
||||||
|
|||||||
@@ -115,11 +115,11 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="hidden pt-2 mt-4 text-xs text-left md:block min-w-[70px]">
|
<div class="hidden pt-2 mt-4 text-xs text-left md:block min-w-[70px]">
|
||||||
{% if entry.author.image %}
|
{% if entry.author.image %}
|
||||||
<span class="inline-block h-[30px] w-[30px] overflow-hidden rounded border border-gray-400 dark:border-gray-500">
|
<span class="inline-block h-[30px] w-[30px] overflow-hidden rounded bg-white dark:bg-slate">
|
||||||
<img src="{{ entry.author.image.url }}" alt="{{ entry.author.get_full_name }}" class="h-full w-full object-cover" />
|
<img src="{{ entry.author.image_thumbnail.url }}" alt="{{ entry.author.get_full_name }}" class="h-full w-full object-cover" />
|
||||||
</span>
|
</span>
|
||||||
{% else %}
|
{% else %}
|
||||||
<span class="inline-block h-[30px] w-[30px] bg-white rounded dark:text-white dark:bg-slate border border-gray-400 dark:border-gray-500">
|
<span class="inline-block h-[30px] w-[30px] bg-white rounded dark:text-white dark:bg-slate">
|
||||||
<i class="text-2xl fas fa-user ml-1" title="{{ entry.author.get_full_name }}"></i>
|
<i class="text-2xl fas fa-user ml-1" title="{{ entry.author.get_full_name }}"></i>
|
||||||
</span>
|
</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
@@ -80,7 +80,19 @@ class UserProfileForm(forms.ModelForm):
|
|||||||
fields = ["email", "first_name", "last_name"]
|
fields = ["email", "first_name", "last_name"]
|
||||||
|
|
||||||
|
|
||||||
|
class CustomClearableFileInput(forms.ClearableFileInput):
|
||||||
|
"""
|
||||||
|
Overrides the template for clearable file input so that we can display
|
||||||
|
the widget without the filename/path displayed and change the checkbox
|
||||||
|
to clear the field.
|
||||||
|
"""
|
||||||
|
|
||||||
|
template_name = "users/clearable_file_input.html"
|
||||||
|
|
||||||
|
|
||||||
class UserProfilePhotoForm(forms.ModelForm):
|
class UserProfilePhotoForm(forms.ModelForm):
|
||||||
|
image = forms.FileField(widget=CustomClearableFileInput, required=False)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = User
|
model = User
|
||||||
fields = ["image"]
|
fields = ["image"]
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ from django.db.models.signals import post_save
|
|||||||
from django.dispatch import receiver
|
from django.dispatch import receiver
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
from imagekit.models import ImageSpecField
|
||||||
|
from imagekit.processors import ResizeToFill
|
||||||
|
|
||||||
from core.validators import image_validator, max_file_size_validator
|
from core.validators import image_validator, max_file_size_validator
|
||||||
|
|
||||||
@@ -211,6 +213,12 @@ class User(BaseUser):
|
|||||||
blank=True,
|
blank=True,
|
||||||
validators=[image_validator, max_file_size_validator],
|
validators=[image_validator, max_file_size_validator],
|
||||||
)
|
)
|
||||||
|
image_thumbnail = ImageSpecField(
|
||||||
|
source="image",
|
||||||
|
processors=[ResizeToFill(100, 100)],
|
||||||
|
format="JPEG",
|
||||||
|
options={"quality": 90},
|
||||||
|
)
|
||||||
claimed = models.BooleanField(
|
claimed = models.BooleanField(
|
||||||
_("claimed"),
|
_("claimed"),
|
||||||
default=True,
|
default=True,
|
||||||
|
|||||||
8
users/templates/users/clearable_file_input.html
Normal file
8
users/templates/users/clearable_file_input.html
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{% if widget.is_initial %}
|
||||||
|
{% if not widget.required %}
|
||||||
|
<input type="checkbox" class="!mr-0" name="{{ widget.checkbox_name }}" id="{{ widget.checkbox_id }}"{% if widget.attrs.disabled %} disabled{% endif %}>
|
||||||
|
<label class="-ml-3" for="{{ widget.checkbox_id }}">Delete</label>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<input type="{{ widget.type }}" name="{{ widget.name }}" {% include "django/forms/widgets/attrs.html" %}>
|
||||||
Reference in New Issue
Block a user