from django.conf import settings from django.core.management.base import BaseCommand from moss import * from judge.models import Contest, ContestParticipation, Submission class Command(BaseCommand): help = 'Checks for duplicate code using MOSS' LANG_MAPPING = { ('C++', MOSS_LANG_CC), ('C', MOSS_LANG_C), ('Java', MOSS_LANG_JAVA), ('Python', MOSS_LANG_PYTHON), ('Pascal', MOSS_LANG_PASCAL), } def add_arguments(self, parser): parser.add_argument('contest', help='the id of the contest') def handle(self, *args, **options): moss_api_key = settings.MOSS_API_KEY if moss_api_key is None: print('No MOSS API Key supplied') return contest = options['contest'] for problem in Contest.objects.get(key=contest).problems.order_by('code'): print('========== %s / %s ==========' % (problem.code, problem.name)) for dmoj_lang, moss_lang in self.LANG_MAPPING: print("%s: " % dmoj_lang, end=' ') subs = Submission.objects.filter( contest__participation__virtual__in=(ContestParticipation.LIVE, ContestParticipation.SPECTATE), contest__participation__contest__key=contest, result='AC', problem__id=problem.id, language__common_name=dmoj_lang, ).values_list('user__user__username', 'source__source') if not subs: print('') continue moss_call = MOSS(moss_api_key, language=moss_lang, matching_file_limit=100, comment='%s - %s' % (contest, problem.code)) users = set() for username, source in subs: if username in users: continue users.add(username) moss_call.add_file_from_memory(username, source.encode('utf-8')) print('(%d): %s' % (subs.count(), moss_call.process()))