major fixes

This commit is contained in:
Alexander Karpov 2023-08-26 09:53:03 +03:00
parent d784e04ff5
commit aa82f1d956
32 changed files with 105 additions and 139 deletions

5
.env
View File

@ -1,5 +0,0 @@
DATABASE_URL=postgres://postgres:postgres@127.0.0.1:5432/pitch_deck_generator
CELERY_BROKER_URL=redis://localhost:6379/0
REDIS_URL=redis://localhost:6379/1
USE_DOCKER=no
OPENAI_KEY=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

17
.envs/.local/.django Normal file
View File

@ -0,0 +1,17 @@
# General
# ------------------------------------------------------------------------------
USE_DOCKER=yes
IPYTHONDIR=/app/.ipython
DJANGO_READ_DOT_ENV_FILE=no
# Redis
# ------------------------------------------------------------------------------
REDIS_URL=redis://redis:6379/1
REDIS_CACHE=rediscache://redis:6379/1
CELERY_BROKER_URL=redis://redis:6379/0
# Celery
# ------------------------------------------------------------------------------
# Flower
CELERY_FLOWER_USER=debug
CELERY_FLOWER_PASSWORD=debug

7
.envs/.local/.postgres Normal file
View File

@ -0,0 +1,7 @@
# PostgreSQL
# ------------------------------------------------------------------------------
POSTGRES_HOST=postgres
POSTGRES_PORT=5432
POSTGRES_DB=akarpov
POSTGRES_USER=debug
POSTGRES_PASSWORD=debug

16
.envs/.production/.django Normal file
View File

@ -0,0 +1,16 @@
# General
# CHANGE ON REAL SERVER
# ------------------------------------------------------------------------------
USE_DOCKER=yes
DJANGO_READ_DOT_ENV_FILE=no
# Redis
# ------------------------------------------------------------------------------
REDIS_URL=redis://redis:6379/0
CELERY_BROKER_URL=redis://localhost:6379/0
# Celery
# ------------------------------------------------------------------------------
# Flower
CELERY_FLOWER_USER=debug
CELERY_FLOWER_PASSWORD=debug

View File

@ -0,0 +1,7 @@
# PostgreSQL
# ------------------------------------------------------------------------------
POSTGRES_HOST=postgres
POSTGRES_PORT=5432
POSTGRES_DB=akarpov
POSTGRES_USER=debug
POSTGRES_PASSWORD=debug

View File

@ -77,4 +77,3 @@ updates:
# Check for updates to GitHub Actions every weekday # Check for updates to GitHub Actions every weekday
schedule: schedule:
interval: "daily" interval: "daily"

1
.gitignore vendored
View File

@ -1,5 +1,6 @@
!.gitkeep !.gitkeep
.idea .idea
.env
### Python template ### Python template
# Byte-compiled / optimized / DLL files # Byte-compiled / optimized / DLL files

8
.idea/.gitignore vendored
View File

@ -1,8 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@ -1,24 +0,0 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="PyMethodMayBeStaticInspection" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
<inspection_tool class="PyPackageRequirementsInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoredPackages">
<value>
<list size="9">
<item index="0" class="java.lang.String" itemvalue="pytest-instafail" />
<item index="1" class="java.lang.String" itemvalue="cookiecutter" />
<item index="2" class="java.lang.String" itemvalue="binaryornot" />
<item index="3" class="java.lang.String" itemvalue="isort" />
<item index="4" class="java.lang.String" itemvalue="PyGithub" />
<item index="5" class="java.lang.String" itemvalue="pytest-cookies" />
<item index="6" class="java.lang.String" itemvalue="gitpython" />
<item index="7" class="java.lang.String" itemvalue="tox" />
<item index="8" class="java.lang.String" itemvalue="django" />
</list>
</value>
</option>
</inspection_tool>
</profile>
</component>

View File

@ -1,6 +0,0 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

View File

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Poetry (pitch_deck_generator)" project-jdk-type="Python SDK" />
</project>

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/pitch_deck_generator.iml" filepath="$PROJECT_DIR$/.idea/pitch_deck_generator.iml" />
</modules>
</component>
</project>

View File

@ -1,27 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="FacetManager">
<facet type="django" name="Django">
<configuration>
<option name="rootFolder" value="$MODULE_DIR$" />
<option name="settingsModule" value="config/settings/local.py" />
<option name="manageScript" value="$MODULE_DIR$/manage.py" />
<option name="environment" value="&lt;map/&gt;" />
<option name="doNotUseTestRunner" value="false" />
<option name="trackFilePattern" value="migrations" />
</configuration>
</facet>
</component>
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="PyDocumentationSettings">
<option name="format" value="PLAIN" />
<option name="myDocStringFormat" value="Plain" />
</component>
<component name="TemplatesService">
<option name="TEMPLATE_CONFIGURATION" value="Django" />
</component>
</module>

