Moved project to src

This commit is contained in:
Götz 2019-04-12 23:30:27 +02:00
parent 05c2e7f259
commit 0bd3020aee
219 changed files with 352 additions and 99 deletions

11
Dockerfile Normal file
View File

@ -0,0 +1,11 @@
FROM alpine:3.9
ADD ["requirements.txt", "/requirements.txt"]
RUN apk upgrade --update && \
apk add --update python3 build-base openldap-dev python3-dev py3-psycopg2 && \
pip3 install -r /requirements.txt && rm /requirements.txt
WORKDIR /lama
EXPOSE 80
ADD ["src", "/lama"]
ENTRYPOINT ["python3", "manage.py"]
CMD ["runserver", "0.0.0.0:80"]

View File

@ -1,73 +0,0 @@
from django.urls import path
import account_manager.views.group_views
import account_manager.views.user_views
from . import main_views
urlpatterns = [
# Realm
path('', main_views.realm_list, name='realm-home'),
path('realm/add/', main_views.realm_add, name='realm-add'),
path('realm/<int:realm_id>/', main_views.realm_detail, name='realm-detail'),
path('realm/<int:realm_id>/update/', main_views.realm_update, name='realm-update'),
path('realm/<int:realm_id>/delete/confirm/', main_views.realm_delete_confirm, name='realm-delete-confirm'),
path('realm/<int:realm_id>/delete/', main_views.realm_delete, name='realm-delete'),
path('realm/<int:realm_id>/mail/test/', main_views.realm_email_test, name='realm-mail-test'),
# Realm User
path('realm/<int:realm_id>/users/', account_manager.views.user_views.realm_user, name='realm-user-list'),
path('realm/<int:realm_id>/users/add/', account_manager.views.user_views.user_add, name='realm-user-add'),
path('realm/<int:realm_id>/user/<str:user_dn>/', account_manager.views.user_views.realm_user_detail,
name='realm-user-detail'),
path('realm/<int:realm_id>/user/<str:user_dn>/update/', account_manager.views.user_views.realm_user_update,
name='realm-user-update'),
path('realm/<int:realm_id>/user/<str:user_dn>/group/update/',
account_manager.views.user_views.realm_user_group_update,
name='realm-user-group-update'),
path('realm/<int:realm_id>/user/<str:user_dn>/group/update/add/',
account_manager.views.user_views.realm_user_group_update_add,
name='realm-user-group-update-add'),
path('realm/<int:realm_id>/user/<str:user_dn>/group/update/delete/',
account_manager.views.user_views.realm_user_group_update_delete,
name='realm-user-group-update-delete'),
path('realm/<int:realm_id>/user/delete/single/<str:user_dn>/confirm/',
account_manager.views.user_views.realm_user_delete_confirm,
name='realm-user-delete-confirm'),
path('realm/<int:realm_id>/user/delete/single/<str:user_dn>/',
account_manager.views.user_views.realm_user_delete,
name='realm-user-delete'),
path('realm/<int:realm_id>/user/delete/multiple/confirm/',
account_manager.views.user_views.realm_multiple_user_delete_confirm,
name='realm-multiple-user-delete-confirm'),
path('realm/<int:realm_id>/user/delete/multiple/', account_manager.views.user_views.realm_multiple_user_delete,
name='realm-multiple-user-delete'),
# Realm Group
path('realm/<int:realm_id>/groups/', account_manager.views.group_views.realm_groups, name='realm-group-list'),
path('realm/<int:realm_id>/groups/add/', account_manager.views.group_views.group_add, name='realm-group-add'),
path('realm/<int:realm_id>/group/<str:group_dn>/', account_manager.views.group_views.group_detail,
name='realm-group-detail'),
path('realm/<int:realm_id>/group/<str:group_dn>/update/', account_manager.views.group_views.group_update,
name='realm-group-update'),
path('realm/<int:realm_id>/group/<str:group_dn>/delete/confirm/', account_manager.views.group_views.group_delete_confirm,
name='realm-group-delete-confirm'),
path('realm/<int:realm_id>/group/<str:group_dn>/delete/', account_manager.views.group_views.group_delete,
name='realm-group-delete'),
# User
path('user/<str:user_dn>/update/realm/<int:realm_id>/', account_manager.views.user_views.user_update,
name='user-update'),
path('user/<str:user_dn>/delete/realm/<int:realm_id>/confirm/',
account_manager.views.user_views.user_delete_confirm,
name='user-delete-confirm'),
path('user/<str:user_dn>/delete/realm/<int:realm_id>/', account_manager.views.user_views.user_delete,
name='user-delete'),
path('accounts/reset/<uidb64>/<token>/', account_manager.views.user_views.LdapPasswordResetConfirmView.as_view(),
name='ldap_password_reset_confirm'),
path('accounts/password_change/', account_manager.views.user_views.LdapPasswordChangeView.as_view(),
name='password_change'),
# Extra
path('permission-denied/', main_views.permission_denied, name='permission-denied'),
path('accounts/deleted/<int:realm_id>/', account_manager.views.user_views.user_deleted, name='account-deleted'),
]

