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