def testCommentedConversationInit(self): data = json.loads( open( os.path.join( TEST_ROOT, 'data', 'conversation_without_comment.json')).read())['data'] Conversation.from_api_response(data)
def single(request, conversation_id): # Offset of comments. try: offset = int(request.GET.get('offset', 0)) except ValueError: offset = 0 conversation_url, params, headers = Conversation.build_request( request.get_host(), id=conversation_id, offset=offset, access_token=request.access_token) request.view_requests.append( grequests.get(conversation_url, params=params, headers=headers)) try: responses = response_list_to_dict(grequests.map(request.view_requests)) except APIException as exc: return respond_with_error(request, exc) conversation = Conversation.from_api_response(responses[conversation_url]) comment_form = CommentForm( initial=dict(itemId=conversation_id, itemType='conversation')) # get attachments attachments = {} for comment in conversation.comments.items: c = comment.as_dict if 'attachments' in c: c_attachments = Attachment.retrieve( request.get_host(), "comments", c['id'], access_token=request.access_token) attachments[str(c['id'])] = c_attachments view_data = { 'user': Profile(responses[request.whoami_url], summary=False) if request.whoami_url else None, 'site': Site(responses[request.site_url]), 'content': conversation, 'comment_form': comment_form, 'pagination': build_pagination_links( responses[conversation_url]['comments']['links'], conversation.comments), 'item_type': 'conversation', 'attachments': attachments } return render(request, single_template, view_data)
def confirm(request): """ View for moderation actions on a single item. """ if request.method == 'GET': if request.GET.get('item_type') == 'conversation': url, params, headers = Conversation.build_request( request.get_host(), request.GET.get('item_id'), access_token=request.access_token ) request.view_requests.append(grequests.get(url, params=params, headers=headers)) responses = response_list_to_dict(grequests.map(request.view_requests)) content = Conversation.from_api_response(responses[url]) elif request.GET.get('item_type') == 'event': url, params, headers = Event.build_request( request.get_host(), request.GET.get('item_id'), access_token=request.access_token ) request.view_requests.append(grequests.get(url, params=params, headers=headers)) responses = response_list_to_dict(grequests.map(request.view_requests)) content = Event.from_api_response(responses[url]) elif request.GET.get('item_type') == 'microcosm': url, params, headers = Microcosm.build_request( request.get_host(), request.GET.get('item_id'), access_token=request.access_token ) request.view_requests.append(grequests.get(url, params=params, headers=headers)) responses = response_list_to_dict(grequests.map(request.view_requests)) content = Microcosm.from_api_response(responses[url]) view_data = { 'user': Profile(responses[request.whoami_url], summary=False), 'site': Site(responses[request.site_url]), 'content': content, 'item_type': request.GET.get('item_type'), 'action': request.GET.get('action'), } if request.GET.get('action') == 'move': # Fetch list of microcosms to supply in form. view_data['microcosms'] = MicrocosmList.retrieve( request.get_host(), access_token=request.access_token ) return render(request, 'forms/moderation_item.html', view_data)
def testLinks(self): """ Assert that a response containing a 'next page' link is correctly represnted in navigation. """ host = generate_location() path = "/conversations/1" # Create a request for a list of microcosms request = self.factory.get(path, HTTP_HOST=host) request.access_token = None request.whoami = None request.site = None data = json.loads(open(os.path.join(TEST_ROOT, "data", "conversation_with_paginated_comments.json")).read())[ "data" ] conversation = Conversation.from_api_response(data) with patch("requests.get") as mock: mock.return_value.json.return_value = conversation pagination_nav = build_pagination_links(request, conversation.comments) assert pagination_nav["page"] == 1 assert pagination_nav["offset"] == 0 assert pagination_nav["total_pages"] == 2 assert pagination_nav["limit"] == 25
def newest(request, conversation_id): """ Get redirected to the first unread post in a conversation """ try: response = Conversation.newest(request.get_host(), conversation_id, access_token=request.access_token) except APIException as exc: return respond_with_error(request, exc) # because redirects are always followed, we can't just get the 'location' value response = response['comments']['links'] for link in response: if link['rel'] == 'self': response = link['href'] response = str.replace(str(response), '/api/v1', '') pr = urlparse(response) queries = parse_qs(pr[4]) frag = "" if queries.get('comment_id'): frag = 'comment' + queries['comment_id'][0] del queries['comment_id'] # queries is a dictionary of 1-item lists (as we don't re-use keys in our query string) # urlencode will encode the lists into the url (offset=[25]) etc. So get the values straight. for (key, value) in queries.items(): queries[key] = value[0] queries = urlencode(queries) response = urlunparse((pr[0], pr[1], pr[2], pr[3], queries, frag)) return HttpResponseRedirect(response)
def testLinks(self): """ Assert that a response containing a 'next page' link is correctly represnted in navigation. """ host = generate_location() path = '/conversations/1' # Create a request for a list of microcosms request = self.factory.get(path, HTTP_HOST=host) request.access_token = None request.whoami = None request.site = None data = json.loads( open( os.path.join(TEST_ROOT, 'data', 'conversation_with_paginated_comments.json')). read())['data'] conversation = Conversation.from_api_response(data) with patch('requests.get') as mock: mock.return_value.json.return_value = conversation pagination_nav = build_pagination_links(request, conversation.comments) assert pagination_nav['page'] == 1 assert pagination_nav['offset'] == 0 assert pagination_nav['total_pages'] == 2 assert pagination_nav['limit'] == 25
def testConversationAsDict(self): data = json.loads( open( os.path.join( TEST_ROOT, 'data', 'conversation_without_comment.json')).read())['data'] conversation = Conversation.from_api_response(data) conversation.as_dict()
def delete(request, conversation_id): """ Delete a conversation and be redirected to the parent microcosm. """ conversation = Conversation.retrieve(request.get_host(), conversation_id, access_token=request.access_token) try: conversation.delete(request.get_host(), request.access_token) except APIException as exc: return respond_with_error(request, exc) return HttpResponseRedirect(reverse('single-microcosm', args=(conversation.microcosm_id,)))
def newest(request, conversation_id): """ Redirect to the user's first unread post in the conversation. """ try: response = Conversation.newest(request.get_host(), conversation_id, access_token=request.access_token) except APIException as exc: return respond_with_error(request, exc) redirect = build_newest_comment_link(response, request) return HttpResponseRedirect(redirect)
def single(request, conversation_id): # Offset of comments. try: offset = int(request.GET.get('offset', 0)) except ValueError: offset = 0 conversation_url, params, headers = Conversation.build_request(request.get_host(), id=conversation_id, offset=offset, access_token=request.access_token) request.view_requests.append(grequests.get(conversation_url, params=params, headers=headers)) try: responses = response_list_to_dict(grequests.map(request.view_requests)) except APIException as exc: return respond_with_error(request, exc) conversation = Conversation.from_api_response(responses[conversation_url]) comment_form = CommentForm(initial=dict(itemId=conversation_id, itemType='conversation')) # get attachments attachments = {} for comment in conversation.comments.items: c = comment.as_dict if 'attachments' in c: c_attachments = Attachment.retrieve(request.get_host(), "comments", c['id'], access_token=request.access_token) attachments[str(c['id'])] = c_attachments view_data = { 'user': Profile(responses[request.whoami_url], summary=False) if request.whoami_url else None, 'site': Site(responses[request.site_url]), 'content': conversation, 'comment_form': comment_form, 'pagination': build_pagination_links(responses[conversation_url]['comments']['links'], conversation.comments), 'item_type': 'conversation', 'attachments': attachments } return render(request, single_template, view_data)
def edit(request, conversation_id): """ Edit a conversation. """ try: responses = response_list_to_dict(grequests.map(request.view_requests)) except APIException as exc: return respond_with_error(request, exc) view_data = { 'user': Profile(responses[request.whoami_url], summary=False), 'site': Site(responses[request.site_url]), 'state_edit': True, } if request.method == 'POST': form = edit_form(request.POST) if form.is_valid(): conv_request = Conversation.from_edit_form(form.cleaned_data) try: conv_response = conv_request.update(request.get_host(), request.access_token) except APIException as exc: return respond_with_error(request, exc) return HttpResponseRedirect( reverse('single-conversation', args=(conv_response.id, ))) else: view_data['form'] = form return render(request, form_template, view_data) if request.method == 'GET': conversation = Conversation.retrieve(request.get_host(), id=conversation_id, access_token=request.access_token) view_data['form'] = edit_form.from_conversation_instance(conversation) return render(request, form_template, view_data)
def delete(request, conversation_id): """ Delete a conversation and be redirected to the parent microcosm. """ conversation = Conversation.retrieve(request.get_host(), conversation_id, access_token=request.access_token) try: conversation.delete(request.get_host(), request.access_token) except APIException as exc: return respond_with_error(request, exc) return HttpResponseRedirect( reverse('single-microcosm', args=(conversation.microcosm_id, )))
def edit(request, conversation_id): """ Edit a conversation. """ try: responses = response_list_to_dict(grequests.map(request.view_requests)) except APIException as exc: return respond_with_error(request, exc) view_data = { 'user': Profile(responses[request.whoami_url], summary=False), 'site': Site(responses[request.site_url]), 'state_edit': True, } if request.method == 'POST': form = edit_form(request.POST) if form.is_valid(): conv_request = Conversation.from_edit_form(form.cleaned_data) try: conv_response = conv_request.update(request.get_host(), request.access_token) except APIException as exc: return respond_with_error(request, exc) return HttpResponseRedirect(reverse('single-conversation', args=(conv_response.id,))) else: view_data['form'] = form return render(request, form_template, view_data) if request.method == 'GET': conversation = Conversation.retrieve(request.get_host(), id=conversation_id, access_token=request.access_token) view_data['form'] = edit_form.from_conversation_instance(conversation) return render(request, form_template, view_data)
def moderate(request): """ View for moderation actions on a single item. """ microcosm_id = request.POST.get('microcosm_id') if request.method == 'POST': if request.POST.get('action') == 'move': if request.POST.get('item_type') == 'event': event = Event() event.id = int(request.POST.get('item_id')) event.microcosm_id = int(microcosm_id) event.meta = {'editReason': 'Moderator moved item'} event.update(request.get_host(), request.access_token) elif request.POST.get('item_type') == 'conversation': conversation = Conversation() conversation.id = int(request.POST.get('item_id')) conversation.microcosm_id = int(microcosm_id) conversation.meta = {'editReason': 'Moderator moved item'} conversation.update(request.get_host(), request.access_token) elif request.POST.get('item_type') == 'microcosm': microcosm = Microcosm() microcosm.id = int(request.POST.get('item_id')) microcosm.parent_id = int(microcosm_id) microcosm.meta = {'editReason': 'Moderator moved item'} microcosm.update(request.get_host(), request.access_token) else: # These are all PATCH requests and we need the item in question first if request.POST.get('item_type') == 'conversation': url, params, headers = Conversation.build_request( request.get_host(), request.POST.get('item_id'), access_token=request.access_token ) if request.POST.get('item_type') == 'event': url, params, headers = Event.build_request( request.get_host(), request.POST.get('item_id'), access_token=request.access_token ) if request.POST.get('item_type') == 'microcosm': url, params, headers = Microcosm.build_request( request.get_host(), request.POST.get('item_id'), access_token=request.access_token ) # And then to execute the PATCH against the item if request.POST.get('action') == 'delete': payload = json.dumps([{'op': 'replace', 'path': '/meta/flags/deleted', 'value': True}]) headers['Content-Type'] = 'application/json' requests.patch(url, payload, headers=headers) elif request.POST.get('action') == 'undelete': payload = json.dumps([{'op': 'replace', 'path': '/meta/flags/deleted', 'value': False}]) headers['Content-Type'] = 'application/json' requests.patch(url, payload, headers=headers) elif request.POST.get('action') == 'approve': payload = json.dumps([{'op': 'replace', 'path': '/meta/flags/moderated', 'value': False}]) headers['Content-Type'] = 'application/json' requests.patch(url, payload, headers=headers) elif request.POST.get('action') == 'pin': payload = json.dumps([{'op': 'replace', 'path': '/meta/flags/sticky', 'value': True}]) headers['Content-Type'] = 'application/json' requests.patch(url, payload, headers=headers) elif request.POST.get('action') == 'unpin': payload = json.dumps([{'op': 'replace', 'path': '/meta/flags/sticky', 'value': False}]) headers['Content-Type'] = 'application/json' requests.patch(url, payload, headers=headers) elif request.POST.get('action') == 'open': payload = json.dumps([{'op': 'replace', 'path': '/meta/flags/open', 'value': True}]) headers['Content-Type'] = 'application/json' requests.patch(url, payload, headers=headers) elif request.POST.get('action') == 'close': payload = json.dumps([{'op': 'replace', 'path': '/meta/flags/open', 'value': False}]) headers['Content-Type'] = 'application/json' requests.patch(url, payload, headers=headers) return HttpResponseRedirect(reverse('single-microcosm', args=(microcosm_id,)))
def confirm(request): """ View for moderation actions on a single item. """ if request.method == 'POST': if request.POST.get('item_type') == 'conversation': url, params, headers = Conversation.build_request( request.get_host(), request.POST.get('item_id'), access_token=request.access_token) request.view_requests.append( grequests.get(url, params=params, headers=headers)) responses = response_list_to_dict( grequests.map(request.view_requests)) content = Conversation.from_api_response(responses[url]) elif request.POST.get('item_type') == 'event': url, params, headers = Event.build_request( request.get_host(), request.POST.get('item_id'), access_token=request.access_token) request.view_requests.append( grequests.get(url, params=params, headers=headers)) responses = response_list_to_dict( grequests.map(request.view_requests)) content = Event.from_api_response(responses[url]) elif request.POST.get('item_type') == 'microcosm': url, params, headers = Microcosm.build_request( request.get_host(), request.POST.get('item_id'), access_token=request.access_token) request.view_requests.append( grequests.get(url, params=params, headers=headers)) responses = response_list_to_dict( grequests.map(request.view_requests)) content = Microcosm.from_api_response(responses[url]) view_data = { 'user': Profile(responses[request.whoami_url], summary=False), 'site': Site(responses[request.site_url]), 'content': content, 'item_type': request.POST.get('item_type'), 'action': request.POST.get('action'), } if request.POST.get('action') == 'move': # Fetch list of microcosms to supply in form. microcosms = MicrocosmList.retrieve( request.get_host(), access_token=request.access_token) if request.POST.get('item_type') == 'microcosm': newlist = [] nuke = content.id found = False for m in microcosms.microcosms: if m['id'] == nuke: found = True nuke = m['id'] elif m.get('parent_id') and m['parent_id'] == nuke: found = True nuke = m['id'] else: if found: nuke = 0 newlist.append(m) microcosms.microcosms = newlist view_data['microcosms'] = microcosms return render(request, 'forms/moderation_item.html', view_data)
def moderate(request): """ View for moderation actions on a single item. """ microcosm_id = request.POST.get('microcosm_id') if request.method == 'POST': if request.POST.get('action') == 'move': if request.POST.get('item_type') == 'event': event = Event() event.id = int(request.POST.get('item_id')) event.microcosm_id = int(microcosm_id) event.meta = {'editReason': 'Moderator moved item'} event.update(request.get_host(), request.access_token) elif request.POST.get('item_type') == 'conversation': conversation = Conversation() conversation.id = int(request.POST.get('item_id')) conversation.microcosm_id = int(microcosm_id) conversation.meta = {'editReason': 'Moderator moved item'} conversation.update(request.get_host(), request.access_token) elif request.POST.get('item_type') == 'microcosm': microcosm = Microcosm() microcosm.id = int(request.POST.get('item_id')) microcosm.parent_id = int(microcosm_id) microcosm.meta = {'editReason': 'Moderator moved item'} microcosm.update(request.get_host(), request.access_token) else: # These are all PATCH requests and we need the item in question first if request.POST.get('item_type') == 'conversation': url, params, headers = Conversation.build_request( request.get_host(), request.POST.get('item_id'), access_token=request.access_token) if request.POST.get('item_type') == 'event': url, params, headers = Event.build_request( request.get_host(), request.POST.get('item_id'), access_token=request.access_token) if request.POST.get('item_type') == 'microcosm': url, params, headers = Microcosm.build_request( request.get_host(), request.POST.get('item_id'), access_token=request.access_token) # And then to execute the PATCH against the item if request.POST.get('action') == 'delete': payload = json.dumps([{ 'op': 'replace', 'path': '/meta/flags/deleted', 'value': True }]) headers['Content-Type'] = 'application/json' requests.patch(url, payload, headers=headers) elif request.POST.get('action') == 'undelete': payload = json.dumps([{ 'op': 'replace', 'path': '/meta/flags/deleted', 'value': False }]) headers['Content-Type'] = 'application/json' requests.patch(url, payload, headers=headers) elif request.POST.get('action') == 'approve': payload = json.dumps([{ 'op': 'replace', 'path': '/meta/flags/moderated', 'value': False }]) headers['Content-Type'] = 'application/json' requests.patch(url, payload, headers=headers) elif request.POST.get('action') == 'pin': payload = json.dumps([{ 'op': 'replace', 'path': '/meta/flags/sticky', 'value': True }]) headers['Content-Type'] = 'application/json' requests.patch(url, payload, headers=headers) elif request.POST.get('action') == 'unpin': payload = json.dumps([{ 'op': 'replace', 'path': '/meta/flags/sticky', 'value': False }]) headers['Content-Type'] = 'application/json' requests.patch(url, payload, headers=headers) elif request.POST.get('action') == 'open': payload = json.dumps([{ 'op': 'replace', 'path': '/meta/flags/open', 'value': True }]) headers['Content-Type'] = 'application/json' requests.patch(url, payload, headers=headers) elif request.POST.get('action') == 'close': payload = json.dumps([{ 'op': 'replace', 'path': '/meta/flags/open', 'value': False }]) headers['Content-Type'] = 'application/json' requests.patch(url, payload, headers=headers) return HttpResponseRedirect( reverse('single-microcosm', args=(microcosm_id, )))
def testConversationAsDict(self): data = json.loads(open(os.path.join(TEST_ROOT, 'data', 'conversation_without_comment.json')).read())['data'] conversation = Conversation.from_api_response(data) conversation.as_dict()
def testCommentedConversationInit(self): data = json.loads(open(os.path.join(TEST_ROOT, 'data', 'conversation_without_comment.json')).read())['data'] Conversation.from_api_response(data)
def confirm(request): """ View for moderation actions on a single item. """ if request.method == 'POST': if request.POST.get('item_type') == 'conversation': url, params, headers = Conversation.build_request( request.get_host(), request.POST.get('item_id'), access_token=request.access_token ) request.view_requests.append(grequests.get(url, params=params, headers=headers)) responses = response_list_to_dict(grequests.map(request.view_requests)) content = Conversation.from_api_response(responses[url]) elif request.POST.get('item_type') == 'event': url, params, headers = Event.build_request( request.get_host(), request.POST.get('item_id'), access_token=request.access_token ) request.view_requests.append(grequests.get(url, params=params, headers=headers)) responses = response_list_to_dict(grequests.map(request.view_requests)) content = Event.from_api_response(responses[url]) elif request.POST.get('item_type') == 'microcosm': url, params, headers = Microcosm.build_request( request.get_host(), request.POST.get('item_id'), access_token=request.access_token ) request.view_requests.append(grequests.get(url, params=params, headers=headers)) responses = response_list_to_dict(grequests.map(request.view_requests)) content = Microcosm.from_api_response(responses[url]) view_data = { 'user': Profile(responses[request.whoami_url], summary=False), 'site': Site(responses[request.site_url]), 'content': content, 'item_type': request.POST.get('item_type'), 'action': request.POST.get('action'), } if request.POST.get('action') == 'move': # Fetch list of microcosms to supply in form. microcosms = MicrocosmList.retrieve( request.get_host(), access_token=request.access_token ) if request.POST.get('item_type') == 'microcosm': newlist = [] nuke = content.id found = False for m in microcosms.microcosms: if m['id'] == nuke: found = True nuke = m['id'] elif m.get('parent_id') and m['parent_id'] == nuke: found = True nuke = m['id'] else: if found: nuke = 0 newlist.append(m) microcosms.microcosms = newlist view_data['microcosms'] = microcosms return render(request, 'forms/moderation_item.html', view_data)
def item(request): """ View for moderation actions on a single item. """ if request.method == 'POST': if request.POST.get('action') == 'move': if request.POST.get('item_type') == 'event': event = Event.retrieve(request.get_host(), request.POST.get('item_id'), access_token=request.access_token) event.microcosm_id = int(request.POST.get('microcosm_id')) event.meta = {'editReason': 'Moderator moved item'} event.update(request.get_host(), request.access_token) elif request.POST.get('item_type') == 'conversation': conversation = Conversation.retrieve(request.get_host(), request.POST.get('item_id'), access_token=request.access_token) conversation.microcosm_id = int(request.POST.get('microcosm_id')) conversation.meta = {'editReason': 'Moderator moved item'} conversation.update(request.get_host(), request.access_token) elif request.POST.get('action') == 'delete': if request.POST.get('item_type') == 'conversation': url, params, headers = Conversation.build_request(request.get_host(), request.POST.get('item_id'), access_token=request.access_token) if request.POST.get('item_type') == 'event': url, params, headers = Event.build_request(request.get_host(), request.POST.get('item_id'), access_token=request.access_token) payload = json.dumps([{'op': 'replace', 'path': '/meta/flags/deleted', 'value': True}]) headers['Content-Type'] = 'application/json' requests.patch(url, payload, headers=headers) return HttpResponseRedirect(reverse('single-microcosm', args=(request.POST.get('microcosm_id'),))) if request.method == 'GET': if request.GET.get('item_type') == 'conversation': url, params, headers = Conversation.build_request(request.get_host(), request.GET.get('item_id'), access_token=request.access_token) request.view_requests.append(grequests.get(url, params=params, headers=headers)) responses = response_list_to_dict(grequests.map(request.view_requests)) content = Conversation.from_api_response(responses[url]) elif request.GET.get('item_type') == 'event': url, params, headers = Event.build_request(request.get_host(), request.GET.get('item_id'), access_token=request.access_token) request.view_requests.append(grequests.get(url, params=params, headers=headers)) responses = response_list_to_dict(grequests.map(request.view_requests)) content = Event.from_api_response(responses[url]) view_data = { 'user': Profile(responses[request.whoami_url], summary=False), 'site': Site(responses[request.site_url]), 'content': content, 'item_type': request.GET.get('item_type'), 'action': request.GET.get('action'), } if request.GET.get('action') == 'move': # Fetch list of microcosms to supply in form. view_data['microcosms'] = MicrocosmList.retrieve(request.get_host(), access_token=request.access_token) return render(request, 'forms/moderation_item.html', view_data)
def testConversationInit(self): data = json.loads(open(os.path.join(TEST_ROOT, "data", "conversation_with_comment.json")).read())["data"] Conversation.from_api_response(data)
def create(request, microcosm_id): """ Create a conversation and first comment in the conversation. """ try: responses = response_list_to_dict(grequests.map(request.view_requests)) except APIException as exc: return respond_with_error(request, exc) view_data = { 'user': Profile(responses[request.whoami_url], summary=False), 'site': Site(responses[request.site_url]), } if request.method == 'POST': form = create_form(request.POST) if form.is_valid(): conv_req = Conversation.from_create_form(form.cleaned_data) try: conv = conv_req.create(request.get_host(), request.access_token) except APIException as exc: return respond_with_error(request, exc) if request.POST.get('firstcomment') and len(request.POST.get('firstcomment')) > 0: payload = { 'itemType': 'conversation', 'itemId': conv.id, 'markdown': request.POST.get('firstcomment'), 'inReplyTo': 0, } comment_req = Comment.from_create_form(payload) try: comment = comment_req.create(request.get_host(), request.access_token) except APIException as exc: return respond_with_error(request, exc) try: process_attachments(request, comment) except ValidationError: responses = response_list_to_dict(grequests.map(request.view_requests)) comment_form = CommentForm( initial={ 'itemId': comment.item_id, 'itemType': comment.item_type, 'comment_id': comment.id, 'markdown': request.POST['markdown'], } ) view_data = { 'user': Profile(responses[request.whoami_url], summary=False), 'site': Site(responses[request.site_url]), 'content': comment, 'comment_form': comment_form, 'error': 'Sorry, one of your files was over 5MB. Please try again.', } return render(request, form_template, view_data) return HttpResponseRedirect(reverse('single-conversation', args=(conv.id,))) else: view_data['form'] = form return render(request, form_template, view_data) if request.method == 'GET': view_data['form'] = create_form(initial=dict(microcosmId=microcosm_id)) view_data['microcosm_id'] = microcosm_id return render(request, form_template, view_data)
def create(request, microcosm_id): """ Create a conversation and first comment in the conversation. """ try: responses = response_list_to_dict(grequests.map(request.view_requests)) except APIException as exc: return respond_with_error(request, exc) view_data = { 'user': Profile(responses[request.whoami_url], summary=False), 'site': Site(responses[request.site_url]), } if request.method == 'POST': form = create_form(request.POST) if form.is_valid(): conv_req = Conversation.from_create_form(form.cleaned_data) try: conv = conv_req.create(request.get_host(), request.access_token) except APIException as exc: return respond_with_error(request, exc) if request.POST.get('firstcomment') and len( request.POST.get('firstcomment')) > 0: payload = { 'itemType': 'conversation', 'itemId': conv.id, 'markdown': request.POST.get('firstcomment'), 'inReplyTo': 0, } comment_req = Comment.from_create_form(payload) try: comment = comment_req.create(request.get_host(), request.access_token) except APIException as exc: return respond_with_error(request, exc) try: process_attachments(request, comment) except ValidationError: responses = response_list_to_dict( grequests.map(request.view_requests)) comment_form = CommentForm( initial={ 'itemId': comment.item_id, 'itemType': comment.item_type, 'comment_id': comment.id, 'markdown': request.POST['markdown'], }) view_data = { 'user': Profile(responses[request.whoami_url], summary=False), 'site': Site(responses[request.site_url]), 'content': comment, 'comment_form': comment_form, 'error': 'Sorry, one of your files was over 5MB. Please try again.', } return render(request, form_template, view_data) return HttpResponseRedirect( reverse('single-conversation', args=(conv.id, ))) else: view_data['form'] = form return render(request, form_template, view_data) if request.method == 'GET': view_data['form'] = create_form(initial=dict(microcosmId=microcosm_id)) view_data['microcosm_id'] = microcosm_id return render(request, form_template, view_data)