Initial commit (Clean history)

This commit is contained in:
anhduy-tech
2025-12-30 11:27:14 +07:00
commit ef48c93de0
19255 changed files with 3248867 additions and 0 deletions

5
.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
venv/
.env/
__pycache__/
*.pyc

24
Dockerfile Normal file
View File

@@ -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/

0
api/__init__.py Normal file
View File

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
api/asgi.py Normal file
View File

@@ -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
api/settings.py Normal file
View File

@@ -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
api/urls.py Normal file
View File

@@ -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
api/wsgi.py Normal file
View File

@@ -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()

0
app/__init__.py Normal file
View File

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