port to new django, AI automated

This commit is contained in:
2026-03-30 22:35:36 +02:00
parent e2d166e437
commit 372da3caa9
215 changed files with 9283 additions and 2981 deletions

View File

@@ -1 +0,0 @@
{"_module": "oauth2client.client", "token_expiry": "2018-12-18T12:55:20Z", "access_token": "ya29.Gl12BuJlFBtRZSBtMkxubhfG8rYDsLUgc1yKMpO9_aE3tmi4sLFGLq_Djq5R9zr1919oZAobX0oaD6bTj3s4i9kqWfw0gpOGKJKRHM1Y9gHc0JsCe2kChNszu_RCAaE", "token_uri": "https://accounts.google.com/o/oauth2/token", "invalid": false, "token_response": {"access_token": "ya29.Gl12BuJlFBtRZSBtMkxubhfG8rYDsLUgc1yKMpO9_aE3tmi4sLFGLq_Djq5R9zr1919oZAobX0oaD6bTj3s4i9kqWfw0gpOGKJKRHM1Y9gHc0JsCe2kChNszu_RCAaE", "scope": "https://www.googleapis.com/auth/calendar", "expires_in": 3600, "token_type": "Bearer"}, "client_id": "34462582242-4kpdvvbi27ajt4u22uitqurpve9o8ipj.apps.googleusercontent.com", "id_token": null, "client_secret": "y4t9XBrJdCODPTO5UvtONWWn", "revoke_uri": "https://accounts.google.com/o/oauth2/revoke", "_class": "OAuth2Credentials", "refresh_token": "1/txixroRJyyVmuENPpaXyB_bGeXa1XV-pClAxqKHk_5-JW1qGFE0Gl-WlgCu1Eizq", "user_agent": null}

Binary file not shown.

View File

@@ -1,37 +1,41 @@
from django.http import HttpResponseRedirect
from django.conf import settings
import re
from django.conf import settings
from django.http import HttpResponseRedirect
class EnforceLoginMiddleware:
"""
Middlware class which requires the user to be authenticated for all urls except
those defined in PUBLIC_URLS in settings.py. PUBLIC_URLS should be a tuple of regular
expresssions for the urls you want anonymous users to have access to. If PUBLIC_URLS
is not defined, it falls back to LOGIN_URL or failing that '/accounts/login/'.
Requests for urls not matching PUBLIC_URLS get redirected to LOGIN_URL with next set
to original path of the unauthenticted request.
Middleware class which requires the user to be authenticated for all urls except
those defined in PUBLIC_URLS in settings.py. PUBLIC_URLS should be a tuple of regular
expressions for the urls you want anonymous users to have access to. If PUBLIC_URLS
is not defined, it falls back to LOGIN_URL or failing that '/accounts/login/'.
Requests for urls not matching PUBLIC_URLS get redirected to LOGIN_URL with next set
to original path of the unauthenticated request.
Any urls statically served by django are excluded from this check. To enforce the same
validation on these set SERVE_STATIC_TO_PUBLIC to False.
"""
def __init__(self, get_response):
self.login_url = getattr(settings, 'LOGIN_URL', '/accounts/login/')
self.get_response = get_response
self.login_url = getattr(settings, "LOGIN_URL", "/accounts/login/")
if hasattr(settings, 'PUBLIC_URLS'):
if hasattr(settings, "PUBLIC_URLS"):
public_urls = [re.compile(url) for url in settings.PUBLIC_URLS]
else:
public_urls = [(re.compile("^%s/?$" % (self.login_url[1:])))]
if getattr(settings, 'SERVE_STATIC_TO_PUBLIC', True):
root_urlconf = __import__(settings.ROOT_URLCONF)
public_urls.extend([re.compile(url.regex)
for url in root_urlconf.urls.urlpatterns
if url.__dict__.get('_callback_str') == 'django.views.static.serve'
])
public_urls = [re.compile("^%s/?$" % (self.login_url[1:]))]
self.public_urls = tuple(public_urls)
def __call__(self, request):
# Check if user needs to be redirected to login
redirect_response = self.check_login(request)
if redirect_response:
return redirect_response
return self.get_response(request)
def check_login(self, request):
"""
Redirect anonymous users to login_url from non public urls
"""
@@ -40,52 +44,63 @@ class EnforceLoginMiddleware:
for url in self.public_urls:
if url.match(request.path[1:]):
return None
return HttpResponseRedirect("%s?next=%s" % (self.login_url, request.path))
return HttpResponseRedirect(
"%s?next=%s" % (self.login_url, request.path)
)
except AttributeError:
return HttpResponseRedirect("%s?next=%s" % (self.login_url, request.path))
return self.get_response(request)
return None
class DetectDevice:
"""
Middleware to detect the device type from user agent string.
"""
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
device = self.mobile(request)
request.device = self.detect_device(request)
return self.get_response(request)
request.device = device
response = self.get_response(request)
return response
def mobile(self, request):
def detect_device(self, request):
device = {}
ua = request.META.get('HTTP_USER_AGENT', '').lower()
ua = request.META.get("HTTP_USER_AGENT", "").lower()
if ua.find("iphone") > 0:
device['iphone'] = "iphone" + re.search("iphone os (\d)", ua).groups(0)[0]
if "iphone" in ua:
match = re.search(r"iphone os (\d)", ua)
if match:
device["iphone"] = "iphone" + match.group(1)
else:
device["iphone"] = "iphone"
if ua.find("ipad") > 0:
device['ipad'] = "ipad"
if "ipad" in ua:
device["ipad"] = "ipad"
if ua.find("android") > 0:
device['android'] = "android" + re.search("android (\d\.\d)", ua).groups(0)[0].translate(None, '.')
if "android" in ua:
match = re.search(r"android (\d\.\d)", ua)
if match:
version = match.group(1).replace(".", "")
device["android"] = "android" + version
else:
device["android"] = "android"
if ua.find("blackberry") > 0:
device['blackberry'] = "blackberry"
if "blackberry" in ua:
device["blackberry"] = "blackberry"
if ua.find("windows phone os 7") > 0:
device['winphone7'] = "winphone7"
if "windows phone os 7" in ua:
device["winphone7"] = "winphone7"
if ua.find("iemobile") > 0:
device['winmo'] = "winmo"
if "iemobile" in ua:
device["winmo"] = "winmo"
if not device: # either desktop, or something we don't care about.
device['baseline'] = "baseline"
if not device:
# either desktop, or something we don't care about.
device["baseline"] = "baseline"
# spits out device names for CSS targeting, to be applied to <html> or <body>.
device['classes'] = " ".join(v for (k, v) in device.items())
device["classes"] = " ".join(v for (k, v) in device.items())
return device

