본문 바로가기
Programming/Python

카카오톡 플러스친구 스마트채팅 만들기 6 - 식당 추가 & 식당 삭제

by NAMP 2018. 5. 8.

카카오톡 플러스친구 스마트채팅 만들기 6 - 식당 추가 & 식당 삭제

식당 추가

식당 추가의 경우 세 단계로 진행됩니다.

  1. 이름 입력
  2. 사진 입력
  3. 최종 확인

이름 정보와 사진 정보를 데이터베이스에 입력하고, 최종 확인시에 해당 데이터를 저장합니다.

class Message(Resource):

    def post(self):
        select = Select(self.args)
        setting = Setting(self.args)
        result = Result(self.args)

        if self.content == Const.BTN_SELECT_LUNCH:
            return select.show_restaurant_list()
        elif self.content == Const.BTN_ADD_RESTAURANT:
            return setting.show_add_restaurant()
        elif self.content == Const.BTN_ADD_RESTAURANT_CONFIRM:
            return setting.add_restaurant()
            
        # 사용자 입력처리
        user = fs.collection(Const.COL_USER).document(self.user_key).get()
        user_state = user.get(Const.FIELD_STATE)

        if user_state == Const.STATE_SELECT_GROUP:
            return select.group_selected()
        elif user_state == Const.STATE_ADD_RESTAURANT_TITLE:
            return setting.show_add_restaurant_desc()
        elif user_state == Const.STATE_ADD_RESTAURANT_DESC:
            return setting.show_add_restaurant_confirm()        

버튼은 두번 처리가 되며

  • BTN_ADD_RESTAURANT
  • BTN_ADD_RESTAURANT_CONFIRM

상태 역시 두번 처리 됩니다.

  • STATE_ADD_RESTAURANT_TITLE
  • STATE_ADD_RESTAURANT_DESC
class Setting(Args):
    def show_add_restaurant(self):
        # state : add_restaurant
        # 1. 이름을 입력해 주세요
        # 2. 설명을 작성해 주세요.
        # 상태 설정
        fs.collection(Const.COL_USER).document(self.user_key).update({
            Const.FIELD_STATE: Const.STATE_ADD_RESTAURANT
        }, firestore.CreateIfMissingOption(True))

        rst = {
            "message": {
                "text": '음식점 이름을 입력해 주세요'
            }
        }

        return Util.send_response(rst)
    
    def show_add_restaurant_desc(self):
        # content = 음식점 이름
        # 상태 설정
        fs.collection(Const.COL_USER).document(self.user_key).update({
            Const.FIELD_STATE: Const.STATE_ADD_RESTAURANT_DESC
        }, firestore.CreateIfMissingOption(True))

        fs.collection(Const.COL_USER).document(self.user_key).update({
            Const.FIELD_ADD_RESTAURANT_TITLE: self.content
        })

        rst = {
            "message": {
                "text": '음식점 사진을 추가해 주세요'
            }
        }

        return Util.send_response(rst)
        
    def show_add_restaurant_confirm(self):
        fs.collection(Const.COL_USER).document(self.user_key).update({
            Const.FIELD_STATE: Const.STATE_ADD_RESTAURANT_CONFIRM
        }, firestore.CreateIfMissingOption(True))

        fs.collection(Const.COL_USER).document(self.user_key).update({
            Const.FIELD_ADD_RESTAURANT_DESC: self.content
        }, firestore.CreateIfMissingOption(True))

        user = fs.collection(Const.COL_USER).document(self.user_key).get()
        title = user.get(Const.FIELD_ADD_RESTAURANT_TITLE)
        desc = self.content

        if Util.is_img(desc):
            rst = {
                "message": {
                    "text": '입력하신 음식점은 다음과 같습니다.\n\n이름:{}\n\n등록하시겠습니까?'.format(title),
                    "photo": {
                        "url": desc,
                        "width": 640,
                        "height": 480
                    }
                },
                "keyboard": {
                    "type": "buttons",
                    "buttons": [
                        Const.BTN_ADD_RESTAURANT_CONFIRM,
                        Const.BTN_GOTO_START
                    ]
                }
            }
        else:
            rst = {
                "message": {
                    "text": '입력하신 음식점은 다음과 같습니다.\n\n이름:{}\n설명:{}\n\n등록하시겠습니까?'.format(title, desc)
                },
                "keyboard": {
                    "type": "buttons",
                    "buttons": [
                        Const.BTN_ADD_RESTAURANT_CONFIRM,
                        Const.BTN_GOTO_START
                    ]
                }
            }

        return Util.send_response(rst)
      
    def add_restaurant(self):
        user = fs.collection(Const.COL_USER).document(self.user_key).get()
        group = user.get(Const.FIELD_GROUP)
        title = user.get(Const.FIELD_ADD_RESTAURANT_TITLE)
        desc = user.get(Const.FIELD_ADD_RESTAURANT_DESC)

        try:
            ref = fs.collection(Const.COL_GROUP).document(group).get()
            restaurant = ref._data.get(Const.FIELD_RESTAURANT)
        except:
            restaurant = {}

        if restaurant is None:
            restaurant = {}

        restaurant[title] = {
            'desc': desc,
            'user': self.user_key,
            'added': Util.get_day_str()
        }

        if Util.is_img(desc):
            restaurant[title][Const.FIELD_IMG_SRC] = desc

        fs.collection(Const.COL_GROUP).document(group).update({Const.FIELD_RESTAURANT: restaurant}, firestore.CreateIfMissingOption(True))

        if Util.is_img(desc):
            msg = '[{}] 이(가) 등록되었습니다'.format(title)
            return Util.show_start_menu(msg, desc)

        msg = '이름:{}\n설명:{}\n등록되었습니다'.format(title, desc)
        return Util.show_start_menu(msg)

 

