示例#1
0
文件: views.py 项目: rong2/codesniff
 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)
示例#2
0
文件: views.py 项目: rong2/codesniff
    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)
示例#3
0
    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)
示例#4
0
 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)
示例#5
0
    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)
示例#6
0
			# skip saving if on first code sample
			if flag:
				# save previous code sample with admin as creator
				code = Code(title=title, content=content, language='Python', creator=admin)
				code.save()
				used_lines = []
				origsmells = []
				usersmells = []
				# randomly select codesmells to be assigned to code sample by admin
				for i in range(num_lines/2):
					newsmell = (randint(1, num_lines), smells[randint(0, len(smells) - 1)])
					if newsmell[0] in used_lines:
						continue
					used_lines.append(newsmell[0])
					origsmells.append(newsmell)
					codesmell = CodeSmell(code=code, user=admin, line=newsmell[0], smell=newsmell[1])
					codesmell.save()
				# select random number of codesmells for test to answer correctly
				correct = randint(0, len(origsmells))
				usersmells = sample(origsmells, correct)
				for newsmell in usersmells:
					codesmell = CodeSmell(code=code, user=user, line=newsmell[0], smell=newsmell[1])
					codesmell.save()

				# calculate score for test's answers
				score = 0
				correct = []
				incorrect = []
				missed = []
				if len(origsmells) > 0:
					for s in usersmells:
示例#7
0
    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)
示例#8
0
from app.models import Code, Score, CodeSmell, Smell
from django.contrib.auth.models import User

import subprocess

subprocess.call(['./manage.py', 'flush'])

User.objects.create_superuser('admin', '*****@*****.**', 'admin')
user = User.objects.create_user('test', '*****@*****.**', 'test')
user.save()

code = Code(title='hello world',
            content='print "hello world"',
            language='Python',
            creator_id=1)
code.save()
code = Code(title='var x', content='x = 0', language='Python', creator_id=1)
code.save()

codesmell = CodeSmell(code_id=1, user_id=1, line=1, smell='too many bugs')
codesmell.save()
codesmell = CodeSmell(code_id=1,
                      user_id=1,
                      line=1,
                      smell='too hard to understand')
codesmell.save()

with open('codesmells.txt') as f:
    for line in f:
        smell = Smell(name=line.replace('\n', ''))
        smell.save()