Example #1
0
    def create(self, request, *args, **kwargs):
        logger.info("TRY CREATE CHATBOT  ||" + create_log_content(request))
        # Django 에서는 request의 body로 들어온 정보를 변환하지 못하도록 막았기 때문에 이를 풀어줌
        mutable = request.POST._mutable
        request.POST._mutable = True

        chat_log_data = request.data
        now_date_time = datetime.now()

        # 필드 중 생성 날짜. 시간들에 대한 정보를 클라이언트가 아닌 서버에서 생성
        create_date_time = "%04d%02d%02d%02d%02d%02d" % (
            now_date_time.year,
            now_date_time.month,
            now_date_time.day,
            now_date_time.hour,
            now_date_time.minute,
            now_date_time.second
        )
        # 20191123 => 2019년 11월 23
        create_date = create_date_time[:8]
        # 193043일 => 19시 30분 43초
        create_time = create_date_time[8:]

        chat_log_data['createDateTime'] = create_date_time
        chat_log_data['createDate'] = create_date
        chat_log_data['createTime'] = create_time

        # 생성 날짜, 시간에 대한 정보를 바꾸었으니 다시 원상 복구
        request.POST._mutable = mutable

        # 이 데이터를 토대로 채팅 생성
        return CreateModelMixin.create(self, request, *args, **kwargs)
Example #2
0
    def list(self, request, *args, **kwargs):
        logger.info("TRY LIST SI GUN GU  ||" + create_log_content(request))
        existing_queryset = self.queryset
        query_dict = request.GET

        si_do_id = query_dict.get('sidoid')

        if si_do_id is not None:
            select_si_gun_gu_with_si_do_query = """
            SELECT * FROM Sigungu
            JOIN Address ON Sigungu.sigunguid = Address.sigunguid
            WHERE Address.sidoid = (%s)
            AND Sigungu.siGunGuId != (%s)
            ORDER BY siGunGuName
            """

            bon_cheung_id = '9999999'
            select_si_gun_gu_with_si_do_query = select_si_gun_gu_with_si_do_query % (
                si_do_id, bon_cheung_id)
            existing_queryset = SiGunGu.objects.raw(
                select_si_gun_gu_with_si_do_query)

        self.queryset = existing_queryset

        return ListModelMixin.list(self, request, *args, **kwargs)
Example #3
0
    def create(self, request, *args, **kwargs):
        logger.info("TRY CREATE WELFARE  ||" + create_log_content(request))
        welfare_data = request.data

        disables = welfare_data.get('disables', [])
        house_types = welfare_data.get('houseTypes', [])
        desires = welfare_data.get('desires', [])
        target_characters = welfare_data.get('targetCharacters', [])
        life_cycles = welfare_data.get('lifeCycles', [])
        responsibles = welfare_data.get('responsibles', [])

        # 유효성 검사를 거치지않는 필드들에 대해서 따로 검사
        try:
            for disable in disables:
                Disable.objects.get(disableId=disable)
            for house_type in house_types:
                HouseType.objects.get(houseTypeId=house_type)
            for desire in desires:
                Desire.objects.get(desireId=desire)
            for target_character in target_characters:
                TargetCharacter.objects.get(targetCharacterId=target_character)
            for life_cycle in life_cycles:
                LifeCycle.objects.get(lifeCycleId=life_cycle)
            for responsible in responsibles:
                Responsible.objects.get(responsibleId=responsible)
        except Disable.DoesNotExist or Welfare.DoesNotExist or HouseType.DoesNotExist or TargetCharacter.DoesNotExist \
               or LifeCycle.DoesNotExist or Responsible.DoesNotExist:
            return Response(status=status.HTTP_400_BAD_REQUEST)

        return CreateModelMixin.create(self, request, *args, **kwargs)
Example #4
0
    def retrieve(self, request, *args, **kwargs):
        logger.info("TRY RETRIEVE MEMBER" + create_log_content(request))

        instance = self.get_object()
        serializer = self.get_serializer(instance)
        serializer_data = serializer.data

        member_data = self.changeAddressToString(serializer_data)
        decrypt_member_data = self.decryptMemberData(
            social_id=instance.socialId, member_data=member_data)

        return Response(decrypt_member_data)
