Remove django-compressor

pull/1459/head
Piero Toffanin 2024-01-09 12:19:24 -05:00
rodzic be8bd6e7ee
commit f227bdb08b
8 zmienionych plików z 402 dodań i 128 usunięć

Wyświetl plik

@ -7,77 +7,3 @@ logger = logging.getLogger('app.logger')
# Make the SETTINGS object available to all templates
def load(request=None):
return {'SETTINGS': Setting.objects.first()}
# Helper functions for libsass
def theme(color):
"""Return a theme color from the currently selected theme"""
try:
return getattr(load()['SETTINGS'].theme, color)
except Exception as e:
logger.warning("Cannot load configuration from theme(): " + e.message)
return "blue" # dah buh dih ah buh daa..
def complementary(hexcolor):
"""Returns complementary RGB color
Example: complementaryColor('#FFFFFF') --> '#000000'
"""
if hexcolor[0] == '#':
hexcolor = hexcolor[1:]
rgb = (hexcolor[0:2], hexcolor[2:4], hexcolor[4:6])
comp = ['%02X' % (255 - int(a, 16)) for a in rgb]
return '#' + ''.join(comp)
def scaleby(hexcolor, scalefactor, ignore_value = False):
"""
Scales a hex string by ``scalefactor``, but is color dependent, unless ignore_value is True
scalefactor is now always between 0 and 1. A value of 0.8
will cause bright colors to become darker and
dark colors to become brigther by 20%
"""
def calculate(hexcolor, scalefactor):
"""
Scales a hex string by ``scalefactor``. Returns scaled hex string.
To darken the color, use a float value between 0 and 1.
To brighten the color, use a float value greater than 1.
>>> colorscale("#DF3C3C", .5)
#6F1E1E
>>> colorscale("#52D24F", 1.6)
#83FF7E
>>> colorscale("#4F75D2", 1)
#4F75D2
"""
def clamp(val, minimum=0, maximum=255):
if val < minimum:
return minimum
if val > maximum:
return maximum
return int(val)
hexcolor = hexcolor.strip('#')
if scalefactor < 0 or len(hexcolor) != 6:
return hexcolor
r, g, b = int(hexcolor[:2], 16), int(hexcolor[2:4], 16), int(hexcolor[4:], 16)
r = clamp(r * scalefactor)
g = clamp(g * scalefactor)
b = clamp(b * scalefactor)
return "#%02x%02x%02x" % (r, g, b)
hexcolor = hexcolor.strip('#')
scalefactor = abs(float(scalefactor.value))
scalefactor = min(1.0, max(0, scalefactor))
r, g, b = int(hexcolor[:2], 16), int(hexcolor[2:4], 16), int(hexcolor[4:], 16)
value = max(r, g, b)
return calculate(hexcolor, scalefactor if ignore_value or value >= 127 else 2 - scalefactor)

Wyświetl plik

@ -7,6 +7,8 @@ from django.db import models
from colorfield.fields import ColorField
from django.dispatch import receiver
from django.utils.translation import gettext_lazy as _
from django.core.cache import cache
from django.core.cache.utils import make_template_fragment_key
from webodm import settings
@ -54,14 +56,5 @@ def theme_post_save(sender, instance, created, **kwargs):
def update_theme_css():
"""
Touch theme.scss to invalidate its cache and force
compressor to regenerate it
"""
theme_file = os.path.join('app', 'static', 'app', 'css', 'theme.scss')
try:
Path(theme_file).touch()
logger.info("Regenerate cache for {}".format(theme_file))
except:
logger.warning("Failed to touch {}".format(theme_file))
key = make_template_fragment_key("theme_css")
cache.delete(key)

Wyświetl plik