27
docker-compose.prod.yml Normal file
View File

@ -0,0 +1,27 @@
version: "3"
networks:
pg_db:
internal: true
services:
lama:
image: lama:0.1
build:
context: .
dockerfile: Dockerfile
networks:
- pg_db
env_file:
- production.env
ports:
- 8888:80
dblama:
image: postgres:11.2-alpine
networks:
- pg_db
volumes:
- ./data/pgdata/:/var/lib/postgresql/data/
env_file:
- production.env

33
production.env Normal file
View File

@ -0,0 +1,33 @@
DJANGO_SETTINGS_MODULE=core.docker_settings
DOMAIN=example.de
SITE_NAME="LAMa"
SECRET_KEY=supersecret
ALLOWED_HOSTS=
DATABASE_HOST=dbzitate
DATABASE_PORT=5432
POSTGRES_USER=quote_man
POSTGRES_PASSWORD=secret
DEBUG=False
LDAP_SERVER_URI="ldap://localhost:1389"
LDAP_BIND_DN="cn=admin,dc=example,dc=de"
LDAP_BIND_PASSWORD="secret"
LDAP_USER_ENTRY="ou=persons,dc=example,dc=de"
LDAP_USER_SELECTOR="(cn=%(user)s)"
LDAP_GROUP_ENTRY='ou=groups,dc=example,dc=de'
LDAP_GROUP_SELECTOR='(objectClass=groupOfNames)'
LDAP_GROUP_NAME_ATTR="cn"
EMAIL_HOST=smtp.uni-bamberg.de
EMAIL_PORT=587
EMAIL_USE_TLS=False
EMAIL_USE_SSL=False
DEFAULT_FROM_EMAIL=
SERVER_EMAIL=

View File

@ -1,4 +1,5 @@
Django==2.1.7 Django==2.1.7
python-ldap==3.2.0 python-ldap==3.2.0
django-auth-ldap==1.7.0
django-ldapdb==1.3.0 django-ldapdb==1.3.0
Jinja2==2.10 Jinja2==2.10

View File

@ -2,4 +2,4 @@ from django.apps import AppConfig
class RdnHelperConfig(AppConfig): class RdnHelperConfig(AppConfig):
name = 'account_helper' name = 'src.account_helper'

View File

@ -1,5 +1,5 @@
from django.core.management.base import BaseCommand, CommandError from django.core.management.base import BaseCommand
from account_helper.models import LdapGroupRDN, LdapUserRDN from src.account_helper import LdapGroupRDN, LdapUserRDN
LDAP_OUS = ['ou=fs_wiai,ou=fachschaften', 'ou=fs_sowi,ou=fachschaften'] LDAP_OUS = ['ou=fs_wiai,ou=fachschaften', 'ou=fs_sowi,ou=fachschaften']

View File

@ -2,4 +2,4 @@ from django.apps import AppConfig
class AccountManagerConfig(AppConfig): class AccountManagerConfig(AppConfig):
name = 'account_manager' name = 'src.account_manager'

View File

