クラスの実装
data keyの管理 - base
このdeta.spaceではdata keyが必要で、それを使ってオブジェクトを作成していきます
base.py
from deta import Deta
class Base:
BASE_ID = "baseのdata keyを入れる"
def __init__(self):
self.deta = Deta(self.BASE_ID)
def openBase(self,basename):
return self.deta.Base(basename)
def putBase(self,listdata):
self.db.put(listdata)
def getBase(self,dict):
return self.db.get(dict)
def fetchBase(self,dict=None,limit=100,last=None):
return self.db.fetch(dict,limit,last)
def delBase(self,dict):
self.db.delete(dict)
一応一通り作りましたが、openBaseしか使いませんでした
drive.py
from deta import Deta class Drive: DRIVE_ID = "driveのdata keyを入れる" def __init__(self): self.deta = Deta(self.DRIVE_ID) def openDrive(self,drivename): return self.deta.Drive(drivename)
deta.spaceでbaseとdriveでkeyが違うので追加しました
ユーザー管理用クラス - user
drive.py
import base
class User:
def __init__(self):
self.db = base.Base()
self.user = self.db.openBase("users")
def newUser(self, userid, password):
self.user.put({"id":userid,"password": password})
def getUser(self, dict):
return self.user.fetch(dict)
新規ユーザーの追加と、ユーザーデータの読み込みを作りました。削除は作ってありません。データベースにusersというテーブルを作り、idとpasswordを保存します。passwordは暗号化して渡します
イベント管理用のクラス - event
event.py
import base
import photoBase
import driveFile
import datetime
import re
class Event:
def __init__(self):
self.deta = base.Base()
self.event = self.deta.openBase("events")
def newEvent(self, userid, eventname, firstDay, limitdate, comment, email, paticip):
t = datetime.date.today()
edata = self.dirCurrentEvents(t.strftime("%Y-%m-%d"))
if edata.count > 10:
return False
else:
self.event.put({"id":userid,"eventname": eventname, "firstDay": firstDay,
"limitdate": limitdate, "comment": comment,"email": email, "paticip": paticip})
return True
def getEvent(self, dict):
return self.event.fetch(query=dict)
def updateEvent(self, key, userid, eventname, firstDay, limitdate, comment, email, paticip):
self.event.put({"key": key, "id":userid,"eventname": eventname, "firstDay": firstDay,
"limitdate": limitdate, "comment": comment, "email": email, "paticip": paticip})
def dirAllEvents(self):
return self.event.fetch(query=None,limit=10,last=None)
def deleteEvent(self, ekey):
self.event.delete(ekey)
def fmtDate(self,day:str,sepChar:str):
l = re.findall(r"\d+", day)
l = [int(s) for s in l]
dt = datetime.datetime(*l)
fmt = "%Y-%m-%d"
fmt.replace("-",sepChar)
strDay = dt.strftime(fmt)
return strDay
def dirCurrentEvents(self,thisDay:str):
strDay = self.fmtDate(thisDay,"-")
return self.event.fetch(query={"limitdate?gte":strDay},limit=10,last=None)
def dirLostEvents(self,thisDay:str):
strDay = self.fmtDate(thisDay,"-")
return self.event.fetch(query={"limitdate?lt":strDay},limit=10,last=None)
def dirEventPhotos(self,ekey,photoFlag:str):
'''make relation ship to event photos and photo image'''
photos = photoBase.PhotoBase()
drives = driveFile.DriveFile()
results = photos.photoBase.fetch(query={"eventID":ekey},limit=100,last=None)
if results.items:
returnList = []
for result in results.items:
if photoFlag=="True":
photoImage = drives.getFile(result['filename'])
result['photoImage']=photoImage
else:
result['photoImage']=""
#result['photoImage']=result['filename'] #debug
returnList.append(result)
return returnList
else:
return None
eventsというデータベーステーブルを作り、新規イベントの登録、イベント情報の取得、イベントの修正、イベントの一覧、イベントの削除、現在稼働中のイベント一覧、期限切れのイベント一覧、イベント中のファイルの一覧、を作りました
イベント参加依頼のクラス - paticip
paticip.py
import base
class Paticip:
def __init__(self):
self.db = base.Base()
self.paticip = self.db.openBase("paticip")
def newRequest(self, ekey, eventname, uid, rmemo):
self.paticip.put({"eventid":ekey,"eventname": eventname,"userid":uid, "rmemo":rmemo})
def getRequest(self, dict):
return self.paticip.fetch(query=dict)
def deleteRequest(self,pkey):
self.paticip.delete(pkey)
paticipというデータベーステーブルを作り、依頼の発行、依頼の読み込み、依頼の削除を行います
画像ファイルを管理するデータベースのクラス - photoBase
photobase.py
from deta import Deta
import base
class PhotoBase:
def __init__(self):
self.deta = base.Base()
self.photoBase = self.deta.openBase("photos")
def getPhotoDetail(self,dict):
return self.photoBase.fetch(query=dict)
def newPhoto(self, fromID, eventID, fileName, deleted, datetime, accesscount, comment):
self.photoBase.put({"fromid": fromID, "eventID": eventID,
"filename": fileName,"deleted":deleted,"datetime":datetime,
"accesscount":accesscount,"comments":comment})
def updatePhoto(self, pkey, fromID, eventID, fileName, deleted, datetime, accesscount, comment):
self.photoBase.update({"fromid": fromID, "eventID": eventID,
"filename": fileName,"deleted":deleted,"datetime":datetime,
"accesscount":accesscount,"comments":comment},pkey)
def dirPhotoNames(self):
result = self.photoBase.list(limit=1000)
all_files = result.get("names")
paging = result.get("paging")
last = paging.get("last") if paging else None
while (last):
result = self.photoBase.list(limit=1000,last=last)
all_files += result.get("names")
paging = result.get("paging")
last = paging.get("last") if paging else None
return all_files
def deletePhoto(self,pkey):
self.photoBase.delete(pkey)
photosというデータベーステーブルを作成し、画像ファイルの詳細取得、写真登録、写真情報修正、ファイル名一覧、画像ファイル削除を作成しました
ファイル管理のクラス - driveFile
drivefile.py
from deta import Deta
import base64
import drive
import string
import random
from PIL import Image #install Pillow
from PIL.ExifTags import TAGS
class DriveFile:
def __init__(self):
self.drive = drive.Drive()
self.file = self.drive.openDrive("files")
def putFile(self, filename, filedata):
"""filedata is request.file data"""
self.file.put(filename,filedata)
def getFile(self, filename):
large_file = self.file.get( filename )
if large_file != None:
image_data = b''
for chunk in large_file.iter_chunks(4096):
# for chunk in large_file.iter_chunks(1024):
image_data += bytearray(chunk)
large_file.close()
img = base64.b64encode(image_data).decode('utf-8')
return img
else:
return None
def deleteFile(self, filename):
self.file.delete(filename)
def get_exif_of_image(self,file):
"""Get EXIF of an image if exists.
指定した画像のEXIFデータを取り出す関数
@return exif_table Exif データを格納した辞書
"""
im = Image.open(file)
# Exif データを取得
# 存在しなければそのまま終了 空の辞書を返す
try:
exif = im._getexif()
except AttributeError:
return {}
# タグIDそのままでは人が読めないのでデコードして
# テーブルに格納する
exif_table = {}
for tag_id, value in exif.items():
tag = TAGS.get(tag_id, tag_id)
exif_table[tag] = str(value) #データーで保存するとエラーが起きることがあるのでstr()
#edit datetime
if 'DateTime' in exif_table:
string = exif_table['DateTime']
exif_table['DateTime'] = string.replace(":","/",2)
else:
exif_table['DateTime']=""
return exif_table
def randStr(self,leng):
s = ''
for i in range(leng):
s += random.choice(string.digits + string.ascii_letters)
return s
Driveにfilesというフォルダーを作成し、ファイルの出力、ファイルの読み込み(chunkで少しづつ読み込む)、ファイルの削除、指定画像ファイルから撮影日付を取得する、/tmpフォルダー用の乱数ファイル名作成を作成しました