@ -1,7 +1,7 @@
<!DOCTYPE html>
<html lang="en">
<head>
{% load i18n static settings compress plugins %}
{% load i18n cache static settings plugins %}
<!--
WebODM - User-friendly, commercial grade software for processing aerial imagery.
Copyright (C) 2020 WebODM Authors
@ -51,9 +51,11 @@
<title>{{title|default:"Login"}} - {{ SETTINGS.app_name }}</title>
{% compress css inline %}
<link rel="stylesheet" type="text/x-scss" href="{% static 'app/css/theme.scss' %}" />
{% endcompress %}
{% cache 3600 theme_css %}
<style type="text/css">
{% include "theme.css" %}
</style>
{% endcache %}
{% is_desktop_mode as desktop_mode %}
{% if desktop_mode %}

Wyświetl plik

@ -0,0 +1,308 @@
{% load settings %}
{% theme "primary" as theme_primary %}
{% theme "secondary" as theme_secondary %}
{% theme "tertiary" as theme_tertiary %}
{% theme "button_primary" as theme_button_primary %}
{% theme "button_default" as theme_button_default %}
{% theme "button_danger" as theme_button_danger %}
{% theme "header_background" as theme_header_background %}
{% theme "header_primary" as theme_header_primary %}
{% theme "border" as theme_border %}
{% theme "highlight" as theme_highlight %}
{% theme "dialog_warning" as theme_dialog_warning %}
{% theme "success" as theme_success %}
{% theme "failed" as theme_failed %}
/* Primary */
body,
ul#side-menu.nav a,
.console,
.alert,
.form-control,
.dropdown-menu > li > a,
.theme-color-primary,
{
color: {{ theme_primary }};
}
.theme-border-primary{
border-color: {{ theme_primary }};
}
.tooltip{
.tooltip-inner{
background-color: {{ theme_primary }};
}
}
.tooltip.left .tooltip-arrow{ border-left-color: {{ theme_primary }}; }
.tooltip.top .tooltip-arrow{ border-top-color: {{ theme_primary }}; }
.tooltip.bottom .tooltip-arrow{ border-bottom-color: {{ theme_primary }}; }
.tooltip.right .tooltip-arrow{ border-right-color: {{ theme_primary }}; }
.theme-fill-primary{
fill: {{ theme_primary }};
}
.theme-stroke-primary{
stroke: {{ theme_primary }};
}
/* Secondary */
body,
.navbar-default,
.console,
.alert,
.modal-content,
.form-control,
.dropdown-menu,
.theme-secondary
{
background-color: {{ theme_secondary }};
}
.tooltip > .tooltip-inner{
color: {{ theme_secondary }};
}
.alert.close:hover{
color: {% complementary theme_secondary %};
}
.alert.close:focus{
color: {% complementary theme_secondary %};
}
.pagination li > a,
.pagination .disabled > a,
.pagination .disabled > a:hover, .pagination .disabled > a:focus{
color: {% scaleby theme_primary 0.7 %};
background-color: {{ theme_secondary }};
border-color: {% scaleby theme_secondary 0.7 %};
}
.pagination li > a{
color: {{ theme_primary }};
}
.theme-border-secondary-07{
border-color: {% scaleby theme_secondary 0.7 %} !important;
}
.btn-secondary, .btn-secondary:active, .open>.dropdown-toggle.btn-secondary{
background-color: {{ theme_secondary }};
border-color: {{ theme_secondary }};
color: {{ theme_primary }};
}
.btn-secondary:hover, .open>.dropdown-toggle.btn-secondary:hover,
.btn-secondary:active, .open>.dropdown-toggle.btn-secondary:active,
.btn-secondary:focus, .open>.dropdown-toggle.btn-secondary:focus{
background-color: {% scalebyiv theme_secondary 0.90 %};
border-color: {% scalebyiv theme_secondary 0.90 %};
color: {{ theme_primary }};
}
/* Tertiary */
a, a:hover, a:focus{
color: {{ theme_tertiary }};
}
.progress-bar-success{
background-color: {{ theme_tertiary }};
}
/* Button primary */
#navbar-top .navbar-top-links a:hover,
#navbar-top .navbar-top-links a:focus,
#navbar-top .navbar-top-links .open > a{
background-color: {{ theme_button_primary }};
color: {{ theme_secondary }};
}
#navbar-top ul#side-menu a:focus{
background-color: inherit;
color: inherit;
}
#navbar-top ul#side-menu a:hover, #navbar-top ul#side-menu a.active:hover{
background-color: {{ theme_button_primary }};
color: {{ theme_secondary }};
}
.btn-primary, .btn-primary:active, .btn-primary.active, .open>.dropdown-toggle.btn-primary{
background-color: {{ theme_button_primary }};
border-color: {{ theme_button_primary }};
color: {{ theme_secondary }};
}
.btn-primary:hover, .btn-primary.active:hover, .open>.dropdown-toggle.btn-primary:hover,
.btn-primary:active, .btn-primary.active:active, .open>.dropdown-toggle.btn-primary:active,
.btn-primary:focus, .btn-primary.active:focus, .open>.dropdown-toggle.btn-primary:focus,
.btn-primary[disabled]:hover, .btn-primary.active[disabled]:hover, .open>.dropdown-toggle.btn-primary[disabled]:hover,
.btn-primary[disabled]:focus, .btn-primary.active[disabled]:focus, .open>.dropdown-toggle.btn-primary[disabled]:focus,
.btn-primary[disabled]:active, .btn-primary.active[disabled]:active, .open>.dropdown-toggle.btn-primary[disabled]:active,
background-color: {% scalebyiv theme_button_primary 0.90 %};
border-color: {% scalebyiv theme_button_primary 0.90 %};
color: {{ theme_secondary }};
}
/* Button default */
.btn-default, .btn-default:active, .open>.dropdown-toggle.btn-default{
background-color: {{ theme_button_default }};
border-color: {{ theme_button_default }};
color: {{ theme_secondary }};
}
.btn-default:hover, .open>.dropdown-toggle.btn-default:hover,
.btn-default:active, .open>.dropdown-toggle.btn-default:active,
.btn-default:focus, .open>.dropdown-toggle.btn-default:focus,
.btn-default[disabled]:hover, .open>.dropdown-toggle.btn-default[disabled]:hover,
.btn-default[disabled]:focus, .open>.dropdown-toggle.btn-default[disabled]:focus,
.btn-default[disabled]:active, .open>.dropdown-toggle.btn-default[disabled]:active{
background-color: {% scalebyiv theme_button_default 0.90 %};
border-color: {% scalebyiv theme_button_default 0.90 %};
color: {{ theme_secondary }};
}
.pagination>.active>a, .pagination>.active>span, .pagination>.active>a:hover, .pagination>.active>span:hover, .pagination>.active>a:focus, .pagination>.active>span:focus,
.pagination .active > a:hover, .pagination .active > a:focus,
.pagination li > a:hover, .pagination li > a:focus{
background-color: {{ theme_button_default }};
color: {{ theme_secondary }};
}
/* Button danger */
.btn-danger, .btn-danger:active, .open>.dropdown-toggle.btn-danger{
background-color: {{ theme_button_danger }};
border-color: {{ theme_button_danger }};
color: {{ theme_secondary }};
}
.btn-danger:hover, .open>.dropdown-toggle.btn-danger:hover,
.btn-danger:active, .open>.dropdown-toggle.btn-danger:active,
.btn-danger:focus, .open>.dropdown-toggle.btn-danger:focus,
.btn-danger[disabled]:hover, .open>.dropdown-toggle.btn-danger[disabled]:hover,
.btn-danger[disabled]:active, .open>.dropdown-toggle.btn-danger[disabled]:active,
.btn-danger[disabled]:focus, .open>.dropdown-toggle.btn-danger[disabled]:focus{
background-color: {% scalebyiv theme_button_danger 0.90 %};
border-color: {% scalebyiv theme_button_danger 0.90 %};
color: {{ theme_secondary }};
}
.theme-color-button-danger{
color: {{ theme_button_danger }};
}
.theme-color-button-primary{
color: {{ theme_button_primary }};
}
/* Header background */
#navbar-top{
background-color: {{ theme_header_background }};
}
/* Header primary */
.navbar-default .navbar-link,
#navbar-top .navbar-top-links a.dropdown-toggle,
#navbar-top .navbar-text{
color: {{ theme_header_primary }};
}
.navbar-default .navbar-link:hover,
#navbar-top .navbar-top-links a.dropdown-toggle:hover{
color: {{ theme_secondary }};
}
/* Border */
.sidebar ul li,
.project-list-item,
#page-wrapper,
table-bordered>thead>tr>th, .table-bordered>thead>tr>th, table-bordered>tbody>tr>th, .table-bordered>tbody>tr>th, table-bordered>tfoot>tr>th, .table-bordered>tfoot>tr>th, table-bordered>thead>tr>td, .table-bordered>thead>tr>td, table-bordered>tbody>tr>td, .table-bordered>tbody>tr>td, table-bordered>tfoot>tr>td, .table-bordered>tfoot>tr>td,
footer,
.modal-content,
.modal-header,
.modal-footer,
.dropdown-menu
{
border-color: {{ theme_border }};
}
.dropdown-menu .divider{
background-color: {{ theme_border }};
}
.popover-title{
border-bottom-color: {{ theme_border }};
}
.theme-border{
border-color: {{ theme_border }} !important;
}
/* Highlight */
.task-list-item:nth-child(odd),
.table-striped>tbody>tr:nth-of-type(odd),
select.form-control option[disabled],
.theme-background-highlight{
background-color: {{ theme_highlight }};
}
.dropdown-menu > li > a:hover,
.dropdown-menu > li > a:focus{
background-color: {{ theme_highlight }};
color: {{ theme_primary }};
}
pre.prettyprint,
.form-control{
border-color: {{ theme_highlight }};
}
pre.prettyprint:focus,
.form-control:focus
border-color: {% scalebyiv theme_highlight 0.7 %};
}
/* Dialog warning */
.alert-warning{
border-color: {{ theme_dialog_warning }};
}
/* Success */
.task-list-item .status-label.done, .theme-background-success{
background-color: {{ theme_success }};
}
/* Failed */
.task-list-item .status-label.error, .theme-background-failed{
background-color: {{ theme_failed }};
}
/* ModelView.jsx specific */
.model-view #potree_sidebar_container .dropdown-menu > li > a{
color: {{ theme_primary }};
}
/* MapView.jsx specific */
.leaflet-bar a, .leaflet-control > a{
background-color: {{ theme_secondary }} !important;
border-color: {{ theme_secondary }} !important;
color: {{ theme_primary }} !important;
}
.leaflet-bar a:hover, .leaflet-control > a:hover{
background-color: {% scalebyiv theme_secondary 0.90 %} !important;
border-color: {% scalebyiv theme_secondary 0.90 %} !important;
}
.leaflet-popup-content-wrapper{
background-color: {{ theme_secondary }} !important;
color: {{ theme_primary }} !important;
}
.leaflet-popup-content-wrapper a{
color: {{ theme_tertiary }} !important;
}
.leaflet-container a.leaflet-popup-close-button{
color: {{ theme_primary }} !important;
}
.leaflet-container a.leaflet-popup-close-button:hover{
color: {% complementary theme_secondary %} !important;
}
.tag-badge{
background-color: {{ theme_button_default }};
border-color: {{ theme_button_default }};
color: {{ theme_secondary }};
}
.tag-badge a, .tag-badge a:hover{
color: {{ theme_secondary }};
}