@ -9,8 +9,8 @@ from django.core.exceptions import ObjectDoesNotExist
from django.db import IntegrityError from django.db import IntegrityError
from django.shortcuts import render, redirect, HttpResponse from django.shortcuts import render, redirect, HttpResponse
from account_helper.models import Realm from src.account_helper import Realm
from account_manager.utils.mail_utils import realm_send_mail from src.account_manager import realm_send_mail
from .forms import RealmAddForm, RealmUpdateForm from .forms import RealmAddForm, RealmUpdateForm
from .models import LdapGroup, LdapUser from .models import LdapGroup, LdapUser
from ldap import LDAPError from ldap import LDAPError

View File

@ -1,8 +1,7 @@
from django.core.management.base import BaseCommand, CommandError from django.core.management.base import BaseCommand
from django.contrib.auth.models import User from django.contrib.auth.models import User
from account_manager.models import UserProfile
import ldap import ldap
import core.settings as settings from src import core as settings
LDAP_CONFIGS = [(settings.AUTH_LDAP_1_SERVER_URI, settings.AUTH_LDAP_1_USER_DN_TEMPLATE), LDAP_CONFIGS = [(settings.AUTH_LDAP_1_SERVER_URI, settings.AUTH_LDAP_1_USER_DN_TEMPLATE),
(settings.AUTH_LDAP_2_SERVER_URI, settings.AUTH_LDAP_2_USER_DN_TEMPLATE)] (settings.AUTH_LDAP_2_SERVER_URI, settings.AUTH_LDAP_2_USER_DN_TEMPLATE)]

View File

@ -10,12 +10,11 @@ from django.db.models import Q
from ldapdb.models import fields as ldap_fields from ldapdb.models import fields as ldap_fields
from ldapdb.models.base import Model from ldapdb.models.base import Model
from core.settings import PASSWORD_RESET_TIMEOUT_DAYS from src.core.settings import PASSWORD_RESET_TIMEOUT_DAYS
from account_manager.utils.mail_utils import realm_send_mail from src.account_manager.utils.mail_utils import realm_send_mail
from multiprocessing import Process from multiprocessing import Process
from ldap import NO_SUCH_OBJECT, ALREADY_EXISTS from ldap import NO_SUCH_OBJECT, ALREADY_EXISTS
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from account_manager.utils.dbldap import get_filterstr
class LdapUser(Model): class LdapUser(Model):

View File