View File

@@ -1,233 +1,205 @@
# Setting the path
import os
from pathlib import Path
gettext = lambda s: s
BASE_DIR = Path(__file__).resolve().parent
PROJECT_PATH = os.path.abspath(os.path.dirname(__file__))
DATA_PATH = os.environ.get('BLECHREIZ_DATA', default=os.path.join(PROJECT_PATH, "data"))
# Django settings for blechreiz project.
DEBUG = True
TEMPLATE_DEBUG = DEBUG
ADMINS = (
('Martin Bauer', 'bauer_martin@gmx.de'),
)
ADMINS = [
("Martin Bauer", "bauer_martin@gmx.de"),
]
MANAGERS = ADMINS
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(DATA_PATH, 'database.sqlite'),
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": os.path.join(PROJECT_PATH, "database.sqlite"),
}
}
# Default primary key field type
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
# Email
EMAIL_HOST = 'smtp.blechreiz.com'
EMAIL_HOST_USER = 'm02b721a'
EMAIL_HOST_PASSWORD = '9Hp4WG5bZ2WVPX5z'
EMAIL_HOST = "smtp.blechreiz.com"
EMAIL_HOST_USER = "m02b721a"
EMAIL_HOST_PASSWORD = "9Hp4WG5bZ2WVPX5z"
EMAIL_USE_TLS = False
# Hosts/domain names that are valid for this site; required if DEBUG is False
# See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts
ALLOWED_HOSTS = []
ALLOWED_HOSTS = ["localhost", "127.0.0.1", ".blechreiz.com", ".bauer.technology"]
# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# In a Windows environment this must be set to your system time zone.
TIME_ZONE = 'Europe/Berlin'
# Local time zone for this installation.
TIME_ZONE = "Europe/Berlin"
# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'de'
# Language code for this installation.
LANGUAGE_CODE = "de"
SITE_ID = 1
# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
# Internationalization
USE_I18N = True
# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale.
USE_L10N = True
# If you set this to False, Django will not use timezone-aware datetimes.
USE_TZ = True
# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/var/www/example.com/media/"
MEDIA_ROOT = PROJECT_PATH + "/media"
MEDIA_ROOT = PROJECT_PATH + "/media/"
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash.
# Examples: "http://example.com/media/", "http://media.example.com/"
MEDIA_URL = '/media/'
# URL that handles the media served from MEDIA_ROOT.
MEDIA_URL = "/media/"
# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/var/www/example.com/static/"
STATIC_ROOT = PROJECT_PATH + '/static_collection'
STATIC_ROOT = PROJECT_PATH + "/static_collection"
# URL prefix for static files.
# Example: "http://example.com/static/", "http://static.example.com/"
STATIC_URL = '/static/'
STATIC_URL = "/static/"
LOGIN_URL = "/musicians/login"
PUBLIC_URLS = ("^musicians/login/?$", "^musicians/login/usernames/?$", "^eventplanner_gcal/gcalApiCallback*")
PUBLIC_URLS = (
"^musicians/login/?$",
"^musicians/login/usernames/?$",
"^eventplanner_gcal/gcalApiCallback*",
)
# Additional locations of static files
STATICFILES_DIRS = (
#PROJECT_PATH + '/static',
# Put strings here, like "/home/html/static" or "C:/www/django/static".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
)
STATICFILES_DIRS = [
PROJECT_PATH + "/static",
]
# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
# 'django.contrib.staticfiles.finders.DefaultStorageFinder',
)
# List of finder classes that know how to find static files in various locations.
STATICFILES_FINDERS = [
"django.contrib.staticfiles.finders.FileSystemFinder",
"django.contrib.staticfiles.finders.AppDirectoriesFinder",
]
# Make this unique, and don't share it with anybody.
SECRET_KEY = 'x$8&9s6t%eeg=wyhar87934wh_s$dbpm(73g4ho&n)9_wogj6p'
SECRET_KEY = "x$8&9s6t%eeg=wyhar87934wh_s$dbpm(73g4ho&n)9_wogj6p"
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
"blechreiz.middleware.EnforceLoginMiddleware",
"blechreiz.middleware.DetectDevice",
]
ROOT_URLCONF = "blechreiz.urls"
# Python dotted path to the WSGI application used by Django's runserver.
WSGI_APPLICATION = "blechreiz.wsgi.application"
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
PROJECT_PATH + '/templates',
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [
PROJECT_PATH + "/templates",
],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
# Insert your TEMPLATE_CONTEXT_PROCESSORS here or use this
# list if you haven't customized them:
'django.contrib.auth.context_processors.auth',
'django.template.context_processors.i18n',
'django.template.context_processors.request',
'django.template.context_processors.media',
'django.template.context_processors.static',
'sekizai.context_processors.sekizai',
"APP_DIRS": True,
"OPTIONS": {
"context_processors": [
"django.template.context_processors.debug",
"django.template.context_processors.request",
"django.contrib.auth.context_processors.auth",
"django.contrib.messages.context_processors.messages",
"django.template.context_processors.i18n",
"django.template.context_processors.media",
"django.template.context_processors.static",
"sekizai.context_processors.sekizai",
],
},
},
]
MIDDLEWARE = (
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
#'blechreiz.middleware.EnforceLoginMiddleware',
'blechreiz.middleware.DetectDevice',
# Uncomment the next line for simple clickjacking protection:
# 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
ROOT_URLCONF = 'blechreiz.urls'
# Python dotted path to the WSGI application used by Django's runserver.
WSGI_APPLICATION = 'blechreiz.wsgi.application'
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin',
'django.contrib.admindocs',
'crispy_forms', # better looking forms ( bootstrap )
'sekizai', # for the addtoblock directive in templates
'rest_framework', # for event management api
# Own Things
'bootstrapTheme', # Theme
'website', # Blechreiz Website in general
'musicians', # User Management
'eventplanner', # Event Management
'eventplanner_gcal', # Event Management Sync with Google Calendar
'simpleforum', # Messages ( Forum )
'location_field', # custom location field used in Event Management
'scoremanager', # manager of scores, repertoire etc.
# 'imagestore',
# 'sorl.thumbnail',
# 'tagging'
)
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.sites",
"django.contrib.messages",
"django.contrib.staticfiles",
# Third-party apps
"crispy_forms",
"crispy_bootstrap5",
"sekizai",
"rest_framework",
# Own apps
"bootstrapTheme",
"website",
"musicians",
"eventplanner",
"eventplanner_gcal",
"simpleforum",
"location_field",
"scoremanager",
# 'imagestore', # Disabled
]
IMAGESTORE_TEMPLATE = "website/base.html"
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAuthenticated',),
'PAGINATE_BY': 10
"DEFAULT_PERMISSION_CLASSES": ["rest_framework.permissions.IsAuthenticated"],
"DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.PageNumberPagination",
"PAGE_SIZE": 10,
}
GCAL_COUPLING = {
'eventPrefix': 'Blechreiz: ',
'developerKey': 'blechreiz-homepage',
'clientId': '34462582242-4kpdvvbi27ajt4u22uitqurpve9o8ipj.apps.googleusercontent.com',
'client_secret': 'y4t9XBrJdCODPTO5UvtONWWn',
'credentials_file': DATA_PATH + '/calendarCredentials.dat',
'push_url': "https://blechreiz.bauer.technology/eventplanner_gcal/gcalApiCallback",
"eventPrefix": "Blechreiz: ",
"developerKey": "blechreiz-homepage",
"clientId": "34462582242-4kpdvvbi27ajt4u22uitqurpve9o8ipj.apps.googleusercontent.com",
"client_secret": "y4t9XBrJdCODPTO5UvtONWWn",
"credentials_file": PROJECT_PATH + "/calendarCredentials.dat",
"push_url": "https://blechreiz.bauer.technology/eventplanner_gcal/gcalApiCallback",
}
GOOGLE_MAPS_API_KEY = 'AIzaSyCf9Lm5ckjmVd08scTOd7fB1dC_UCoumKg'
GCAL_SYNC_ENABLED = True
CRISPY_TEMPLATE_PACK = 'bootstrap'
# Crispy Forms configuration
CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap5"
CRISPY_TEMPLATE_PACK = "bootstrap5"
# A sample logging configuration. The only tangible logging
# performed by this configuration is to send an email to
# the site admins on every HTTP 500 error when DEBUG=False.
# See http://docs.djangoproject.com/en/dev/topics/logging for
# more details on how to customize your logging configuration.
# Logging configuration
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '{levelname} {asctime} {module} {message}',
'style': '{',
"version": 1,
"disable_existing_loggers": False,
"handlers": {
"file": {
"level": "DEBUG",
"class": "logging.FileHandler",
"filename": PROJECT_PATH + "/eventplanner.log",
},
'simple': {
'format': '{levelname} {asctime} {message}',
'style': '{',
"console": {
"level": "DEBUG",
"class": "logging.StreamHandler",
},
},
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': DATA_PATH + '/eventplanner.log',
"loggers": {
"eventplanner_gcal": {
"handlers": ["file", "console"],
"level": "DEBUG",
"propagate": True,
},
"eventplanner": {
"handlers": ["file", "console"],
"level": "DEBUG",
"propagate": True,
},
},
'loggers': {
'eventplanner_gcal': {
'handlers': ['file'],
'level': 'DEBUG',
'propagate': True,
},
'eventplanner': {
'handler': ['file'],
'level': 'DEBUG',
'propagate': True,
}
},
}

