Схемочка. Хобби помощник

#backend #frontend #python #django

https://схемочка.рф/

Схемочка - конструктор схем по номера и схем для вышевок на основе картинок. Сам проект на фреймворке django, а картинки обрабатывает движок основанный на библиотке компьютерного зрения. Она анализирует цвета, контуры изображения, обрабатывает и составляет карту для дальнейшего использования.

Проект был передан на доработку. Пришлось разбираться как в самом проекте, так и с сервером. Были решены некоторые вопросы с деплоем приложения и базы данных.

Моих знаний не хватило, чтобы доработать сам движок компьютерного зрения т.к не совсем моя специальность, а обработка изображений требовала определенных навыков.

Интерфейс и сервер

Я доработал некоторые вопросы по интерфейсу:

Мастер класс

Добавил некоторый функционал для Мастер-класса. До этого новый мастер-класс заполнялся администратором. Теперь есть форма, с которой идет заполнение, а из админки есть функция подтверждения заявки.

Отзывы

Так же был добавлен функционал отправки отзывов. Как анонимных, так при при регистрации. Функционал одобрения отзывов.

Контентные функциональные блоки.

Вынос информации, которая не является просто контентом. Для этого было подключен модуль django constance. Так например теги при заполнении мастер класса и уведомление для пользователей в админке. Позже перенес это в визуальный редактор, оставил только функционала показа скрытия уведомления

Для меня это был практически первый серьезный проект на django. Было приятно поразбираться в нем, освоить структуру и конечно писать на python.

Аналитика

Был запрос по анализу количества схем по юзерам. Юзеры и схемы находились в разных таблицах, что логично. Однако, чтобы вывести в django вьюшку было необходимо сделать отдельную сущность. Что было реализовано. Данные собирались со всей бд.

Дополнительно вывел список схем по датам. Тк для некоторых юзеров список мог быть больше 10-20, сделал специальный html для вывода а стандартную вью джанги и сделал скролл.

Очищение схем

Был реализован интерфейс для грамотного очищения места на диске и в бд. Был кастомизирован интерфейс для удаления схем с выбранной даты. Помимо удаления старых схем, удалялись и папки с картинками, что обеспечивало полное очищение данных.

Кастомизация django админки

Для реализации кастомного функционала потребовались дополнительные темплейты к стандартным вьюшкам, а так дополнительный UI. Так в джанго устаревшие и неудобные мультиселекты переделал на Select2 c поиском. Это сильно облегчило работу с большими выборками данных. Так же был добвлен datepicker, не нашел способ вызова стандартного в кастомном темплейте, поэтому сделал из jquery ui.

Алмазная мозаика доработка движка

Я как то не собирался лезть внутрь. Но постепенно как то само получилось. Была проблема с корректным отображение алмаза на определенных форматах. Я провел анализ работы хендлеров и классов, составил цепочку последовательных вызовов. Тк весь код содержал ровно 0 комментариев, пришлось разбираться по наитию. Всю информацию благополучно покрыл комментариями и разделами в документации. Нашли решили вопрос с размером алмаза и генерации секторов в зависимости от формата изображения. Пофиксен баг различия количества секторов от смены ориентации.

Мобильная версия редактора

Захотели адаптировать редактор. До этого стояла просто заглушка для перехода на пк. Я сначала припугнулся. Так js самого интерфейса редактора превышает 1000 строк кода. Много всего: классы, события, методы - которые связаны в нетривальную логику. Но все оказалось довольно хорошо. Получилось удачно адаптировать интерфейс под мобильный степпер за сравнимо небольшое время и с меньшими затратами. Но большая часть около дня ушла на разбор фронтенда, рефактор и документирования текущего кода.

Документация

Было не совсем понятно как устроен конфиг на сервере. Потратил пару дней чтобы разобраться, но не до конца успешно. Написали ТП. И благодаря им полностью понял настройку сервера. Описал документацию по администрированию: перезапуск приложения, режим дебага, установка пакетов, доступы. Убрали лишнее из админки хостинга.
Далее в документации подробно описал работу, запуск фронтенда. Описал подули и классы участвующие в обработке изображений. Документация превысила 50 страниц.

Exception

Error