@ -0,0 +1,71 @@
from django.urls import path
from . import main_views
urlpatterns = [
# Realm
path('', main_views.realm_list, name='realm-home'),
path('realm/add/', main_views.realm_add, name='realm-add'),
path('realm/<int:realm_id>/', main_views.realm_detail, name='realm-detail'),
path('realm/<int:realm_id>/update/', main_views.realm_update, name='realm-update'),
path('realm/<int:realm_id>/delete/confirm/', main_views.realm_delete_confirm, name='realm-delete-confirm'),
path('realm/<int:realm_id>/delete/', main_views.realm_delete, name='realm-delete'),
path('realm/<int:realm_id>/mail/test/', main_views.realm_email_test, name='realm-mail-test'),
# Realm User
path('realm/<int:realm_id>/users/', src.account_manager.views.user_views.realm_user, name='realm-user-list'),
path('realm/<int:realm_id>/users/add/', src.account_manager.views.user_views.user_add, name='realm-user-add'),
path('realm/<int:realm_id>/user/<str:user_dn>/', src.account_manager.views.user_views.realm_user_detail,
name='realm-user-detail'),
path('realm/<int:realm_id>/user/<str:user_dn>/update/', src.account_manager.views.user_views.realm_user_update,
name='realm-user-update'),
path('realm/<int:realm_id>/user/<str:user_dn>/group/update/',
src.account_manager.views.user_views.realm_user_group_update,
name='realm-user-group-update'),
path('realm/<int:realm_id>/user/<str:user_dn>/group/update/add/',
src.account_manager.views.user_views.realm_user_group_update_add,
name='realm-user-group-update-add'),
path('realm/<int:realm_id>/user/<str:user_dn>/group/update/delete/',
src.account_manager.views.user_views.realm_user_group_update_delete,
name='realm-user-group-update-delete'),
path('realm/<int:realm_id>/user/delete/single/<str:user_dn>/confirm/',
src.account_manager.views.user_views.realm_user_delete_confirm,
name='realm-user-delete-confirm'),
path('realm/<int:realm_id>/user/delete/single/<str:user_dn>/',
src.account_manager.views.user_views.realm_user_delete,
name='realm-user-delete'),
path('realm/<int:realm_id>/user/delete/multiple/confirm/',
src.account_manager.views.user_views.realm_multiple_user_delete_confirm,
name='realm-multiple-user-delete-confirm'),
path('realm/<int:realm_id>/user/delete/multiple/', src.account_manager.views.user_views.realm_multiple_user_delete,
name='realm-multiple-user-delete'),
# Realm Group
path('realm/<int:realm_id>/groups/', src.account_manager.views.group_views.realm_groups, name='realm-group-list'),
path('realm/<int:realm_id>/groups/add/', src.account_manager.views.group_views.group_add, name='realm-group-add'),
path('realm/<int:realm_id>/group/<str:group_dn>/', src.account_manager.views.group_views.group_detail,
name='realm-group-detail'),
path('realm/<int:realm_id>/group/<str:group_dn>/update/', src.account_manager.views.group_views.group_update,
name='realm-group-update'),
path('realm/<int:realm_id>/group/<str:group_dn>/delete/confirm/', src.account_manager.views.group_views.group_delete_confirm,
name='realm-group-delete-confirm'),
path('realm/<int:realm_id>/group/<str:group_dn>/delete/', src.account_manager.views.group_views.group_delete,
name='realm-group-delete'),
# User
path('user/<str:user_dn>/update/realm/<int:realm_id>/', src.account_manager.views.user_views.user_update,
name='user-update'),
path('user/<str:user_dn>/delete/realm/<int:realm_id>/confirm/',
src.account_manager.views.user_views.user_delete_confirm,
name='user-delete-confirm'),
path('user/<str:user_dn>/delete/realm/<int:realm_id>/', src.account_manager.views.user_views.user_delete,
name='user-delete'),
path('accounts/reset/<uidb64>/<token>/', src.account_manager.views.user_views.LdapPasswordResetConfirmView.as_view(),
name='ldap_password_reset_confirm'),
path('accounts/password_change/', src.account_manager.views.user_views.LdapPasswordChangeView.as_view(),
name='password_change'),
# Extra
path('permission-denied/', main_views.permission_denied, name='permission-denied'),
path('accounts/deleted/<int:realm_id>/', src.account_manager.views.user_views.user_deleted, name='account-deleted'),
]

View File

@ -3,7 +3,7 @@ import logging
from django.core.mail import get_connection, send_mail from django.core.mail import get_connection, send_mail
from django.utils.html import strip_tags from django.utils.html import strip_tags
from core.settings import EMAIL_HOST, EMAIL_PORT, EMAIL_USE_SSL, EMAIL_USE_TLS from src.core import EMAIL_HOST, EMAIL_PORT, EMAIL_USE_SSL, EMAIL_USE_TLS
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View File

@ -4,10 +4,10 @@ from django.contrib.auth.decorators import login_required
from django.db.models import Q from django.db.models import Q
from django.shortcuts import render, redirect from django.shortcuts import render, redirect
from django.http import HttpResponse from django.http import HttpResponse
from account_helper.models import Realm from src.account_helper import Realm
from account_manager.forms import AddLDAPGroupForm from src.account_manager import AddLDAPGroupForm
from account_manager.main_views import is_realm_admin from src.account_manager.main_views import is_realm_admin
from account_manager.models import LdapGroup, LdapUser from src.account_manager import LdapGroup, LdapUser
def protect_cross_realm_group_access(view_func): def protect_cross_realm_group_access(view_func):

View File

@ -5,11 +5,11 @@ from django.contrib.sites.shortcuts import get_current_site
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.shortcuts import render, redirect from django.shortcuts import render, redirect
from ldap import ALREADY_EXISTS, OBJECT_CLASS_VIOLATION from ldap import ALREADY_EXISTS, OBJECT_CLASS_VIOLATION
from account_helper.models import Realm from src.account_helper import Realm
from account_manager.forms import AddLDAPUserForm, UserDeleteListForm, UpdateLDAPUserForm, AdminUpdateLDAPUserForm, \ from src.account_manager import AddLDAPUserForm, UserDeleteListForm, UpdateLDAPUserForm, AdminUpdateLDAPUserForm, \
UserGroupListForm UserGroupListForm
from account_manager.main_views import is_realm_admin from src.account_manager.main_views import is_realm_admin
from account_manager.models import LdapUser, LdapGroup from src.account_manager import LdapUser, LdapGroup
@login_required @login_required

