Code Monkey home page Code Monkey logo

specialrecipe's Introduction

📖 Contents

📃 About

Special Recipe is a webapp where you can search for recipes, bookmark them, and access them as needed. Each recipe can be viewed in detail along with its comments, and users can optionally leave a comment. The search functionality allows for both category and keyword searches, while users also have the option to browse all available recipes. Additionally, the website enables users to create or edit an account, reset lost passwords, and verify email addresses.

The project was created for educational purposes.

🌄 Demonstration

  • Recipes page

firefox_NeEAcpxcd3 firefox_ojqwCSTJJx


  • Adding / removing from bookmarks

recipe-bookmark


  • Recipe detail pages

firefox_0DKWb1eWkW firefox_9SFI9HVncg


firefox_ea9Mhd9I3Y firefox_ICgV4HS1TZ


  • Bookmarks page

firefox_IrbXSTevJy


  • Profile pages

firefox_Rjwr6yUSXn firefox_GVubZrCC1K firefox_aLKDOhKHSg

  • Authentication pages

firefox_B4E9sQRVKS firefox_OHwLoPAKEr

🔥 Features

  • Django Rest API
  • Postponed Tasks / Celery
  • Recipe bookmarks
  • Recipe comments
  • Recipe markdown editing
  • Registration / Authorization
  • User profile
  • Profile editing
  • Password change / reset
  • Email verification
  • Tests

❕ Peculiarities

  • For correct display, at least 3 recipes must be created regardless of the category.
  • For correct display of images, their aspect ratio must be 16:10. Example: 1440×900, 1536×960, 1680:1050, 1920x1200...

💽 Local: Development

  1. Clone or download the repository.
  2. Create a virtual environment and install requirements from requirements/local.txt file.
  3. Create an .env file or rename .env.dist in .env and populate it only with development variables:
    • DEBUG
    • SECRET_KEY
    • DOMAIN_NAME
    • ALLOWED_HOSTS
    • INTERNAL_IPS
    • PROTOCOL
    • REDIS_HOST
    • REDIS_PORT
    • EMAIL_HOST_USER
    • EMAIL_SEND_INTERVAL_SECONDS
    • EMAIL_EXPIRATION_HOURS
    • RECIPES_PAGINATE_BY
    • CATEGORIES_PAGINATE_BY
    • COMMENTS_PAGINATE_BY
  4. Make migrations:
    • python manage.py makemigrations
    • python manage.py migrate
  5. Run redis:
  6. Run celery:
    • Windows: celery -A core worker -l INFO -P solo
    • Linux: celery -A core worker -l INFO
  7. Run development server:
    • python manage.py runserver

🐳 Docker: Production

  • All actions with files are performed in the project directory.
  • Don't forget to install docker and docker compose first.

Project Deployment:

  1. Clone or download the repository and go to its directory.
  2. Create an .env file or rename .env.dist in .env and populate it with all variables from .env.dist file.
    • In the REDIS_HOST, you need to specify not the local ip, but the name of the redis container, like this: REDIS_HOST=redis.
  3. Open data/nginx/nginx.conf file and change server_name example.com www.example.com; to your domains.
  4. Grant executable rights to the entrypoint.sh script: chmod +x ./entrypoint.sh
  5. Start the services: docker-compose up --build -d

Obtaining an ssl certificate:

  1. Access nginx container: docker exec -it <nginx-container-id> bin/sh
  2. Get ssl certificate: certbot --nginx
  3. Done ! Now you can exit from nginx container: exit

specialrecipe's People

Contributors

fctl3314 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

specialrecipe's Issues

Issue #1

