I don't know where the websocket bug is (or maybe bugs from other sources?). Could you help me with that? Thanks!!!
I am attaching some information that I think might be useful. If you think I miss anything please let me know and I will post it here!
2018-06-25 00:22:42,828 - INFO - worker - Listening on channels http.request, websocket.connect, websocket.disconnect, websocket.receive
import re
import json
import logging
from channels import Group
from channels.sessions import channel_session
from .models import Discussion, Statement, Vote
from chat.models import Room
from experiment.models import ExpUser,TaskUser, Crowd
from channels.auth import http_session, http_session_user, channel_session_user, channel_session_user_from_http
log = logging.getLogger(__name__)
@channel_session_user_from_http
@channel_session
def ws_connect(message):
# Extract the discussion-label from the message. This expects message.path to be of the
# form forum/{label}/, and finds a Discussion if the message path is applicable,
# and if the Discussion exists. Otherwise, bails (meaning this is a some othersort
# of websocket). So, this is effectively a version of _get_object_or_404.
try:
log.debug('In the try block of ws_connect')#added by me
prefix, label = message['path'].decode('ascii').strip('/').split('/')
if prefix != 'forum':
log.debug('invalid ws path=%s', message['path'])
return
if prefix == 'forum':
discussion = Discussion.objects.get(label=label)
except ValueError:
log.debug('invalid ws path=%s', message['path'])
return
except Discussion.DoesNotExist:
log.debug('ws discussion does not exist label=%s', label)
return
if prefix == 'forum':
log.debug('forum connect discussion=%s client=%s:%s', discussion.label, message['client'][0], message['client'][1])
t = TaskUser(user=message.user,crowd=label,time_type='start')
t.save()
# Need to be explicit about the channel layer so that testability works
# This may be a FIXME?
Group('forum-'+label, channel_layer=message.channel_layer).add(message.reply_channel)
message.channel_session['discussion'] = discussion.label
message.reply_channel.send({
'accept': True
})
@channel_session_user
@channel_session
def ws_receive(message):
if 'discussion' in message.channel_session:
# Look up the room from the channel session, bailing if it doesn't exist
try:
label = message.channel_session['discussion']
discussion = Discussion.objects.get(label=label)
except KeyError:
log.debug('no discussion-forum in channel_session')
return
except Discussion.DoesNotExist:
log.debug('recieved message, buy discussion does not exist label=%s', label)
return
try:
expuser = ExpUser.objects.get(user=message.user)
except KeyError:
log.debug('problem getting username')
return
except ExpUser.DoesNotExist:
log.debug('recieved message, but user does not exist label=%s', label)
return
# Parse out a chat message from the content text, bailing if it doesn't
# conform to the expected message format.
try:
data = json.loads(message['text'])
except ValueError:
log.debug("ws message isn't json text=%s", text)
return
## check whether it is acceptable format
# if set(data.keys()) != set(('handle', 'message','isreply','parentid')):
#if set(data.keys()) != set(('handle', 'msg_type')):
# log.debug("ws message unexpected format data=%s", data)
# return
if data:
if data['msg_type'] == 'vote':
log.debug('vote handle=%s value=%s',
expuser.nickname, data['value'])
statement = Statement.objects.get(id=data['id'])
m0 = statement.as_dict()
log.debug('vote id=%s, score=%s, ups=%s, downs=%s',
statement.id,statement.score,statement.ups,statement.downs)
ndata = {'user':message.user,'handle':expuser.nickname,'statement':statement,'value':data['value']}
#vote = Vote.objects.create(**ndata)
#vote = vote.new_vote()
vote = None
votes = Vote.objects.filter(user=message.user,statement=statement)
if not votes:
vote = Vote.objects.create(**ndata)
else:
vote = votes[0]
vote.value = data['value']
vote.save()
#m = Vote.objects.create(data['handle'],statement,data['value']) # NEED TO FIX HERE
#vote = Vote.create(handle=data['handle'],
# statement=statement,
# value=data['value'])
#vote.save()
m = statement.update_score()
m['msg_type'] = 'vote'
log.debug('vote score=%s',
m['score'])
# See above for the note about Group
Group('forum-'+label, channel_layer=message.channel_layer).send({'text': json.dumps(m)})
else:
log.debug('chat message handle=%s message=%s',
expuser.nickname, data['message'])
parent = None
log.debug(data['parentid'])
if data['parentid']!=0:
parent = discussion.statements.get(id=data['parentid'])
data['parent'] = parent
data.pop("msg_type",None)
data['user'] = message.user
data['handle'] = expuser.nickname
data['crowd_label'] = discussion.crowd_label
data['task_label'] = discussion.task_label
m = discussion.statements.create(**data) # NEED TO FIX HERE
# See above for the note about Group
Group('forum-'+label, channel_layer=message.channel_layer).send({'text': json.dumps(m.as_dict())})
@channel_session_user
@channel_session
def ws_disconnect(message):
if 'discussion' in message.channel_session:
try:
label = message.channel_session['discussion']
discussion = Discussion.objects.get(label=label)
#crowd_taskuser = Crowd.objects.get(id=int(label))
t = TaskUser(user=message.user,crowd=label,time_type='end')
t.save()
Group('forum-'+label, channel_layer=message.channel_layer).discard(message.reply_channel)
except (KeyError, Discussion.DoesNotExist):
pass