0
src/core/__init__.py Normal file
View File

185
src/core/docker_settings.py Normal file
View File

@ -0,0 +1,185 @@
"""
Django settings for core project.
Generated by 'django-admin startproject' using Django 2.1.7.
For more information on this file, see
https://docs.djangoproject.com/en/2.1/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.1/ref/settings/
"""
import os
import ldap
from django_auth_ldap.config import LDAPSearch, GroupOfNamesType
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
DOMAIN = os.environ['DOMAIN']
SITE_NAME = os.environ['SITE_NAME']
SECRET_KEY = os.environ['SECRET_KEY']
DEBUG = bool(os.environ.get('DEBUG', False))
ALLOWED_HOSTS = os.environ['ALLOWED_HOSTS'].split()
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'account_manager',
'account_helper',
]
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',
]
ROOT_URLCONF = 'src.core.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.jinja2.Jinja2',
'DIRS': [
'templates',
],
'APP_DIRS': True,
'OPTIONS': {
'environment': 'core.jinja2.environment'
},
},
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': ['templates/admin', ],
'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',
],
},
},
]
WSGI_APPLICATION = 'core.wsgi.application'
# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases
DATABASES = {
'ldap': {
'ENGINE': 'ldapdb.backends.ldap',
'NAME': os.environ['LDAP_SERVER_URI'],
'USER': os.environ.get('LDAP_ADMIN_USER_NAME', ''),
'PASSWORD': os.environ.get('LDAP_ADMIN_USER_PASSWORD', ''),
},
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': os.environ.get('POSTGRES_USER', ''),
'USER': os.environ.get('POSTGRES_USER', ''),
'PASSWORD': os.environ.get('POSTGRES_PASSWORD', ''),
'HOST': os.environ.get('DATABASE_HOST', ''),
'PORT': os.environ.get('DATABASE_PORT', ''),
}
}
DATABASE_ROUTERS = ['ldapdb.router.Router']
# Password validation
# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/2.1/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/
STATIC_URL = '/static/'
# STATIC_ROOT = 'static'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, '../../static/'),
)
########################################################################################################################
# LDAP Config #
########################################################################################################################
AUTHENTICATION_BACKENDS = [
'multiple_ldap_backends.ldap.LDAPBackend1',
'multiple_ldap_backends.ldap.LDAPBackend2',
'django.contrib.auth.backends.ModelBackend',
]
AUTH_LDAP_SERVER_URI = os.environ['LDAP_SERVER_URI']
# AUTH_LDAP_USER_DN_TEMPLATE = "uid=%(user)s,ou=people,ou=fs_wiai,ou=fachschaften,dc=stuve,dc=de"
AUTH_LDAP_USER_SEARCH = LDAPSearch(os.environ['LDAP_USER_ENTRY'], ldap.SCOPE_SUBTREE,
os.environ['LDAP_USER_SELECTOR'])
AUTH_LDAP_GROUP_SEARCH = LDAPSearch(
os.environ['LDAP_GROUP_ENTRY'],
ldap.SCOPE_SUBTREE,
os.environ['LDAP_GROUP_SELECTOR'],
)
AUTH_LDAP_GROUP_TYPE = GroupOfNamesType(name_attr=os.environ['LDAP_GROUP_NAME_ATTR'])
AUTH_LDAP_MIRROR_GROUPS = True
AUTH_LDAP_USER_ATTR_MAP = {
'first_name': 'cn',
'last_name': 'sn',
'email': 'mail',
}
AUTH_PROFILE_MODULE = 'account_manager.UserProfile'
########################################################################################################################
# EMAIL Config #
########################################################################################################################
# EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend'
# EMAIL_FILE_PATH = os.path.join(BASE_DIR, "sent_emails")
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_TIMEOUT = 15
EMAIL_HOST = os.environ['EMAIL_HOST']
EMAIL_PORT = os.environ['EMAIL_PORT']
EMAIL_USE_TLS = bool(os.environ.get('EMAIL_USE_TLS', False))
EMAIL_USE_SSL = bool(os.environ.get('EMAIL_USE_SSL', False))
DEFAULT_FROM_EMAIL = os.environ['DEFAULT_FROM_EMAIL']
SERVER_EMAIL = os.environ['SERVER_EMAIL']
########################################################################################################################
# Logging Config #
########################################################################################################################
LOGIN_URL = 'login'
LOGIN_REDIRECT_URL = 'realm-home'
PASSWORD_RESET_TIMEOUT_DAYS = 3