View File

@ -21,7 +21,7 @@ repos:
- id: black - id: black
- repo: https://github.com/PyCQA/isort - repo: https://github.com/PyCQA/isort
rev: 5.11.4 rev: 5.12.0
hooks: hooks:
- id: isort - id: isort

View File

@ -2,8 +2,6 @@
from django.conf.urls.static import static from django.conf.urls.static import static
from django.contrib import admin from django.contrib import admin
from django.urls import include, path from django.urls import include, path
from django.views import defaults as default_views
from django.views.generic import TemplateView
from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView
from rest_framework.authtoken.views import obtain_auth_token from rest_framework.authtoken.views import obtain_auth_token

File diff suppressed because one or more lines are too long

View File

@ -1,28 +1,32 @@
import openai
import datetime import datetime
from ast import literal_eval from ast import literal_eval
import openai
from django.conf import settings from django.conf import settings
KEY = settings.OPENAI_KEY KEY = settings.OPENAI_KEY
description = """ description = """🍀 Что такое Pitch-Deck? Pitch-Deck представляет собой презентацию-тизер проекта/компании для
🍀 Что такое Pitch-Deck? инвесторов, партнеров, журналистов и других заинтересованных лиц. Цель презентации - привлечение дополнительного
Pitch-Deck представляет собой презентацию-тизер проекта/компании для инвесторов, партнеров, журналистов и других заинтересованных лиц. Цель презентации - привлечение дополнительного финансирования (инвестиций). финансирования (инвестиций). Почему это проблема?
Почему это проблема?
🍀 Проблема #1. Недостаток средств: 🍀 Проблема #1. Недостаток средств: Для многих стартапов ограниченные финансы создают преграду при разработке
Для многих стартапов ограниченные финансы создают преграду при разработке качественного Pitch Deck. Отсутствие достаточных средств для найма профессиональных консультантов, дизайнеров и копирайтеров, а также для проведения исследований рынка, может привести к созданию менее привлекательной и малоинформативной презентации, что затрудняет привлечение инвестиций. качественного Pitch Deck. Отсутствие достаточных средств для найма профессиональных консультантов, дизайнеров и
копирайтеров, а также для проведения исследований рынка, может привести к созданию менее привлекательной и
малоинформативной презентации, что затрудняет привлечение инвестиций.
🍀 Проблема #2. Недостаток экспертизы: 🍀 Проблема #2. Недостаток экспертизы: Проблемой для стартапов является недостаток экспертизы для проведения
Проблемой для стартапов является недостаток экспертизы для проведения необходимых исследований и корректного отражения их результатов в Pitch Deck. Не всегда у стартапов есть нужные знания в области маркетинга, финансов и анализа рынка, что затрудняет создание убедительной и информативной презентации для привлечения инвестиций. необходимых исследований и корректного отражения их результатов в Pitch Deck. Не всегда у стартапов есть нужные
знания в области маркетинга, финансов и анализа рынка, что затрудняет создание убедительной и информативной
презентации для привлечения инвестиций.
🍀 Проблема #3. Недостаток времени 🍀 Проблема #3. Недостаток времени Молодым компаниям для привлечения инвестиций требуется подготовить целый пакет
Молодым компаниям для привлечения инвестиций требуется подготовить целый пакет документов, одним из которых является Pitch Deck. Особенностью стартапов является сравнительного молодая и небольшая команда, у которой чисто физически не хватает времени на разработку инвестиционных материалов, ведь они полностью погружены в процесс разработки и улучшения продукта или сервиса. документов, одним из которых является Pitch Deck. Особенностью стартапов является сравнительного молодая и небольшая
команда, у которой чисто физически не хватает времени на разработку инвестиционных материалов, ведь они полностью
погружены в процесс разработки и улучшения продукта или сервиса.
🍀 ИДЕЯ: 🍀 ИДЕЯ: Основная идея кейса заключается в создании вспомогательного инструмента на основе ИИ, заточенного под
Основная идея кейса заключается в создании вспомогательного инструмента на основе ИИ, заточенного под создание Pitch-Deck. создание Pitch-Deck."""
"""
names_prompt = """ names_prompt = """
По тексту ответь или предположи ответ на вопросы в следющем формате: По тексту ответь или предположи ответ на вопросы в следющем формате:
@ -45,11 +49,11 @@
""" """
По тексту ответь или предположи ответ на вопросы в следющем формате: По тексту ответь или предположи ответ на вопросы в следющем формате:
{ {
'awards': 'Когда проблема будет решена, какова будет ценность для ваших пользователей', 'awards': 'Когда проблема будет решена, какова будет ценность для ваших пользователей',
'money': 'На чем проект зарабатывает? сколько и за что ему платят клиенты', 'money': 'На чем проект зарабатывает? сколько и за что ему платят клиенты',
'aims': Напиши 3 цели: на месяц, на полгода и год, формат: {'1': цель на месяц, '2': цель на полгода, '3': цель на год}, 'aims': Напиши 3 цели: на месяц, на полгода и год, формат: {'1': цель на месяц, '2': цель на полгода, '3': цель на год},
'investments_sold': 'На что потратить инвестиции под проект', 'investments_sold': 'На что потратить инвестиции под проект',
'financial_indicators': 'Напиши финансовые показатели проекта' 'financial_indicators': 'Напиши финансовые показатели проекта'
} }
""", """,
""" """

