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

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

식당 추가

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
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로 부터 시작합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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)
공유하기