View File

@ -54,7 +54,7 @@ MIDDLEWARE = [
'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware',
] ]
ROOT_URLCONF = 'core.urls' ROOT_URLCONF = 'src.core.urls'
TEMPLATES = [ TEMPLATES = [
{ {
@ -96,7 +96,7 @@ DATABASES = {
}, },
'default': { 'default': {
'ENGINE': 'django.db.backends.sqlite3', 'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 'NAME': os.path.join(BASE_DIR, '../../db.sqlite3'),
} }
} }
DATABASE_ROUTERS = ['ldapdb.router.Router'] DATABASE_ROUTERS = ['ldapdb.router.Router']
@ -137,7 +137,7 @@ USE_TZ = True
STATIC_URL = '/static/' STATIC_URL = '/static/'
# STATIC_ROOT = 'static' # STATIC_ROOT = 'static'
STATICFILES_DIRS = ( STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static/'), os.path.join(BASE_DIR, '../../static/'),
) )
######################################################################################################################## ########################################################################################################################
@ -206,7 +206,7 @@ LOGGING = {
}, },
'file': { 'file': {
'class': 'logging.FileHandler', 'class': 'logging.FileHandler',
'filename': './logs/import_food.log', 'filename': '../logs/import_food.log',
'formatter': 'default', 'formatter': 'default',
}, },
'mail_admins': { 'mail_admins': {

View File

@ -22,7 +22,7 @@ from .views import about
login_forbidden = user_passes_test(lambda u: u.is_anonymous(), '/') login_forbidden = user_passes_test(lambda u: u.is_anonymous(), '/')
urlpatterns = [ urlpatterns = [
path('', include('account_manager.urls')), path('', include('src.account_manager.urls')),
path('admin/', admin.site.urls), path('admin/', admin.site.urls),
path('accounts/login/', auth_views.LoginView.as_view(redirect_authenticated_user=True), name='login'), path('accounts/login/', auth_views.LoginView.as_view(redirect_authenticated_user=True), name='login'),
path('about/', about, name='about'), path('about/', about, name='about'),

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 331 B

After

Width:  |  Height:  |  Size: 331 B

View File

Before

Width:  |  Height:  |  Size: 504 B

After

Width:  |  Height:  |  Size: 504 B

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 380 B

After

Width:  |  Height:  |  Size: 380 B

View File

Before

Width:  |  Height:  |  Size: 677 B

After

Width:  |  Height:  |  Size: 677 B

View File

Before

Width:  |  Height:  |  Size: 392 B

After

Width:  |  Height:  |  Size: 392 B

View File

Before

Width:  |  Height:  |  Size: 560 B

After

Width:  |  Height:  |  Size: 560 B

View File

Before

Width:  |  Height:  |  Size: 655 B

After

Width:  |  Height:  |  Size: 655 B

View File

Before

Width:  |  Height:  |  Size: 655 B

After

Width:  |  Height:  |  Size: 655 B

View File

Before

Width:  |  Height:  |  Size: 581 B

After

Width:  |  Height:  |  Size: 581 B

View File

Before

Width:  |  Height:  |  Size: 436 B

After

Width:  |  Height:  |  Size: 436 B

View File

Before

Width:  |  Height:  |  Size: 560 B

After

Width:  |  Height:  |  Size: 560 B

View File

Before

Width:  |  Height:  |  Size: 458 B

After

Width:  |  Height:  |  Size: 458 B

View File

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 331 B

After

Width:  |  Height:  |  Size: 331 B

View File

Before

Width:  |  Height:  |  Size: 280 B

After

Width:  |  Height:  |  Size: 280 B

Some files were not shown because too many files have changed in this diff Show More