diff --git a/adminpanel/__init__.py b/adminpanel/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/adminpanel/asgi.py b/adminpanel/asgi.py new file mode 100644 index 0000000..65ed7db --- /dev/null +++ b/adminpanel/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for adminpanel project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.2/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'adminpanel.settings') + +application = get_asgi_application() diff --git a/adminpanel/config.py b/adminpanel/config.py new file mode 100644 index 0000000..e19304d --- /dev/null +++ b/adminpanel/config.py @@ -0,0 +1,25 @@ +g_telegram_bot_api_token = '' +# --------------------------------------------------------- +# Файлы для настройки, которые не коммитятся в git +telegram_bot_api_token_file_name = 'config_telegram_bot_api_token' +# --------------------------------------------------------- +# Дополнительные функции +def ClearReadLine(a_Line): + return a_Line[:-1] +def GetFirstLineFromFile(a_FileName): + f = open(a_FileName, 'r') + result = f.readline() + f.close() + return result +def GetAllLinesFromFile(a_FileName): + f = open(a_FileName, 'r') + result = f.readlines() + f.close() + return result +# --------------------------------------------------------- +# Основные функции +def GetTelegramBotApiToken(): + global g_telegram_bot_api_token + if len(g_telegram_bot_api_token) == 0: + g_telegram_bot_api_token = ClearReadLine(GetFirstLineFromFile(telegram_bot_api_token_file_name)) + return g_telegram_bot_api_token \ No newline at end of file diff --git a/adminpanel/settings.py b/adminpanel/settings.py new file mode 100644 index 0000000..f471600 --- /dev/null +++ b/adminpanel/settings.py @@ -0,0 +1,132 @@ +""" +Django settings for adminpanel project. + +Generated by 'django-admin startproject' using Django 4.1.4. + +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/ +""" +import os +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-13x&cmg=f1gx9u(i@s(xplh+4x=+@ucyujcqf2t3hu7@i(k=fe' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'adminpanelapp', + +] + +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 = 'adminpanel.urls' + +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 = 'adminpanel.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/4.1/ref/settings/#databases + +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'bot.db'), + } +} + + +# 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 = 'UTC' + +USE_I18N = 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' + +ASGI_APPLICATION = 'adminpanelapp.asgi.application' +ASYNC_MODE = 'django' + + + diff --git a/adminpanel/urls.py b/adminpanel/urls.py new file mode 100644 index 0000000..6f7db62 --- /dev/null +++ b/adminpanel/urls.py @@ -0,0 +1,11 @@ +from django.contrib import admin +from django.urls import path, include +from django.views.generic import RedirectView +from django.conf import settings +from django.conf.urls.static import static + +urlpatterns = [ +path('admin/', admin.site.urls), +path('', include('adminpanelapp.urls')), +path('', RedirectView.as_view(url='/admin/adminpanelapp/orders'), name='') +] \ No newline at end of file diff --git a/adminpanel/wsgi.py b/adminpanel/wsgi.py new file mode 100644 index 0000000..d976b1e --- /dev/null +++ b/adminpanel/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for adminpanel 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.2/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'adminpanel.settings') + +application = get_wsgi_application() diff --git a/adminpanelapp/__init__.py b/adminpanelapp/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/adminpanelapp/admin.py b/adminpanelapp/admin.py new file mode 100644 index 0000000..e066c49 --- /dev/null +++ b/adminpanelapp/admin.py @@ -0,0 +1,44 @@ +from django.http import HttpResponseRedirect +from django.contrib.admin.helpers import ACTION_CHECKBOX_NAME +from django.utils.safestring import mark_safe +from .models import Orders + + +from django.contrib import admin, messages +from django.urls import reverse + + + +class OrdersAdmin(admin.ModelAdmin): + list_display = ('orderName', 'orderCreateDateTime', 'orderDesc', 'orderAddress', 'show_photo', 'show_photopay') + actions =['send_message'] + exclude = ['orderAccess', 'userID', 'orderPhoto', 'orderPhotoPay'] + + def show_photo(self, obj): + html = obj.get_photo_html() + return mark_safe(html) + + show_photo.short_description = 'Фото' + + def show_photopay(self, obj): + html = obj.get_photopay_html() + return mark_safe(html) + + show_photopay.short_description = 'Чек' + + def send_message(orders, request, queryset): + selected_objects = request.POST.getlist(ACTION_CHECKBOX_NAME) + if len(selected_objects) != 1: + messages.error(request, "Выберите только один объект") + return + + selected_user_id = int(selected_objects[0]) + obj = queryset.get(orderID=selected_user_id) + user_id = obj.userID + url = reverse('send_telegram_message', kwargs={'chat_id': user_id}) + return HttpResponseRedirect(url) + + + send_message.short_description = 'Отправка сообщения' + +admin.site.register(Orders, OrdersAdmin) diff --git a/adminpanelapp/apps.py b/adminpanelapp/apps.py new file mode 100644 index 0000000..f186ec5 --- /dev/null +++ b/adminpanelapp/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class AdminpanelappConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'adminpanelapp' diff --git a/adminpanelapp/migrations/__init__.py b/adminpanelapp/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/adminpanelapp/models.py b/adminpanelapp/models.py new file mode 100644 index 0000000..4f039a1 --- /dev/null +++ b/adminpanelapp/models.py @@ -0,0 +1,142 @@ +from urllib.parse import quote + +import requests +from django.db import models + +from bot_sys.config import GetTelegramBotApiToken + + +class Orders(models.Model): + + + orderID = models.AutoField(primary_key=True, verbose_name='id заказа') + userID = models.CharField(max_length=100, verbose_name='id пользователя в tg', null=True) + orderName = models.CharField(max_length=100, verbose_name='наименование', null=True) + orderDesc = models.TextField(verbose_name='описание', null=True) + orderPhoto = models.ImageField(verbose_name='фото', null=True) + orderPhotoPay = models.ImageField(upload_to='photo/', verbose_name='чек') + orderAddress = models.CharField(max_length=100, verbose_name='адрес доставки', blank=True, null=True) + orderAccess = models.CharField(max_length=100, verbose_name='доступ', blank=True, null=True) + orderCreateDateTime = models.DateTimeField(auto_now_add=True, null=True, verbose_name='дата и время создания') + orderStatus = models.CharField(max_length=100, verbose_name='статус заказа', blank=True, null=True) + + def get_photo_html(self, width=100, height=100, large_width=400, large_height=400): + file_id = self.orderPhoto + token = GetTelegramBotApiToken() + url = f"https://api.telegram.org/bot{token}/getFile?file_id={file_id}" + + response = requests.get(url) + data = response.json() + + if data['ok']: + file_path = data["result"]["file_path"] + photo_url = f"https://api.telegram.org/file/bot{token}/{quote(file_path, safe='')}" + + html = f""" + +
+ + + Увеличить фото + + + + + """ + return html + + + def get_photopay_html(self, width=100, height=100, large_width=400, large_height=400): + token = GetTelegramBotApiToken() + file_id = self.orderPhotoPay + url = f"https://api.telegram.org/bot{token}/getFile?file_id={file_id}" + + response = requests.get(url) + data = response.json() + + if data['ok']: + file_path = data["result"]["file_path"] + photo_url = f"https://api.telegram.org/file/bot{token}/{quote(file_path, safe='')}" + + html = f""" + + + + + Увеличить фото + + + + + """ + return html + + class Meta: + + verbose_name_plural = 'Заказы' + managed = False + db_table = 'orders' diff --git a/adminpanelapp/tests.py b/adminpanelapp/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/adminpanelapp/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/adminpanelapp/urls.py b/adminpanelapp/urls.py new file mode 100644 index 0000000..989f17d --- /dev/null +++ b/adminpanelapp/urls.py @@ -0,0 +1,10 @@ +from django.urls import path, include +from .views import send_telegram_message + + +urlpatterns = [ + path('send_telegram_message/