Compare commits

...

2 Commits

Author SHA1 Message Date
8455d64e31
Reformat 2023-02-11 14:00:19 +00:00
57078c10c1
Optimise performance with caching 2023-02-11 14:00:09 +00:00
8 changed files with 361 additions and 302 deletions

View File

@ -54,6 +54,24 @@ INSTALLED_APPS = [
# "otp_yubikey", # "otp_yubikey",
"mixins", "mixins",
] ]
# Performance optimisations
CACHES = {
"default": {
"BACKEND": "django.core.cache.backends.redis.RedisCache",
"LOCATION": "unix:///var/run/socks/redis.sock",
"OPTIONS": {
"db": "10",
"parser_class": "redis.connection.PythonParser",
"pool_class": "redis.BlockingConnectionPool",
},
}
}
# CACHE_MIDDLEWARE_ALIAS
# CACHE_MIDDLEWARE_SECONDS
# CACHE_MIDDLEWARE_KEY_PREFIX
CRISPY_TEMPLATE_PACK = "bulma" CRISPY_TEMPLATE_PACK = "bulma"
CRISPY_ALLOWED_TEMPLATE_PACKS = ("bulma",) CRISPY_ALLOWED_TEMPLATE_PACKS = ("bulma",)
DJANGO_TABLES2_TEMPLATE = "django-tables2/bulma.html" DJANGO_TABLES2_TEMPLATE = "django-tables2/bulma.html"
@ -69,6 +87,9 @@ MIDDLEWARE = [
"django.contrib.messages.middleware.MessageMiddleware", "django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware",
"django_htmx.middleware.HtmxMiddleware", "django_htmx.middleware.HtmxMiddleware",
# 'django.middleware.cache.UpdateCacheMiddleware',
# 'django.middleware.common.CommonMiddleware',
# 'django.middleware.cache.FetchFromCacheMiddleware',
] ]
ROOT_URLCONF = "app.urls" ROOT_URLCONF = "app.urls"

View File

@ -4,19 +4,19 @@ from django.contrib.auth.admin import UserAdmin
from .forms import CustomUserCreationForm from .forms import CustomUserCreationForm
from .models import ( from .models import (
Account, Account,
AssetGroup,
AssetRestriction,
Callback, Callback,
Hook, Hook,
NotificationSettings,
Plan, Plan,
RiskModel,
Session, Session,
Signal, Signal,
Strategy, Strategy,
Trade, Trade,
TradingTime, TradingTime,
User, User,
NotificationSettings,
RiskModel,
AssetGroup,
AssetRestriction,
) )
# admin.site.__class__ = OTPAdminSite # admin.site.__class__ = OTPAdminSite
@ -80,15 +80,27 @@ class StrategyAdmin(admin.ModelAdmin):
class NotificationSettingsAdmin(admin.ModelAdmin): class NotificationSettingsAdmin(admin.ModelAdmin):
list_display = ("user", "ntfy_topic", "ntfy_url") list_display = ("user", "ntfy_topic", "ntfy_url")
class RiskModelAdmin(admin.ModelAdmin): class RiskModelAdmin(admin.ModelAdmin):
list_display = ("user", "name", "description", "max_loss_percent", "max_risk_percent", "max_open_trades", "max_open_trades_per_symbol") list_display = (
"user",
"name",
"description",
"max_loss_percent",
"max_risk_percent",
"max_open_trades",
"max_open_trades_per_symbol",
)
class AssetGroupAdmin(admin.ModelAdmin): class AssetGroupAdmin(admin.ModelAdmin):
list_display = ("user", "name", "description", "account") list_display = ("user", "name", "description", "account")
class AssetRestrictionAdmin(admin.ModelAdmin): class AssetRestrictionAdmin(admin.ModelAdmin):
list_display = ("user", "name", "description", "webhook_id", "group") list_display = ("user", "name", "description", "webhook_id", "group")
admin.site.register(User, CustomUserAdmin) admin.site.register(User, CustomUserAdmin)
admin.site.register(Plan) admin.site.register(Plan)
admin.site.register(Session) admin.site.register(Session)

View File

@ -1,7 +1,7 @@
# Generated by Django 4.1.6 on 2023-02-10 22:57 # Generated by Django 4.1.6 on 2023-02-10 22:57
from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):

View File