Example #5
0
    def list(self, request, *args, **kwargs):
        logger.info("TRY LIST WELFARE  ||" + create_log_content(request))
        existing_queryset = self.queryset
        query_dict = request.GET
        pagination_class = PageNumberPagination

        disable = query_dict.get('disable')
        house_type = query_dict.get('houseType')
        desire = query_dict.get('desire')
        target_character = query_dict.get('targetCharacter')
        life_cycle = query_dict.get('lifeCycle')
        responsible = query_dict.get('responsible')
        welfare_address_id = query_dict.get('welAddressId')
        search = query_dict.get('search')
        offset = query_dict.get('offset')

        if disable is not None:
            existing_queryset = existing_queryset.filter(disables__disableId=disable)
        if house_type is not None:
            existing_queryset = existing_queryset.filter(houseTypes__houseTypeId=house_type)
        if desire is not None:
            existing_queryset = existing_queryset.filter(desires__desireId=desire)
        if target_character is not None:
            existing_queryset = existing_queryset.filter(targetCharacters__targetCharacterId=target_character)
        if life_cycle is not None:
            existing_queryset = existing_queryset.filter(lifeCycles__lifeCycleId=life_cycle)
        if responsible is not None:
            existing_queryset = existing_queryset.filter(responsibles_responsibleId=responsible)
        if welfare_address_id is not None:
            existing_queryset = existing_queryset.filter(welAddressId__addressId=welfare_address_id)

        if offset is not None:
            pagination_class.page_size = offset
        else:
            pagination_class.page_size = 10

        if search is not None:
            existing_queryset = Welfare.objects.filter(
                Q(welName__icontains=search) | Q(welSummary__icontains=search) | Q(targetDetail__icontains=search))

        self.queryset = existing_queryset

        return ListModelMixin.list(self, request, *args, **kwargs)
Example #6
0
    def list(self, request, *args, **kwargs):
        logger.info("TRY LIST MEMBER" + create_log_content(request))

        new_queryset = Member.objects.all()
        # 보안성을 위해 배포시에 주석 해제
        # new_queryset = Member.objects.filter(socialId=None)
        social_id = request.GET.get('socialId', None)

        if social_id is not None:
            try:
                instance = Member.objects.get(socialId=social_id)
            except Member.DoesNotExist:
                message = {'message': '해당하는 socialId가 존재하지 않습니다.'}
                return Response(message, status=status.HTTP_404_NOT_FOUND)
            serializer = self.get_serializer(instance)
            serializer_data = serializer.data
            member_data = self.changeAddressToString(serializer_data)
            decrypt_member_data = self.decryptMemberData(
                social_id=social_id, member_data=member_data)
            return Response(decrypt_member_data)

        self.queryset = new_queryset

        return ListModelMixin.list(self, request, *args, **kwargs)
Example #7
0
    def update(self, request, *args, **kwargs):
        logger.info("TRY UPDATE WELFARE  ||" + create_log_content(request))
        welfare_data = request.data

        disables = welfare_data.get('disables')
        welfares = welfare_data.get('welfares')
        house_types = welfare_data.get('houseTypes')
        desires = welfare_data.get('desires')
        target_characters = welfare_data.get('targetCharacters')
        life_cycles = welfare_data.get('lifeCycles')
        responsibles = welfare_data.get('responsibles')

        # 유효성 검사를 거치지않는 필드들에 대해서 따로 검사
        try:
            for disable in disables:
                Disable.objects.get(disableId=disable)
            for welfare in welfares:
                Welfare.objects.get(welId=welfare)
            for house_type in house_types:
                HouseType.objects.get(houseTypeId=house_type)
            for desire in desires:
                Desire.objects.get(desireId=desire)
            for target_character in target_characters:
                TargetCharacter.objects.get(targetCharacterId=target_character)
            for life_cycle in life_cycles:
                LifeCycle.objects.get(lifeCycleId=life_cycle)
            for responsible in responsibles:
                Responsible.objects.get(responsibleId=responsible)
        except Disable.DoesNotExist or Welfare.DoesNotExist or HouseType.DoesNotExist or TargetCharacter.DoesNotExist \
               or LifeCycle.DoesNotExist or Responsible.DoesNotExist:
            return Response(status=status.HTTP_400_BAD_REQUEST)

        # 부분적인 업데이트를 한다는 것을 serializer에게 알려줌
        kwargs['partial'] = True

        return UpdateModelMixin.partial_update(self, request, *args, **kwargs)