Wyświetl plik

@ -112,3 +112,80 @@ def get_footer(context):
return "<footer>" + \
footer + \
"</footer>"
@register.simple_tag(takes_context=True)
def theme(context, color):
"""Return a theme color from the currently selected theme"""
try:
return getattr(context['SETTINGS'].theme, color)
except Exception as e:
logger.warning("Cannot load configuration from theme(): " + str(e))
return "blue" # dah buh dih ah buh daa..
@register.simple_tag
def complementary(hexcolor):
"""Returns complementary RGB color
Example: complementaryColor('#FFFFFF') --> '#000000'
"""
if hexcolor[0] == '#':
hexcolor = hexcolor[1:]
rgb = (hexcolor[0:2], hexcolor[2:4], hexcolor[4:6])
comp = ['%02X' % (255 - int(a, 16)) for a in rgb]
return '#' + ''.join(comp)
@register.simple_tag
def scaleby(hexcolor, scalefactor, ignore_value = False):
"""
Scales a hex string by ``scalefactor``, but is color dependent, unless ignore_value is True
scalefactor is now always between 0 and 1. A value of 0.8
will cause bright colors to become darker and
dark colors to become brigther by 20%
"""
def calculate(hexcolor, scalefactor):
"""
Scales a hex string by ``scalefactor``. Returns scaled hex string.
To darken the color, use a float value between 0 and 1.
To brighten the color, use a float value greater than 1.
>>> colorscale("#DF3C3C", .5)
#6F1E1E
>>> colorscale("#52D24F", 1.6)
#83FF7E
>>> colorscale("#4F75D2", 1)
#4F75D2
"""
def clamp(val, minimum=0, maximum=255):
if val < minimum:
return minimum
if val > maximum:
return maximum
return int(val)
hexcolor = hexcolor.strip('#')
if scalefactor < 0 or len(hexcolor) != 6:
return hexcolor
r, g, b = int(hexcolor[:2], 16), int(hexcolor[2:4], 16), int(hexcolor[4:], 16)
r = clamp(r * scalefactor)
g = clamp(g * scalefactor)
b = clamp(b * scalefactor)
return "#%02x%02x%02x" % (r, g, b)
hexcolor = hexcolor.strip('#')
scalefactor = abs(float(scalefactor))
scalefactor = min(1.0, max(0, scalefactor))
r, g, b = int(hexcolor[:2], 16), int(hexcolor[2:4], 16), int(hexcolor[4:], 16)
value = max(r, g, b)
return calculate(hexcolor, scalefactor if ignore_value or value >= 127 else 2 - scalefactor)
@register.simple_tag
def scalebyiv(hexcolor, scalefactor):
return scaleby(hexcolor, scalefactor, True)