View File

@ -1,6 +1,7 @@
import pickle
from annoy import AnnoyIndex from annoy import AnnoyIndex
from sentence_transformers import SentenceTransformer from sentence_transformers import SentenceTransformer
import pickle
model = None model = None
data = None data = None

View File

@ -1,12 +1,12 @@
from django.db import models from django.db import models
from pitch_deck_generator.utils.files import user_file_upload_mixin
from pitch_deck_generator.utils.generators import generate_charset
from pitch_deck_generator.common.signals import ( from pitch_deck_generator.common.signals import (
create_cropped_model_image, create_cropped_model_image,
delete_cropped_model_image, delete_cropped_model_image,
update_cropped_model_image, update_cropped_model_image,
) )
from pitch_deck_generator.utils.files import user_file_upload_mixin
from pitch_deck_generator.utils.generators import generate_charset
class BaseImageModel(models.Model): class BaseImageModel(models.Model):

View File

@ -7,7 +7,7 @@ def create_cropped_model_image(sender, instance, created, **kwargs):
model = sender model = sender
if created: if created:
if instance.image: if instance.image:
crop_model_image.apply_async( crop_model_image.apply_async(
kwargs={ kwargs={
"pk": instance.pk, "pk": instance.pk,
@ -16,7 +16,7 @@ def create_cropped_model_image(sender, instance, created, **kwargs):
}, },
countdown=2, countdown=2,
) )
def update_cropped_model_image(sender, instance, **kwargs): def update_cropped_model_image(sender, instance, **kwargs):
model = sender model = sender
@ -30,7 +30,7 @@ def update_cropped_model_image(sender, instance, **kwargs):
# run task to create new cropped image # run task to create new cropped image
if kwargs["update_fields"] != frozenset({"image_cropped"}) and instance: if kwargs["update_fields"] != frozenset({"image_cropped"}) and instance:
if instance.image: if instance.image:
crop_model_image.apply_async( crop_model_image.apply_async(
kwargs={ kwargs={
"pk": instance.pk, "pk": instance.pk,
@ -39,7 +39,7 @@ def update_cropped_model_image(sender, instance, **kwargs):
}, },
countdown=2, countdown=2,
) )
else: else:
instance.image_cropped = None instance.image_cropped = None

View File

@ -1,6 +1,6 @@
from django.contrib import admin from django.contrib import admin
from pitch_deck_generator.decks.models import Question, PitchDeck from pitch_deck_generator.decks.models import PitchDeck, Question
admin.site.register(PitchDeck) admin.site.register(PitchDeck)
admin.site.register(Question) admin.site.register(Question)

View File

@ -7,9 +7,9 @@
from pitch_deck_generator.decks.models import ( from pitch_deck_generator.decks.models import (
PitchDeck, PitchDeck,
Question, Question,
QuestionDeckHint,
QuestionAnswer, QuestionAnswer,
QuestionAnswerPhoto, QuestionAnswerPhoto,
QuestionDeckHint,
) )

View File

@ -1,11 +1,12 @@
from django.urls import path from django.urls import path
from pitch_deck_generator.decks.api.views import ( from pitch_deck_generator.decks.api.views import (
CreateQuestionAnswerApiView,
GetDeckQuestionApiView,
GetDeckQuestionHintApiView,
GetFirstQuestionApiView,
ListDecksApiView, ListDecksApiView,
RetrievePitchApiView, RetrievePitchApiView,
GetFirstQuestionApiView,
GetDeckQuestionApiView,
GetDeckQuestionHintApiView, CreateQuestionAnswerApiView,
) )
app_name = "decks" app_name = "decks"
@ -15,6 +16,9 @@
path("<int:id>", RetrievePitchApiView.as_view()), path("<int:id>", RetrievePitchApiView.as_view()),
path("question/<int:deck_id>", GetFirstQuestionApiView.as_view()), path("question/<int:deck_id>", GetFirstQuestionApiView.as_view()),
path("question/<int:deck_id>/<int:question_id>", GetDeckQuestionApiView.as_view()), path("question/<int:deck_id>/<int:question_id>", GetDeckQuestionApiView.as_view()),
path("question/<int:deck_id>/<int:question_id>/", CreateQuestionAnswerApiView.as_view()), path(
"question/<int:deck_id>/<int:question_id>/",
CreateQuestionAnswerApiView.as_view(),
),
path("hint/<int:deck_id>/<int:question_id>", GetDeckQuestionHintApiView.as_view()), path("hint/<int:deck_id>/<int:question_id>", GetDeckQuestionHintApiView.as_view()),
] ]