Example #8
0
    def create(self, request, *args, **kwargs):
        logger.info("TRY CREATE MEMBER" + create_log_content(request))

        # Django 에서는 request의 body로 들어온 정보를 변환하지 못하도록 막았기 때문에 이를 풀어줌
        mutable = request.POST._mutable
        request.POST._mutable = True

        member_data = request.data
        social_id = member_data['socialId']
        salting_with_social_id = 'hoxymetoo_' + social_id
        now_datetime = datetime.now()

        jobs = member_data.get('jobs', [])
        disables = member_data.get('disables', [])
        welfares = member_data.get('welfares', [])
        house_types = member_data.get('houseTypes', [])
        desires = member_data.get('desires', [])
        target_characters = member_data.get('targetCharacters', [])
        life_cycles = member_data.get('lifeCycles', [])

        # 유효성 검사를 거치지않는 필드들에 대해서 따로 검사
        try:
            for job in jobs:
                Job.objects.get(jobId=job)
            for disable in disables:
                Disable.objects.get(disableId=disable)
            for welfare in welfares:
                Welfare.objects.get(welId=welfare)
            for house_type in house_types:
                HouseType.objects.get(houseTypeId=house_type)
            for desire in desires:
                Desire.objects.get(desireId=desire)
            for target_character in target_characters:
                TargetCharacter.objects.get(targetCharacterId=target_character)
            for life_cycle in life_cycles:
                LifeCycle.objects.get(lifeCycleId=life_cycle)
        except Job.DoesNotExist or Disable.DoesNotExist or Welfare.DoesNotExist or HouseType.DoesNotExist or \
               Desire.DoesNotExist or TargetCharacter.DoesNotExist or LifeCycle.DoesNotExist:
            logger.error("ERROR with field associated with CREATE MEMBER" +
                         create_log_content(request))
            return Response(status=status.HTTP_400_BAD_REQUEST)

        # 필드 중 생성 날짜. 시간들에 대한 정보를 클라이언트가 아닌 서버에서 생성
        create_date_time = "%04d%02d%02d%02d%02d%02d" % (
            now_datetime.year, now_datetime.month, now_datetime.day,
            now_datetime.hour, now_datetime.minute, now_datetime.second)
        create_date = create_date_time[:8]
        create_time = create_date_time[8:]
        mem_key = hashlib.sha256(salting_with_social_id.encode()).hexdigest()

        member_data['memKey'] = mem_key
        member_data['createDateTime'] = create_date_time
        member_data['updateDateTime'] = create_date_time
        member_data['createDate'] = create_date
        member_data['updateDate'] = create_date
        member_data['createTime'] = create_time
        member_data['updateTime'] = create_time

        # mutable 원상복구
        request.POST._mutable = mutable

        # 이 데이터를 토대로 멤버 생성
        CreateModelMixin.create(self, request, *args, **kwargs)

        instance = Member.objects.get(socialId=social_id)
        serializer = self.get_serializer(instance)
        serializer_data = serializer.data

        list_of_welfare_of_recommend = self.select_welfare_of_member(social_id)
        for welfare_of_recommend in list_of_welfare_of_recommend:
            MemWelfare.objects.get_or_create(socialId=instance,
                                             welId=welfare_of_recommend)

        member_data = self.changeAddressToString(serializer_data)
        decrypt_member_data = self.decryptMemberData(social_id=social_id,
                                                     member_data=member_data)
        return Response(decrypt_member_data)
Example #9
0
 def update(self, request, *args, **kwargs):
     logger.info("TRY UPDATE SI DO  ||" + create_log_content(request))
     return super().update(self, request, *args, **kwargs)
Example #10
0
 def retrieve(self, request, *args, **kwargs):
     logger.info("TRY RETRIEVE SI DO  ||" + create_log_content(request))
     return super().retrieve(self, request, *args, **kwargs)
Example #11
0
 def list(self, request, *args, **kwargs):
     logger.info("TRY LIST SI DO  ||" + create_log_content(request))
     return super().list(self, request, *args, **kwargs)
Example #12
0
 def create(self, request, *args, **kwargs):
     logger.info("TRY CREATE ADDRESS  ||" + create_log_content(request))
     return super().create(self, request, *args, **kwargs)