1)Этой штуки нет по дефолту в .env.dist
image
Этой тоже COMMENTS_PAGINATE_BY
2)Зачем тебе эти комменты?
image
3)Нет запятой + это тоже надо из енва тянуть
image
4)Имхо в двух местах надо менять логкику поведение тулбара - эт плохо
image
5)Ну скапипаситил ты эт с доки, но комменты то удали...
image
6)Почему ты тут напрямую подключаешь RecipesListView в мейн урлы - так делать плохо
image
7)Имхо метод назван не понятно + в его название не сказано, что ты чет сетишь в кеш
image
8)По хорошему поля модели стоит писать: Model.field_name.field.name, то есть User.username.field.name - это поможет потом избежать ошибок, когда у тебя в моделе кто-то название филда поменяет+ еще плюшки есть
image
9)Во-первых, добавь в название класса User, во-вторых, зачем тебе нужен этот комент? он фактически повторяет название класса
image
10) а юзернейм тут может быть None?
image
11)if request.user.is_anonymous лучше, чем начало условия с not
image
12)Это надо ограничвать на уровне модели, а не формы
image
13)Не совсем понятно, почему бы это не вынести в сеттингс и импортить от туда?
image
14)А эт зачем? тебе же джанга не даст создать юзера, если юзернейм будет уже в бд так как поле uniq
image
15)Опять чет сомнительное
image
16)я конечно не уверен, но мне кажется, что ты какое-то дефолт поведение переписал
image
17)такое делать нельзя, солид нарушаешь
image
18) а какой сокральный смысл имеет это? там же и так будет user и users по дефолту, так как у тебя модель так называется
image
19) По код стайлу джанги: сначала идет Meta, потом str, а уже потом методы
image
https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/coding-style/#model-style
20)Почему у тебя в одном классе есть Meta, а в другом нет? Какой смысл давать вербозы половине сущностей?
21)Почему ты это делаешь тут, если у тебя есть селери таска, которая делает то же самое?
image
В чем проблема ее тут заюзать?
22)Это пишется проще. return self.expiration < now()
image
23)Юзай менеджеры модели, чтобы у тебя не было куча мест с одинаковыми orm запросами
24)Зачем ты тут тайпхинт заюзал? У тебя их негде нет, но зато в сетапе тестов заюзал)
image
25)Очень плохая идея такие тесты делать, ты тестишь какой-то тайтл, который может менятся. Не тестируй сам контент страницы
image
26)Тестить то какой темплейт юзался - тоже странно
image
27)Зачем тебе эт надо было в отдельный метод выносить?
image
28)До тестов докапаться есть до чего конечно - но мне лень. То что их написал уже +rep
29)Выглидит не красиво, стоит делать в одном стиле все
image
30) Не понял зачем тебе декоратор, которым ты оборачиваешь классы, почему бы миксин не сделать?
image
31)Ты эту штуку пишешь в каждой вьюхе - время задуматься
image
32)Это какая-то логика с сессией точно не уровень абстракции метода form_valid
image
33)ок, сверх челу поможешь, мог еще написать что мб проблема в нем просто
image
34)Какой смысл это выносить отдельно, в чем проблема там сразу это сделать
image
35)какая-то сверх сложная бизнес логика, который не место во вьюхе
image
36) тут можно замашнить за харкод таймдельты
image
37)Не совсем понятно, зачем тебе is_valid_uuid тут делать
image
38)Пепка не любит такие переносы строк
image
39)Почему апи accounts и recipe в одном месте? Это два независимых приложения
image
40)а тут в теории может не быть username?)
image
41)Эт же не будет правильно работать, оно ж один раз в самом начале сделает запрос, а потом там будет устаревшая дата, или на это и был расчет?
image
(Мб я конечно чет путаю)
42)А еще эту штуку лучше делать через доп серилизатор
43)Какая-то сверх сильная система, мне кажется эт лучше проще делать
image
44)где-то я уже это видел) Дублировать код не оч классно
image
45)Во-первых, я эт опять же видел в каком-то похожем стиле + эта штука кучу запросов делает + не понятно ничего + куча бизнес логике там, где ее быть не должно
image
46)Никогда так не делай
image
47)Почему эти цифры такие? Откуда они?
image
48)немного не в тему, но почему у тебя все в кучу, почему оно лежит прямо в джанге?
image
49)Почему это тут, а не в менеджере модели?
image
50)Почему какие-то вьюхи функции, а какие-то классы? Мб стоит писать в одном стиле?
51)ПОЧЕМУ 60 * 60? Почему бы это не вынести куда-то в константы, тут ваще не понятно, что и зачем это
image
52)А и то и другое не может быть вместе?
image
53)Лямбда фор вот? Почему бы просто так не оставить Category.objects.all
54)Вот эт вот - это пиздец, а не функция, чтобы понять что тут происходит надо потратить кучу времени, ее надо раздрабить на функции. Плюс куча бизнес логики, которой тут тоже быть не должно
image

У тебя такой штуки очень много, где дохуя бизнес логики и прочих моментов во вьюшках. Так быть не должно
55)Куча моментов, где ты ебешь базу хз зачем. То есть делаешь сверх много запросов, когда эт не нужно.
image
Про запросы - там вроде есть моменты, где все будет ваще плохо, но мне было лень разворачивать проект и проверять эт все, так что советую: залить базу и идти в дебаг тулбаре посмотреть запросы на каждой вьюшке
56)Еще раз повторю - пиши запросы в менеджере модели. потому что сейчас вьюшки читать не реально.
57)Еще раз дубляж кода, эти функции - сверх одинаковые
image
58) Сверх странная логика в закладки рецепта добавлять/удалять юзера, чет тут не то
image
59)FormView спасет тебе тут жизнь
image
60)Совет: погугли про поетри
image
61)Почему у тебя бейз шаблон валяется в recipe?
Шаблоны я особо не чекал, так что про них наверное можно тоже чет посмотреть.
62)У тебя нигде не юзаются тайпхинты и тут ты решил еще и typing импортнуть, вай?
image
Плюс мне кажется, данный алго

С первого взгляда вроде все. Но скорее всего чет упустил.

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

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.