View File

@ -1,16 +1,16 @@
from rest_framework import generics, status from rest_framework import generics, status
from rest_framework.generics import get_object_or_404 from rest_framework.generics import get_object_or_404
from rest_framework.parsers import FormParser, JSONParser, MultiPartParser
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.parsers import JSONParser, FormParser, MultiPartParser
from pitch_deck_generator.decks.api.serializers import ( from pitch_deck_generator.decks.api.serializers import (
AnswerSerializer,
BasePitchDeckSerializer, BasePitchDeckSerializer,
HintSerializer,
PitchDeckSerializer, PitchDeckSerializer,
QuestionSerializer, QuestionSerializer,
HintSerializer,
AnswerSerializer,
) )
from pitch_deck_generator.decks.models import PitchDeck, QuestionDeckHint, Question from pitch_deck_generator.decks.models import PitchDeck, Question, QuestionDeckHint
class ListDecksApiView(generics.ListCreateAPIView): class ListDecksApiView(generics.ListCreateAPIView):

View File

@ -1,7 +1,7 @@
import requests import requests
from celery import shared_task from celery import shared_task
from ml.openai_handle import create_name_hint, create_hints from ml.openai_handle import create_hints, create_name_hint
from pitch_deck_generator.decks.models import PitchDeck, Question, QuestionDeckHint from pitch_deck_generator.decks.models import PitchDeck, Question, QuestionDeckHint
data_types = { data_types = {

View File

@ -1,3 +0,0 @@
from django.test import TestCase
# Create your tests here.

View File

@ -1,3 +0,0 @@
from django.shortcuts import render
# Create your views here.

View File

@ -1,5 +1,5 @@
from django.core.cache import cache from django.core.cache import cache
from django.db.models.signals import post_save, post_delete, pre_save from django.db.models.signals import post_delete, post_save, pre_save
from django.dispatch import receiver from django.dispatch import receiver
from pitch_deck_generator.tickets.models import Ticket from pitch_deck_generator.tickets.models import Ticket

View File

@ -1 +0,0 @@

View File

@ -1,6 +1,6 @@
import os import os
from io import BytesIO from io import BytesIO
from PIL import Image from PIL import Image
from pitch_deck_generator.users.models import User from pitch_deck_generator.users.models import User

12
poetry.lock generated
View File

@ -1428,18 +1428,18 @@ test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pa
[[package]] [[package]]
name = "isort" name = "isort"
version = "5.12.0" version = "5.11.5"
description = "A Python utility / library to sort Python imports." description = "A Python utility / library to sort Python imports."
category = "main" category = "main"
optional = false optional = false
python-versions = ">=3.8.0" python-versions = ">=3.7.0"
files = [ files = [
{file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, {file = "isort-5.11.5-py3-none-any.whl", hash = "sha256:ba1d72fb2595a01c7895a5128f9585a5cc4b6d395f1c8d514989b9a7eb2a8746"},
{file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, {file = "isort-5.11.5.tar.gz", hash = "sha256:6be1f76a507cb2ecf16c7cf14a37e41609ca082330be4e3436a18ef74add55db"},
] ]
[package.extras] [package.extras]
colors = ["colorama (>=0.4.3)"] colors = ["colorama (>=0.4.3,<0.5.0)"]
pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"]
plugins = ["setuptools"] plugins = ["setuptools"]
requirements-deprecated-finder = ["pip-api", "pipreqs"] requirements-deprecated-finder = ["pip-api", "pipreqs"]
@ -3298,4 +3298,4 @@ multidict = ">=4.0"
[metadata] [metadata]
lock-version = "2.0" lock-version = "2.0"
python-versions = "^3.11" python-versions = "^3.11"
content-hash = "981198feadb63083b31387f32ef93f2ded7098868fe9cd40a9e505a057cf9d1b" content-hash = "31ce390d9b50a16455803f012bd6f7eca984fbec0d0e60404edaea07b5523792"

View File

@ -48,6 +48,7 @@ django-coverage-plugin = "^3.0.0"
pytest-django = "^4.5.2" pytest-django = "^4.5.2"
sentry-sdk = "^1.12.0" sentry-sdk = "^1.12.0"
openai = "^0.27.9" openai = "^0.27.9"
isort = "5.11.5"
[build-system] [build-system]