summaryrefslogtreecommitdiffstats
path: root/group_messaging/views.py
diff options
context:
space:
mode:
Diffstat (limited to 'group_messaging/views.py')
-rw-r--r--group_messaging/views.py152
1 files changed, 152 insertions, 0 deletions
diff --git a/group_messaging/views.py b/group_messaging/views.py
new file mode 100644
index 00000000..9d324d62
--- /dev/null
+++ b/group_messaging/views.py
@@ -0,0 +1,152 @@
+"""semi-views for the `group_messaging` application
+These are not really views - rather context generator
+functions, to be used separately, when needed.
+
+For example, some other application can call these
+in order to render messages within the page.
+
+Notice that :mod:`urls` module decorates all these functions
+and turns them into complete views
+"""
+from coffin.template.loader import get_template
+from django.forms import IntegerField
+from django.http import HttpResponse
+from django.http import HttpResponseNotAllowed
+from django.http import HttpResponseForbidden
+from django.utils import simplejson
+from group_messaging.models import Message
+from group_messaging.models import SenderList
+from group_messaging.models import get_personal_group_by_user_id
+
+class InboxView(object):
+ """custom class-based view
+ to be used for pjax use and for generation
+ of content in the traditional way, where
+ the only the :method:`get_context` would be used.
+ """
+ template_name = None #used only for the "GET" method
+ http_method_names = ('GET', 'POST')
+
+ def render_to_response(self, context, template_name=None):
+ """like a django's shortcut, except will use
+ template_name from self, if `template_name` is not given.
+ Also, response is packaged as json with an html fragment
+ for the pjax consumption
+ """
+ if template_name is None:
+ template_name = self.template_name
+ template = get_template(self.template_name)
+ html = template.render(context)
+ json = simplejson.dumps({'html': html})
+ return HttpResponse(json, mimetype='application/json')
+
+
+ def get(self, request, *args, **kwargs):
+ """view function for the "GET" method"""
+ context = self.get_context(request, *args, **kwargs)
+ return self.render_to_response(context)
+
+ def post(self, request, *args, **kwargs):
+ """view function for the "POST" method"""
+ pass
+
+ def dispatch(self, request, *args, **kwargs):
+ """checks that the current request method is allowed
+ and calls the corresponding view function"""
+ if request.method not in self.http_method_names:
+ return HttpResponseNotAllowed()
+ view_func = getattr(self, request.method.lower())
+ return view_func(request, *args, **kwargs)
+
+ def get_context(self, request, *args, **kwargs):
+ """Returns the context dictionary for the "get"
+ method only"""
+ return {}
+
+ def as_view(self):
+ """returns the view function - for the urls.py"""
+ def view_function(request, *args, **kwargs):
+ """the actual view function"""
+ if request.user.is_authenticated() and request.is_ajax():
+ view_method = getattr(self, request.method.lower())
+ return view_method(request, *args, **kwargs)
+ else:
+ return HttpResponseForbidden()
+
+ return view_function
+
+
+class NewThread(InboxView):
+ """view for creation of new thread"""
+ template_name = 'create_thread.html'# contains new thread form
+ http_method_list = ('GET', 'POST')
+
+ def post(self, request):
+ """creates a new thread on behalf of the user
+ response is blank, because on the client side we just
+ need to go back to the thread listing view whose
+ content should be cached in the client'
+ """
+ username = IntegerField().clean(request.POST['to_username'])
+ user = User.objects.get(username=username)
+ recipient = get_personal_group_by_user_id(user.id)
+ Message.objects.create_thread(
+ sender=request.user,
+ recipients=[recipient],
+ text=request.POST['text']
+ )
+ return HttpResponse('', mimetype='application/json')
+
+
+class NewResponse(InboxView):
+ """view to create a new response"""
+ http_method_list = ('POST',)
+
+ def post(self, request):
+ parent_id = IntegerField().clean(request.POST['parent_id'])
+ parent = Message.objects.get(id=parent_id)
+ message = Message.objects.create_response(
+ sender=request.user,
+ text=request.POST['text'],
+ parent=parent
+ )
+ return self.render_to_response(
+ {'message': message}, template_name='stored_message.htmtl'
+ )
+
+class ThreadsList(InboxView):
+ """shows list of threads for a given user"""
+ template_name = 'threads_list.html'
+ http_method_list = ('GET',)
+
+ def get_context(self, request):
+ """returns thread list data"""
+ threads = Message.objects.get_threads_for_user(request.user)
+ threads = threads.values('id', 'headline')
+ return {'threads': threads}
+
+
+class SendersList(InboxView):
+ """shows list of senders for a user"""
+ template_name = 'senders_list.html'
+ http_method_names = ('GET',)
+
+ def get_context(self, request):
+ """get data about senders for the user"""
+ senders = SenderList.objects.get_senders_for_user(request.user)
+ senders = senders.values('id', 'username')
+ return {'senders': senders}
+
+
+class ThreadDetails(InboxView):
+ """shows entire thread in the unfolded form"""
+ template_name = 'thread_details.html'
+ http_method_names = ('GET',)
+
+ def get_context(self, request):
+ """shows individual thread"""
+ thread_id = IntegerField().clean(request.GET['thread_id'])
+ #todo: assert that current thread is the root
+ messages = Message.objects.filter(root__id=thread_id)
+ messages = messages.values('html')
+ return {'messages': messages}