Initial commit (Clean history)
This commit is contained in:
@@ -0,0 +1,5 @@
|
||||
|
||||
venv/
|
||||
.env/
|
||||
__pycache__/
|
||||
*.pyc
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
FROM python:3.13.5-slim-bookworm
|
||||
ENV PYTHONUNBUFFERED=1
|
||||
WORKDIR /code
|
||||
RUN apt update
|
||||
RUN apt install -y libgl1-mesa-glx
|
||||
RUN apt install -y libglib2.0-0
|
||||
RUN apt install libreoffice -y
|
||||
RUN apt-get update && \
|
||||
apt-get install -y wget gnupg lsb-release && \
|
||||
sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' && \
|
||||
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - && \
|
||||
apt-get update && \
|
||||
apt-get install -y postgresql-client-17 && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get install -y sshpass openssh-client && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
RUN apt-get update && apt-get install rsync -y
|
||||
|
||||
COPY requirements.txt /code/
|
||||
RUN pip3 install -r requirements.txt
|
||||
COPY . /code/
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+18
@@ -0,0 +1,18 @@
|
||||
import os
|
||||
|
||||
# Set the settings module before any other Django-related imports.
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'api.settings')
|
||||
|
||||
from django.core.asgi import get_asgi_application
|
||||
from channels.routing import ProtocolTypeRouter, URLRouter
|
||||
from channels.auth import AuthMiddlewareStack
|
||||
import app.routing
|
||||
|
||||
application = ProtocolTypeRouter({
|
||||
"http": get_asgi_application(),
|
||||
"websocket": AuthMiddlewareStack(
|
||||
URLRouter(
|
||||
app.routing.websocket_urlpatterns
|
||||
)
|
||||
),
|
||||
})
|
||||
+162
@@ -0,0 +1,162 @@
|
||||
"""
|
||||
Django settings for api project.
|
||||
|
||||
Generated by 'django-admin startproject' using Django 4.1.3.
|
||||
|
||||
For more information on this file, see
|
||||
https://docs.djangoproject.com/en/4.1/topics/settings/
|
||||
|
||||
For the full list of settings and their values, see
|
||||
https://docs.djangoproject.com/en/4.1/ref/settings/
|
||||
"""
|
||||
from pathlib import Path
|
||||
|
||||
# Build paths inside the project like this: BASE_DIR / 'subdir'.
|
||||
BASE_DIR = Path(__file__).resolve().parent.parent
|
||||
|
||||
# Quick-start development settings - unsuitable for production
|
||||
# See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/
|
||||
|
||||
# SECURITY WARNING: keep the secret key used in production secret!
|
||||
SECRET_KEY = 'django-insecure-_u202k$8qq2p*cr_eo(7k!0ngr5^n)27@85+5oy8&41(u6&j54'
|
||||
|
||||
# SECURITY WARNING: don't run with debug turned on in production!
|
||||
DEBUG = True
|
||||
|
||||
ALLOWED_HOSTS = ['*']
|
||||
|
||||
# Application definition
|
||||
|
||||
INSTALLED_APPS = [
|
||||
'channels',
|
||||
'django.contrib.admin',
|
||||
'django.contrib.auth',
|
||||
'django.contrib.contenttypes',
|
||||
'django.contrib.sessions',
|
||||
'django.contrib.messages',
|
||||
'django.contrib.staticfiles',
|
||||
'app',
|
||||
'rest_framework',
|
||||
'corsheaders',
|
||||
'django_extensions'
|
||||
]
|
||||
|
||||
MIDDLEWARE = [
|
||||
# 'app.middleware.BlockUnauthorizedOriginsMiddleware',
|
||||
'django.middleware.security.SecurityMiddleware',
|
||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||
'django.middleware.common.CommonMiddleware',
|
||||
'django.middleware.csrf.CsrfViewMiddleware',
|
||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||
'app.middleware.CurrentUserMiddleware', # Add CurrentUserMiddleware
|
||||
'django.contrib.messages.middleware.MessageMiddleware',
|
||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||
'corsheaders.middleware.CorsMiddleware'
|
||||
]
|
||||
|
||||
ROOT_URLCONF = 'api.urls'
|
||||
CORS_ORIGIN_ALLOW_ALL = True
|
||||
CORS_ALLOW_CREDENTIALS = True
|
||||
|
||||
TEMPLATES = [
|
||||
{
|
||||
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||
'DIRS': [],
|
||||
'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 = 'api.wsgi.application'
|
||||
ASGI_APPLICATION = 'api.asgi.application'
|
||||
|
||||
# Database
|
||||
# https://docs.djangoproject.com/en/4.1/ref/settings/#databases
|
||||
#prod:5.223.52.193 dev:5.223.52.193
|
||||
|
||||
MODE = 'dev'
|
||||
DBHOST = '172.17.0.1' if MODE == 'prod' else '5.223.52.193'
|
||||
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django_db_geventpool.backends.postgresql_psycopg3', # Hoặc psycopg3/postgis
|
||||
'NAME': 'utopia',
|
||||
'USER': 'postgres',
|
||||
'PASSWORD': 'V59yNLN42a9Q7xT',
|
||||
'HOST': DBHOST,
|
||||
'PORT': '5423',
|
||||
'CONN_MAX_AGE': 0, # Tắt persistent connection mặc định của Django
|
||||
'OPTIONS': {
|
||||
'MAX_CONNS': 20, # Số kết nối tối đa trong pool
|
||||
'REUSE_CONNS': 10, # Số kết nối được tái sử dụng
|
||||
'pool': False
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Password validation
|
||||
# https://docs.djangoproject.com/en/4.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/4.1/topics/i18n/
|
||||
|
||||
LANGUAGE_CODE = 'en-us'
|
||||
|
||||
TIME_ZONE = 'Asia/Ho_Chi_Minh'
|
||||
|
||||
USE_I18N = True
|
||||
|
||||
USE_L10N = True
|
||||
|
||||
USE_TZ = True
|
||||
|
||||
# Static files (CSS, JavaScript, Images)
|
||||
# https://docs.djangoproject.com/en/4.1/howto/static-files/
|
||||
|
||||
STATIC_URL = '/static/'
|
||||
|
||||
# Default primary key field type
|
||||
# https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field
|
||||
|
||||
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
||||
|
||||
CACHES = {
|
||||
"default": {
|
||||
"BACKEND": "django_redis.cache.RedisCache",
|
||||
"LOCATION": f"redis://{DBHOST}:6677/1",
|
||||
"OPTIONS": {
|
||||
"CLIENT_CLASS": "django_redis.client.DefaultClient",
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CHANNEL_LAYERS = {
|
||||
"default": {
|
||||
"BACKEND": "channels_redis.core.RedisChannelLayer",
|
||||
"CONFIG": {
|
||||
"hosts": [(DBHOST, 6677)],
|
||||
},
|
||||
},
|
||||
}
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
"""api URL Configuration
|
||||
|
||||
The `urlpatterns` list routes URLs to views. For more information please see:
|
||||
https://docs.djangoproject.com/en/4.1/topics/http/urls/
|
||||
Examples:
|
||||
Function views
|
||||
1. Add an import: from my_app import views
|
||||
2. Add a URL to urlpatterns: re_path('', views.home, name='home')
|
||||
Class-based views
|
||||
1. Add an import: from other_app.views import Home
|
||||
2. Add a URL to urlpatterns: re_path('', Home.as_view(), name='home')
|
||||
Including another URLconf
|
||||
1. Import the include() function: from django.urls import include, path
|
||||
2. Add a URL to urlpatterns: re_path('blog/', include('blog.urls'))
|
||||
"""
|
||||
from django.urls import re_path
|
||||
from app import views, cob, payment, contract, cleardata, email, backup, server, workflows,api_workflow, importdata
|
||||
|
||||
urlpatterns = [
|
||||
# New Workflow Endpoints
|
||||
re_path("workflow/execute/$", api_workflow.execute_workflow),
|
||||
|
||||
# Existing Endpoints
|
||||
re_path('get-model/$', views.get_model),
|
||||
re_path('increment/(?P<name>.+)/(?P<prefix>[A-Z]+)', views.get_increment),
|
||||
re_path('increment-next/(?P<name>.+)/(?P<prefix>[A-Z]+)', views.get_increment_next),
|
||||
re_path('data/(?P<name>.+)/$', views.data_list),
|
||||
re_path('data-detail/(?P<name>.+)/(?P<pk>[0-9]+)', views.data_detail),
|
||||
re_path('get-hash/', views.get_hash),
|
||||
re_path('login/$', views.login),
|
||||
re_path('import-data/(?P<name>.+)/$', views.import_data),
|
||||
re_path('delete-data/(?P<name>.+)/$', views.delete_data),
|
||||
re_path('upload/$', views.upload),
|
||||
re_path('download/$', views.download),
|
||||
re_path('auth-token/$', views.auth_token),
|
||||
re_path('stream-video/(?P<path>.+)/$', views.stream_video),
|
||||
re_path('get-cache/(?P<name>.+)/$', views.get_cache),
|
||||
re_path('delete-cache/(?P<name>.+)/$', views.delete_cache),
|
||||
re_path('otp/$', views.get_otp),
|
||||
re_path('signin/$', views.signin),
|
||||
re_path('check-pin/$', views.check_pin),
|
||||
re_path('password/(?P<text>.+)/$', views.get_password),
|
||||
re_path('exportcsv/(?P<name>.+)/$', views.export_csv),
|
||||
re_path('account-entry/$', payment.account_entry),
|
||||
re_path('close-of-business/$', cob.close_of_business),
|
||||
re_path('create-contract/', contract.create_contract),
|
||||
re_path('data-deletion/', cleardata.data_deletion),
|
||||
re_path('send-email/$', email.send_email),
|
||||
re_path('backup-database/', backup.backup_database),
|
||||
re_path('set-token-expiry/', views.set_token_expiry),
|
||||
re_path('download-contract/(?P<name>.+)', views.download_contract),
|
||||
re_path('execute-command/$', server.execute_command),
|
||||
re_path('excel-import/$', views.ExcelImportAPIView.as_view()),
|
||||
re_path('generate-document/$',views.generate_document),
|
||||
re_path('model-fields/(?P<name>.+)/', importdata.model_fields),
|
||||
re_path('read-excel/', importdata.read_excel),
|
||||
re_path('find-key/$', importdata.find_key)
|
||||
]
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
"""
|
||||
WSGI config for api project.
|
||||
|
||||
It exposes the WSGI callable as a module-level variable named ``application``.
|
||||
|
||||
For more information on this file, see
|
||||
https://docs.djangoproject.com/en/4.1/howto/deployment/wsgi/
|
||||
"""
|
||||
|
||||
import os
|
||||
|
||||
from django.core.wsgi import get_wsgi_application
|
||||
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'api.settings')
|
||||
|
||||
application = get_wsgi_application()
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user