예제 #1
0
    def get_correct_answer(self, event, pk):
        test_list_cache = CacheProduct("test_list_cache")
        test_score_cache  = CacheProduct("test_score_cache")
        key = "%d_%d" % (int(pk), event.id)
        test_list_dateil = test_list_cache.get(key, None)
        test_score_dateil = test_score_cache.get(key, None)

        if test_list_dateil is None or test_score_dateil is None:
            task_arrary = self.get_event_task(pk)
            answer_dict = {}
            score_dict = {}
            for t in task_arrary:
                task = practice_api.get_task_object(t.task_hash)
                score_dict[int(task.id)] = t.task_score

                if task.answer is None:
                    is_dynamic_env = hasattr(task, "is_dynamic_env") if hasattr(task, "is_dynamic_env") else False
                    if is_dynamic_env:
                        task_answer = _("x_dynamic_answer")
                    else:
                        task_answer = _("x_answer_not_generated")
                else:
                    task_answer = task.answer
                answer_dict[int(task.id)] = str(task_answer)
            test_list_cache.set(key, answer_dict, DEFAULT_CACHE_TIME)
            test_score_cache.set(key, score_dict, DEFAULT_CACHE_TIME)
        else:
            answer_dict = test_list_dateil
            score_dict = test_score_dateil

        return answer_dict, score_dict
예제 #2
0
    def get_task(task_hash):
        cache = CacheProduct("get_task")
        task = cache.get(task_hash)
        if task:
            return task

        task = practice_api.get_task_object(task_hash)
        if task:
            cache.set(task_hash, task, 300)

        return task
예제 #3
0
    def get_event_task(self, pk):
        task_cache = CacheProduct("get_event_task")
        key = pk

        event_task = task_cache.get(key, None)
        if event_task:
            return event_task

        event_task = event_models.EventTask.objects.filter(event=pk)
        if event_task:
            task_cache.set(key, event_task, DEFAULT_CACHE_TIME)

        return event_task
예제 #4
0
def get_event_by_id(id):
    event_cache = CacheProduct('event')
    key = 'get_event_id_%s' % id
    event = event_cache.get(key, None)
    if event:
        return event

    try:
        event = event_models.Event.objects.get(id=id)
    except event_models.Event.DoesNotExist as e:
        return None

    if event:
        event_cache.set(key, event, DEFAULT_CACHE_TIME)

    return event
예제 #5
0
    def clear_cls_cache(cls):
        # 暂时删除所有缓存
        from django.core.cache import cache
        cache.clear()

        if not isinstance(cls, (list, tuple)):
            cls = [cls]
        for c in cls:
            if isinstance(c, (six.string_types, six.text_type)):
                try:
                    c = import_string(c)
                except:
                    continue
            cache_view_name = _generate_cache_view_name(c)
            cache = CacheProduct(cache_view_name)
            delete_cache(cache)
예제 #6
0
 def cache(self):
     if not hasattr(self, '_cache'):
         cls = self.__class__
         self._cache = CacheProduct('{}.{}'.format(cls.__module__,
                                                   cls.__name__))
     return self._cache
예제 #7
0
def handler_task_list(request, testpaper_id):
    examname = request.data.get('examname', '')
    examDescription = request.data.get('examDescription', '')
    datas = request.data.get('data', '')
    testpaper_id = int(testpaper_id)

    if request.method == "GET":
        rows = []
        if testpaper_id != 0:
            taskArrary = TestPaperTask.objects.filter(
                test_paper__id=testpaper_id)
            for t in taskArrary:
                task = get_task_object(t.task_hash)
                if not task:
                    continue
                data = SerializerNew(task, t).data
                rows.append(data)

        return Response(data=rows, status=status.HTTP_200_OK)

    if not datas or not json.loads(datas):
        raise exceptions.ParseError(PracticeResError.NO_EXAM_QUESTIONS)
    if not examname:
        raise exceptions.ParseError(PracticeResError.WARN_MESSAGES_7)
    if capability_models.TestPaper.objects.filter(
            status=capability_models.TestPaper.Status.NORMAL,
            name=examname).exclude(pk=testpaper_id).exists():
        raise exceptions.ParseError(PracticeResError.WARN_MESSAGES_6)

    datas = json.loads(datas)

    number = 0
    allScore = 0
    for data in datas:
        number = number + 1
        allScore = allScore + float(data['score'])

    logo_url = request.data.get("logo", None)

    if testpaper_id == 0:
        # 新增
        # 创建一张试卷
        if logo_url is not None and logo_url != '':
            logo = save_image(logo_url)
        else:
            logo = None
        testPaper = capability_models.TestPaper.objects.create(
            name=examname,
            task_number=number,
            task_all_score=allScore,
            introduction=examDescription,
            create_time=timezone.now(),
            create_user=request.user,
            logo=logo,
            public=True,
        )
    else:
        testPaper = capability_models.TestPaper.objects.filter(id=testpaper_id)
        if not testPaper:
            raise exceptions.NotFound(PracticeResError.NOT_FOUND_EXAM)
        testPaper = testPaper[0]
        testPaper.name = examname
        testPaper.task_number = number
        testPaper.task_all_score = allScore
        testPaper.introduction = examDescription
        if logo_url is not None and logo_url != '':
            logos = save_image(logo_url)
            testPaper.logo = logos
        testPaper.save()

        event_task_list = TestPaperTask.objects.filter(test_paper=testPaper)
        if event_task_list:
            # 判断原来是否存在初始数据, 批量删除
            try:
                event_task_list.delete()
            except ProtectedError:
                raise exceptions.ParseError(
                    PracticeResError.CANNT_CHANGE_HAS_DONE)

    event_task_list = []
    for data in datas:
        # copy_hash = copy_task(data['hash'])
        # if not copy_hash:
        #     continue

        hash_list = []
        if int(data['hash'].split('.')[-1]) != 0:
            hash_list.append(data['hash'])
            task_handler_class = TaskHandler
            copy_hash = task_handler_class.handle_tasks(hash_list)
            copy_hash = copy_hash[0]
        else:
            copy_hash = copy_task(data['hash'])
            if not copy_hash:
                continue

        event_task = TestPaperTask(test_paper=testPaper,
                                   task_hash=copy_hash,
                                   score=data['score'])
        event_task_list.append(event_task)
    TestPaperTask.objects.bulk_create(event_task_list)

    cache = CacheProduct(
        "%s-%s" % (TestPaperViewSet.__module__, TestPaperViewSet.__name__))
    delete_cache(cache)

    return Response(data={'type': 'success'}, status=status.HTTP_200_OK)