We're sorry, but an unhandled error occurred. Please see the details below.

file_put_contents(/home/admin/web/alex.dzen-code.ru/public_html/storage/framework/cache/11/de/11de31e1eabb2682cf62ee9c9ccb0630f1019006): failed to open stream: Permission denied

/home/admin/web/alex.dzen-code.ru/public_html/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php line 122

     * @param  string  $contents
     * @param  bool  $lock
     * @return int
     */
    public function put($path, $contents, $lock = false)
    {
        return file_put_contents($path, $contents, $lock ? LOCK_EX : 0);
    }
 
    /**
     * Prepend to a file.
     *
     * @param  string  $path

Stack trace

# Called Code Document Line
30 file_put_contents(…) ~/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php 122
29 Illuminate\Filesystem\Filesystem->put(…) ~/vendor/october/rain/src/Filesystem/Filesystem.php 217
28 October\Rain\Filesystem\Filesystem->put(…) ~/vendor/laravel/framework/src/Illuminate/Cache/FileStore.php 65
27 Illuminate\Cache\FileStore->put(…) ~/vendor/laravel/framework/src/Illuminate/Cache/Repository.php 191
26 Illuminate\Cache\Repository->put(…) ~/vendor/october/rain/src/Halcyon/MemoryRepository.php 61
25 October\Rain\Halcyon\MemoryRepository->put(…) ~/vendor/laravel/framework/src/Illuminate/Cache/Repository.php 323
24 Illuminate\Cache\Repository->remember(…) ~/vendor/laravel/framework/src/Illuminate/Cache/CacheManager.php 304
23 Illuminate\Cache\CacheManager->__call(…) ~/vendor/october/rain/src/Database/QueryBuilder.php 158
22 October\Rain\Database\QueryBuilder->getCached(…) ~/vendor/october/rain/src/Database/QueryBuilder.php 121
21 October\Rain\Database\QueryBuilder->getDuplicateCached(…) ~/vendor/october/rain/src/Database/QueryBuilder.php 92
20 October\Rain\Database\QueryBuilder->get(…) ~/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php 481
19 Illuminate\Database\Eloquent\Builder->getModels(…) ~/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php 465
18 Illuminate\Database\Eloquent\Builder->get(…) ~/vendor/laravel/framework/src/Illuminate/Database/Concerns/BuildsQueries.php 77
17 Illuminate\Database\Eloquent\Builder->first() ~/modules/system/behaviors/SettingsModel.php 114
16 System\Behaviors\SettingsModel->getSettingsRecord() ~/modules/system/behaviors/SettingsModel.php 76
15 System\Behaviors\SettingsModel->instance() ~/modules/system/behaviors/SettingsModel.php 135
14 System\Behaviors\SettingsModel->get(…)
13 call_user_func_array(…) ~/vendor/october/rain/src/Extension/ExtendableTrait.php 414
12 October\Rain\Database\Model->extendableCall(…) ~/vendor/october/rain/src/Database/Model.php 647
11 October\Rain\Database\Model->__call(…) ~/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php 1489
10 Illuminate\Database\Eloquent\Model::__callStatic(…) ~/modules/system/models/EventLog.php 37
9 System\Models\EventLog::useLogging() ~/modules/system/ServiceProvider.php 286
8 System\ServiceProvider->System\{closure}(…)
7 call_user_func_array(…) ~/vendor/october/rain/src/Events/Dispatcher.php 233
6 October\Rain\Events\Dispatcher->dispatch(…) ~/vendor/laravel/framework/src/Illuminate/Log/Writer.php 295
5 Illuminate\Log\Writer->fireLogEvent(…) ~/vendor/laravel/framework/src/Illuminate/Log/Writer.php 201
4 Illuminate\Log\Writer->writeLog(…) ~/vendor/laravel/framework/src/Illuminate/Log/Writer.php 114
3 Illuminate\Log\Writer->error(…) ~/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php 221
2 Illuminate\Support\Facades\Facade::__callStatic(…) ~/vendor/october/rain/src/Foundation/Exception/Handler.php 66
1 October\Rain\Foundation\Exception\Handler->report(…) ~/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php 81
0 Illuminate\Foundation\Bootstrap\HandleExceptions->handleException(…)