식당 삭제

해당 그룹의 식당 목록을 보여주고, 사용자가 선택하면 해당 식당 정보를 제거합니다.

/message로 부터 시작합니다.

class Message(Resource):

    def post(self):
        select = Select(self.args)
        setting = Setting(self.args)
        result = Result(self.args)

        if self.content == Const.BTN_SELECT_LUNCH:
        elif self.content == Const.BTN_DELETE_RESTAURANT:
            return setting.show_delete_restaurant()
        elif self.content == Const.BTN_DELETE_RESTAURANT_CONFIRM:
            return setting.delete_restaurant()
            
        # 사용자 입력처리
        user = fs.collection(Const.COL_USER).document(self.user_key).get()
        user_state = user.get(Const.FIELD_STATE)

        if user_state == Const.STATE_SELECT_GROUP:
            return select.group_selected()
        elif user_state == Const.STATE_DELETE_RESTAURANT:
            return setting.show_delete_restaurant_confirm()

식당을 선택하는 버튼과 확인하는 버튼을 처리합니다.

  • BTN_DELETE_RESTAURANT
  • BTN_DELETE_RESTAURANT_CONFIRM

식당 삭제 상태를 처리합니다.

  • STATE_DELETE_RESTAURANT
class Setting(Args):
    
    def show_delete_restaurant(self):
        fs.collection(Const.COL_USER).document(self.user_key).update({
            Const.FIELD_STATE: Const.STATE_DELETE_RESTAURANT
        }, firestore.CreateIfMissingOption(True))

        user = fs.collection(Const.COL_USER).document(self.user_key).get()
        group = user.get(Const.FIELD_GROUP)

        ref = fs.collection(Const.COL_GROUP).document(group).get()
        restaurants = ref._data.get(Const.FIELD_RESTAURANT)

        restaurant_list = []
        for key, val in restaurants.items():
            restaurant_list.append(key)

        restaurant_list.append(Const.BTN_GOTO_START)

        rst = {
            "message": {
                "text": '삭제할 대상을 선택해 주세요'
            },
            "keyboard": {
                "type": "buttons",
                "buttons": restaurant_list
            }
        }

        return Util.send_response(rst)

    def show_delete_restaurant_confirm(self):
        fs.collection(Const.COL_USER).document(self.user_key).update({
            Const.FIELD_STATE: Const.STATE_DELETE_RESTAURANT
        }, firestore.CreateIfMissingOption(True))

        fs.collection(Const.COL_USER).document(self.user_key).update({
            Const.FIELD_DELETE_RESTAURANT_TITLE: self.content
        }, firestore.CreateIfMissingOption(True))

        title = self.content

        rst = {
            "message": {
                "text": '[{}] 을(를) 삭제하겠습니까?'.format(title)
            },
            "keyboard": {
                "type": "buttons",
                "buttons": [
                    Const.BTN_DELETE_RESTAURANT_CONFIRM,
                    Const.BTN_GOTO_START
                ]
            }
        }

        return Util.send_response(rst)

    def delete_restaurant(self):
        user = fs.collection(Const.COL_USER).document(self.user_key).get()
        group = user.get(Const.FIELD_GROUP)
        title = user.get(Const.FIELD_DELETE_RESTAURANT_TITLE)

        try:
            ref = fs.collection(Const.COL_GROUP).document(group).get()
            restaurant = ref._data.get(Const.FIELD_RESTAURANT)
            del restaurant[title]
        except:
            restaurant = {}

        fs.collection(Const.COL_GROUP).document(group).update({Const.FIELD_RESTAURANT: restaurant}, firestore.CreateIfMissingOption(True))

        msg = '[{}] 을(를) 삭제하였습니다.'.format(title)
        return Util.show_start_menu(msg)

댓글