Api de opinione

This commit is contained in:
Daniel Cortes
2020-07-15 00:35:20 -04:00
parent 442c01db1f
commit 329a982641
4 changed files with 54 additions and 4 deletions

View File

@@ -13,6 +13,7 @@ class Entity(Model):
Pueden ser: artist, release-group, release o recording Pueden ser: artist, release-group, release o recording
""" """
class Meta: class Meta:
verbose_name = 'Entidad' verbose_name = 'Entidad'
verbose_name_plural = 'Entidades' verbose_name_plural = 'Entidades'
@@ -49,7 +50,7 @@ class ListItem(Model):
stars_validators = [MinValueValidator(0), MaxValueValidator(5)] stars_validators = [MinValueValidator(0), MaxValueValidator(5)]
user = ForeignKey(User, on_delete=CASCADE, related_name='list') user = ForeignKey(User, on_delete=CASCADE, related_name='list')
entity = ForeignKey(Entity, on_delete=CASCADE) entity = ForeignKey(Entity, on_delete=CASCADE, related_name='entities')
stars = IntegerField('estrellas', default=0, validators=stars_validators, blank=True) stars = IntegerField('estrellas', default=0, validators=stars_validators, blank=True)
opinion = TextField('opinion', default='', blank=True) opinion = TextField('opinion', default='', blank=True)
tags = ManyToManyField(Tag, related_name='list', blank=True) tags = ManyToManyField(Tag, related_name='list', blank=True)
@@ -60,6 +61,7 @@ class ListItem(Model):
class OpinionHelpful(Model): class OpinionHelpful(Model):
"""Voto sobre una opinion""" """Voto sobre una opinion"""
class Meta: class Meta:
verbose_name = 'valoración de opinion' verbose_name = 'valoración de opinion'
verbose_name_plural = 'valoraciones de opinion' verbose_name_plural = 'valoraciones de opinion'

View File

@@ -28,7 +28,7 @@ class TestList(TestCase):
for tag in self.tags: for tag in self.tags:
self.user.tags.add(tag) self.user.tags.add(tag)
list_item = ListItem.objects.create(user_id=self.user.id, entity=self.entities[0]) list_item = ListItem.objects.create(user_id=self.user.id, entity=self.entities[0], opinion='oh no', stars=4)
list_item.tags.set(self.tags) list_item.tags.set(self.tags)
self.user.list.add(list_item) self.user.list.add(list_item)
@@ -269,3 +269,16 @@ class TestList(TestCase):
self.assertEqual(Tag.objects.all().count(), 2) self.assertEqual(Tag.objects.all().count(), 2)
self.assertEqual(ListItem.objects.get(pk=1).tags.count(), 2) self.assertEqual(ListItem.objects.get(pk=1).tags.count(), 2)
def test_entity_opinions(self):
response = self.client.get('/api/lists/entity/a/opinions', follow=True)
self.assertEqual(response.status_code, 200)
opinions = response.json()['opinions']
self.assertEqual(len(opinions), 1)
self.assertEqual(opinions[0]['user']['id'], 1)
self.assertEqual(opinions[0]['user']['username'], 'user')
self.assertEqual(opinions[0]['opinion'], 'oh no')
self.assertEqual(opinions[0]['stars'], 4)

View File

@@ -6,5 +6,6 @@ urlpatterns = [
path('list/<int:user_id>/', views.list_view), path('list/<int:user_id>/', views.list_view),
path('list/<int:user_id>/<int:list_item_id>/', views.list_item_view), path('list/<int:user_id>/<int:list_item_id>/', views.list_item_view),
path('tag/<int:user_id>/', views.tag_view), path('tag/<int:user_id>/', views.tag_view),
path('tag/<int:user_id>/<int:tag_id>/', views.tag_view) path('tag/<int:user_id>/<int:tag_id>/', views.tag_view),
path('entity/<str:entity_mbid>/opinions/', views.get_entity_opinions),
] ]

View File

@@ -5,7 +5,7 @@ from django.http import JsonResponse
from oauth2_provider.decorators import protected_resource from oauth2_provider.decorators import protected_resource
from lists.forms import ListItemForm, TagForm, EntityForm from lists.forms import ListItemForm, TagForm, EntityForm
from lists.models import ListItem, Tag, Entity from lists.models import ListItem, Tag, Entity, OpinionHelpful
from users.models import User from users.models import User
@@ -305,3 +305,37 @@ def _delete_tag(request, user, tag):
tag.delete() tag.delete()
return JsonResponse({'status': 200}, status=200) return JsonResponse({'status': 200}, status=200)
def get_entity_opinions(request, entity_mbid):
"""Opiniones sobre una entidad"""
if request.method != 'GET':
return JsonResponse({'status': 404, 'error': 'La ruta no existe'}, status=404)
# Tiene que existir la entidad con el id entregado.
items = ListItem.objects.filter(entity__mbid=entity_mbid)
if items.count() == 0:
return JsonResponse({'status': 404, 'error': f'La entidad {entity_mbid} no esta en ninguna lista'}, status=404)
encoded_opinions = []
for item in items:
helpful_y = OpinionHelpful.objects.filter(opinion_id=item, vote='Y').count()
helpful_n = OpinionHelpful.objects.filter(opinion_id=item, vote='N').count()
helpful_f = OpinionHelpful.objects.filter(opinion_id=item, vote='F').count()
encoded_opinions.append({
'user': {
'id': item.user.id,
'username': item.user.username,
},
'opinion': item.opinion,
'stars': item.stars,
'helpful': {
'Y': helpful_y,
'N': helpful_n,
'F': helpful_f,
}
})
return JsonResponse({'opinions': encoded_opinions})