View File

@@ -1,28 +1,21 @@
from django.conf.urls import include, url
from django.contrib import admin
import simpleforum.views
import eventplanner.urls
import musicians.urls
import website.urls
import scoremanager.urls
import eventplanner_gcal.urls
from . import settings
from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import include, path, re_path
admin.autodiscover()
from simpleforum import views as simpleforum_views
urlpatterns = [
url(r'^', include(website.urls)),
url(r'^events/', include(eventplanner.urls.urlpatterns)),
url(r'^musicians/', include(musicians.urls.urlpatterns)),
url(r'^scores/', include(scoremanager.urls.urlpatterns)),
url(r'^messages/$', simpleforum.views.message_view),
url(r'^admin/', admin.site.urls),
url(r'^location_field/', include('location_field.urls')),
url(r'^eventplanner_gcal/', include(eventplanner_gcal.urls)),
# url(r'^gallery/', include(imagestore.urls, namespace='imagestore') ),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
path("", include("website.urls")),
path("events/", include("eventplanner.urls")),
path("musicians/", include("musicians.urls")),
path("scores/", include("scoremanager.urls")),
path("messages/", simpleforum_views.message_view),
path("admin/", admin.site.urls),
path("location_field/", include("location_field.urls")),
path("eventplanner_gcal/", include("eventplanner_gcal.urls")),
# url(r'^gallery/', include('imagestore.urls', namespace='imagestore')),
]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

View File

@@ -1,32 +1,16 @@
"""
WSGI config for blechreiz project.
This module contains the WSGI application used by Django's development server
and any production WSGI deployments. It should expose a module-level variable
named ``application``. Django's ``runserver`` and ``runfcgi`` commands discover
this application via the ``WSGI_APPLICATION`` setting.
Usually you will have the standard Django WSGI application here, but it also
might make sense to replace the whole Django WSGI application with a custom one
that later delegates to the Django one. For example, you could introduce WSGI
middleware here, or combine a Django application with an application of another
framework.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/5.1/howto/deployment/wsgi/
"""
import os
# We defer to a DJANGO_SETTINGS_MODULE already in the environment. This breaks
# if running multiple sites in the same mod_wsgi process. To fix this, use
# mod_wsgi daemon mode with each site in its own daemon process, or use
# os.environ["DJANGO_SETTINGS_MODULE"] = "blechreiz.settings"
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "blechreiz.settings")
# This application object is used by any WSGI server configured to use this
# file. This includes Django's development server, if the WSGI_APPLICATION
# setting points here.
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
# Apply WSGI middleware here.
# from helloworld.wsgi import HelloWorldApplication
# application = HelloWorldApplication(application)