From 168d40789bf774f5e26d6e672a04fc163480c7ed Mon Sep 17 00:00:00 2001 From: Dmitriy Lyalyuev Date: Tue, 25 Oct 2022 14:35:00 +0300 Subject: [PATCH] feat: reader --- later42/libs/__init__.py | 0 later42/libs/content.py | 21 +++++++++++++++++++++ later42/templates/index.html | 4 ++-- later42/templates/reader.html | 35 +++++++++++++++++++++++++++++++++++ later42/urls.py | 4 ++-- later42/views/api.py | 30 +++++------------------------- later42/views/reader.py | 17 +++++++++++++++++ 7 files changed, 82 insertions(+), 29 deletions(-) create mode 100644 later42/libs/__init__.py create mode 100644 later42/libs/content.py create mode 100644 later42/templates/reader.html create mode 100644 later42/views/reader.py diff --git a/later42/libs/__init__.py b/later42/libs/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/later42/libs/content.py b/later42/libs/content.py new file mode 100644 index 0000000..5cad6c1 --- /dev/null +++ b/later42/libs/content.py @@ -0,0 +1,21 @@ +import requests + +from bs4 import BeautifulSoup +from django.conf import settings + + +def sanitize_img_size(html: str): + soup = BeautifulSoup(html, 'html.parser') + for img in soup.find_all('img'): + img['width'] = '100%' + img['height'] = 'auto' + return str(soup) + + +def get_content(url: str): + url = settings.READABILITY_HOST.rstrip( + '/') + '/api/content/v1/parser?url=' + url + try: + return requests.get(url).json() + except KeyError: + return None diff --git a/later42/templates/index.html b/later42/templates/index.html index 2914732..298fd4b 100644 --- a/later42/templates/index.html +++ b/later42/templates/index.html @@ -7,12 +7,12 @@
{% if url.content %} diff --git a/later42/templates/reader.html b/later42/templates/reader.html new file mode 100644 index 0000000..55f7d3d --- /dev/null +++ b/later42/templates/reader.html @@ -0,0 +1,35 @@ +{% extends 'base.html' %} + +{% block content %} +
+ +{% if content %} + +
+ {{ content.rich_content|safe }} + +{% else %} +

Что-то пошло не так.

+ Открыть оригинал ссылки. +{% endif %} +
+{% endblock %} \ No newline at end of file diff --git a/later42/urls.py b/later42/urls.py index 2d757fd..eb9de87 100644 --- a/later42/urls.py +++ b/later42/urls.py @@ -22,7 +22,7 @@ from django.contrib.auth.views import LoginView from rest_framework import routers, serializers, viewsets from later42.forms import CustomLoginForm -from later42.views import index, profile, api, api_token, signup, about +from later42.views import index, profile, api, api_token, reader, signup, about class UserSerializer(serializers.HyperlinkedModelSerializer): @@ -53,5 +53,5 @@ urlpatterns = [ path('about/', about.get, name='about'), path('archive/', index.archive, name='archive'), path('archive/', index.archive, name='archive_url'), - + path('reader/', reader.get, name='reader'), ] diff --git a/later42/views/api.py b/later42/views/api.py index e533332..e039b7c 100644 --- a/later42/views/api.py +++ b/later42/views/api.py @@ -1,41 +1,21 @@ -import requests - from rest_framework.response import Response from rest_framework.views import APIView -from bs4 import BeautifulSoup +from later42.libs.content import get_content from later42.models.urls import URL as URLModel from django.conf import settings class URL(APIView): - def get_title(self, url: str): - try: - response = requests.get(url) - soup = BeautifulSoup(response.text, 'html.parser') - title = soup.find('title').text - return title - except AttributeError: - return None - - def get_content(self, url: str): - url = settings.READABILITY_HOST.rstrip( - '/') + '/api/content/v1/parser?url=' + url - try: - response = requests.get(url).json() - return response['excerpt'] - except KeyError: - return None - def post(self, request, format=None): url = request.GET.get('url') if url: - title = self.get_title(url) - if title is None: - title = url + page = get_content(url) + + title = page['title'] content = None if settings.READABILITY_HOST: - content = self.get_content(url) + content = page['excerpt'] url = URLModel(url=url, user=request.user, title=title, content=content) diff --git a/later42/views/reader.py b/later42/views/reader.py new file mode 100644 index 0000000..6c1cb07 --- /dev/null +++ b/later42/views/reader.py @@ -0,0 +1,17 @@ +from multiprocessing import context +from django.contrib.auth.decorators import login_required +from django.shortcuts import render, redirect +from django.core.paginator import Paginator +from django.conf import settings +from later42.libs.content import get_content, sanitize_img_size +from later42.models.urls import URL + + +@login_required +def get(request, url_id=None): + url = URL.objects.get( + user=request.user, archived=False, id=url_id) + content = get_content(url.url) + content['rich_content'] = sanitize_img_size(content['rich_content']) + context = {'url': url, 'content': content} + return render(request, 'reader.html', context)