@ -1,8 +1,10 @@
{% load static %} {% load static %}
{% load has_plan %} {% load has_plan %}
{% load cache %}
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en-GB"> <html lang="en-GB">
{% cache 600 head %}
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
@ -195,8 +197,10 @@
</script> </script>
<!-- End Piwik Code --> <!-- End Piwik Code -->
</head> </head>
{% endcache %}
<body> <body>
{% cache 600 nav request.user.id %}
<nav class="navbar" role="navigation" aria-label="main navigation"> <nav class="navbar" role="navigation" aria-label="main navigation">
<div class="navbar-brand"> <div class="navbar-brand">
<a class="navbar-item" href="{% url 'home' %}"> <a class="navbar-item" href="{% url 'home' %}">
@ -310,6 +314,7 @@
</div> </div>
</div> </div>
</nav> </nav>
{% endcache %}
<script> <script>
let deferredPrompt; let deferredPrompt;
const addBtn = document.querySelector('.add-button'); const addBtn = document.querySelector('.add-button');

View File

@ -1,3 +1,5 @@
import json
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin
from django.http import HttpResponse from django.http import HttpResponse
from mixins.views import AbortSave, ObjectCreate, ObjectDelete, ObjectList, ObjectUpdate from mixins.views import AbortSave, ObjectCreate, ObjectDelete, ObjectList, ObjectUpdate
@ -8,7 +10,6 @@ from rest_framework.views import APIView
from core.forms import AssetGroupForm, AssetRestrictionForm from core.forms import AssetGroupForm, AssetRestrictionForm
from core.models import AssetGroup, AssetRestriction from core.models import AssetGroup, AssetRestriction
from core.util import logs from core.util import logs
import json
log = logs.get_logger(__name__) log = logs.get_logger(__name__)
@ -65,7 +66,9 @@ class AssetRestrictionList(
list_template = "partials/assetrestriction-list.html" list_template = "partials/assetrestriction-list.html"
model = AssetRestriction model = AssetRestriction
page_title = "List of asset restrictions. Linked to asset groups." page_title = "List of asset restrictions. Linked to asset groups."
page_subtitle = "Allows API calls to permit or prohibit trading on defined currency pairs." page_subtitle = (
"Allows API calls to permit or prohibit trading on defined currency pairs."
)
list_url_name = "assetrestrictions" list_url_name = "assetrestrictions"
list_url_args = ["type", "group"] list_url_args = ["type", "group"]

View File

@ -43,6 +43,8 @@ services:
- ${PORTAINER_GIT_DIR}:/code - ${PORTAINER_GIT_DIR}:/code
- ${APP_DATABASE_FILE}:/conf/db.sqlite3 - ${APP_DATABASE_FILE}:/conf/db.sqlite3
- fisk_static:${STATIC_ROOT} - fisk_static:${STATIC_ROOT}
volumes_from:
- tmp
env_file: env_file:
- stack.env - stack.env
@ -58,6 +60,8 @@ services:
- ${PORTAINER_GIT_DIR}:/code - ${PORTAINER_GIT_DIR}:/code
- ${APP_DATABASE_FILE}:/conf/db.sqlite3 - ${APP_DATABASE_FILE}:/conf/db.sqlite3
- fisk_static:${STATIC_ROOT} - fisk_static:${STATIC_ROOT}
volumes_from:
- tmp
env_file: env_file:
- stack.env - stack.env
@ -98,24 +102,33 @@ services:
volumes: volumes:
- /var/run/socks - /var/run/socks
# redis: # For caching
# image: redis redis:
# command: redis-server /etc/redis.conf image: redis
# ulimits: container_name: redis_fisk
# nproc: 65535 command: redis-server /etc/redis.conf
# nofile: ulimits:
# soft: 65535 nproc: 65535
# hard: 65535 nofile:
# volumes: soft: 65535
# - ${PORTAINER_GIT_DIR}/docker/redis.conf:/etc/redis.conf hard: 65535
# - redis_data:/data volumes:
# volumes_from: - ${PORTAINER_GIT_DIR}/docker/redis.conf:/etc/redis.conf
# - tmp - fisk_redis_data:/data
# healthcheck: volumes_from:
# test: "redis-cli -s /var/run/redis/redis.sock ping" - tmp
# interval: 2s healthcheck:
# timeout: 2s test: "redis-cli -s /var/run/socks/redis.sock ping"
# retries: 15 interval: 2s
timeout: 2s
retries: 15
# pyroscope:
# image: "pyroscope/pyroscope:latest"
# ports:
# - "4040:4040"
# command:
# - "server"
networks: networks:
default: default:
@ -127,3 +140,4 @@ networks:
volumes: volumes:
fisk_static: {} fisk_static: {}
fisk_redis_data: {}

View File

@ -1,2 +1,2 @@
unixsocket /var/run/redis/redis.sock unixsocket /var/run/socks/redis.sock
unixsocketperm 777 unixsocketperm 777

View File

@ -22,3 +22,7 @@ oandapyV20
glom glom
elasticsearch elasticsearch
git+https://git.zm.is/XF/django-crud-mixins git+https://git.zm.is/XF/django-crud-mixins
# pyroscope-io
# For caching
redis
hiredis