Example #13
0
    def list(self, request, *args, **kwargs):
        logger.info("TRY LIST CHATBOT  ||" + create_log_content(request))
        chat_data = request.GET

        receiver_member_key = chat_data.get('receiverMemKey', None)
        sender_member_key = chat_data.get('senderMemKey', None)
        search = chat_data.get('search', None)

        # queryset과 serializer_class를 재지정 시작

        # 챗봇을 보낸 사람을 기준으로 list를 호출할 때,
        if receiver_member_key is None and sender_member_key is not None:
            new_queryset = ChatLog.objects.filter(senderMemKey__memKey=sender_member_key)
            new_serializer_class = ChatLogSenderSerializer
            self.queryset = new_queryset
            self.serializer_class = new_serializer_class
        # 챗봇을 받은 사람을 기준으로 list를 호출할 때,
        elif receiver_member_key is not None and sender_member_key is None:
            new_queryset = ChatLog.objects.filter(receiverMemKey__memKey=receiver_member_key)
            new_serializer_class = ChatLogReceiverSerializer
            self.queryset = new_queryset
            self.serializer_class = new_serializer_class

        # queryset과 serializer_class를 재지정 끝

        # search로 파라미터를 받았을 때는 토큰화를 통해 word2vec을 이용하여 복지 검색
        if search is not None:
            from gensim.models import Word2Vec
            from konlpy.tag import Okt
            import sys

            # tagger class를 Okt를 이
            okt = Okt()

            # 단어 토큰화
            token_list = okt.pos(phrase=search, stem=True, norm=True)

            model = Word2Vec.load(f'{sys.path[0]}/chatbot/word2vec.model')

            dict_similar_tokens = dict()
            # 일치율이 높은 3개의 단어만 추출
            n = 3
            # 총 3개 이상의 인덱스가 겹치는 복지의 경우만 반환
            total_count = 3
            for token in token_list:
                if token[1] in ['Noun']:
                    # 사용자의 질문자체를 이용한 유사한 단어 추출
                    try:
                        similar_tokens = model.wv.most_similar(token[0])
                    # 모델에 있지않은 단어의 경우 그냥 계속 작동
                    except KeyError:
                        continue
                    # 사용자의 질문자체에서 뽑힌 단어중 일치율이 높은 n개의 단어만 추출
                    if similar_tokens:
                        dict_similar_tokens[token[0]] = similar_tokens[:n]

            recommend_welfare = dict()
            # ('육아', ('도우미', 0.7666430473327637))
            for key, similar_keys in dict_similar_tokens.items():
                # 사용자의 질문자체의 Noun에 대한 index정보 획득
                try:
                    recommend_index = Index.objects.get(indexName=key)
                # 사용자의 질문자체가 인덱스로 등록 안되어있는 경우에 대한 예외처
                except Index.DoesNotExist:
                    recommend_index = 1560
                # 사용자의 질문자체의 Noun에 대한 index를 갖는 복지들 획득
                list_recommend_welfare_index = WelIndex.objects.filter(indexId=recommend_index)
                for recommend_welfare_index in list_recommend_welfare_index:
                    welfare_count = recommend_welfare.get(recommend_welfare_index.welId.welId)
                    # 처음 검색된 복지일 때, 카운트 = 1
                    if welfare_count is None:
                        recommend_welfare[recommend_welfare_index.welId.welId] = 1
                    # 이미 찾아진 복지일 떄, 카운트 += 1
                    else:
                        recommend_welfare[recommend_welfare_index.welId.welId] = welfare_count + 1

                # 사용자의 질문과 일치율이 높은 단어들에 대해서
                for similar_key in similar_keys:
                    # 일치율이 높은 단어에 대한 index정보 획득
                    try:
                        recommend_index = Index.objects.get(indexName=similar_key[0])
                    except Index.DoesNotExist:
                        recommend_index = 1560
                    # 일치율이 높은 단어에 대한 index를 갖는 복지들 획득
                    list_recommend_welfare_index = WelIndex.objects.filter(indexId=recommend_index)
                    for recommend_welfare_index in list_recommend_welfare_index:
                        welfare_count = recommend_welfare.get(recommend_welfare_index.welId.welId)
                        # 처음 검색된 복지일 때, 카운트 = 1
                        if welfare_count is None:
                            recommend_welfare[recommend_welfare_index.welId.welId] = 1
                        # 이미 찾아진 복지일 떄, 카운트 += 1
                        else:
                            recommend_welfare[recommend_welfare_index.welId.welId] = welfare_count + 1

            # 카운트가 높은 순으로 정렬
            recommend_welfares_sorted_by_count_desc = sorted(recommend_welfare, key=recommend_welfare.get, reverse=True)

            # 카운트가 특정 수를 넘어야 추천
            recommend_welfare_dict = dict()
            for recommend_welfare_sorted_by_count_desc in recommend_welfares_sorted_by_count_desc:
                if recommend_welfare.get(recommend_welfare_sorted_by_count_desc) >= total_count:
                    recommend_welfare_dict[recommend_welfare_sorted_by_count_desc] = recommend_welfare.get(
                        recommend_welfare_sorted_by_count_desc)

            # 채팅이 어떻게 쪼개졌나 확인하기
            recommend_welfare_dict['chat tokenize'] = token_list

            # 쪼개진 채팅을 토대로 어떤 단어가 유사하다고 나왔는지 확인
            for chat_token, similar_chat_token in dict_similar_tokens.items():
                recommend_welfare_dict[chat_token] = similar_chat_token

            # 이 데이터를 토대로 search에 대한 결과갑 반환
            return Response(recommend_welfare_dict)

        # 이 데이터를 토대로 채팅 반환
        return ListModelMixin.list(self, request, *args, **kwargs)
Example #14
0
 def create(self, request, *args, **kwargs):
     logger.info("TRY CREATE TARGET CHARACTER  ||" + create_log_content(request))
     return super().create(self, request, *args, **kwargs)