diff --git a/docker-compose.yaml b/docker-compose.yaml index 1e1f713..2742b8c 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -34,6 +34,7 @@ services: max-file: "5" later42: + build: . container_name: later42 image: dntskdev/later42:master restart: always @@ -59,6 +60,28 @@ services: - "traefik.http.routers.later42-opt.tls.certresolver=myresolver" - "extdns.cf.later42.hostname=later42.com" +# later42_tasks: +# build: . +# container_name: later42_tasks +# image: dntskdev/later42:master +# restart: always +# command: celery -A later42 worker --loglevel=info +# environment: +# SECRET: "ahth3chaquodahh6que8thie1EThe5Iephich8eikei2Uojaemae6gee0kaet4aush2aoqu0ruL9oGhaiR9luu7cohreH6lebo0v" +# DB_TYPE: postgres +# DB_HOST: later42db +# DB_NAME: later42 +# DB_USER: later42 +# DB_PASS: later42 +# DOMAIN: later42.com +# READABILITY_HOST: http://ureadability:8080/ +# REDIS_URL: redis://redis:6379 +# logging: +# driver: json-file +# options: +# max-size: "10m" +# max-file: "5" + later42db: container_name: later42db image: postgres diff --git a/later42/migrations/0006_remove_url_content_remove_url_title_article_short_and_more.py b/later42/migrations/0006_remove_url_content_remove_url_title_article_short_and_more.py new file mode 100644 index 0000000..251ee97 --- /dev/null +++ b/later42/migrations/0006_remove_url_content_remove_url_title_article_short_and_more.py @@ -0,0 +1,31 @@ +# Generated by Django 4.1.2 on 2022-11-14 12:28 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('later42', '0005_rename_articles_article'), + ] + + operations = [ + migrations.RemoveField( + model_name='url', + name='content', + ), + migrations.RemoveField( + model_name='url', + name='title', + ), + migrations.AddField( + model_name='article', + name='short', + field=models.TextField(blank=True, null=True), + ), + migrations.AddField( + model_name='article', + name='title', + field=models.CharField(blank=True, max_length=2000, null=True), + ), + ] diff --git a/later42/models/article.py b/later42/models/article.py index 97606d0..895eaf2 100644 --- a/later42/models/article.py +++ b/later42/models/article.py @@ -1,4 +1,3 @@ -from django.contrib.auth.models import User from django.db import models from later42.models.urls import URL @@ -7,3 +6,5 @@ class Article(models.Model): id = models.AutoField(auto_created=True, primary_key=True) url = models.ForeignKey(URL, on_delete=models.CASCADE) content = models.TextField(blank=True, null=True) + title = models.CharField(max_length=2000, blank=True, null=True) + short = models.TextField(blank=True, null=True) diff --git a/later42/models/urls.py b/later42/models/urls.py index 02deb17..c7c962b 100644 --- a/later42/models/urls.py +++ b/later42/models/urls.py @@ -8,6 +8,4 @@ class URL(models.Model): id = models.AutoField(auto_created=True, primary_key=True) user = models.ForeignKey(User, on_delete=models.CASCADE) url = models.CharField(max_length=2000) - title = models.CharField(max_length=2000) archived = models.BooleanField(default=False) - content = models.TextField(blank=True, null=True) diff --git a/later42/tasks.py b/later42/tasks.py index 936adb7..12b1c86 100644 --- a/later42/tasks.py +++ b/later42/tasks.py @@ -1,6 +1,7 @@ import os import pybrake from celery import shared_task +from django.contrib.auth.models import User from pybrake.middleware.celery import patch_celery from later42.models.urls import URL from later42.models.article import Article @@ -19,9 +20,17 @@ if AIRBRAKE_PROJECT_ID is not None and AIRBRAKE_PROJECT_KEY is not None: @shared_task() -def get_url_content_task(id): - url = URL.objects.get(id=id) - article = Article.objects.create(url=url) - content = get_content(url.url)['rich_content'] - article.content = content +def get_url_content_task(url, user_id): + print(url) + print(user_id) + user = User.objects.get(pk=int(user_id)) + url_object = URL(url=url, user=user) + url_object.save() + + data = get_content(url) + + article = Article.objects.create(url=url_object) + article.content = data['rich_content'] + article.title = data['title'] + article.short = data['excerpt'] article.save() diff --git a/later42/templates/archive.html b/later42/templates/archive.html index 4384d2f..a5c606f 100644 --- a/later42/templates/archive.html +++ b/later42/templates/archive.html @@ -2,54 +2,57 @@ {% block content %}
-{% if urls|length > 0 %} -{% for url in urls %} +{% if data|length > 0 %} +{% for d in data %}
- {% if url.content %} + {% if d.short %} {% endif %}

{% endfor %} + +{% if data.number %} +{% endif %} {% else %}

У вас нет ссылок в архиве