예제 #8
0
def ret_testpaper_detail(request, testpaper_id):
    if request.method == "GET":
        context = {}
        single_selections = []
        multiple_selections = []
        judgment_selections = []
        analysis_questions = []
        testpaper_id = int(testpaper_id)

        testpaper = capability_models.TestPaper.objects.get(id=testpaper_id)
        context['name'] = testpaper.name
        context['number'] = testpaper.task_number
        context['allScore'] = testpaper.task_all_score

        taskArrary = TestPaperTask.objects.filter(test_paper=testpaper)
        rows = []
        for t in taskArrary:
            task = get_task_object(t.task_hash)
            rows.append(Serializer(task, t).data)

        context['tasks'] = rows
        for task in context["tasks"]:
            if task.has_key("is_choice_question"):
                if _judgment_question_type(
                        task["hash"]
                ) == theory_models.ChoiceTask.TopicProblem.SINGLE:
                    single_selections.append(task)
                elif _judgment_question_type(
                        task["hash"]
                ) == theory_models.ChoiceTask.TopicProblem.MULTIPLE:
                    multiple_selections.append(task)
                else:
                    judgment_selections.append(task)
            else:
                analysis_questions.append(task)
        tasks = dict(judgment_selections=judgment_selections,
                     single_selections=single_selections,
                     multiple_selections=multiple_selections,
                     analysis_questions=analysis_questions)
        context['tasks'] = tasks
        return response.Response({'error_code': 0, 'response_data': context})
    elif request.method == "POST":
        name = request.data['examname']
        if int(testpaper_id) == 0 and TestPaper.objects.filter(
                name=name).exists():
            return response.Response({'error_code': 1})

        questions = request.data['questions']
        list = questions.values()
        list.sort(key=lambda k: (k.get('qorder', 0)))
        number = 0
        allScore = 0

        for questions in list:
            number = number + 1
            allScore = allScore + int(questions['score'])

        event_teachers = request.data.get('teacher')

        if int(testpaper_id) > 0:
            testPaper = TestPaper.objects.get(id=testpaper_id)
            testPaper.name = name
            testPaper.task_number = number
            testPaper.task_all_score = allScore
            testPaper.teacher = ",".join(
                event_teachers) if event_teachers else None
            testPaper.save()

            tpt = TestPaperTask.objects.filter(test_paper=testPaper)
            for t in tpt:
                t.delete()

        else:
            testPaper = TestPaper.objects.create(
                name=name,
                task_number=number,
                task_all_score=allScore,
                create_time=timezone.now(),
                create_user=request.user,
                public=True,
            )

        for questions in list:
            TestPaperTask.objects.create(test_paper=testPaper,
                                         task_hash=questions['hash'],
                                         score=questions['score'])

        cache = CacheProduct(
            "%s-%s" % (TestPaperViewSet.__module__, TestPaperViewSet.__name__))
        delete_cache(cache)

        return response.Response({'error_code': 1})
예제 #9
0
from rest_framework.decorators import api_view
from rest_framework.permissions import IsAuthenticated
from rest_framework.viewsets import ReadOnlyModelViewSet
from rest_framework.response import Response

from common_auth.models import User
from common_framework.utils.cache import CacheProduct, delete_cache, cache_wrapper
from common_framework.utils.rest.mixins import CacheModelMixin
from common_message.models import Message
from common_message.serializer import MessageSerializer

MESSAGE_TYPE_SYSTEM = 0
MESSAGE_TYPE_APP = 1

_cache_instance = CacheProduct("common_message")

logger = logging.getLogger(__name__)


def get_users(user, faculty, major, classes, team):
    users = []
    if not user:
        queryset = User.objects.filter()
        if team:
            queryset |= queryset.filter(team=team)

        if major:
            queryset |= queryset.filter(major=major)

        if faculty:
예제 #10
0
def delete_event_cache(id):
    event_cache = CacheProduct('event')
    key = 'get_event_id_%s' % id
    event_cache.set(key, None, DEFAULT_CACHE_TIME)
예제 #11
0
from common_framework.utils.cache import CacheProduct, cache_wrapper
from common_framework.utils.constant import Status

from course import models as course_models

_cache_instance = CacheProduct("course")


@cache_wrapper(_cache_instance, cache_age=20)
def get_lesson(course_id):
    return course_models.Lesson.objects.filter(course__id=course_id,
                                               status=Status.NORMAL)
예제 #12
0
    def __new__(cls, *args, **kwargs):
        obj = super(CacheModelMixin, cls).__new__(cls, *args, **kwargs)
        view_name = _generate_cache_view_name(cls)
        obj.cache = CacheProduct(view_name)

        return obj