main.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. from enum import Enum
  2. import time
  3. from datetime import datetime
  4. from typing import Optional
  5. from pydantic import BaseModel
  6. from fastapi import FastAPI, Query, UploadFile, File
  7. import dataset,json
  8. from fastapi import FastAPI
  9. from fastapi.middleware.cors import CORSMiddleware
  10. import pandas as pd
  11. from gspread_pandas import Spread, Client
  12. from oauth2client.service_account import ServiceAccountCredentials
  13. import gspread
  14. import asyncio
  15. app = FastAPI()
  16. import nest_asyncio
  17. import threading
  18. origins = [
  19. "https://hhh.com.tw"
  20. "http://172.105.205.52",
  21. "http://172.105.205.52:8002",
  22. "http://172.104.93.163",
  23. ]
  24. app.add_middleware(
  25. CORSMiddleware,
  26. # allow_origins=origins,
  27. allow_origins=["*"],
  28. allow_credentials=True,
  29. allow_methods=["*"],
  30. allow_headers=["*"],
  31. )
  32. class deco_request(BaseModel):
  33. id: int
  34. name: str
  35. email: str
  36. phone: str
  37. class deco_request_detail(BaseModel):
  38. id: int
  39. name: str
  40. email: str
  41. phone: str
  42. #detail
  43. loc: str
  44. h_class: str
  45. type: str
  46. budget: str
  47. size: float
  48. bed_num: int
  49. liv_num: int
  50. bath_num: int
  51. style: str
  52. prefer_date: str
  53. time_stamp: str
  54. gender: str
  55. class client_info(BaseModel):
  56. name:str
  57. organization:str
  58. position:str
  59. phone:str
  60. email:str
  61. cert_last5:str
  62. where_learn:str
  63. why_sign:str
  64. @app.get("/deco_request")
  65. async def get_req():
  66. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/hhh?charset=utf8mb4')
  67. request_table = db['deco_request']
  68. statement = 'SELECT * FROM deco_request'
  69. reqs = []
  70. for req in db.query(statement):
  71. reqs.append({'name':req['name'],'email':req['email'],'phone':req['phone'],'loc':req['loc']
  72. ,'h_class':req['h_class'],'type':req['type'],'budget':req['budget'],'size':req['size'],'bed_num':req['bed_num']
  73. ,'liv_num':req['liv_num'],'bath_num':req['bath_num'],'style':req['style'],'prefer_date':req['prefer_date'],'gender':req.gender})
  74. return reqs
  75. @app.post("/deco_request")
  76. async def create_req(req:deco_request):
  77. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/hhh?charset=utf8mb4')
  78. request_table = db['deco_request']
  79. time_stamp = datetime.fromtimestamp(time.time())
  80. time_stamp = time_stamp.strftime("%Y-%m-%d %H:%M:%S")
  81. pk = request_table.insert({'name':req.name,'email':req.email,'phone':req.phone,'time_stamp':time_stamp})
  82. req.id = pk
  83. return req
  84. @app.post("/add_client_info")
  85. async def add_client_info(ci:client_info):
  86. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/hhh?charset=utf8mb4')
  87. request_table = db['client_info']
  88. time_stamp = datetime.fromtimestamp(time.time())
  89. time_stamp = time_stamp.strftime("%Y-%m-%d %H:%M:%S")
  90. pk = request_table.insert({'name':ci.name,'organization':ci.organization,'position':ci.position,'phone':ci.phone,'email':ci.email
  91. ,'cert_last5':ci.cert_last5,'where_learn':ci.where_learn,'why_sign':ci.why_sign,'time_stamp':time_stamp})
  92. return pk
  93. @app.post("/deco_request_detail")
  94. async def create_req_detail(req:deco_request_detail):
  95. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/hhh?charset=utf8mb4')
  96. statement = 'SELECT * FROM deco_request WHERE email="'+req.email+'"'
  97. email_cnt = 0
  98. for row in db.query(statement):
  99. email_cnt = email_cnt + 1
  100. statement = 'SELECT * FROM deco_request WHERE phone="'+req.phone+'"'
  101. phone_cnt = 0
  102. for row in db.query(statement):
  103. phone_cnt = phone_cnt + 1
  104. return_code = 0
  105. #return code 0=good, 1=email duplication, 2=phone duplication, 3= both duplicate
  106. '''
  107. if email_cnt>0 and phone_cnt==0:
  108. return_code = 1
  109. if email_cnt==0 and phone_cnt>0:
  110. return_code = 2
  111. if email_cnt>0 and phone_cnt>0:
  112. return_code = 3
  113. '''
  114. if return_code ==0 :
  115. request_table = db['deco_request']
  116. time_stamp = datetime.fromtimestamp(time.time())
  117. time_stamp = time_stamp.strftime("%Y-%m-%d %H:%M:%S")
  118. req.time_stamp = time_stamp
  119. pk = request_table.insert({'name':req.name,'email':req.email,'phone':req.phone,'loc':req.loc
  120. ,'h_class':req.h_class,'type':req.type,'budget':req.budget,'size':req.size,'bed_num':req.bed_num
  121. ,'liv_num':req.liv_num,'bath_num':req.bath_num,'style':req.style,'prefer_date':req.prefer_date,'time_stamp':req.time_stamp,'gender':req.gender,'version':req.version})
  122. req.id = pk
  123. x = threading.Thread(target=make_req_df)
  124. x.start()
  125. #asyncio.run(make_req_df())23
  126. return return_code
  127. else :
  128. return return_code
  129. async def make_req_df():
  130. db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/hhh?charset=utf8mb4')
  131. statement = 'SELECT * FROM deco_request ORDER BY time_stamp DESC'
  132. #2021-05-23 15:57:43
  133. df = pd.DataFrame()
  134. for row in db.query(statement):
  135. date_format = "%Y-%M-%d %H:%M:%S"
  136. #fdate = datetime.strptime(row['ts_date'],date_format)
  137. fdate = row['time_stamp'].strftime('%Y-%m-%d')
  138. df = df.append({'serial id':row['id'],'姓名':['name'],'email':row['email'],'電話':row['phone']
  139. ,'地區':row['loc'],'房屋類型':row['h_class'],"房屋型態":row['type'],'預算':row['budget']
  140. ,'坪數':row['size'],'房數':row['bed_num'],'廳數':row['liv_num'],'衛浴數':row['bath_num']
  141. ,'風格類型':row['style'],'預選裝修日期':row['prefer_date']}, ignore_index=True)
  142. save_sheet(df,'deco_request','sheet1')
  143. def save_sheet(df,filename,tabname,startpos='A1'):
  144. scope = ['https://spreadsheets.google.com/feeds',
  145. 'https://www.googleapis.com/auth/drive']
  146. # credentials = ServiceAccountCredentials.from_json_keyfile_name('c:\\keys\\spread2.json', scope)
  147. credentials = ServiceAccountCredentials.from_json_keyfile_name('spread2.json', scope)
  148. gc = gspread.authorize(credentials)
  149. spread = Spread(filename,creds=credentials)
  150. spread.df_to_sheet(df, index=False, sheet=tabname, start=startpos, replace=False)