def post(self, request, *args, **kwargs): data = request.data user = data['creator'] code = eval(data['code']) code = Code(title=code['title'], content=code['content'], language=code['language'], creator_id=user) try: code.clean_fields() code.save() except Exception as error: return Response(error, status=status.HTTP_400_BAD_REQUEST) smells = eval(data['smells']) for s in smells: smell = CodeSmell(code_id=code.id, user_id=user, line=s['line'], smell=s['smell']) try: smell.clean_fields() smell.save() except Exception as error: return Response(error, status=status.HTTP_400_BAD_REQUEST) return Response(CodeSerializer(code).data, status=status.HTTP_201_CREATED)
def post(self, request, *args, **kwargs): data = request.data user = data['user'] codeid = data['code'] smells = eval(data['smells']) CodeSmell.objects.filter(code_id=codeid, user=user).delete() for s in smells: smell = CodeSmell(code_id=codeid, user_id=user, line=s['line'], smell=s['smell']) try: smell.clean_fields() smell.save() except Exception as error: return Response(error, status=status.HTTP_400_BAD_REQUEST) smells = map(lambda x: (x['line'], x['smell']), smells) origsmells = CodeSmell.objects.filter( code_id=codeid, user=Code.objects.filter(id=codeid)[0].creator) origsmells = map(lambda x: (x.line, x.smell), origsmells) score = 0 correct = [] incorrect = [] missed = [] if len(origsmells) > 0: for s in smells: if s in origsmells: score += 1 correct.append({'line': s[0], 'smell': s[1]}) else: incorrect.append({'line': s[0], 'smell': s[1]}) incorrect_lines = map(lambda x: x['line'], incorrect) for s in origsmells: if s not in smells and s[0] not in incorrect_lines: missed.append({'line': s[0], 'smell': s[1]}) score -= 0.5 * (len(missed) + len(incorrect)) score = score / len(origsmells) * 100 score = max(0, score) Score.objects.filter(code_id=codeid, user_id=user).delete() score = Score(code_id=codeid, user_id=user, score=score) score.save() scores = Score.objects.filter(code_id=codeid) scores = map(lambda x: x.score, scores) avg = sum(scores) / len(scores) code = Code.objects.get(pk=codeid) code.difficulty = (min(len(origsmells) * 10, 100) + 100 - avg) / 2 code.save() data = { 'score': score.score, 'correct': correct, 'incorrect': incorrect, 'missed': missed } return Response(data, status=status.HTTP_200_OK)
def post(self, request, *args, **kwargs): data = request.data user = data['user'] codeid = data['code'] smells = eval(data['smells']) CodeSmell.objects.filter(code_id=codeid, user=user).delete() for s in smells: smell = CodeSmell(code_id=codeid, user_id=user, line=s['line'], smell=s['smell']) try: smell.clean_fields() smell.save() except Exception as error: return Response(error, status=status.HTTP_400_BAD_REQUEST) smells = map(lambda x:(x['line'], x['smell']), smells) origsmells = CodeSmell.objects.filter(code_id=codeid, user=Code.objects.filter(id=codeid)[0].creator) origsmells = map(lambda x:(x.line, x.smell), origsmells) score = 0 correct = [] incorrect = [] missed = [] if len(origsmells) > 0: for s in smells: if s in origsmells: score += 1 correct.append({'line': s[0], 'smell': s[1]}) else: incorrect.append({'line': s[0], 'smell': s[1]}) incorrect_lines = map(lambda x:x['line'], incorrect) for s in origsmells: if s not in smells and s[0] not in incorrect_lines: missed.append({'line': s[0], 'smell': s[1]}) score -= 0.5 * (len(missed) + len(incorrect)) score = score/len(origsmells) * 100 score = max(0, score) Score.objects.filter(code_id=codeid, user_id=user).delete() score = Score(code_id=codeid, user_id=user, score=score) score.save() scores = Score.objects.filter(code_id=codeid) scores = map(lambda x: x.score, scores) avg = sum(scores)/len(scores) code = Code.objects.get(pk=codeid) code.difficulty = (min(len(origsmells) * 10, 100) + 100 - avg) / 2 code.save() data = { 'score': score.score, 'correct': correct, 'incorrect': incorrect, 'missed': missed } return Response(data, status=status.HTTP_200_OK)
def post(self, request, *args, **kwargs): """ Submit a new code snippet with a list of codesmells together. Example POST body: <code> { "creator" : 18, "code" : "{'title' : 'Third Code Snippet!', 'content' : 'sum = 3+4', 'language' : 'Python'}", "smells" : "[{'line': 1, 'smell': 'Vague string'}, {'line': 2, 'smell': 'Bad variable name'}]" } </code> --- parameters: - name: body paramType: body description: See example POST body above consumes: - application/json """ data = request.data user = data['creator'] code = eval(data['code']) code = Code(title=code['title'], content=code['content'], language=code['language'], creator_id=user) try: code.clean_fields() code.save() except Exception as error: return Response(error, status=status.HTTP_400_BAD_REQUEST) smells = eval(data['smells']) for s in smells: smell = CodeSmell(code_id=code.id, user_id=user, line=s['line'], smell=s['smell']) try: smell.clean_fields() smell.save() except Exception as error: return Response(error, status=status.HTTP_400_BAD_REQUEST) return Response(CodeSerializer(code).data, status=status.HTTP_201_CREATED)
def post(self, request, *args, **kwargs): """ Submit a list of code smells and check it against the original uploader's code snippets to calculate a score for the user. Example POST body: <code> { "user" : 17, "code" : 38, "smells" : "[{'line': 1, 'smell': 'Vague string'}, {'line': 2, 'smell': 'Bad variable name'}]" } </code> Get back a list of incorrect, missed, and correct code smells labelled. --- parameters: - name: body paramType: body description: See example POST body above consumes: - application/json """ data = request.data user = data['user'] codeid = data['code'] smells = eval(data['smells']) CodeSmell.objects.filter(code_id=codeid, user=user).delete() for s in smells: smell = CodeSmell(code_id=codeid, user_id=user, line=s['line'], smell=s['smell']) try: smell.clean_fields() smell.save() except Exception as error: return Response(error, status=status.HTTP_400_BAD_REQUEST) smells = map(lambda x:(x['line'], x['smell']), smells) """ Code smells are compared against answers (code smells assigned by creator) """ origsmells = CodeSmell.objects.filter(code_id=codeid, user=Code.objects.filter(id=codeid)[0].creator) origsmells = map(lambda x:(x.line, x.smell), origsmells) score = 0 correct = [] incorrect = [] missed = [] """ Score is calculated as follows: ((# correct answers) - 0.5*((# missed answers) + (# incorrect answers)))/(# originally assigned code smells) """ if len(origsmells) > 0: for s in smells: if s in origsmells: score += 1 correct.append({'line': s[0], 'smell': s[1]}) else: incorrect.append({'line': s[0], 'smell': s[1]}) incorrect_lines = map(lambda x:x['line'], incorrect) for s in origsmells: if s not in smells and s[0] not in incorrect_lines: missed.append({'line': s[0], 'smell': s[1]}) score -= 0.5 * (len(missed) + len(incorrect)) score = score/len(origsmells) * 100 score = max(0, score) Score.objects.filter(code_id=codeid, user_id=user).delete() score = Score(code_id=codeid, user_id=user, score=score) score.save() """ Code's difficulty is assigned based on number of code smells (capped at 10) and average score """ scores = Score.objects.filter(code_id=codeid) scores = map(lambda x: x.score, scores) avg = sum(scores)/len(scores) code = Code.objects.get(pk=codeid) code.difficulty = (min(len(origsmells) * 10, 100) + 100 - avg) / 2 code.save() data = { 'score': score.score, 'correct': correct, 'incorrect': incorrect, 'missed': missed } return Response(data, status=status.HTTP_200_OK)