Browse Source

use strategy to build API urls for polls

Rafał Pitoń 8 years ago
parent
commit
cc0ae15aff

+ 4 - 0
misago/threads/api/threadpoll.py

@@ -32,8 +32,12 @@ class ViewSet(viewsets.ViewSet):
             poll_id = get_int_or_404(pk)
             if thread.poll.pk != poll_id:
                 raise Http404()
+
             poll = Poll.objects.select_for_update().get(pk=thread.poll.pk)
+
             poll.thread = thread
+            poll.category = thread.category
+
             return poll
         except Poll.DoesNotExist:
             raise Http404()

+ 7 - 0
misago/threads/models/poll.py

@@ -36,6 +36,13 @@ class Poll(models.Model):
             return self.posted_on - timedelta(days=self.length) < timezone.now()
         return False
 
+    @property
+    def thread_type(self):
+        return self.category.thread_type
+
+    def get_api_url(self):
+        return self.thread_type.get_poll_api_url(self)
+
     def make_choices_votes_aware(self, user, choices):
         if user.is_anonymous():
             for choice in choices:

+ 3 - 0
misago/threads/models/thread.py

@@ -174,6 +174,9 @@ class Thread(models.Model):
     def get_post_split_api_url(self):
         return self.thread_type.get_post_split_api_url(self)
 
+    def get_poll_api_url(self):
+        return self.thread_type.get_thread_poll_api_url(self)
+
     def get_absolute_url(self, page=1):
         return self.thread_type.get_thread_absolute_url(self, page)
 

+ 3 - 6
misago/threads/serializers/poll.py

@@ -39,18 +39,15 @@ class PollSerializer(serializers.ModelSerializer):
 
     def get_api(self, obj):
         return {
-            'index': reverse('misago:api:thread-poll-detail', kwargs={
-                'thread_pk': obj.thread_id,
-                'pk': obj.pk
-            }),
+            'index': obj.get_api_url(),
         }
 
     def get_url(self, obj):
         return {
-            'poster': self.get_last_poster_url(obj),
+            'poster': self.get_poster_url(obj),
         }
 
-    def get_last_poster_url(self, obj):
+    def get_poster_url(self, obj):
         if obj.poster_id:
             return reverse('misago:user', kwargs={
                 'slug': obj.poster_slug,

+ 1 - 0
misago/threads/serializers/thread.py

@@ -90,6 +90,7 @@ class ThreadSerializer(serializers.ModelSerializer):
             'index': obj.get_api_url(),
             'editor': obj.get_editor_api_url(),
             'merge': obj.get_merge_api_url(),
+            'poll': obj.get_poll_api_url(),
             'posts': {
                 'index': obj.get_posts_api_url(),
                 'merge': obj.get_post_merge_api_url(),

+ 11 - 0
misago/threads/threadtypes/thread.py

@@ -85,11 +85,22 @@ class Thread(ThreadType):
             'pk': thread.pk
         })
 
+    def get_thread_poll_api_url(self, thread):
+        return reverse('misago:api:thread-poll-list', kwargs={
+            'thread_pk': thread.pk
+        })
+
     def get_thread_posts_api_url(self, thread):
         return reverse('misago:api:thread-post-list', kwargs={
             'thread_pk': thread.pk
         })
 
+    def get_poll_api_url(self, poll):
+        return reverse('misago:api:thread-poll-detail', kwargs={
+            'thread_pk': poll.thread_id,
+            'pk': poll.pk
+        })
+
     def get_post_merge_api_url(self, thread):
         reverse('misago:api:thread-post-merge', kwargs={
             'thread_pk': thread.pk