/jchat/views.py

http://django-jchat.googlecode.com/ · Python · 144 lines · 80 code · 27 blank · 37 comment · 17 complexity · 2f26211b6a5803fafdfdcd7623c9330c MD5 · raw file

  1. # -*- encoding: UTF-8 -*-
  2. '''
  3. Chat application views, some are tests... some are not
  4. @author: Federico C??ceres <fede.caceres@gmail.com>
  5. '''
  6. from datetime import datetime
  7. from django.http import HttpResponse, Http404
  8. from django.shortcuts import render_to_response
  9. from django.contrib.auth.decorators import login_required
  10. from django.template import RequestContext
  11. from django.contrib.auth.models import User
  12. from models import Room, Message
  13. @login_required
  14. def send(request):
  15. '''
  16. Expects the following POST parameters:
  17. chat_room_id
  18. message
  19. '''
  20. p = request.POST
  21. r = Room.objects.get(id=int(p['chat_room_id']))
  22. r.say(request.user, p['message'])
  23. return HttpResponse('')
  24. @login_required
  25. def sync(request):
  26. '''Return last message id
  27. EXPECTS the following POST parameters:
  28. id
  29. '''
  30. if request.method != 'POST':
  31. raise Http404
  32. post = request.POST
  33. if not post.get('id', None):
  34. raise Http404
  35. r = Room.objects.get(id=post['id'])
  36. lmid = r.last_message_id()
  37. return HttpResponse(jsonify({'last_message_id':lmid}))
  38. @login_required
  39. def receive(request):
  40. '''
  41. Returned serialized data
  42. EXPECTS the following POST parameters:
  43. id
  44. offset
  45. This could be useful:
  46. @see: http://www.djangosnippets.org/snippets/622/
  47. '''
  48. if request.method != 'POST':
  49. raise Http404
  50. post = request.POST
  51. if not post.get('id', None) or not post.get('offset', None):
  52. raise Http404
  53. try:
  54. room_id = int(post['id'])
  55. except:
  56. raise Http404
  57. try:
  58. offset = int(post['offset'])
  59. except:
  60. offset = 0
  61. r = Room.objects.get(id=room_id)
  62. m = r.messages(offset)
  63. return HttpResponse(jsonify(m, ['id','author','message','type']))
  64. @login_required
  65. def join(request):
  66. '''
  67. Expects the following POST parameters:
  68. chat_room_id
  69. message
  70. '''
  71. p = request.POST
  72. r = Room.objects.get(id=int(p['chat_room_id']))
  73. r.join(request.user)
  74. return HttpResponse('')
  75. @login_required
  76. def leave(request):
  77. '''
  78. Expects the following POST parameters:
  79. chat_room_id
  80. message
  81. '''
  82. p = request.POST
  83. r = Room.objects.get(id=int(p['chat_room_id']))
  84. r.leave(request.user)
  85. return HttpResponse('')
  86. @login_required
  87. def test(request):
  88. '''Test the chat application'''
  89. u = User.objects.get(id=1) # always attach to first user id
  90. r = Room.objects.get_or_create(u)
  91. return render_to_response('chat/chat.html', {'js': ['/media/js/mg/chat.js'], 'chat_id':r.pk}, context_instance=RequestContext(request))
  92. def jsonify(object, fields=None, to_dict=False):
  93. '''Simple convert model to json'''
  94. try:
  95. import json
  96. except:
  97. import django.utils.simplejson as json
  98. out = []
  99. if type(object) not in [dict,list,tuple] :
  100. for i in object:
  101. tmp = {}
  102. if fields:
  103. for field in fields:
  104. tmp[field] = unicode(i.__getattribute__(field))
  105. else:
  106. for attr, value in i.__dict__.iteritems():
  107. tmp[attr] = value
  108. out.append(tmp)
  109. else:
  110. out = object
  111. if to_dict:
  112. return out
  113. else:
  114. return json.dumps(out)