Wyświetl plik

@ -1,6 +1,6 @@
{
"name": "WebODM",
"version": "2.4.0",
"version": "2.4.1",
"description": "User-friendly, extendable application and API for processing aerial imagery.",
"main": "index.js",
"scripts": {

Wyświetl plik

@ -8,7 +8,6 @@ Django==2.2.27
django-appconf==1.0.2
django-codemirror2==0.2
django-colorfield==0.1.15
django-compressor==2.2
django-cors-headers==3.0.2
django-filter==2.4.0
django-guardian==1.4.9

Wyświetl plik

@ -114,7 +114,6 @@ INSTALLED_APPS = [
'colorfield',
'imagekit',
'codemirror2',
'compressor',
'app',
'nodeodm',
]
@ -199,7 +198,6 @@ STATICFILES_DIRS = [
STATICFILES_FINDERS = [
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'compressor.finders.CompressorFinder',
]
# File Uploads
@ -334,41 +332,6 @@ JWT_AUTH = {
'JWT_EXPIRATION_DELTA': datetime.timedelta(hours=6),
}
# Compressor
COMPRESS_PRECOMPILERS = (
('text/x-scss', 'django_libsass.SassCompiler'),
)
COMPRESS_ENABLED = True
COMPRESS_MTIME_DELAY = 0
# Sass
def theme(color):
from app.contexts.settings import theme as f
return f(color)
def complementary(color):
from app.contexts.settings import complementary as f
return f(color)
def scaleby(color, n):
from app.contexts.settings import scaleby as f
return f(color, n)
def scalebyiv(color, n):
from app.contexts.settings import scaleby as f
return f(color, n, True)
LIBSASS_CUSTOM_FUNCTIONS = {
'theme': theme,
'complementary': complementary,
'scaleby': scaleby,
'scalebyiv': scalebyiv
}
# Celery
CELERY_BROKER_URL = os.environ.get('WO_BROKER', 'redis://localhost')
CELERY_RESULT_BACKEND = os.environ.get('WO_BROKER', 'redis://localhost')
@ -389,6 +352,12 @@ CACHES = {
}
}
}
if DEBUG:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
}
}
# Number of minutes a processing node hasn't been seen
# before it should be considered offline