{% endif %}
-{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/later42/templates/base.html b/later42/templates/base.html index 06151af..1449360 100644 --- a/later42/templates/base.html +++ b/later42/templates/base.html @@ -57,6 +57,7 @@ + {% else %} diff --git a/later42/templates/index.html b/later42/templates/index.html index 2977b3c..5a033ee 100644 --- a/later42/templates/index.html +++ b/later42/templates/index.html @@ -1,27 +1,27 @@ {% extends 'base.html' %} {% block content %} - {% if user.is_authenticated and urls|length > 0 %} - {% for url in urls %} + {% if user.is_authenticated and data|length > 0 %} + {% for d in data %}
- +
- {% if url.content %} + {% if d.short %}

- {{ url.content }} + {{ d.short }}

{% endif %}

- {{ url.url|urlizetrunc:70 }} + {{ d.url.url|urlizetrunc:70 }}

diff --git a/later42/templates/search.html b/later42/templates/search.html new file mode 100644 index 0000000..758ce5f --- /dev/null +++ b/later42/templates/search.html @@ -0,0 +1,58 @@ +{% extends 'base.html' %} + +{% block title %}Поиск{% endblock %} + + +{% block content %} +
+ {% csrf_token %} + + +
+
+ {% for d in data %} + +
+
+ +
+ +
+
+ {% if d.short %} +

+ {{ d.short }} +

+ {% endif %} +

+ {{ d.url.url|urlizetrunc:70 }} +

+
+ +
+ {% endfor %} +{% if data.number %} + +{% endif %} +{% endblock %} diff --git a/later42/urls.py b/later42/urls.py index fd49e48..2fd712b 100644 --- a/later42/urls.py +++ b/later42/urls.py @@ -22,7 +22,7 @@ from django.contrib.auth.models import User from rest_framework import routers, serializers, viewsets # from later42.forms import CustomLoginForm -from later42.views import account_activation, index, profile, api, api_token, reader, signup, about +from later42.views import account_activation, index, profile, api, api_token, reader, search, signup, about class UserSerializer(serializers.HyperlinkedModelSerializer): @@ -54,4 +54,5 @@ urlpatterns = [ path('archive/', index.archive, name='archive'), path('archive/', index.archive, name='archive_url'), path('reader/', reader.get, name='reader'), + path('search/', search.search, name='search'), ] diff --git a/later42/views/api.py b/later42/views/api.py index 95f2686..26a23cb 100644 --- a/later42/views/api.py +++ b/later42/views/api.py @@ -8,26 +8,8 @@ from django.conf import settings class URL(APIView): def post(self, request, format=None): - url = request.GET.get('url') - if url: - page = get_content(url) - - try: - title = page['title'] - except KeyError: - title = '' - - content = None - if settings.READABILITY_HOST: - try: - content = page['excerpt'] - except KeyError: - content = '' - - url = URLModel(url=url, user=request.user, - title=title, content=content) - url.save() - get_url_content_task.delay(url.id) + if request.GET.get('url'): + get_url_content_task.delay(request.GET.get('url'), request.user.id) return Response({'status': 'success'}) else: return Response({'status': 'error'}) diff --git a/later42/views/index.py b/later42/views/index.py index 70eea5b..4ed26be 100644 --- a/later42/views/index.py +++ b/later42/views/index.py @@ -3,16 +3,20 @@ 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.models.article import Article from later42.models.urls import URL def get(request): + data = {} try: urls = URL.objects.filter( user=request.user, archived=False).order_by('-id') + data = Article.objects.filter(url__in=urls).select_related('url') except: urls = [] - context = {'urls': urls} + context = {'data': data} return render(request, 'index.html', context) @@ -24,12 +28,13 @@ def archive(request, url_id=None): try: urls = URL.objects.filter( user=request.user, archived=True).order_by('-id') - paginator = Paginator(urls, settings.URLS_PER_PAGE) + data = Article.objects.filter(url__in=urls).select_related('url') + paginator = Paginator(data, settings.URLS_PER_PAGE) page_number = request.GET.get('page') - urls = paginator.get_page(page_number) + data = paginator.get_page(page_number) except: urls = [] - context = {'urls': urls} + context = {'data': data} return render(request, 'archive.html', context) diff --git a/later42/views/reader.py b/later42/views/reader.py index 12da6e7..4fb70ca 100644 --- a/later42/views/reader.py +++ b/later42/views/reader.py @@ -6,16 +6,13 @@ from django.conf import settings from later42.libs.content import get_content, sanitize_img_size from later42.models.article import Article from later42.models.urls import URL -from later42.tasks import get_url_content_task @login_required def get(request, url_id=None): url = URL.objects.get( user=request.user, id=url_id) - content = {} - try: article = Article.objects.get(url=url) content['rich_content'] = article.content @@ -24,6 +21,5 @@ def get(request, url_id=None): content['rich_content'] = sanitize_img_size(content['rich_content']) except: content = get_content(url.url) - get_url_content_task.delay(url.id) context = {'url': url, 'content': content} return render(request, 'reader.html', context) diff --git a/later42/views/search.py b/later42/views/search.py new file mode 100644 index 0000000..cef0728 --- /dev/null +++ b/later42/views/search.py @@ -0,0 +1,29 @@ +from django.conf import settings +from django.contrib.auth.decorators import login_required +from django.core.paginator import Paginator +from django.db.models import Q +from django.shortcuts import render + +from later42.models.article import Article +from later42.models.urls import URL as URL + + +@login_required +def search(request): + pattern = request.POST.get('search') + context = {} + if request.method == 'GET': + return render(request, 'search.html', context) + elif request.method == 'POST': + urls = URL.objects.filter( + user=request.user).order_by('-id') + data = Article.objects.filter( + Q(title__contains=pattern) | + Q(content__contains=pattern) | + Q(short__contains=pattern) | + Q(url__url__contains=pattern), url__user_id=request.user.id).select_related('url') + paginator = Paginator(data, settings.URLS_PER_PAGE) + page_number = request.GET.get('page') + data = paginator.get_page(page_number) + context = {'data': data} + return render(request, 'search.html', context)