From 753471544e934c54f515afbc507d4f0f77108414 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80=20=D0=93=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=BA=D0=B8=D1=85?= Date: Wed, 2 Oct 2019 14:17:06 +0300 Subject: [PATCH 1/9] Add app Rating --- apps/rating/__init__.py | 0 apps/rating/admin.py | 3 +++ apps/rating/apps.py | 5 +++++ apps/rating/migrations/__init__.py | 0 apps/rating/models.py | 3 +++ apps/rating/tests.py | 3 +++ apps/rating/views.py | 3 +++ project/settings/base.py | 1 + 8 files changed, 18 insertions(+) create mode 100644 apps/rating/__init__.py create mode 100644 apps/rating/admin.py create mode 100644 apps/rating/apps.py create mode 100644 apps/rating/migrations/__init__.py create mode 100644 apps/rating/models.py create mode 100644 apps/rating/tests.py create mode 100644 apps/rating/views.py diff --git a/apps/rating/__init__.py b/apps/rating/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/rating/admin.py b/apps/rating/admin.py new file mode 100644 index 00000000..8c38f3f3 --- /dev/null +++ b/apps/rating/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/apps/rating/apps.py b/apps/rating/apps.py new file mode 100644 index 00000000..6f17a343 --- /dev/null +++ b/apps/rating/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class RatingConfig(AppConfig): + name = 'rating' diff --git a/apps/rating/migrations/__init__.py b/apps/rating/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/rating/models.py b/apps/rating/models.py new file mode 100644 index 00000000..71a83623 --- /dev/null +++ b/apps/rating/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/apps/rating/tests.py b/apps/rating/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/apps/rating/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/apps/rating/views.py b/apps/rating/views.py new file mode 100644 index 00000000..91ea44a2 --- /dev/null +++ b/apps/rating/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/project/settings/base.py b/project/settings/base.py index cfea18a5..e444ef37 100644 --- a/project/settings/base.py +++ b/project/settings/base.py @@ -71,6 +71,7 @@ PROJECT_APPS = [ 'review.apps.ReviewConfig', 'comment.apps.CommentConfig', 'favorites.apps.FavoritesConfig', + 'rating.apps.RatingConfig', ] EXTERNAL_APPS = [ From 7b18d7e43069de542033e95ea128bd2675635e45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80=20=D0=93=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=BA=D0=B8=D1=85?= Date: Wed, 2 Oct 2019 14:50:30 +0300 Subject: [PATCH 2/9] Model and admin --- apps/rating/admin.py | 8 +++++++- apps/rating/migrations/0001_initial.py | 28 ++++++++++++++++++++++++++ apps/rating/models.py | 18 ++++++++++++++++- 3 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 apps/rating/migrations/0001_initial.py diff --git a/apps/rating/admin.py b/apps/rating/admin.py index 8c38f3f3..94a0435e 100644 --- a/apps/rating/admin.py +++ b/apps/rating/admin.py @@ -1,3 +1,9 @@ from django.contrib import admin +from rating import models -# Register your models here. + +@admin.register(models.Rating) +class RatingAdmin(admin.ModelAdmin): + """Rating type admin conf.""" + list_display = ['name', 'ip'] + list_display_links = ['name'] diff --git a/apps/rating/migrations/0001_initial.py b/apps/rating/migrations/0001_initial.py new file mode 100644 index 00000000..03165670 --- /dev/null +++ b/apps/rating/migrations/0001_initial.py @@ -0,0 +1,28 @@ +# Generated by Django 2.2.4 on 2019-10-02 11:32 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ] + + operations = [ + migrations.CreateModel( + name='Rating', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('object_id', models.PositiveIntegerField()), + ('ip', models.GenericIPAddressField(verbose_name='ip')), + ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), + ], + options={ + 'verbose_name': 'rating', + }, + ), + ] diff --git a/apps/rating/models.py b/apps/rating/models.py index 71a83623..61e4378d 100644 --- a/apps/rating/models.py +++ b/apps/rating/models.py @@ -1,3 +1,19 @@ +from django.contrib.contenttypes.fields import GenericForeignKey +from django.contrib.contenttypes.models import ContentType from django.db import models +from django.utils.translation import gettext_lazy as _ -# Create your models here. + +class Rating(models.Model): + content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) + object_id = models.PositiveIntegerField() + content_object = GenericForeignKey('content_type', 'object_id') + ip = models.GenericIPAddressField(verbose_name=_('ip')) + + @property + def name(self): + # Check if Generic obj has name or title + if hasattr(self.content_object, 'name'): + return self.content_object.name + if hasattr(self.content_object, 'title'): + return self.content_object.title_translated From f0001eef93e28d19c379b4cdde7a03a5f9411f39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80=20=D0=93=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=BA=D0=B8=D1=85?= Date: Wed, 2 Oct 2019 17:58:22 +0300 Subject: [PATCH 3/9] Add get method in view --- apps/news/views.py | 8 ++++++++ apps/rating/admin.py | 9 +++++++++ apps/rating/send.py | 14 ++++++++++++++ apps/rating/tasks.py | 14 ++++++++++++++ 4 files changed, 45 insertions(+) create mode 100644 apps/rating/send.py create mode 100644 apps/rating/tasks.py diff --git a/apps/news/views.py b/apps/news/views.py index 081f5a62..1e24971f 100644 --- a/apps/news/views.py +++ b/apps/news/views.py @@ -34,6 +34,14 @@ class NewsDetailView(NewsMixinView, generics.RetrieveAPIView): """Override get_queryset method.""" return super().get_queryset().with_extended_related() + def get(self, request, *args, **kwargs): + from rating.tasks import add_rating + print('SLUG') + add_rating.apply_async( + (1, '192.1.1.1.'), countdown=4 + ) + return self.retrieve(request, *args, **kwargs) + class NewsTypeListView(generics.ListAPIView): """NewsType list view.""" diff --git a/apps/rating/admin.py b/apps/rating/admin.py index 94a0435e..d8d46ae9 100644 --- a/apps/rating/admin.py +++ b/apps/rating/admin.py @@ -1,5 +1,11 @@ from django.contrib import admin from rating import models +from rating import tasks + +# +# def add_task_action(modeladmin, request, queryset): +# # 1, "192.168.1.1" +# tasks.add.delay(1, "192.168.1.1") @admin.register(models.Rating) @@ -7,3 +13,6 @@ class RatingAdmin(admin.ModelAdmin): """Rating type admin conf.""" list_display = ['name', 'ip'] list_display_links = ['name'] + # actions = [add_task_action] + + diff --git a/apps/rating/send.py b/apps/rating/send.py new file mode 100644 index 00000000..06e5daff --- /dev/null +++ b/apps/rating/send.py @@ -0,0 +1,14 @@ +from pika import BlockingConnection, ConnectionParameters + + +def mess(): + connection = BlockingConnection(ConnectionParameters('rabbitmq')) + channel = connection.channel() + + channel.queue_declare(queue='rating') + channel.basic_publish( + exchange='', + routing_key='rating', + body='{news_id:127.0.0.1}' + ) + connection.close() \ No newline at end of file diff --git a/apps/rating/tasks.py b/apps/rating/tasks.py new file mode 100644 index 00000000..d3d2216c --- /dev/null +++ b/apps/rating/tasks.py @@ -0,0 +1,14 @@ +from datetime import timedelta +from celery.task import periodic_task, Task +from celery import task + + + + + +@task +def add_rating(object_id, ip): + print('object_id: ' + str(object_id)) + print('ip: ' + str(ip)) + + From f90e1cedede10a4a723bf6a9e9d0a811c9b603d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80=20=D0=93=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=BA=D0=B8=D1=85?= Date: Thu, 3 Oct 2019 11:37:59 +0300 Subject: [PATCH 4/9] Add raiting --- apps/news/views.py | 14 ++++---------- apps/rating/tasks.py | 18 +++++++++++++----- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/apps/news/views.py b/apps/news/views.py index 1e24971f..24cac304 100644 --- a/apps/news/views.py +++ b/apps/news/views.py @@ -1,7 +1,7 @@ """News app views.""" from rest_framework import generics, permissions from news import filters, models, serializers - +from rating.tasks import add_rating class NewsMixinView: """News mixin.""" @@ -34,15 +34,6 @@ class NewsDetailView(NewsMixinView, generics.RetrieveAPIView): """Override get_queryset method.""" return super().get_queryset().with_extended_related() - def get(self, request, *args, **kwargs): - from rating.tasks import add_rating - print('SLUG') - add_rating.apply_async( - (1, '192.1.1.1.'), countdown=4 - ) - return self.retrieve(request, *args, **kwargs) - - class NewsTypeListView(generics.ListAPIView): """NewsType list view.""" @@ -84,3 +75,6 @@ class NewsBackOfficeRUDView(NewsBackOfficeMixinView, serializer_class = serializers.NewsBackOfficeDetailSerializer + def get(self, request, pk, *args, **kwargs): + add_rating(remote_addr=request.META.get('REMOTE_ADDR'), pk=pk, model='news') + return self.retrieve(request, *args, **kwargs) diff --git a/apps/rating/tasks.py b/apps/rating/tasks.py index d3d2216c..6b214e18 100644 --- a/apps/rating/tasks.py +++ b/apps/rating/tasks.py @@ -1,14 +1,22 @@ from datetime import timedelta -from celery.task import periodic_task, Task from celery import task +from rating.models import Rating +from django.contrib.contenttypes.models import ContentType - +def add_rating(remote_addr, pk, model): + add.apply_async( + (remote_addr, pk, model), countdown=60 + ) @task -def add_rating(object_id, ip): - print('object_id: ' + str(object_id)) - print('ip: ' + str(ip)) +def add(remote_addr, pk, model): + rating = Rating() + rating.ip = remote_addr + rating.object_id = pk + rating.content_type = ContentType.objects.get(model=model) + rating.save() + From 295bda4b4ffb18c9fcee4cb95258376376cbbb32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80=20=D0=93=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=BA=D0=B8=D1=85?= Date: Thu, 3 Oct 2019 11:41:52 +0300 Subject: [PATCH 5/9] Add hours --- apps/rating/tasks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/rating/tasks.py b/apps/rating/tasks.py index 6b214e18..4942ccdb 100644 --- a/apps/rating/tasks.py +++ b/apps/rating/tasks.py @@ -6,7 +6,7 @@ from django.contrib.contenttypes.models import ContentType def add_rating(remote_addr, pk, model): add.apply_async( - (remote_addr, pk, model), countdown=60 + (remote_addr, pk, model), countdown=60 * 60 ) From 14cf7d7b1b9d3203deebc0ff2ac931516da3df13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80=20=D0=93=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=BA=D0=B8=D1=85?= Date: Thu, 3 Oct 2019 14:46:34 +0300 Subject: [PATCH 6/9] Add rating value in news --- apps/news/models.py | 7 +++++++ apps/news/views.py | 2 +- apps/rating/tasks.py | 8 ++++---- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/apps/news/models.py b/apps/news/models.py index efa0b566..2264d897 100644 --- a/apps/news/models.py +++ b/apps/news/models.py @@ -5,6 +5,8 @@ from django.utils import timezone from django.utils.translation import gettext_lazy as _ from rest_framework.reverse import reverse from utils.models import BaseAttributes, TJSONField, TranslatedFieldsMixin +from django.contrib.contenttypes.models import ContentType +from rating.models import Rating from random import sample as random_sample @@ -27,6 +29,9 @@ class NewsType(models.Model): class NewsQuerySet(models.QuerySet): """QuerySet for model News""" + def rating_value(self): + return self.annotate(rating=models.Count('ratings')) + def with_base_related(self): """Return qs with related objects.""" return self.select_related('news_type', 'country').prefetch_related('tags') @@ -132,6 +137,8 @@ class News(BaseAttributes, TranslatedFieldsMixin): verbose_name=_('country')) tags = generic.GenericRelation(to='main.MetaDataContent') + ratings = generic.GenericRelation(Rating) + objects = NewsQuerySet.as_manager() class Meta: diff --git a/apps/news/views.py b/apps/news/views.py index 24cac304..25dac124 100644 --- a/apps/news/views.py +++ b/apps/news/views.py @@ -76,5 +76,5 @@ class NewsBackOfficeRUDView(NewsBackOfficeMixinView, serializer_class = serializers.NewsBackOfficeDetailSerializer def get(self, request, pk, *args, **kwargs): - add_rating(remote_addr=request.META.get('REMOTE_ADDR'), pk=pk, model='news') + add_rating(remote_addr=request.META.get('REMOTE_ADDR'), pk=pk, model='news', app_label='news',) return self.retrieve(request, *args, **kwargs) diff --git a/apps/rating/tasks.py b/apps/rating/tasks.py index 4942ccdb..0e176910 100644 --- a/apps/rating/tasks.py +++ b/apps/rating/tasks.py @@ -4,18 +4,18 @@ from rating.models import Rating from django.contrib.contenttypes.models import ContentType -def add_rating(remote_addr, pk, model): +def add_rating(remote_addr, pk, model, app_label): add.apply_async( - (remote_addr, pk, model), countdown=60 * 60 + (remote_addr, pk, model, app_label), countdown=60 * 60 ) @task -def add(remote_addr, pk, model): +def add(remote_addr, pk, model, app_label): rating = Rating() rating.ip = remote_addr rating.object_id = pk - rating.content_type = ContentType.objects.get(model=model) + rating.content_type = ContentType.objects.get(app_label=app_label, model=model) rating.save() From 9fd064fdec5f4245db9e8c5df42644a3be426fc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80=20=D0=93=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=BA=D0=B8=D1=85?= Date: Thu, 3 Oct 2019 14:51:17 +0300 Subject: [PATCH 7/9] Add rating unique value --- apps/news/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/news/models.py b/apps/news/models.py index 2264d897..a4aae03a 100644 --- a/apps/news/models.py +++ b/apps/news/models.py @@ -30,7 +30,7 @@ class NewsQuerySet(models.QuerySet): """QuerySet for model News""" def rating_value(self): - return self.annotate(rating=models.Count('ratings')) + return self.annotate(rating=models.Count('ratings__ip', distinct=True)) def with_base_related(self): """Return qs with related objects.""" From ca38f369f7ee2ecf55161da24797fb150a7f34b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80=20=D0=93=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=BA=D0=B8=D1=85?= Date: Fri, 4 Oct 2019 10:15:07 +0300 Subject: [PATCH 8/9] Fix --- apps/rating/send.py | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 apps/rating/send.py diff --git a/apps/rating/send.py b/apps/rating/send.py deleted file mode 100644 index 06e5daff..00000000 --- a/apps/rating/send.py +++ /dev/null @@ -1,14 +0,0 @@ -from pika import BlockingConnection, ConnectionParameters - - -def mess(): - connection = BlockingConnection(ConnectionParameters('rabbitmq')) - channel = connection.channel() - - channel.queue_declare(queue='rating') - channel.basic_publish( - exchange='', - routing_key='rating', - body='{news_id:127.0.0.1}' - ) - connection.close() \ No newline at end of file From b42e9781a11fc4714bae6cccb703ed3a42a458bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80=20=D0=93=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=BA=D0=B8=D1=85?= Date: Fri, 4 Oct 2019 10:20:36 +0300 Subject: [PATCH 9/9] Fix code --- apps/news/views.py | 3 ++- apps/rating/admin.py | 7 ------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/apps/news/views.py b/apps/news/views.py index 25dac124..61a57251 100644 --- a/apps/news/views.py +++ b/apps/news/views.py @@ -76,5 +76,6 @@ class NewsBackOfficeRUDView(NewsBackOfficeMixinView, serializer_class = serializers.NewsBackOfficeDetailSerializer def get(self, request, pk, *args, **kwargs): - add_rating(remote_addr=request.META.get('REMOTE_ADDR'), pk=pk, model='news', app_label='news',) + add_rating(remote_addr=request.META.get('REMOTE_ADDR'), + pk=pk, model='news', app_label='news') return self.retrieve(request, *args, **kwargs) diff --git a/apps/rating/admin.py b/apps/rating/admin.py index d8d46ae9..151f406b 100644 --- a/apps/rating/admin.py +++ b/apps/rating/admin.py @@ -2,17 +2,10 @@ from django.contrib import admin from rating import models from rating import tasks -# -# def add_task_action(modeladmin, request, queryset): -# # 1, "192.168.1.1" -# tasks.add.delay(1, "192.168.1.1") - - @admin.register(models.Rating) class RatingAdmin(admin.ModelAdmin): """Rating type admin conf.""" list_display = ['name', 'ip'] list_display_links = ['name'] - # actions = [add_task_action]